Ejemplo n.º 1
0
    def _saveCurveAsNXdata(self, curve, filename):
        entryPath = self._selectWriteableOutputGroup(filename)
        if entryPath is None:
            return False

        xlabel, ylabel = self._getAxesLabels(curve)

        return save_NXdata(filename,
                           nxentry_name=entryPath,
                           signal=curve.getYData(copy=False),
                           axes=[curve.getXData(copy=False)],
                           signal_name="y",
                           axes_names=["x"],
                           signal_long_name=ylabel,
                           axes_long_names=[xlabel],
                           signal_errors=curve.getYErrorData(copy=False),
                           axes_errors=[curve.getXErrorData(copy=True)],
                           title=self.plot.getGraphTitle())
Ejemplo n.º 2
0
Archivo: io.py Proyecto: vasole/silx
    def _saveCurveAsNXdata(self, curve, filename):
        entryPath = self._selectWriteableOutputGroup(filename)
        if entryPath is None:
            return False

        xlabel, ylabel = self._getAxesLabels(curve)

        return save_NXdata(
            filename,
            nxentry_name=entryPath,
            signal=curve.getYData(copy=False),
            axes=[curve.getXData(copy=False)],
            signal_name="y",
            axes_names=["x"],
            signal_long_name=ylabel,
            axes_long_names=[xlabel],
            signal_errors=curve.getYErrorData(copy=False),
            axes_errors=[curve.getXErrorData(copy=True)],
            title=self.plot.getGraphTitle())
Ejemplo n.º 3
0
    def _saveScatter(self, plot, filename, nameFilter):
        """Save an image from the plot.

        :param str filename: The name of the file to write
        :param str nameFilter: The selected name filter
        :return: False if format is not supported or save failed,
                 True otherwise.
        """
        if nameFilter not in self.DEFAULT_SCATTER_FILTERS:
            return False

        if nameFilter == self.SCATTER_FILTER_NXDATA:
            entryPath = self._selectWriteableOutputGroup(filename)
            if entryPath is None:
                return False
            scatter = plot.getScatter()

            x = scatter.getXData(copy=False)
            y = scatter.getYData(copy=False)
            z = scatter.getValueData(copy=False)

            xerror = scatter.getXErrorData(copy=False)
            if isinstance(xerror, float):
                xerror = xerror * numpy.ones(x.shape, dtype=numpy.float32)

            yerror = scatter.getYErrorData(copy=False)
            if isinstance(yerror, float):
                yerror = yerror * numpy.ones(x.shape, dtype=numpy.float32)

            xlabel = plot.getGraphXLabel()
            ylabel = plot.getGraphYLabel()

            return save_NXdata(
                filename,
                nxentry_name=entryPath,
                signal=z,
                axes=[x, y],
                signal_name="values",
                axes_names=["x", "y"],
                axes_long_names=[xlabel, ylabel],
                axes_errors=[xerror, yerror],
                title=plot.getGraphTitle())
Ejemplo n.º 4
0
    def _saveImageStack(self, plot, filename, nameFilter):
        """Save all images from the stack into a volume.

        :param str filename: The name of the file to write
        :param str nameFilter: The selected name filter
        :return: False if format is not supported or save failed,
                 True otherwise.
        :raises: ValueError if nameFilter is invalid
        """
        if not nameFilter == self.IMAGE_STACK_FILTER_NXDATA:
            raise ValueError('Wrong callback')
        entryPath = silx_io.SaveAction._selectWriteableOutputGroup(filename,
                                                                   parent=self)
        if entryPath is None:
            return False
        return save_NXdata(filename,
                           nxentry_name=entryPath,
                           signal=self.getStack(copy=False,
                                                returnNumpyArray=True)[0],
                           signal_name="image_stack")
Ejemplo n.º 5
0
    def _saveScatter(self, filename, nameFilter):
        """Save an image from the plot.

        :param str filename: The name of the file to write
        :param str nameFilter: The selected name filter
        :return: False if format is not supported or save failed,
                 True otherwise.
        """
        if nameFilter not in self.SCATTER_FILTERS:
            return False

        if nameFilter == self.SCATTER_FILTER_NXDATA:
            scatter = self.plot.getScatter()
            # TODO: we could get all scatters on this plot and concatenate their (x, y, values)
            x = scatter.getXData(copy=False)
            y = scatter.getYData(copy=False)
            z = scatter.getValueData(copy=False)

            xerror = scatter.getXErrorData(copy=False)
            if isinstance(xerror, float):
                xerror = xerror * numpy.ones(x.shape, dtype=numpy.float32)

            yerror = scatter.getYErrorData(copy=False)
            if isinstance(yerror, float):
                yerror = yerror * numpy.ones(x.shape, dtype=numpy.float32)

            xlabel = self.plot.getGraphXLabel()
            ylabel = self.plot.getGraphYLabel()

            return save_NXdata(filename,
                               signal=z,
                               axes=[x, y],
                               signal_name="values",
                               axes_names=["x", "y"],
                               axes_long_names=[xlabel, ylabel],
                               axes_errors=[xerror, yerror],
                               title=self.plot.getGraphTitle())
Ejemplo n.º 6
0
    def _saveImage(self, plot, filename, nameFilter):
        """Save an image from the plot.

        :param str filename: The name of the file to write
        :param str nameFilter: The selected name filter
        :return: False if format is not supported or save failed,
                 True otherwise.
        """
        if nameFilter not in self.DEFAULT_IMAGE_FILTERS:
            return False

        image = plot.getActiveImage()
        if image is None:
            qt.QMessageBox.warning(
                plot, "No Data", "No image to be saved")
            return False

        data = image.getData(copy=False)

        # TODO Use silx.io for writing files
        if nameFilter == self.IMAGE_FILTER_EDF:
            edfFile = EdfFile(filename, access="w+")
            edfFile.WriteImage({}, data, Append=0)
            return True

        elif nameFilter == self.IMAGE_FILTER_TIFF:
            tiffFile = TiffIO(filename, mode='w')
            tiffFile.writeImage(data, software='silx')
            return True

        elif nameFilter == self.IMAGE_FILTER_NUMPY:
            try:
                numpy.save(filename, data)
            except IOError:
                self._errorMessage('Save failed\n')
                return False
            return True

        elif nameFilter == self.IMAGE_FILTER_NXDATA:
            entryPath = self._selectWriteableOutputGroup(filename)
            if entryPath is None:
                return False
            xorigin, yorigin = image.getOrigin()
            xscale, yscale = image.getScale()
            xaxis = xorigin + xscale * numpy.arange(data.shape[1])
            yaxis = yorigin + yscale * numpy.arange(data.shape[0])
            xlabel, ylabel = self._getAxesLabels(image)
            interpretation = "image" if len(data.shape) == 2 else "rgba-image"

            return save_NXdata(filename,
                               nxentry_name=entryPath,
                               signal=data,
                               axes=[yaxis, xaxis],
                               signal_name="image",
                               axes_names=["y", "x"],
                               axes_long_names=[ylabel, xlabel],
                               title=plot.getGraphTitle(),
                               interpretation=interpretation)

        elif nameFilter in (self.IMAGE_FILTER_ASCII,
                            self.IMAGE_FILTER_CSV_COMMA,
                            self.IMAGE_FILTER_CSV_SEMICOLON,
                            self.IMAGE_FILTER_CSV_TAB):
            csvdelim, filetype = {
                self.IMAGE_FILTER_ASCII: (' ', 'txt'),
                self.IMAGE_FILTER_CSV_COMMA: (',', 'csv'),
                self.IMAGE_FILTER_CSV_SEMICOLON: (';', 'csv'),
                self.IMAGE_FILTER_CSV_TAB: ('\t', 'csv'),
                }[nameFilter]

            height, width = data.shape
            rows, cols = numpy.mgrid[0:height, 0:width]
            try:
                save1D(filename, rows.ravel(), (cols.ravel(), data.ravel()),
                       filetype=filetype,
                       xlabel='row',
                       ylabels=['column', 'value'],
                       csvdelim=csvdelim,
                       autoheader=True)

            except IOError:
                self._errorMessage('Save failed\n')
                return False
            return True

        elif nameFilter == self.IMAGE_FILTER_RGB_PNG:
            # Get displayed image
            rgbaImage = image.getRgbaImageData(copy=False)
            # Convert RGB QImage
            qimage = convertArrayToQImage(rgbaImage[:, :, :3])

            if qimage.save(filename, 'PNG'):
                return True
            else:
                _logger.error('Failed to save image as %s', filename)
                qt.QMessageBox.critical(
                    self.parent(),
                    'Save image as',
                    'Failed to save image')

        return False
Ejemplo n.º 7
0
    def _saveCurve(self, filename, nameFilter):
        """Save a curve from the plot.

        :param str filename: The name of the file to write
        :param str nameFilter: The selected name filter
        :return: False if format is not supported or save failed,
                 True otherwise.
        """
        if nameFilter not in self.CURVE_FILTERS:
            return False

        # Check if a curve is to be saved
        curve = self.plot.getActiveCurve()
        # before calling _saveCurve, if there is no selected curve, we
        # make sure there is only one curve on the graph
        if curve is None:
            curves = self.plot.getAllCurves()
            if not curves:
                self._errorMessage("No curve to be saved")
                return False
            curve = curves[0]

        if nameFilter in self.CURVE_FILTERS_TXT:
            filter_ = self.CURVE_FILTERS_TXT[nameFilter]
            fmt = filter_['fmt']
            csvdelim = filter_['delimiter']
            autoheader = filter_['header']
        else:
            # .npy or nxdata
            fmt, csvdelim, autoheader = ("", "", False)

        # If curve has no associated label, get the default from the plot
        xlabel = curve.getXLabel()
        if xlabel is None:
            xlabel = self.plot.getXAxis().getLabel()
        ylabel = curve.getYLabel()
        if ylabel is None:
            ylabel = self.plot.getYAxis().getLabel()

        if nameFilter == self.CURVE_FILTER_NXDATA:
            return save_NXdata(filename,
                               signal=curve.getYData(copy=False),
                               axes=[curve.getXData(copy=False)],
                               signal_name="y",
                               axes_names=["x"],
                               signal_long_name=ylabel,
                               axes_long_names=[xlabel],
                               signal_errors=curve.getYErrorData(copy=False),
                               axes_errors=[curve.getXErrorData(copy=True)],
                               title=self.plot.getGraphTitle())

        try:
            save1D(filename,
                   curve.getXData(copy=False),
                   curve.getYData(copy=False),
                   xlabel, [ylabel],
                   fmt=fmt,
                   csvdelim=csvdelim,
                   autoheader=autoheader)
        except IOError:
            self._errorMessage('Save failed\n')
            return False

        return True