コード例 #1
0
class SAXSViewerPlugin(DynImageView, QWidgetPlugin):
    def __init__(self,
                 header: NonDBHeader = None,
                 field: str = 'primary',
                 toolbar: QToolBar = None,
                 *args,
                 **kwargs):

        # Add q axes
        self.axesItem = PlotItem()
        self.axesItem.setLabel('bottom', u'q (Å⁻¹)')  # , units='s')
        self.axesItem.setLabel('left', u'q (Å⁻¹)')
        self.axesItem.axes['left']['item'].setZValue(10)
        self.axesItem.axes['top']['item'].setZValue(10)
        if 'view' not in kwargs: kwargs['view'] = self.axesItem

        super(SAXSViewerPlugin, self).__init__(**kwargs)
        self.axesItem.invertY(False)

        # Setup axes reset button
        self.resetAxesBtn = QPushButton('Reset Axes')
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(
            self.resetAxesBtn.sizePolicy().hasHeightForWidth())
        self.resetAxesBtn.setSizePolicy(sizePolicy)
        self.resetAxesBtn.setObjectName("resetAxes")
        self.ui.gridLayout.addWidget(self.resetAxesBtn, 2, 1, 1, 1)
        self.resetAxesBtn.clicked.connect(self.autoRange)

        # Setup LUT reset button
        self.resetLUTBtn = QPushButton('Reset LUT')
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(
            self.resetLUTBtn.sizePolicy().hasHeightForWidth())
        # self.resetLUTBtn.setSizePolicy(sizePolicy)
        # self.resetLUTBtn.setObjectName("resetLUTBtn")
        self.ui.gridLayout.addWidget(self.resetLUTBtn, 3, 1, 1, 1)
        self.resetLUTBtn.clicked.connect(self.autoLevels)

        # Hide ROI button and rearrange
        self.ui.roiBtn.setParent(None)
        self.ui.gridLayout.addWidget(self.ui.menuBtn, 1, 1, 1, 1)
        self.ui.gridLayout.addWidget(self.ui.graphicsView, 0, 0, 3, 1)

        # Setup coordinates label
        self.coordinatesLbl = QLabel('--COORDINATES WILL GO HERE--')
        self.ui.gridLayout.addWidget(self.coordinatesLbl,
                                     3,
                                     0,
                                     1,
                                     1,
                                     alignment=Qt.AlignHCenter)

        # Setup mask layer
        self.maskimage = pg.ImageItem(opacity=.25)
        self.view.addItem(self.maskimage)

        # Setup calibration layer
        self.calibrantimage = pg.ImageItem(opacity=.25)
        self.view.addItem(self.calibrantimage)

        # Empty ROI for later use
        self.maskROI = pg.PolyLineROI([],
                                      closed=True,
                                      movable=False,
                                      pen=pg.mkPen(color='r', width=2))
        self.maskROI.handlePen = pg.mkPen(color='r', width=2)
        self.maskROI.handleSize = 10
        self.view.addItem(self.maskROI)

        # Connect toolbar handlers
        self.toolbar = toolbar
        if self.toolbar:
            self.toolbar.modegroup.triggered.connect(self.redraw)

        # Setup results cache
        self.results = []

        # Set header
        if header: self.setHeader(header, field)

    def setHeader(self, header: NonDBHeader, field: str, *args, **kwargs):
        self.header = header
        self.field = field
        # make lazy array from document
        data = None
        try:
            data = header.meta_array(field)
        except IndexError:
            msg.logMessage(
                'Header object contained no frames with field '
                '{field}'
                '.', msg.ERROR)

        if data:
            kwargs['transform'] = QTransform(0, -1, 1, 0, 0, data.shape[-2])
            super(SAXSViewerPlugin, self).setImage(img=data, *args, **kwargs)

    def setMaskImage(self, mask):
        if mask is not None:
            self.maskimage.setImage(mask,
                                    lut=np.array([[0, 0, 0, 0],
                                                  [255, 0, 0, 255]]))
            self.maskimage.setTransform(
                QTransform(0, -1, 1, 0, 0, mask.shape[-2]))
        else:
            self.maskimage.clear()

    def setCalibrantImage(self, data):
        if data is not None:
            self.calibrantimage.setImage(data, lut=calibrantlut)
            self.calibrantimage.setTransform(QTransform(0, 1, 1, 0, 0, 0))
        else:
            self.calibrantimage.clear()

    def redraw(self):
        if not self.parent().currentWidget() == self:
            return  # Don't redraw when not shown

        for result in self.results:
            try:
                if self.toolbar.cakeaction.isChecked():
                    self.setImage(result['cake'].value)
                    break
                elif self.toolbar.remeshaction.isChecked():
                    self.setImage(result['remesh'].value
                                  )  # TODO: add checkbox to toolbar
                    break
                elif 'inpaint' in result:
                    self.setImage(result['inpaint'].value)
                    break

            except TypeError:
                continue
        else:  # if self.toolbar.rawaction.isChecked():
            self.setHeader(self.header, self.field)

    def setResults(self, results):
        self.results = results
        self.redraw()
コード例 #2
0
class EFIViewerPlugin(Crosshair, QCoordinates, DynImageView, QWidgetPlugin):
    def __init__(self,
                 header: NonDBHeader = None,
                 field: str = 'primary',
                 toolbar: QToolBar = None,
                 *args,
                 **kwargs):

        # Add axes
        self.axesItem = PlotItem()
        # self.axesItem.setLabel('bottom', u'q ()')  # , units='s')
        # self.axesItem.setLabel('bottom', u'q ()')  # , units='s')
        # self.axesItem.setLabel('left', u'q ()')
        self.axesItem.axes['left']['item'].setZValue(10)
        self.axesItem.axes['top']['item'].setZValue(10)
        if 'view' not in kwargs: kwargs['view'] = self.axesItem

        super(EFIViewerPlugin, self).__init__(**kwargs)
        self.axesItem.invertY(True)

        # Setup axes reset button
        self.resetAxesBtn = QPushButton('Reset Axes')
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(
            self.resetAxesBtn.sizePolicy().hasHeightForWidth())
        self.resetAxesBtn.setSizePolicy(sizePolicy)
        self.resetAxesBtn.setObjectName("resetAxes")
        self.ui.gridLayout.addWidget(self.resetAxesBtn, 2, 1, 1, 1)
        self.resetAxesBtn.clicked.connect(self.autoRange)

        # Setup LUT reset button
        self.resetLUTBtn = QPushButton('Reset LUT')
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(
            self.resetLUTBtn.sizePolicy().hasHeightForWidth())
        # self.resetLUTBtn.setSizePolicy(sizePolicy)
        # self.resetLUTBtn.setObjectName("resetLUTBtn")
        self.ui.gridLayout.addWidget(self.resetLUTBtn, 3, 1, 1, 1)
        self.resetLUTBtn.clicked.connect(self.autoLevels)

        # Hide ROI button and rearrange
        # self.ui.roiBtn.setParent(None)
        # self.ui.gridLayout.addWidget(self.ui.menuBtn, 1, 1, 1, 1)
        # self.ui.gridLayout.addWidget(self.ui.graphicsView, 0, 0, 3, 1)

        # Setup coordinates label
        # self.coordinatesLbl = QLabel('--COORDINATES WILL GO HERE--')
        # self.ui.gridLayout.addWidget(self.coordinatesLbl, 3, 0, 1, 1, alignment=Qt.AlignHCenter)

        # Set header
        if header: self.setHeader(header, field)

    def setHeader(self, header: NonDBHeader, field: str, *args, **kwargs):
        self.header = header
        self.field = field
        # make lazy array from document
        data = None
        try:
            data = header.meta_array(field)
        except IndexError:
            msg.logMessage(
                f'Header object contained no frames with field {field}.',
                msg.ERROR)

        for ii in header:
            msg.logMessage('header types = '.format(type(ii)))

        if data:
            # data = np.squeeze(data) #test for 1D spectra
            if data.ndim > 1:
                # kwargs['transform'] = QTransform(0, -1, 1, 0, 0, data.shape[-2])
                # NOTE PAE: for setImage:
                #   use setImage(xVals=timeVals) to set the values on the slider for 3D data
                try:
                    # Retrieve the metadata for pixel scale and units
                    descriptorsTee = itertools.tee(
                        header.descriptors,
                        1)[0]  # tee the descriptors generator once
                    _ = next(descriptorsTee)  # start document
                    headerTitle, md = next(
                        descriptorsTee)  # descriptor document with metadata
                    scale0 = (md['PhysicalSizeX'], md['PhysicalSizeY'])
                    units0 = (md['PhysicalSizeXUnit'], md['PhysicalSizeYUnit'])
                except:
                    scale0 = (1, 1)
                    units0 = ('', '')
                    msg.logMessage(
                        'EFIviewer: No pixel size or units detected')
                super(EFIViewerPlugin, self).setImage(img=data,
                                                      scale=scale0,
                                                      *args,
                                                      **kwargs)
                self.axesItem.setLabel('bottom', text='X', units=units0[0])
                self.axesItem.setLabel('left', text='Y', units=units0[1])