示例#1
0
    def __init__(self,
                 source,
                 axis=None,
                 scale=None,
                 title=None,
                 invertY=False,
                 minMax=None,
                 screen=None,
                 parent=None,
                 *args):
        ### Images soures
        self.initializeSources(source, axis=axis, scale=scale)
        #print('init')

        ### Gui Construction
        pg.QtGui.QWidget.__init__(self, parent, *args)
        #print('gui')

        if title is None:
            if isinstance(source, str):
                title = source
            elif isinstance(source, io.src.Source):
                title = source.location
            if title is None:
                title = 'DataViewer'
        self.setWindowTitle(title)
        self.resize(1600, 1200)
        #print('title')

        self.layout = pg.QtGui.QGridLayout(self)
        self.layout.setContentsMargins(0, 0, 0, 0)
        #print('layout')

        # image pane
        self.view = pg.ViewBox()
        self.view.setAspectLocked(True)
        self.view.invertY(invertY)

        self.graphicsView = pg.GraphicsView()
        self.graphicsView.setObjectName("GraphicsView")
        self.graphicsView.setCentralItem(self.view)

        splitter = pg.QtGui.QSplitter()
        splitter.setOrientation(pg.QtCore.Qt.Horizontal)
        splitter.setSizes([self.width() - 10, 10])
        self.layout.addWidget(splitter)

        image_splitter = pg.QtGui.QSplitter()
        image_splitter.setOrientation(pg.QtCore.Qt.Vertical)
        image_splitter.setSizePolicy(pg.QtGui.QSizePolicy.Expanding,
                                     pg.QtGui.QSizePolicy.Expanding)
        splitter.addWidget(image_splitter)
        #print('image')

        #  Image plots
        image_options = dict(clipToView=True,
                             autoDownsample=True,
                             autoLevels=False,
                             useOpenGL=None)
        self.image_items = [
            pg.ImageItem(s[self.source_slice[:s.ndim]], **image_options)
            for s in self.sources
        ]
        for i in self.image_items:
            i.setRect(
                pg.QtCore.QRect(0, 0, self.source_range_x,
                                self.source_range_y))
            i.setCompositionMode(pg.QtGui.QPainter.CompositionMode_Plus)
            self.view.addItem(i)
        self.view.setXRange(0, self.source_range_x)
        self.view.setYRange(0, self.source_range_y)
        #print('plots')

        # Slice Selector
        self.slicePlot = pg.PlotWidget()
        sizePolicy = pg.QtGui.QSizePolicy(pg.QtGui.QSizePolicy.Preferred,
                                          pg.QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.slicePlot.sizePolicy().hasHeightForWidth())
        self.slicePlot.setSizePolicy(sizePolicy)
        self.slicePlot.setMinimumSize(pg.QtCore.QSize(0, 40))
        self.slicePlot.setObjectName("roiPlot")
        #self.sliceCurve = self.slicePlot.plot()

        self.sliceLine = pg.InfiniteLine(0, movable=True)
        self.sliceLine.setPen((255, 255, 255, 200))
        self.sliceLine.setZValue(1)
        self.slicePlot.addItem(self.sliceLine)
        self.slicePlot.hideAxis('left')

        self.updateSlicer()

        self.sliceLine.sigPositionChanged.connect(self.updateSlice)
        #print('slice')

        # Axis Tools
        axis_tools_layout = pg.QtGui.QGridLayout()
        self.axis_buttons = []
        axesnames = ['x', 'y', 'z']
        for d in range(3):
            button = pg.QtGui.QRadioButton(axesnames[d])
            button.setMaximumWidth(50)
            axis_tools_layout.addWidget(button, 0, d)
            button.clicked.connect(ft.partial(self.setSliceAxis, d))
            self.axis_buttons.append(button)
        self.axis_buttons[self.source_axis].setChecked(True)
        axis_tools_widget = pg.QtGui.QWidget()
        axis_tools_widget.setLayout(axis_tools_layout)
        #print('axis')

        # coordinate label
        self.source_pointer = [0, 0, 0]
        self.source_label = pg.QtGui.QLabel("")
        axis_tools_layout.addWidget(self.source_label, 0, 3)

        self.graphicsView.scene().sigMouseMoved.connect(
            self.updateLabelFromMouseMove)
        #print('coords')

        #compose the image viewer
        image_splitter.addWidget(self.graphicsView)
        image_splitter.addWidget(self.slicePlot)
        image_splitter.addWidget(axis_tools_widget)
        image_splitter.setSizes([self.height() - 35 - 20, 35, 20])
        #print('viewer')

        # lut widgets
        if self.nsources == 1:
            cols = ['flame']
        elif self.nsources == 2:
            cols = ['purple', 'green']
        else:
            cols = np.array(['white', 'green', 'red', 'blue', 'purple'] *
                            self.nsources)[:self.nsources]

        self.luts = [
            LUT(image=i, color=c) for i, c in zip(self.image_items, cols)
        ]

        lut_layout = pg.QtGui.QGridLayout()

        lut_layout.setContentsMargins(0, 0, 0, 0)
        for d, l in enumerate(self.luts):
            lut_layout.addWidget(l, 0, d)
        lut_widget = pg.QtGui.QWidget()
        lut_widget.setLayout(lut_layout)
        lut_widget.setContentsMargins(0, 0, 0, 0)
        #lut_widget.setSizePolicy(pg.QtGui.QSizePolicy.Maximum, pg.QtGui.QSizePolicy.Expanding)
        lut_widget.setSizePolicy(pg.QtGui.QSizePolicy.Preferred,
                                 pg.QtGui.QSizePolicy.Expanding)
        splitter.addWidget(lut_widget)

        splitter.setStretchFactor(0, 1)
        splitter.setStretchFactor(1, 0)

        #self.source_levelMin = [];
        #self.source_levelMax = [];
        #for i,s in enumerate(self.sources):
        #  lmin, lmax = list(map(float, self.quickMinMax(s[self.source_slice])));
        #  self.levelMin.append(lmin);
        #  self.levelMax.append(lmax);
        #print('lut')

        # update scale
        for l in self.luts:
            l.range_buttons[1][2].click()
        if minMax is not None:
            self.setMinMax(minMax)

        self.show()
示例#2
0
def plot_spectrogram(stream, channels=None, w_size=(1920, 1080)):
    """
    plots spectrogram of data stream from inlet. one row per channel.

    Args:
        stream (neurol.streams object): neurol stream for a data source.
        channels: channels to plot. list/tuple of channel indices,
            or dict with indices as keys and names as values.
            Defaults to None (plots all channels w/o names).
        w_size (tuple, optional): initial size of window in pixels.
            Defaults to (1920, 1080).
    """

    # get info about stream
    n_channels = stream.n_channels
    s_rate = stream.sampling_rate
    buffer_length = stream.buffer_length

    # get format of frequencies and times
    freqs, ts, _ = signal.spectrogram(stream.buffer[:, 0],
                                      s_rate,
                                      mode='magnitude')
    ts = np.max(ts) - ts  # reverse ts s.t. it takes the range [-max_ts, 0]

    # initialize pyqt graph app, window
    win = pg.GraphicsLayoutWidget(show=True)
    win.setWindowTitle('Spectrogram Live Plot')
    app = pg.QtGui.QApplication
    win.resize(w_size[0], w_size[1])

    # interpret image data as row-major to match scipy output
    pg.setConfigOptions(imageAxisOrder='row-major')

    # initialize plots/curves
    plots = []
    plot_imgs = []
    #plot_hists = []

    if channels is None:
        channels = list(range(n_channels))

    # TODO: implement x-axis time range using ts defined above
    # TODO: implement y-axis frequency range using freqs defined above
    if isinstance(channels, (list, tuple)):
        for ch_ind in channels:
            plt = win.addPlot(title=f'channel {ch_ind}')
            plt.setMouseEnabled(x=False, y=False)

            img = pg.ImageItem()
            plt.addItem(img)

            # interactive histogram
            hist = pg.HistogramLUTItem()
            # link the histogram to the image
            hist.setImageItem(img)
            # set histogram gradient
            hist.gradient.restoreState({
                'mode':
                'rgb',
                'ticks': [(0.5, (0, 182, 188, 255)), (1.0, (246, 111, 0, 255)),
                          (0.0, (75, 0, 113, 255))]
            })

            win.addItem(hist)

            plots.append(plt)
            plot_imgs.append(img)

            win.nextRow()

        ch_inds = list(channels)

    elif isinstance(channels, dict):
        for ch_ind, ch_name in channels.items():

            plt = win.addPlot(title=f'{ch_name} channel')
            plt.setMouseEnabled(x=False, y=False)

            img = pg.ImageItem()
            plt.addItem(img)

            # interactive histogram
            hist = pg.HistogramLUTItem()
            # link the histogram to the image
            hist.setImageItem(img)
            # set histogram gradient
            hist.gradient.restoreState({
                'mode':
                'rgb',
                'ticks': [(0.5, (0, 182, 188, 255)), (1.0, (246, 111, 0, 255)),
                          (0.0, (75, 0, 113, 255))]
            })

            win.addItem(hist)

            plots.append(plt)
            plot_imgs.append(img)

            win.nextRow()

        ch_inds = list(channels.keys())

    else:
        raise ValueError('`channels` argument should be list, tuple, or dict')

    # label bottom plot's x-axis
    plots[-1].setLabel('bottom', 'time', units='s')

    # process initialization events
    app.processEvents()

    running = True
    while running:
        if stream.update_buffer():  # update buffer if new data available

            for ch_ind, plot_img in zip(ch_inds, plot_imgs):
                freqs, _, Sxx = signal.spectrogram(stream.buffer[:, ch_ind],
                                                   s_rate,
                                                   mode='magnitude')

                # FIXME: temp fix of outliers
                Sxx_clipped = np.clip(Sxx, 0, 100)
                plot_img.setImage(Sxx_clipped)

            app.processEvents()

        if not win.isVisible():
            running = False
            app.quit()
示例#3
0
text = """
This example demonstrates the use of GraphicsLayout to arrange items in a grid.<br>
The items added to the layout must be subclasses of QGraphicsWidget (this includes <br>
PlotItem, ViewBox, LabelItem, and GrphicsLayout itself).
"""
l.addLabel(text, col=1, colspan=4)
l.nextRow()

## Put vertical label on left side
l.addLabel('Long Vertical Label', angle=-90, rowspan=3)

## Add 3 plots into the first row (automatic position)
p1 = l.addPlot(title="Plot 1")
p2 = l.addPlot(title="Plot 2")
vb = l.addViewBox(lockAspect=True)
img = pg.ImageItem(np.random.normal(size=(100,100)))
vb.addItem(img)
vb.autoRange()


## Add a sub-layout into the second row (automatic position)
## The added item should avoid the first column, which is already filled
l.nextRow()
l2 = l.addLayout(colspan=3, border=(50,0,0))
l2.setContentsMargins(10, 10, 10, 10)
l2.addLabel("Sub-layout: this layout demonstrates the use of shared axes and axis labels", colspan=3)
l2.nextRow()
l2.addLabel('Vertical Axis Label', angle=-90, rowspan=2)
p21 = l2.addPlot()
p22 = l2.addPlot()
l2.nextRow()
示例#4
0
    def __init__(self, parent=None):
        super(BinaryPlayer, self).__init__(parent)
        pg.setConfigOptions(imageAxisOrder='row-major')
        self.setGeometry(70, 70, 1070, 1070)
        self.setWindowTitle('View registered binary')
        self.cwidget = QtGui.QWidget(self)
        self.setCentralWidget(self.cwidget)
        self.l0 = QtGui.QGridLayout()
        #layout = QtGui.QFormLayout()
        self.cwidget.setLayout(self.l0)
        #self.p0 = pg.ViewBox(lockAspect=False,name='plot1',border=[100,100,100],invertY=True)
        self.win = pg.GraphicsLayoutWidget()
        # --- cells image
        self.win = pg.GraphicsLayoutWidget()
        self.win.move(600, 0)
        self.win.resize(1000, 500)
        self.l0.addWidget(self.win, 1, 1, 13, 14)
        layout = self.win.ci.layout
        self.loaded = False

        # A plot area (ViewBox + axes) for displaying the image
        self.vmain = pg.ViewBox(lockAspect=True, invertY=True, name="plot1")
        self.win.addItem(self.vmain, row=0, col=0)
        self.vmain.setMenuEnabled(False)
        self.imain = pg.ImageItem()
        self.vmain.addItem(self.imain)
        self.maskmain = pg.ImageItem()

        # side box
        self.vside = pg.ViewBox(lockAspect=True, invertY=True)
        self.vside.setMenuEnabled(False)
        self.iside = pg.ImageItem()
        self.vside.addItem(self.iside)
        self.maskside = pg.ImageItem()

        # view red channel
        self.redbox = QtGui.QCheckBox("view red channel")
        self.redbox.setStyleSheet("color: white;")
        self.redbox.setEnabled(False)
        self.redbox.toggled.connect(self.add_red)
        self.l0.addWidget(self.redbox, 0, 5, 1, 1)
        # view masks
        self.maskbox = QtGui.QCheckBox("view masks")
        self.maskbox.setStyleSheet("color: white;")
        self.maskbox.setEnabled(False)
        self.maskbox.toggled.connect(self.add_masks)
        self.l0.addWidget(self.maskbox, 0, 6, 1, 1)
        # view raw binary
        self.rawbox = QtGui.QCheckBox("view raw binary")
        self.rawbox.setStyleSheet("color: white;")
        self.rawbox.setEnabled(False)
        self.rawbox.toggled.connect(self.add_raw)
        self.l0.addWidget(self.rawbox, 0, 7, 1, 1)
        # view zstack
        self.zbox = QtGui.QCheckBox("view z-stack")
        self.zbox.setStyleSheet("color: white;")
        self.zbox.setEnabled(False)
        self.zbox.toggled.connect(self.add_zstack)
        self.l0.addWidget(self.zbox, 0, 8, 1, 1)

        self.p1 = self.win.addPlot(name='plot1', row=1, col=0, colspan=2)
        self.p1.setMouseEnabled(x=True, y=False)
        self.p1.setMenuEnabled(False)
        self.scatter1 = pg.ScatterPlotItem()
        self.p1.addItem(self.scatter1)

        self.p2 = self.win.addPlot(name='plot2', row=2, col=0, colspan=2)
        self.p2.setMouseEnabled(x=True, y=False)
        self.p2.setMenuEnabled(False)
        self.scatter2 = pg.ScatterPlotItem()
        self.p2.addItem(self.scatter2)
        self.p2.setXLink('plot1')

        #self.p2.autoRange(padding=0.01)
        self.win.ci.layout.setRowStretchFactor(0, 5)
        self.movieLabel = QtGui.QLabel("No ops chosen")
        self.movieLabel.setStyleSheet("color: white;")
        self.movieLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.nframes = 0
        self.cframe = 0
        self.createButtons()
        # create ROI chooser
        self.l0.addWidget(QtGui.QLabel(''), 2, 0, 1, 2)
        qlabel = QtGui.QLabel(self)
        qlabel.setText("<font color='white'>Selected ROI:</font>")
        self.l0.addWidget(qlabel, 3, 0, 1, 2)
        self.ROIedit = QtGui.QLineEdit(self)
        self.ROIedit.setValidator(QtGui.QIntValidator(0, 10000))
        self.ROIedit.setText('0')
        self.ROIedit.setFixedWidth(45)
        self.ROIedit.setAlignment(QtCore.Qt.AlignRight)
        self.ROIedit.returnPressed.connect(self.number_chosen)
        self.l0.addWidget(self.ROIedit, 4, 0, 1, 1)
        # create frame slider
        self.frameLabel = QtGui.QLabel("Current frame:")
        self.frameLabel.setStyleSheet("color: white;")
        self.frameNumber = QtGui.QLabel("0")
        self.frameNumber.setStyleSheet("color: white;")
        self.frameSlider = QtGui.QSlider(QtCore.Qt.Horizontal)
        #self.frameSlider.setTickPosition(QtGui.QSlider.TicksBelow)
        self.frameSlider.setTickInterval(5)
        self.frameSlider.setTracking(False)
        self.frameDelta = 10
        self.l0.addWidget(QtGui.QLabel(''), 12, 0, 1, 1)
        self.l0.setRowStretch(12, 1)
        self.l0.addWidget(self.frameLabel, 13, 0, 1, 2)
        self.l0.addWidget(self.frameNumber, 14, 0, 1, 2)
        self.l0.addWidget(self.frameSlider, 13, 2, 14, 13)
        self.l0.addWidget(QtGui.QLabel(''), 14, 1, 1, 1)
        ll = QtGui.QLabel(
            '(when paused, left/right arrow keys can move slider)')
        ll.setStyleSheet("color: white;")
        self.l0.addWidget(ll, 16, 0, 1, 3)
        #speedLabel = QtGui.QLabel("Speed:")
        #self.speedSpinBox = QtGui.QSpinBox()
        #self.speedSpinBox.setRange(1, 9999)
        #self.speedSpinBox.setValue(100)
        #self.speedSpinBox.setSuffix("%")
        self.frameSlider.valueChanged.connect(self.go_to_frame)
        self.l0.addWidget(self.movieLabel, 0, 0, 1, 5)
        self.updateFrameSlider()
        self.updateButtons()
        self.updateTimer = QtCore.QTimer()
        self.updateTimer.timeout.connect(self.next_frame)
        self.cframe = 0
        self.loaded = False
        self.Floaded = False
        self.raw_on = False
        self.red_on = False
        self.wraw = False
        self.wred = False
        self.wraw_wred = False
        self.win.scene().sigMouseClicked.connect(self.plot_clicked)
        # if not a combined recording, automatically open binary
        if hasattr(parent, 'ops'):
            if parent.ops['save_path'][-8:] != 'combined':
                fileName = os.path.abspath(
                    os.path.join(parent.basename, 'ops.npy'))
                print(fileName)
                self.Fcell = parent.Fcell
                self.stat = parent.stat
                self.Floaded = True
                self.openFile(fileName, True)
示例#5
0
for idx in range(width):
    modulation[idx] = -0.05 * np.sin(200 * np.pi * idx / width)
for idx in range(height):
    img[:, idx] = gradient + (idx / (height - 1)) * modulation

num_bars = 0

lw.addLabel('=== local color maps ===')
num_bars += 1
lw.nextRow()
list_of_maps = pg.colormap.listMaps()
for map_name in list_of_maps:
    num_bars += 1
    lw.addLabel(map_name)
    cmap = pg.colormap.get(map_name)
    imi = pg.ImageItem()
    imi.setImage(img)
    imi.setLookupTable(cmap.getLookupTable(alpha=True))
    vb = lw.addViewBox(lockAspect=True, enableMouse=False)
    vb.addItem(imi)
    lw.nextRow()

lw.addLabel('=== Matplotlib import ===')
num_bars += 1
lw.nextRow()
list_of_maps = pg.colormap.listMaps('matplotlib')
for map_name in list_of_maps:
    num_bars += 1
    lw.addLabel(map_name)
    cmap = pg.colormap.get(map_name, source='matplotlib', skipCache=True)
    if cmap is not None:
示例#6
0
    def __init__(self, annots1, annots2, parent=None):
        QDialog.__init__(self, parent)
        self.setWindowTitle('Compare Call Pairs')
        self.setWindowIcon(QIcon('img/Avianz.ico'))
        self.setWindowFlags((self.windowFlags() ^ Qt.WindowContextHelpButtonHint) | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint)

        self.parent = parent
        self.rec1 = annots1[0].recname
        self.rec2 = annots2[0].recname

        self.annots1 = annots1
        self.annots2 = annots2

        # Set colour map
        # cmap = self.config['cmap']  # TODO Read these from config
        self.lut = colourMaps.getLookupTable("Grey")
        self.cmapInverted = False

        self.topLabel = QLabel("Comparing recorders %s (top) and %s (bottom)" %(self.rec1, self.rec2))
        self.labelPair = QLabel()

        # Volume, brightness and contrast sliders. (NOTE hardcoded init)
        self.specControls = SupportClasses_GUI.BrightContrVol(80, 20, False)
        self.specControls.colChanged.connect(self.setColourLevels)
        # self.specControls.volChanged.connect(self.volSliderMoved)
        # TODO add volume and playback at some point

        # spectrograms
        self.wPlot = pg.GraphicsLayoutWidget()
        self.pPlot1 = self.wPlot.addViewBox(enableMouse=False, row=0, col=1)
        self.pPlot2 = self.wPlot.addViewBox(enableMouse=False, row=1, col=1)

        self.plot1 = pg.ImageItem()
        self.plot2 = pg.ImageItem()
        self.pPlot1.addItem(self.plot1)
        self.pPlot2.addItem(self.plot2)

        # Y (freq) axis
        self.sg_axis1 = pg.AxisItem(orientation='left')
        self.sg_axis1.linkToView(self.pPlot1)
        self.sg_axis2 = pg.AxisItem(orientation='left')
        self.sg_axis2.linkToView(self.pPlot2)
        self.wPlot.addItem(self.sg_axis1, row=0, col=0)
        self.wPlot.addItem(self.sg_axis2, row=1, col=0)

        # The buttons to move through the overview
        self.leftBtn = QToolButton()
        self.leftBtn.setArrowType(Qt.LeftArrow)
        self.leftBtn.clicked.connect(self.moveLeft)
        self.leftBtn.setToolTip("View previous pair")
        self.rightBtn = QToolButton()
        self.rightBtn.setArrowType(Qt.RightArrow)
        self.rightBtn.clicked.connect(self.moveRight)
        self.rightBtn.setToolTip("View next pair")
        self.leftBtn.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.MinimumExpanding)
        self.rightBtn.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.MinimumExpanding)

        # accept / close
        closeBtn = QPushButton("Close")
        closeBtn.clicked.connect(self.accept)

        # init GUI with page 1 data
        self.currpage = 1
        self.leftBtn.setEnabled(False)
        if len(self.annots1)==1:
            self.rightBtn.setEnabled(False)
        self.setData()

        # layout
        box = QVBoxLayout()
        box.addWidget(self.topLabel)
        box.addWidget(self.labelPair)
        box.addWidget(self.specControls)
        midHBox = QHBoxLayout()
        midHBox.addWidget(self.leftBtn)
        midHBox.addWidget(self.wPlot, stretch=10)
        midHBox.addWidget(self.rightBtn)
        box.addLayout(midHBox)
        box.addWidget(closeBtn)
        self.setLayout(box)
示例#7
0
    def __init__(self, *args, experiment=None, **kwargs):
        """
        :param experiment: experiment to which this belongs
                           (:class:Experiment <stytra.Experiment> object)
        """

        super().__init__(*args, **kwargs)

        self.experiment = experiment
        if experiment is not None:
            self.camera = experiment.camera
            experiment.gui_timer.timeout.connect(self.retrieve_image)
        else:
            self.gui_timer = QTimer()
            self.gui_timer.setSingleShot(False)

        self.control_params = self.experiment.camera_state

        # Create the layout for the camera view:
        self.camera_display_widget = pg.GraphicsLayoutWidget()

        # Display area for showing the camera image:
        self.display_area = pg.ViewBox(lockAspect=1, invertY=False)
        self.display_area.setRange(QRectF(0, 0, 640, 480),
                                   update=True,
                                   disableAutoRange=True)
        self.scale = 640

        self.display_area.invertY(True)
        # Image to which the frame will be set, initially black:
        self.image_item = pg.ImageItem()
        self.image_item.setImage(np.zeros((640, 480), dtype=np.uint8))
        self.display_area.addItem(self.image_item)

        self.camera_display_widget.addItem(self.display_area)

        # Queue of frames coming from the camera
        if hasattr(experiment, "frame_dispatcher"):
            self.frame_queue = self.experiment.frame_dispatcher.gui_queue
        else:
            self.frame_queue = self.camera.frame_queue

        # Queue of control parameters for the camera:
        self.control_queue = self.camera.control_queue
        self.camera_rotation = self.camera.rotation

        self.layout = QVBoxLayout()
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.layout.addWidget(self.camera_display_widget)

        self.layout_control = QHBoxLayout()
        self.layout_control.setContentsMargins(10, 0, 10, 10)

        self.btn_pause = ControlToggleIcon(
            self.experiment.camera_state,
            "paused",
            icon_on=get_icon("play"),
            icon_off=get_icon("pause"),
            action_off="Pause",
            action_on="Play",
        )
        self.layout_control.addWidget(self.btn_pause)

        if hasattr(self.experiment.camera_state, "replay"):
            self.experiment.camera_state.replay = False

            self.btn_rewind = ControlToggleIcon(
                self.experiment.camera_state,
                "replay",
                icon_on=get_icon("rewind"),
                action_off="Resume",
                action_on="Replay",
            )
            self.layout_control.addWidget(self.btn_rewind)

        if self.control_queue is not None:
            self.btn_camera_param = IconButton(icon_name="edit_camera",
                                               action_name="Configure camera")
            self.btn_camera_param.clicked.connect(self.show_params_gui)
            self.layout_control.addWidget(self.btn_camera_param)

        self.btn_capture = IconButton(icon_name="camera_flash",
                                      action_name="Capture frame")
        self.btn_capture.clicked.connect(self.save_image)
        self.layout_control.addWidget(self.btn_capture)

        self.btn_autorange = ToggleIconButton(icon_off="autoscale",
                                              icon_on="autoscaleOFF",
                                              action_on="Autoscale")
        self.layout_control.addWidget(self.btn_autorange)

        self.layout.addLayout(self.layout_control)
        self.current_image = None

        self.setLayout(self.layout)
        self.current_frame_time = None

        self.param_widget = None
示例#8
0
    def saveDisp(self):
        print("saving main window")
        mydialog = QtGui.QFileDialog()
        options = mydialog.Options()
        thedir = str(
            mydialog.getExistingDirectory(options=options, caption="Image output directory")
        )
        print("thedir=", thedir)
        thename = self.map.namebase + self.map.name

        # make a square background
        thesquarewin = pg.ImageItem()
        thesquarewin.translate(0, 0)
        maximpervox = np.max([self.impixpervoxx, self.impixpervoxy, self.impixpervoxz])
        maxdim = np.max([self.xdim, self.ydim, self.zdim])
        thesquarewin.scale(maximpervox, maximpervox)
        thesquarewin.setImage(np.zeros((maxdim, maxdim), dtype=float), autoLevels=True)

        # make a rectangular background
        therectwin = pg.ImageItem()
        therectwin.translate(0, 0)
        therectwin.scale(maximpervox, maximpervox)
        therectwin.setImage(np.zeros((maxdim // 10, maxdim), dtype=float), autoLevels=True)

        (thecolorbarfgwin, thecolorbarbgwin, thecolorbarviewbox, colorbarvals,) = newColorbar(
            0, 0, maximpervox, maximpervox, maxdim
        )
        cbim = self.applyLUT(
            colorbarvals, (colorbarvals * 0 + 1).astype("int"), self.map.theLUT, 0.0, 1.0,
        )
        thecolorbarfgwin.setImage(cbim.astype("float"))
        thecolorbarbgwin.setImage(cbim.astype("float"), autoLevels=True)
        print(thecolorbarfgwin)
        print(thecolorbarbgwin)
        print(thecolorbarviewbox)

        self.saveandcomposite(
            thesquarewin,
            self.axviewwin,
            self.axviewbgwin,
            thename + "_ax",
            thedir,
            self.xdim * self.xsize,
            self.ydim * self.ysize,
        )
        self.saveandcomposite(
            thesquarewin,
            self.corviewwin,
            self.corviewbgwin,
            thename + "_cor",
            thedir,
            self.xdim * self.xsize,
            self.zdim * self.zsize,
        )
        self.saveandcomposite(
            thesquarewin,
            self.sagviewwin,
            self.sagviewbgwin,
            thename + "_sag",
            thedir,
            self.ydim * self.ysize,
            self.zdim * self.zsize,
        )
        """self.saveandcomposite(therectwin,
                              thecolorbarfgwin, thecolorbarbgwin,
                              thename + '_colorbar', thedir,
                              maximpervox * maxdim // 10,
                              maximpervox * maxdim)"""

        with open(os.path.join(thedir, thename + "_lims.txt"), "w") as FILE:
            FILE.writelines(str(self.map.dispmin) + "\t" + str(self.map.dispmax))
示例#9
0
    def mix_images(self):
        component1Enum = None
        component2Enum = None
        percentage_of_component1_image1 = 0.0
        percentage_of_component2_image1 = 0.0
        outputText = self.ui.comboBox_output.currentText()
        component1ComponentText = self.ui.component1_component_comboBox.currentText(
        )
        component1ImageText = self.ui.component1_image_comboBox.currentText()
        component2ComponentText = self.ui.component2_component_comboBox.currentText(
        )
        component2ImageText = self.ui.component2_image_comboBox.currentText()
        if (outputText == "Choose output 1 or 2"
                or component1ComponentText == "choose component"
                or component1ImageText == "Choose image 1 or 2"
                or component2ComponentText == "choose component"
                or component2ImageText == "Choose image 1 or 2"):
            self.show_popup("fill all comboboxes")
            return
        if ((component1ComponentText == "Magnitude"
             and component2ComponentText != "Phase")
                and (component1ComponentText == "Magnitude"
                     and component2ComponentText != "Uni_Phase")):
            self.show_popup("you cannot mix by these components")
            return
        elif ((component1ComponentText == "Phase"
               and component2ComponentText != "Magnitude")
              and (component1ComponentText == "Phase"
                   and component2ComponentText != "Uni_Mag")):
            self.show_popup("you cannot mix by these components")
            return
        elif ((component1ComponentText == "Uni_Mag"
               and component2ComponentText != "Phase")
              and (component1ComponentText == "Uni_Mag"
                   and component2ComponentText != "Uni_Phase")):
            self.show_popup("you cannot mix by these components")
            return
        elif ((component1ComponentText == "Uni_Phase"
               and component2ComponentText != "Magnitude")
              and (component1ComponentText == "Uni_Phase"
                   and component2ComponentText != "Uni_Mag")):
            self.show_popup("you cannot mix by these components")
            return
        if (component1ComponentText == "Real"
                and component2ComponentText != "Imag"):
            self.show_popup("you cannot mix by these components")
            return
        elif (component1ComponentText == "Imag"
              and component2ComponentText != "Real"):
            self.show_popup("you cannot mix by these components")
            return

        if (component1ComponentText == "Magnitude"):
            component1Enum = Modes.MagnitudeComponent
        elif (component1ComponentText == "Phase"):
            component1Enum = Modes.PhaseComponent
        elif (component1ComponentText == "Real"):
            component1Enum = Modes.RealComponent
        elif (component1ComponentText == "Imag"):
            component1Enum = Modes.ImagComponent

        if (component2ComponentText == "Magnitude"):
            component2Enum = Modes.MagnitudeComponent
        elif (component2ComponentText == "Phase"):
            component2Enum = Modes.PhaseComponent
        elif (component2ComponentText == "Real"):
            component2Enum = Modes.RealComponent
        elif (component2ComponentText == "Imag"):
            component2Enum = Modes.ImagComponent
        if (component1ImageText == "Image1"):
            percentage_of_component1_image1 = self.ui.component1_Percentage.value(
            ) * 0.01
            if (component1ComponentText == "Uni_Mag"):
                component1Enum = Modes.Uni_Magnitude_Image_1
            elif (component1ComponentText == "Uni_Phase"):
                component1Enum = Modes.Uni_Phase_Image_1
        else:
            percentage_of_component1_image1 = (
                100 - self.ui.component1_Percentage.value()) * 0.01
            if (component1ComponentText == "Uni_Mag"):
                component1Enum = Modes.Uni_Magnitude_Image_2
            elif (component1ComponentText == "Uni_Phase"):
                component1Enum = Modes.Uni_Phase_Image_2
        if (component2ImageText == "Image1"):
            percentage_of_component2_image1 = self.ui.component2_Percentage.value(
            ) * 0.01
            if (component2ComponentText == "Uni_Mag"):
                component2Enum = Modes.Uni_Magnitude_Image_1
            elif (component2ComponentText == "Uni_Phase"):
                component2Enum = Modes.Uni_Phase_Image_1
        else:
            percentage_of_component2_image1 = (
                100 - self.ui.component2_Percentage.value()) * 0.01
            if (component2ComponentText == "Uni_Mag"):
                component2Enum = Modes.Uni_Magnitude_Image_2
            elif (component2ComponentText == "Uni_Phase"):
                component2Enum = Modes.Uni_Phase_Image_2
        logging.info("Components for mixing are : " + component1ComponentText +
                     " , " + component2ComponentText)
        output = imageClass.mixTwoImages(self.image_arr[0], self.image_arr[1],
                                         percentage_of_component1_image1,
                                         percentage_of_component2_image1,
                                         component1Enum, component2Enum)
        image = pg.ImageItem(output)
        image.rotate(270)
        if (outputText == "Output1"):
            logging.info("user chose mixture to be shown in Output1 window")
            self.ui.output1_graphicsView.clear()
            self.ui.output1_graphicsView.addItem(image)
        elif (outputText == "Output2"):
            logging.info("user chose mixture to be shown in Output2 window")
            self.ui.output2_graphicsView.clear()
            self.ui.output2_graphicsView.addItem(image)
    def add_components(self):

        # Widgets
        self.graphics_widget = pg.GraphicsLayoutWidget()
        self.graphics_widget.view = self.graphics_widget.addViewBox()
        ## lock the aspect ratio so pixels are always square
        self.graphics_widget.view.setAspectLocked(True)
        ## Create image item
        self.graphics_widget.img = pg.ImageItem(border='w')
        self.graphics_widget.view.addItem(self.graphics_widget.img)

        self.playButton = QtGui.QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setCheckable(True)
        self.playButton.setIcon(self.style().standardIcon(
            QtWidgets.QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.recordButton = QtGui.QPushButton()
        self.recordButton.setEnabled(False)
        self.recordButton.setCheckable(True)
        self.recordButton.setIcon(self.style().standardIcon(
            QtWidgets.QStyle.SP_DialogYesButton))
        self.recordButton.clicked.connect(self.record)

        self.positionSlider = QtGui.QSlider(QtCore.Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.setEnabled(False)
        self.positionSlider_prevValue = 0

        self.positionSpinBox = QtGui.QDoubleSpinBox()
        self.positionSpinBox.setRange(0, 0)
        self.positionSpinBox.setSingleStep(0.01)
        self.positionSpinBox.setEnabled(False)
        self.positionSpinBox_prevValue = 0

        # Add ROI
        self.roi_pos = (0.5, 0.5)
        self.roi_size = (100, 100)

        self.ROI = pg.CircleROI(self.roi_pos,
                                self.roi_size,
                                scaleSnap=True,
                                translateSnap=True)
        # self.ROI.addScalehandle((0,0),(1,1))
        self.graphics_widget.view.addItem(self.ROI)
        self.ROI.hide()
        self.ROI.sigRegionChanged.connect(self.updateROI)
        self.roi_pos = self.ROI.pos()
        self.roi_size = self.ROI.size()

        # Connections
        self.positionSlider.valueChanged.connect(self.positionSpinBox_setValue)
        self.positionSpinBox.valueChanged.connect(self.positionSlider_setValue)

        # Create layouts to place inside widget
        controlLayout = QtGui.QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)
        controlLayout.addWidget(self.positionSpinBox)
        controlLayout.addWidget(self.recordButton)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.graphics_widget)
        layout.addLayout(controlLayout)

        self.setLayout(layout)
示例#11
0
 def create_widget(self, parent):
     widget = PgImageWidget(parent, self)
     self.image_item = pg.ImageItem()
     widget.addItem(self.image_item)
     self.image  # note: need read image to trigger observers
     return widget
示例#12
0
    win = QtGui.QMainWindow()
    win.resize(1600, 600)
    win.setWindowTitle(sys.argv[0])

    glw = QtGui.QWidget()
    #glw = pg.GraphicsLayoutWidget()
    l = QtGui.QGridLayout()
    glw.setLayout(l)

    win.setCentralWidget(glw)
    #view = glw.addViewBox()
    v = pg.GraphicsView()
    view = pg.ViewBox()
    view.setAspectLocked(True)
    v.setCentralItem(view)
    img = pg.ImageItem(border='y')
    view.addItem(img)
    #img.setTitle('test')

    v2 = pg.GraphicsView()
    l2 = pg.GraphicsLayout()
    v2.setCentralItem(l2)
    plot1 = l2.addPlot()
    curve1 = plot1.plot(pen=(200, 200, 200),
                        symbolBrush=(0, 255, 0),
                        symbolPen='w')
    #  plot1.setYRange(0.01, 1000000)
    plot1.setLogMode(x=False, y=p.param("LogScaleRow?").value())
    l2.nextRow()
    plot2 = l2.addPlot()
    curve2 = plot2.plot(pen=(200, 200, 200),
示例#13
0
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)

        self.logic = MainLogic()

        self.setWindowFlags(QtCore.Qt.Window)
        self.setWindowTitle("Defect Detector")
        self.open_avi_action = QtWidgets.QAction("Open video...")
        self.open_avi_action.triggered.connect(self.open_avi)
        self.open_csv_action = QtWidgets.QAction("Open CSV...")
        self.open_csv_action.triggered.connect(self.open_csv)
        self.open_csv_action.setShortcut("Ctrl+O")

        self.menuBar().addAction(self.open_avi_action)
        self.menuBar().addAction(self.open_csv_action)

        self.gaps_list = QtWidgets.QListView()
        self.gaps_model = QtGui.QStandardItemModel()
        self.gaps_list.setModel(self.gaps_model)
        self.gaps_list.pressed["const QModelIndex&"].connect(
            self.on_select_element)
        self.gaps_list.activated["const QModelIndex&"].connect(
            self.on_select_element)

        self.info_label = QtWidgets.QLabel("Мин. зазор, мм")
        self.gap_limit_spinbox = QtWidgets.QSpinBox()
        self.gap_limit_spinbox.setRange(0, 1000)
        self.gap_limit_spinbox.setValue(0)
        self.gap_limit_spinbox.setSingleStep(1)
        self.gap_limit_spinbox.valueChanged["int"].connect(
            self.change_gap_limit)
        self.rail_combo = QtWidgets.QComboBox()
        self.rail_combo.addItems(self.logic.RAILS)
        self.rail_combo.currentIndexChanged["int"].connect(
            self.change_rail_combo)

        self.hbox_filter = QtWidgets.QHBoxLayout()
        self.hbox_filter.addWidget(self.info_label, stretch=0)
        self.hbox_filter.addWidget(self.gap_limit_spinbox, stretch=10)
        self.hbox_filter.addWidget(self.rail_combo, stretch=10)

        self.vbox_data = QtWidgets.QVBoxLayout()
        self.vbox_data.addLayout(self.hbox_filter)
        self.vbox_data.addWidget(self.gaps_list)
        self.board_widget = QtWidgets.QWidget()
        self.board_widget.setLayout(self.vbox_data)

        self.plot_area = self.create_plot_area(self)
        self.image_item = pg.ImageItem()
        self.plot_area.addItem(self.image_item)

        self.plot_area_nn = self.create_plot_area(self)
        self.image_item_nn = pg.ImageItem()
        self.plot_area_nn.addItem(self.image_item_nn)

        self.splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
        self.splitter.addWidget(self.board_widget)
        self.splitter2 = QtWidgets.QSplitter(QtCore.Qt.Vertical)
        self.splitter2.addWidget(self.plot_area)
        self.splitter2.addWidget(self.plot_area_nn)
        self.splitter.addWidget(self.splitter2)

        self.vbox = QtWidgets.QVBoxLayout(self)
        self.vbox.addWidget(self.splitter)
        self.setCentralWidget(QtWidgets.QWidget(self))
        self.centralWidget().setLayout(self.vbox)
        self.showMaximized()

        self.rectangle_region = None
示例#14
0
    def create_ui(self):
        """
        Setup the whole UI of the radar data viewer. Creates several member variables for sliders, comboBoxes etc.
        :return: None
        """
        self.setWindowTitle("Radar Data Viewer")

        self.main_grid_layout = QtWidgets.QGridLayout()
        self.central_widget = QtWidgets.QWidget()
        self.central_widget.setLayout(self.main_grid_layout)
        self.setCentralWidget(self.central_widget)

        self.plot_item = pg.PlotWidget()
        self.plot_item.setBackground("#0B0F14")
        self.main_grid_layout.addWidget(self.plot_item, 0, 0)

        # Options Dock Widget
        self.options_layout = QtWidgets.QVBoxLayout()
        self.options_layout.setAlignment(QtCore.Qt.AlignTop)

        self.doppler_arrows_cb = QtWidgets.QCheckBox("Doppler Velocity Arrows")
        self.doppler_arrows_cb.setChecked(True)
        self.options_layout.addWidget(self.doppler_arrows_cb)

        # scaling of doppler arrows
        self.doppler_h_layout = QtWidgets.QHBoxLayout()
        self.doppler_h_layout.setContentsMargins(20, 0, 0, 10)
        self.doppler_scale_label = QtWidgets.QLabel()
        self.doppler_scale_label.setText("Scale")
        self.doppler_scale_label.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed))
        self.doppler_h_layout.addWidget(self.doppler_scale_label)

        self.doppler_scale_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
        self.doppler_scale_slider.setMinimum(1)
        self.doppler_scale_slider.setMaximum(20)
        self.doppler_scale_slider.setValue(7)
        self.doppler_scale_slider.setFixedWidth(150)
        self.doppler_h_layout.addWidget(self.doppler_scale_slider)

        self.options_layout.addLayout(self.doppler_h_layout)

        self.label_text_cb = QtWidgets.QCheckBox("Class Names of True Label")
        self.label_text_cb.setChecked(True)
        self.options_layout.addWidget(self.label_text_cb)

        self.convex_hulls_cb = QtWidgets.QCheckBox("Convex Hulls Around True Objects")
        self.options_layout.addWidget(self.convex_hulls_cb)

        self.color_by_label = QtWidgets.QLabel()
        self.color_by_label.setText("Color Detections by")
        self.color_by_label.setStyleSheet(
            """
            QLabel {
            margin-top: 10px;
            }
            """
        )
        self.options_layout.addWidget(self.color_by_label)

        self.color_by_list = QtWidgets.QComboBox()
        self.color_by_list.setStyleSheet(
            """
            QComboBox::item:checked {
            height: 12px;
            border: 1px solid #32414B;
            margin-top: 0px;
            margin-bottom: 0px;
            padding: 4px;
            padding-left: 0px;
            }
            QComboBox {
            margin-left: 20px;
            }
            """
        )
        self.color_by_list.addItems([x.value for x in ColorOpts])
        self.color_by_list.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed))
        self.color_by_list.setCurrentIndex(6)
        self.options_layout.addWidget(self.color_by_list)

        options_widget = QtWidgets.QWidget()
        options_widget.setLayout(self.options_layout)
        self.options_dock = QtWidgets.QDockWidget("Options", self)
        self.options_dock.setWidget(options_widget)
        self.options_dock.setFloating(False)
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.options_dock)

        # Detection Info Dock Widget
        self.info_dock = QtWidgets.QDockWidget("Information", self)
        self.info_dock.setMinimumWidth(350)
        self.info_dock.setMinimumHeight(200)
        self.detection_info_label = QtWidgets.QTextEdit(text="No detection selected.")
        self.detection_info_label.setMinimumWidth(200)
        flags = QtCore.Qt.TextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
        self.detection_info_label.setTextInteractionFlags(flags)
        self.info_dock.setWidget(self.detection_info_label)
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.info_dock)

        # Camera Dock Widget
        self.cam_graphics_layout = pg.GraphicsLayoutWidget()
        self.cam_viewbox = self.cam_graphics_layout.addViewBox()
        self.cam_viewbox.setAspectLocked(True)
        self.camera_widget = pg.ImageItem()
        self.camera_widget.rotate(-90)
        self.cam_viewbox.addItem(self.camera_widget)
        self.camera_dock = QtWidgets.QDockWidget("Camera", self)
        self.camera_dock.setMinimumWidth(300)
        self.camera_dock.setMinimumHeight(300)
        self.camera_dock.setWidget(self.cam_graphics_layout)
        self.camera_dock.setFloating(False)
        self.camera_dock.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Expanding))
        self.camera_dock.widget().setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Expanding)
        )
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.camera_dock)

        # Timeline: Slider, Spinboxes, Labes
        self.timeline_grid_layout = QtWidgets.QGridLayout()
        self.timeline_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
        self.timeline_slider.setStyleSheet("""
        .QSlider {
        min-height: 20px;
        max-height: 20px;
        }
        .QSlider::groove:horizontal {
        height: 15px;
        }
        """)

        self.timeline_spinbox = QtWidgets.QSpinBox()
        self.timeline_spinbox.setMaximum(10000)
        self.timeline_spinbox.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed))
        self.timeline_label = QtWidgets.QLabel()
        self.timeline_label.setText("Current Frame:")
        self.timeline_label.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed))
        self.prev_frames_spinbox = QtWidgets.QSpinBox()
        self.prev_frames_spinbox.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed))
        self.prev_frames_spinbox.setMaximum(30)
        self.prev_frames_label = QtWidgets.QLabel()
        self.prev_frames_label.setText("Show Previous Frames:")
        self.prev_frames_label.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed))
        self.future_frames_spinbox = QtWidgets.QSpinBox()
        self.future_frames_spinbox.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed))
        self.future_frames_spinbox.setMaximum(30)
        self.future_frames_spinbox.setValue(4)
        self.future_frames_label = QtWidgets.QLabel()
        self.future_frames_label.setText("Show Future Frames:")
        self.future_frames_label.setSizePolicy(
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed))

        self.timeline_grid_layout.addWidget(self.timeline_slider, 0, 0, 1, 8)
        self.timeline_grid_layout.addWidget(self.timeline_label, 1, 1)
        self.timeline_grid_layout.addWidget(self.timeline_spinbox, 1, 2)
        self.timeline_grid_layout.addWidget(self.prev_frames_label, 1, 3)
        self.timeline_grid_layout.addWidget(self.prev_frames_spinbox, 1, 4)
        self.timeline_grid_layout.addWidget(self.future_frames_label, 1, 5)
        self.timeline_grid_layout.addWidget(self.future_frames_spinbox, 1, 6)

        self.main_grid_layout.addLayout(self.timeline_grid_layout, 1, 0)

        # Menu
        self.menu = self.menuBar()
        self.file_menu = self.menu.addMenu("File")
        self.view_menu = self.menu.addMenu("View")
        self.view_menu.addAction(self.options_dock.toggleViewAction())
        self.view_menu.addAction(self.info_dock.toggleViewAction())
        self.view_menu.addAction(self.camera_dock.toggleViewAction())

        ## Exit QAction
        exit_action = QtWidgets.QAction("Exit", self)
        exit_action.setShortcut(QtGui.QKeySequence.Quit)
        exit_action.triggered.connect(self.close)

        # Open Sequence Action
        self.open_action = QtWidgets.QAction("Open Sequence", self)
        self.open_action.setShortcut(QtGui.QKeySequence.Open)
        self.open_action.triggered.connect(self.open_sequence)

        # Open Predictions Action
        self.open_pred_action = QtWidgets.QAction("Open Predictions", self)
        self.open_pred_action.triggered.connect(self.open_predictions)

        self.file_menu.addAction(self.open_action)
        self.file_menu.addAction(self.open_pred_action)
        self.file_menu.addAction(exit_action)

        # Status Bar
        self.status = self.statusBar()
        self.status_label = QtWidgets.QLabel()
        self.status_label.setText(
            "Frame {}/{}.\t\t Current Timestamp: {}.\t\t Time Window Size: {}s".format(0, 0, 0, 0.0))
        self.status.addPermanentWidget(self.status_label)
示例#15
0
transform = np.array([[0.5, 1.3], [-1.7, 0.2]])
measure_coords_2d = (measure_coords_2d[..., None] * transform[None, None, ...]).sum(axis=2) + origin

measure_vals_2d = np.random.normal(size=(w, h)) + 10
measure_vals_2d = scipy.ndimage.gaussian_filter(measure_vals_2d, (2, 2))

measure_coords = measure_coords_2d.reshape(w*h, 2)
measure_vals = measure_vals_2d.reshape(w*h)


plt = pg.plot()
plt.resize(1000, 1000)
colors = [pg.mkBrush(np.clip([(x-10)*250 + 50, (x-10)*250, (x-10)*250 - 50], 0, 255)) for x in measure_vals]
scatter = plt.plot(measure_coords[:,0], measure_coords[:,1], symbolBrush=colors, symbolPen=None, pen=None, symbol='o', symbolSize=3)


x_bounds = -100, 0
y_bounds = 300, 380

img_coords = np.zeros((50, 50, 2))
img_coords[:, :, 0] = np.linspace(x_bounds[0], x_bounds[1], 50)[None, :]
img_coords[:, :, 1] = np.linspace(y_bounds[0], y_bounds[1], 50)[:, None]

interp = LinearNDInterpolator(measure_coords, measure_vals)
img_vals = interp(img_coords)

img = pg.ImageItem(img_vals.T, levels=[8, 15])
plt.addItem(img)
brect = pg.QtCore.QRectF(x_bounds[0], y_bounds[0], x_bounds[1]-x_bounds[0], y_bounds[1]-y_bounds[0])
img.setRect(brect)
img.setZValue(-10)
    def myLayout(self):
        self.layout = QtGui.QHBoxLayout(self)  #the whole window, main layout
        self.leftLayout = QtGui.QVBoxLayout()
        self.middleLayout = QtGui.QVBoxLayout()
        self.rightLayout = QtGui.QHBoxLayout()
        self.controlsLayout = QtGui.QGridLayout()
        self.lineoutsLayout = QtGui.QGridLayout()
        self.cameraLayout = QtGui.QVBoxLayout()
        self.plotLayout = QtGui.QVBoxLayout()
        self.phaseLayout = QtGui.QVBoxLayout()

        self.layout.addLayout(self.leftLayout)
        self.layout.addLayout(self.middleLayout)
        self.layout.addLayout(self.rightLayout)
        self.middleLayout.addLayout(self.controlsLayout)
        self.leftLayout.addLayout(self.lineoutsLayout)
        self.leftLayout.addLayout(self.cameraLayout)
        self.rightLayout.addLayout(self.plotLayout)
        self.rightLayout.addLayout(self.phaseLayout)

        self.plotWidget1 = pq.PlotWidget(title='BC1 horn antenna')
        self.plotWidget1.setVisible(True)
        self.plotWidget1.setMaximumSize(350, 170)
        self.plot11 = self.plotWidget1.plot()

        self.plotWidget2 = pq.PlotWidget(title='BC2 horn antenna')
        self.plotWidget2.setVisible(True)
        self.plotWidget2.setMaximumSize(350, 170)
        self.plot21 = self.plotWidget2.plot(
            axisItems=['signal sum', 'pixel', '', ''])

        self.plotWidget3 = pq.PlotWidget(title='BC1 horn antenna trend')
        self.plotWidget3.setVisible(True)
        self.plotWidget3.setMaximumSize(350, 185)
        self.plot31 = self.plotWidget3.plot()

        self.plotWidget4 = pq.PlotWidget(title='BC2 horn antenna trend')
        self.plotWidget4.setVisible(True)
        self.plotWidget4.setMaximumSize(350, 185)
        self.plot41 = self.plotWidget4.plot()

        self.lineoutsLayout.addWidget(self.plotWidget1)
        self.lineoutsLayout.addWidget(self.plotWidget3)
        self.lineoutsLayout.addWidget(self.plotWidget2)
        self.lineoutsLayout.addWidget(self.plotWidget4)

        #camera image
        #self.cameraWindow = pq.GraphicsLayoutWidget()
        self.cameraWindow = pq.PlotWidget()
        self.cameraWindow.setMaximumSize(350, 350)
        #self.cameraWindow.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
        self.cameraLayout.addWidget(self.cameraWindow)
        #self.view = self.cameraWindow.addViewBox()
        #self.view.setAspectLocked(True)
        self.img = pq.ImageItem(border='w')
        self.cameraWindow.addItem(self.img)

        #roi
        self._roi = pq.ROI([300, 440], [self._pixX, self._pixY])
        self._roi.addScaleHandle(1, 0)
        self._roi.scaleSnap = True  # Force ROI to integer snap positions
        #self._roi.maxBounds = QtCore.QRect(0, 0, 1280, 1024)
        self._roi.sigRegionChangeFinished.connect(self.change_roi)
        self.cameraWindow.addItem(self._roi)
        self._roi.setZValue(10)  # make sure ROI is drawn above image

        self.chooseScreenBox = QtGui.QComboBox()
        self.chooseScreenBox.addItems(self.cameraNames)
        #self.screenSelectedLabel = QtGui.QLabel("none selected")
        #self.screenBoxLabel = QtGui.QLabel("select camera")
        #self.cameraStartButton = QtGui.QPushButton("start camera")
        #self.cameraStopButton = QtGui.QPushButton("stop camera")
        self.saveImagesButton = QtGui.QPushButton("save images")
        self.noImagesBox = QtGui.QSpinBox()
        self.noImagesBox.setValue(5)
        self.imageNameBox = QtGui.QLineEdit()
        self.imageFolderNameBox = QtGui.QLineEdit()

        #camera box
        self.cameraBox = QtGui.QGroupBox()
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.cameraBox.sizePolicy().hasHeightForWidth())
        self.cameraBox.setSizePolicy(sizePolicy)
        self.cameraBox.setMinimumSize(QtCore.QSize(150, 0))
        self.cameraBox.setMaximumSize(QtCore.QSize(200, 80))
        #self.cameraBox.setObjectName("Select Camera")

        self.chooseScreenBox = QtGui.QComboBox(self.cameraBox)
        self.chooseScreenBox.setGeometry(QtCore.QRect(20, 20, 50, 15))
        self.chooseScreenBox.setObjectName("chooseScreenBox")
        self.chooseScreenBox.addItems(self.cameraNames)
        self.screenSelectedLabel = QtGui.QLabel(self.cameraBox)
        self.chooseScreenBox.setGeometry(QtCore.QRect(20, 50, 50, 15))
        #self.screenSelectedLabel.setText("none selected")
        self.screenBoxLabel = QtGui.QLabel(self.cameraBox)
        self.screenBoxLabel.setText("select camera")

        self.cameraStartButton = QtGui.QPushButton(self.cameraBox)
        self.cameraStartButton.setText("start camera")
        self.cameraStartButton.setGeometry(QtCore.QRect(20, 80, 20, 15))
        self.cameraStopButton = QtGui.QPushButton("stop camera",
                                                  self.cameraBox)
        self.cameraStopButton.setGeometry(QtCore.QRect(20, 110, 20, 15))

        self.controlsLayout.addWidget(self.cameraBox)

        self.saveImagesButton = QtGui.QPushButton("save images")
        self.noImagesBox = QtGui.QSpinBox()
        self.noImagesBox.setValue(5)
        self.imageNameBox = QtGui.QLineEdit()
        self.imageFolderNameBox = QtGui.QLineEdit()

        self.VExpSpacer = QtGui.QSpacerItem(100, 100,
                                            QtGui.QSizePolicy.Expanding,
                                            QtGui.QSizePolicy.Expanding)
        self.VFixSpacer = QtGui.QSpacerItem(100, 100,
                                            QtGui.QSizePolicy.Expanding,
                                            QtGui.QSizePolicy.Minimum)
        self.VFixSmallSpacer = QtGui.QSpacerItem(100, 25,
                                                 QtGui.QSizePolicy.Expanding,
                                                 QtGui.QSizePolicy.Minimum)

        #phase scan controls
        self.scanPhaseRadioButtonLabel = QtGui.QLabel('Scan L00 phase')
        self.scanPhaseRadioButton = QtGui.QRadioButton()
        self.scanPhaseInitialLabel = QtGui.QLabel('initial phase')
        self.scanPhaseFinalLabel = QtGui.QLabel('final phase')
        self.scanPhaseFinal = QtGui.QDoubleSpinBox()

        #self.controlsLayout.addWidget(self.screenBoxLabel,8,0)
        #self.controlsLayout.addWidget(self.chooseScreenBox,9,0)
        #self.controlsLayout.addWidget(self.screenSelectedLabel,10,0)
        #self.controlsLayout.addWidget(self.cameraStartButton,11,0)
        #self.controlsLayout.addWidget(self.cameraStopButton,12,0)
        #self.controlsLayout.addItem(self.VExpSpacer,13,0)

        #self.controlsLayout.addWidget(self.)

        self.controlsLayout.addItem(self.VExpSpacer, 13, 0)
        self.controlsLayout.addWidget(self.saveImagesButton, 14, 0)
        self.controlsLayout.addWidget(self.noImagesBox, 15, 0)
        self.controlsLayout.addWidget(QtGui.QLabel("file name"), 16, 0)
        self.controlsLayout.addWidget(self.imageNameBox, 17, 0)
        self.controlsLayout.addWidget(QtGui.QLabel("folder name"), 18, 0)
        self.controlsLayout.addWidget(self.imageFolderNameBox, 19, 0)
        self.controlsLayout.addItem(self.VExpSpacer, 20, 0)

        self.saveBkgndButton = QtGui.QPushButton('Save Background')
        self.saveBkgndButton.clicked.connect(self.saveBkgnd)
        self.subtractBkgndButton = QtGui.QRadioButton()
        self.subtractBkgndButton.setText('Subtract bkgnd')

        self.controlsLayout.addWidget(self.saveBkgndButton, 21, 0)
        self.controlsLayout.addWidget(self.subtractBkgndButton, 22, 0)

        self.chooseScreenBox.activated.connect(self.updatescreenSelected)
        self.cameraStartButton.clicked.connect(self.cameraStart)
        self.cameraStopButton.clicked.connect(self.cameraStop)
        self.saveImagesButton.clicked.connect(self.saveImages)

        self.rightLayout.addLayout(self.plotLayout)

        self.plotWidget5 = pq.PlotWidget(title='beam lineout')
        self.plotWidget5.setVisible(True)
        self.plotWidget5.setMaximumSize(350, 185)
        self.plot51 = self.plotWidget5.plot()
        self.plot52 = self.plotWidget5.plot()

        self.plotWidget6 = pq.PlotWidget(title='beam trans. std trend')
        self.plotWidget6.setVisible(True)
        self.plotWidget6.setMaximumSize(350, 185)
        self.plot61 = self.plotWidget6.plot()

        #self.plotLayout.addWidget(self.plotWidget3)
        #self.plotLayout.addWidget(self.plotWidget4)
        self.plotLayout.addWidget(self.cameraWindow)
        self.plotLayout.addWidget(self.plotWidget5)
        self.plotLayout.addWidget(self.plotWidget6)

        #phases
        self.L00PhaseCrest = QtGui.QLineEdit()
        self.L00PhaseCrest.setText('1000')
        self.L00PhaseWrite = QtGui.QDoubleSpinBox()
        self.L00PhaseWrite.setRange(0, 1000)
        self.L00PhaseRead = QtGui.QLabel()

        self.L01PhaseCrest = QtGui.QLineEdit()
        self.L01PhaseCrest.setText('303')
        self.L01PhaseWrite = QtGui.QDoubleSpinBox()
        self.L01PhaseWrite.setRange(0, 1000)
        self.L01PhaseRead = QtGui.QLabel()

        self.L02PhaseCrest = QtGui.QLineEdit()
        self.L02PhaseCrest.setText('163')
        self.L02PhaseWrite = QtGui.QDoubleSpinBox()
        self.L02PhaseWrite.setRange(0, 1000)
        self.L02PhaseRead = QtGui.QLabel()

        self.phaseLayout.addWidget(QtGui.QLabel("L00 crest phase"))
        self.phaseLayout.addWidget(self.L00PhaseCrest)
        self.phaseLayout.addWidget(QtGui.QLabel("L00 phase"))
        self.phaseLayout.addWidget(self.L00PhaseWrite)
        L00Phase = self.L00PhaseDevice.read_attribute('PhaseDifference').value
        self.L00PhaseWrite.setValue(L00Phase)
        self.L00PhaseWrite.valueChanged.connect(self.setL00Phase)
        self.phaseLayout.addWidget(self.L00PhaseRead)
        self.L00PhaseDevice.read_attribute('PhaseDifference').value
        self.L00PhaseRead.setText(
            str(self.L00PhaseDevice.read_attribute('PhaseDifference').value))

        self.phaseLayout.addItem(self.VFixSpacer)

        self.phaseLayout.addWidget(QtGui.QLabel("L01 crest phase"))
        self.phaseLayout.addWidget(self.L01PhaseCrest)
        self.phaseLayout.addWidget(QtGui.QLabel("L01 phase"))
        self.phaseLayout.addWidget(self.L01PhaseWrite)
        L01Phase = self.L01PhaseDevice.read_attribute('PhaseDifference').value
        self.L01PhaseWrite.setValue(L01Phase)
        self.L01PhaseWrite.valueChanged.connect(self.setL01Phase)
        self.phaseLayout.addWidget(self.L01PhaseRead)
        self.L01PhaseDevice.read_attribute('PhaseDifference').value
        self.L01PhaseRead.setText(
            str(self.L01PhaseDevice.read_attribute('PhaseDifference').value))

        self.phaseLayout.addItem(self.VFixSpacer)

        self.phaseLayout.addWidget(QtGui.QLabel("L02 crest phase"))
        self.phaseLayout.addWidget(self.L02PhaseCrest)
        self.phaseLayout.addWidget(QtGui.QLabel("L02 phase"))
        self.phaseLayout.addWidget(self.L02PhaseWrite)
        L02Phase = self.L02PhaseDevice.read_attribute('PhaseDifference').value
        self.L02PhaseWrite.setValue(L02Phase)
        self.L02PhaseWrite.valueChanged.connect(self.setL02Phase)
        self.phaseLayout.addWidget(self.L02PhaseRead)
        self.L02PhaseDevice.read_attribute('PhaseDifference').value
        self.L02PhaseRead.setText(
            str(self.L02PhaseDevice.read_attribute('PhaseDifference').value))

        self.phaseLayout.addItem(self.VExpSpacer)
示例#17
0
    def __init__(self, geometry, plane=-1):
        super(viewport, self).__init__(border=None)
        # add a view box, which is a widget that allows an image to be shown
        self._view = self.addViewBox(border=None)
        # add an image item which handles drawing (and refreshing) the image
        self._item = pg.ImageItem(useOpenGL=True)
        # self._item._setPen((0,0,0))
        self._view.addItem(self._item)
        # connect the scene to click events, used to get wires
        self.scene().sigMouseClicked.connect(self.mouseClicked)
        # connect the views to mouse move events, used to update the info box at the bottom
        self.scene().sigMouseMoved.connect(self.mouseMoved)
        self._plane = plane
        self._cmSpace = False
        self._geometry = geometry

        self._dataPoints = []
        self._drawnPoints = []
        self._polygon = QtGui.QPolygonF()
        self._path = QtGui.QPainterPath()
        self._path.addPolygon(self._polygon)
        self._polyGraphicsItem = QtGui.QGraphicsPathItem(self._path)
        self._view.addItem(self._polyGraphicsItem)

        # Connect scale changes to handle the scale bar correctly
        self._view.sigYRangeChanged.connect(self.scaleHandler)
        self._view.sigXRangeChanged.connect(self.scaleHandler)
        self._xBar = None
        self._xBarText = None
        # self._yBar = None
        # self._yBarText = None
        self.useScaleBar = False

        # Set up the blank data:
        # self._blankData = np.ones((self._geometry.wRange(self._plane),self._geometry.tRange()))
        self.setBackground('w')

        self._useLogo = False
        self._logo = None

        # each drawer contains its own color gradient and levels
        # this class can return a widget containing the right layout for everything
        # Define some color collections:

        self._colorMap = self._geometry.colorMap(self._plane)

        self._cmap = pg.GradientWidget(orientation='right')
        self._cmap.restoreState(self._colorMap)
        self._cmap.sigGradientChanged.connect(self.refreshGradient)
        self._cmap.resize(1, 1)

        # These boxes control the levels.
        self._upperLevel = QtGui.QLineEdit()
        self._lowerLevel = QtGui.QLineEdit()

        self._upperLevel.returnPressed.connect(self.levelChanged)
        self._lowerLevel.returnPressed.connect(self.levelChanged)

        self._lowerLevel.setText(str(self._geometry.getLevels(self._plane)[0]))
        self._upperLevel.setText(str(self._geometry.getLevels(self._plane)[1]))

        # Fix the maximum width of the widgets:
        self._upperLevel.setMaximumWidth(35)
        self._cmap.setMaximumWidth(25)
        self._lowerLevel.setMaximumWidth(35)

        colors = QtGui.QVBoxLayout()
        colors.addWidget(self._upperLevel)
        colors.addWidget(self._cmap)
        colors.addWidget(self._lowerLevel)
        self._totalLayout = QtGui.QHBoxLayout()
        self._totalLayout.addWidget(self)
        self._totalLayout.addLayout(colors)
        self._widget = QtGui.QWidget()
        self._widget.setLayout(self._totalLayout)
示例#18
0
文件: gui.py 项目: scomup/location
    def run(self):
        ## Always start by initializing Qt (only once per application)
        app = QtGui.QApplication([])

        ## Define a top-level widget to hold everything
        w = QtGui.QWidget()
        w.resize(800, 800)
        w.setWindowTitle("AMCL Viewer")

        ## Create some widgets to be placed inside
        #text = QtGui.QLineEdit('enter text')

        p2d = pg.GraphicsView()

        button_play = QtGui.QPushButton('Play')
        button_play.setFixedWidth(110)
        button_play.clicked.connect(self.handleButton_play)

        button_next = QtGui.QPushButton('Next')
        button_next.setFixedWidth(110)
        button_next.clicked.connect(self.handleButton_next)

        self.checkbox_show_likelihood_field = QtGui.QCheckBox(
            "Show likelihood field")
        self.checkbox_show_likelihood_field.setChecked(False)

        ## Create a grid layout to manage the widgets size and position
        layout = QtGui.QGridLayout()
        w.setLayout(layout)

        ## Add widgets to the layout in their proper positions
        layout.addWidget(p2d, 0, 0, 1, 5)
        layout.addWidget(button_play, 2, 0)
        layout.addWidget(button_next, 2, 1)
        layout.addWidget(self.checkbox_show_likelihood_field, 2, 2)

        # Create a viewBox for 2D image
        vb = pg.ViewBox()
        vb.setAspectLocked()
        p2d.setCentralItem(vb)

        self.prob_map = gl.GLSurfacePlotItem(z=np.zeros((80, 80)),
                                             shader='shaded',
                                             color=(0.5, 0.5, 1, 1))
        self.prob_map.scale(0.5, 0.5, 1.0)
        self.prob_map.translate(-20, -20, 0)

        #Create ImageItem for map
        self.img = pg.ImageItem(np.zeros((400, 400)))
        vb.addItem(self.img)

        ## Display the widget as a new window
        w.show()

        ## Set image level
        self.img.setLevels([0, 1])

        #Create ScatterPlotItem for scan data
        self.sct = pg.ScatterPlotItem(pen=pg.mkPen(None),
                                      brush=pg.mkBrush("g"),
                                      size=5,
                                      antialias=False)
        self.sct.setParentItem(self.img)

        #Create RobotItem(custom) for showing robot pose
        self.robot = RobotItem('b')
        self.robot.setParentItem(self.img)
        self.robot.setZValue(10)

        #Set timer
        timer = pg.QtCore.QTimer()
        timer.timeout.connect(self.update)
        timer.start(300)

        ## Start the Qt event loop
        app.exec_()
示例#19
0
    def __init__(self):
        TemplateBaseClass.__init__(self)
        self.setWindowTitle('muscle imaging browser')
        # Create the main window
        self.ui = WindowTemplate()
        #initialize the items created in designer
        self.ui.setupUi(self)
        
        #frame view
        self.plt = pg.PlotItem()
        self.ui.frameView.setCentralItem(self.plt)
        self.frameView = pg.ImageItem()
        self.plt.addItem(self.frameView)

        #gama plot
        self.gammaPlt = pg.PlotItem()
        self.ui.gammaPlot.setCentralItem(self.gammaPlt)
        self.ui.gammaSlider.valueChanged.connect(self.gammaChange)
        
        #default gama
        self.gammaf = lambda x: x**1
        self.gammax = np.linspace(0,2,100)
        self.gammaCurve = self.gammaPlt.plot(self.gammax,self.gammaf(self.gammax))

        #timeSeries
        self.timeSeriesPlt = pg.PlotItem()
        self.ui.timeSeriesPlt.setCentralItem(self.timeSeriesPlt)
        #self.tserTrace = self.timeSeriesPlt.plot(np.ones(1000))
        self.tpointLine = pg.InfiniteLine(pos = 0,movable = True)
        self.tpointLine.sigPositionChanged.connect(self.tpointLineMoved)
        self.timeSeriesPlt.addItem(self.tpointLine)

        #load frames button
        self.ui.loadFrames.clicked.connect(self.loadFrames)

        self.ui.applyDemix.clicked.connect(self.extract_signals)
        #save data button
        self.ui.saveFit.clicked.connect(self.saveFit)
        self.ui.loadFit.clicked.connect(self.loadFit)

        ##scroll bar
        self.ui.frameScrollBar.valueChanged.connect(self.frameScrollBar_valueChanged)

        # Contrast/color control
        self.hist = pg.HistogramLUTItem()
        self.hist.setImageItem(self.frameView)
        self.ui.frameHist.setCentralItem(self.hist)

        #load data
        self.loadModel()
        self.current_frame = 0
        self.show()
        
        #self.ui.commentBox
        self.ui.frameNumber.setText(str(self.current_frame))
        self.ui.frameNumber.textEdited.connect(self.frameInput)

        #addEpoch
        self.epochPlots = dict()
        self.epoch_dict = dict()
        self.ui.newEpoch.clicked.connect(self.newEpoch)
        self.ui.saveEpoch.clicked.connect(self.saveEpoch)

        self.ui.epochStart.textEdited.connect(self.updateEpochFromText)
        self.ui.epochEnd.textEdited.connect(self.updateEpochFromText)
示例#20
0
    def get_data(self, s):
        print('get data')
        if isinstance(s, QMdiSubWindow) and str(
                s.objectName()) in self.opened_wd_names:
            sub = self.mdi.currentSubWindow()
            self.data_dict = ut.ibw2dict(self.current_dir + '/' +
                                         str(s.objectName()))
        elif isinstance(s, QListWidgetItem):
            file_name = s.text()
            self.opened_wd_names.append(file_name)
            MDIWindow.count = MDIWindow.count + 1
            sub = QMdiSubWindow()
            sub.resize(550, 550)
            sub.setWindowTitle(file_name)
            sub.setObjectName(file_name)
            self.data_dict = ut.ibw2dict(self.current_dir + '/' + file_name)
        else:
            print(isinstance(s, QMdiSubWindow), isinstance(s, QListWidgetItem))
            print(type(s))
            return
        e_sc = self.data_dict['E_axis'][1] - self.data_dict['E_axis'][0]
        a_sc = self.data_dict['A_axis'][1] - self.data_dict['A_axis'][0]
        e_rg = self.data_dict['E_axis'][-1] - self.data_dict['E_axis'][0]
        a_rg = self.data_dict['A_axis'][-1] - self.data_dict['A_axis'][0]

        e_str = self.data_dict['E_axis'][0]
        a_str = self.data_dict['A_axis'][0]
        e_end = self.data_dict['E_axis'][-1]
        a_end = self.data_dict['A_axis'][-1]
        print(e_str, a_str)
        print(e_end, a_end)
        print(e_rg, a_rg)
        print(e_sc, a_sc)

        gr_v = pg.GraphicsView()
        l = pg.GraphicsLayout()
        gr_v.setCentralWidget(l)
        sub.setWidget(gr_v)
        self.mdi.addSubWindow(sub)
        sub.show()

        p1 = l.addPlot(x=[1, 2],
                       y=[1, 2],
                       name="Plot1",
                       title="EDC",
                       pen="r",
                       row=0,
                       col=0)
        #       label1 = pg.LabelItem(justify='right')
        #        p1.addItem(label1)

        plt_i = pg.PlotItem(labels={
            'left': ('slits', 'degrees'),
            'bottom': ('Kin. Energy', 'eV')
        })
        plt_i.setRange(xRange=[e_str, e_end],
                       yRange=[a_str, a_end],
                       update=True,
                       padding=0)

        vb = plt_i.getViewBox()
        vb.setLimits(xMin=e_str, xMax=e_end, yMin=a_str, yMax=a_end)

        l.addItem(plt_i, row=1, col=0)
        img_i = pg.ImageItem(self.data_dict['data'], border=None)
        qrect = vb.viewRect()
        img_i.setRect(qrect)
        vb.addItem(img_i)
        vb.autoRange()
        #        vb.invertX()
        vb.invertY()

        p2 = l.addPlot(x=[1, 2],
                       y=[2, 1],
                       name="Plot2",
                       title="MDC",
                       pen="g",
                       row=1,
                       col=1)
        #        label2 = pg.LabelItem(justify='left')
        #        plt_i.addItem(label2)

        # cross hair
        vLine = pg.InfiniteLine(angle=90, movable=False)
        hLine = pg.InfiniteLine(angle=0, movable=False)
        p1.addItem(vLine, ignoreBounds=False)
        p1.addItem(hLine, ignoreBounds=False)

        vb1 = p1.vb

        pcv = plt_i.addLine(x=e_end, pen='r')
        pch = plt_i.addLine(y=a_str, pen='r')

        #        lROI = pg.ROI(((e_str+e_end)/2,a_str), size=(5*e_sc,a_rg))
        #        vb.addItem(lROI)
        #        slice, coor = lROI.getArrayRegion(self.data_dict['data'], img_i ,returnMappedCoords = True)

        #        print('slice')
        #        sl_sum=np.sum(slice, axis=0)
        #        print(sl_sum[0:10])
        #        print(type(slice), slice.shape)
        #        print(type(coor), coor.shape)
        #        print(coor[1,0,0:10])
        #        p2.invertY()
        #        p2.setYLink(plt_i)
        #        p2.plot(y=coor[1,0,:], x=sl_sum)

        def onMouseMoved(point):
            p = vb.mapSceneToView(point)
            pcv.setValue(p.x())
            pch.setValue(p.y())
            #            print(p.x(), p.y())

            hROI = pg.ROI((e_str, p.y()), size=(e_rg, 5 * a_sc))
            vb.addItem(hROI)
            hROI.hide()
            sl, co = hROI.getArrayRegion(self.data_dict['data'],
                                         img_i,
                                         returnMappedCoords=True)
            sl_sum = np.sum(sl, axis=1)
            p1.setXLink(plt_i)
            p1.plot(x=co[0, :, 0], y=sl_sum, clear=True)

            vROI = pg.ROI((p.x(), a_str), size=(5 * e_sc, a_rg))
            vb.addItem(vROI)
            vROI.hide()
            slc, coo = vROI.getArrayRegion(self.data_dict['data'],
                                           img_i,
                                           returnMappedCoords=True)
            sl_sum = np.sum(slc, axis=0)
            p2.invertY()
            p2.setYLink(plt_i)
            p2.plot(y=coo[1, 0, :], x=sl_sum, clear=True)


#            label2.setText("{}-{}".format(p.x(), p.y()))

        img_i.scene().sigMouseMoved.connect(onMouseMoved)
示例#21
0
## create GUI
app = QtGui.QApplication([])
w = pg.GraphicsWindow(size=(1000, 800), border=True)
w.setWindowTitle('pyqtgraph example: ROI Examples')

text = """Data Selection From Image.<br>\n
Drag an ROI or its handles to update the selected image.<br>
Hold CTRL while dragging to snap to pixel boundaries<br>
and 15-degree rotation angles.
"""
w1 = w.addLayout(row=0, col=0)
label1 = w1.addLabel(text, row=0, col=0)
v1a = w1.addViewBox(row=1, col=0, lockAspect=True)
v1b = w1.addViewBox(row=2, col=0, lockAspect=True)
img1a = pg.ImageItem(arr)
v1a.addItem(img1a)
img1b = pg.ImageItem()
v1b.addItem(img1b)
v1a.disableAutoRange('xy')
v1b.disableAutoRange('xy')
v1a.autoRange()
v1b.autoRange()

rois = []
rois.append(pg.RectROI([20, 20], [20, 20], pen=(0, 9)))
rois[-1].addRotateHandle([1, 0], [0.5, 0.5])
rois.append(pg.LineROI([0, 60], [20, 80], width=5, pen=(1, 9)))
rois.append(
    pg.MultiRectROI([[20, 90], [50, 60], [60, 90]], width=5, pen=(2, 9)))
rois.append(pg.EllipseROI([60, 10], [30, 20], pen=(3, 9)))
示例#22
0
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        uic.loadUi("MainApp.ui", self)

        # Variables for UI and SDR
        self.center_freq = 100.0e6
        self.band_width = 2.4e6
        self.CHUNK = 1024
        self.PPM = 60
        self.isRunning = False
        self.gain = 0.0

        self.aspect_ratio = 1.0

        self.isPeaks = False
        self.tmp = 0
        self.history_length = 128

        #self.PSD = np.arange(-1,2)
        #self.freq = np.arange(-1,2)*self.band_width/2.0 + self.center_freq
        self.calc_freq = lambda bw, nfft, cf: np.linspace(
            -bw / 2, bw / 2, nfft) + cf

        self.freq = self.calc_freq(self.band_width, self.CHUNK,
                                   self.center_freq)

        self.data = np.random.rand(self.CHUNK) * 1e-6
        self.history = np.zeros(shape=(self.history_length, self.CHUNK))

        self.waterfallView.plot()
        self.waterfallView.setLabel("bottom", "Frequency", units="Hz")
        self.waterfallView.setLabel("left", "Time")
        self.waterfallView.setLimits(xMin=self.freq[0],
                                     xMax=self.freq[-1],
                                     yMin=-self.history_length,
                                     yMax=0)
        # We need to construct image for waterfall
        self.img_waterfall = pg.ImageItem()
        self.waterfallView.addItem(self.img_waterfall)
        """
        grad = QtGui.QLinearGradient(0, 0, 0, 0.000004)
        grad.setColorAt(0.000007, pg.mkColor('#000000'))
        grad.setColorAt(0.000005, pg.mkColor('b'))
        brush = QtGui.QBrush(grad)
        """
        self.spectrumView.setLimits(xMin=self.freq[0], xMax=self.freq[-1])
        self.curve = self.spectrumView.plot(x=self.freq,
                                            y=self.data,
                                            pen='w',
                                            fillLevel=-8,
                                            fillBrush=(55, 155, 255, 100),
                                            padding=0.0,
                                            autoRange=False)
        self.curve.setPen((255, 255, 195, 90), width=1)
        self.curvePeaks = self.spectrumView.plot(self.freq,
                                                 self.freq * 1.0e-5,
                                                 pen=None,
                                                 symbol='d',
                                                 symbolBrush=(215, 155, 255,
                                                              200))
        self.spectrumView.setLabel("left", "Power", units="dB")
        self.spectrumView.setLimits(yMin=-4, yMax=-1)
        self.spectrumView.setLogMode(x=None, y=True)
        self.spectrumView.showGrid(x=True, y=None, alpha=0.8)
        self.spectrumView.setLabel("bottom", "Frequency", units="Hz")
        self.spectrumView.showButtons()

        # Create crosshair
        self.vLine = pg.InfiniteLine(angle=90, movable=False, pen='#aaaabb')
        self.vLine.setZValue(1000)
        self.hLine = pg.InfiniteLine(angle=0, movable=False, pen='#aaaabb')
        self.hLine.setZValue(1000)
        self.spectrumView.addItem(self.vLine, ignoreBounds=True)
        self.spectrumView.addItem(self.hLine, ignoreBounds=True)
        self.vLine2 = pg.InfiniteLine(angle=90, movable=False, pen='#aaaabb')
        self.vLine2.setZValue(1000)
        self.waterfallView.addItem(self.vLine2, ignoreBounds=True)

        self.spectrumView.setTitle('Power Spectral Density')

        # Link ranges and focus of spectrum and waterfall
        self.spectrumView.setXLink(self.waterfallView)
        # Gradient color level selector
        self.histogram_layout = pg.GraphicsLayoutWidget()
        self.verticalLayout.addWidget(self.histogram_layout)

        self.histogram = pg.HistogramLUTItem(fillHistogram=False)
        self.histogram_layout.addItem(self.histogram)
        # Load a predefined gradient. Currently defined gradients are:
        self.gradient_presets = [
            'thermal', 'flame', 'yellowy', 'bipolar', 'spectrum', 'cyclic',
            'greyclip', 'grey'
        ]
        self.histogram.gradient.loadPreset(self.gradient_presets[1])
        #self.histogram.setHistogramRange(-50, 0)
        self.histogram.setLevels(-1.0e-3, 1.0e-2)
        self.histogram.setHistogramRange(-2.0e-2, 2.0e-3, padding=1)

        # Lables
        self.lblFreq.setText(str(self.center_freq))

        #
        self.spinBoxFrequency.setValue(self.center_freq)
        self.spinBoxPPM.setValue(self.PPM)

        # averaging filter for psd
        self.doubleSpinBoxAlfa.setValue(0.9)
        self.comboBoxGain.currentIndex = 21
        self.pushButtonConnect.clicked.connect(self.initThread)
示例#23
0
    def __init__(self, parent=None):
        super(PCViewer, self).__init__(parent)
        pg.setConfigOptions(imageAxisOrder='row-major')
        self.setGeometry(70, 70, 1300, 800)
        self.setWindowTitle('Metrics for registration')
        self.cwidget = QtGui.QWidget(self)
        self.setCentralWidget(self.cwidget)
        self.l0 = QtGui.QGridLayout()
        #layout = QtGui.QFormLayout()
        self.cwidget.setLayout(self.l0)

        #self.p0 = pg.ViewBox(lockAspect=False,name='plot1',border=[100,100,100],invertY=True)
        self.win = pg.GraphicsLayoutWidget()
        # --- cells image
        self.win = pg.GraphicsLayoutWidget()
        self.l0.addWidget(self.win, 0, 2, 13, 14)
        layout = self.win.ci.layout
        # A plot area (ViewBox + axes) for displaying the image
        self.p3 = self.win.addPlot(row=0, col=0)
        self.p3.setMouseEnabled(x=False, y=False)
        self.p3.setMenuEnabled(False)

        self.p0 = self.win.addViewBox(name='plot1',
                                      lockAspect=True,
                                      row=1,
                                      col=0,
                                      invertY=True)
        self.p1 = self.win.addViewBox(lockAspect=True,
                                      row=1,
                                      col=1,
                                      invertY=True)
        self.p1.setMenuEnabled(False)
        self.p1.setXLink('plot1')
        self.p1.setYLink('plot1')
        self.p2 = self.win.addViewBox(lockAspect=True,
                                      row=1,
                                      col=2,
                                      invertY=True)
        self.p2.setMenuEnabled(False)
        self.p2.setXLink('plot1')
        self.p2.setYLink('plot1')
        self.img0 = pg.ImageItem()
        self.img1 = pg.ImageItem()
        self.img2 = pg.ImageItem()
        self.p0.addItem(self.img0)
        self.p1.addItem(self.img1)
        self.p2.addItem(self.img2)
        self.win.scene().sigMouseClicked.connect(self.plot_clicked)

        self.p4 = self.win.addPlot(row=0, col=1, colspan=2)
        self.p4.setMouseEnabled(x=False)
        self.p4.setMenuEnabled(False)

        self.PCedit = QtGui.QLineEdit(self)
        self.PCedit.setText('1')
        self.PCedit.setFixedWidth(40)
        self.PCedit.setAlignment(QtCore.Qt.AlignRight)
        self.PCedit.returnPressed.connect(self.plot_frame)
        self.PCedit.textEdited.connect(self.pause)
        qlabel = QtGui.QLabel('PC: ')
        boldfont = QtGui.QFont("Arial", 14, QtGui.QFont.Bold)
        bigfont = QtGui.QFont("Arial", 14)
        qlabel.setFont(boldfont)
        self.PCedit.setFont(bigfont)
        qlabel.setStyleSheet('color: white;')
        #qlabel.setAlignment(QtCore.Qt.AlignRight)
        self.l0.addWidget(QtGui.QLabel(''), 1, 0, 1, 1)
        self.l0.addWidget(qlabel, 2, 0, 1, 1)
        self.l0.addWidget(self.PCedit, 2, 1, 1, 1)
        self.nums = []
        self.titles = []
        for j in range(3):
            num1 = QtGui.QLabel('')
            num1.setStyleSheet('color: white;')
            self.l0.addWidget(num1, 3 + j, 0, 1, 2)
            self.nums.append(num1)
            t1 = QtGui.QLabel('')
            t1.setStyleSheet('color: white;')
            self.l0.addWidget(t1, 12, 4 + j * 4, 1, 2)
            self.titles.append(t1)
        self.loaded = False
        self.wraw = False
        self.wred = False
        self.wraw_wred = False
        self.l0.addWidget(QtGui.QLabel(''), 7, 0, 1, 1)
        self.l0.setRowStretch(7, 1)
        self.cframe = 0
        self.createButtons()
        self.nPCs = 50
        self.PCedit.setValidator(QtGui.QIntValidator(1, self.nPCs))
        # play button
        self.updateTimer = QtCore.QTimer()
        self.updateTimer.timeout.connect(self.next_frame)
        #self.win.scene().sigMouseClicked.connect(self.plot_clicked)
        # if not a combined recording, automatically open binary
        if hasattr(parent, 'ops'):
            if parent.ops['save_path'][-8:] != 'combined':
                fileName = os.path.abspath(
                    os.path.join(parent.basename, 'ops.npy'))
                print(fileName)
                self.openFile(fileName)
示例#24
0
import pyqtgraph as pg

# build lookup table
lut = np.zeros((255, 3), dtype=np.ubyte)
lut[:128, 0] = np.arange(0, 255, 2)
lut[128:, 0] = 255
lut[:, 1] = np.arange(255)

# random image data
img = np.random.normal(size=(100, 100))

# GUI
win = pg.GraphicsWindow()
view = win.addViewBox()
view.setAspectLocked(True)
item = pg.ImageItem(img)

item.setLookupTable(lut)
item.setLevels([0, 1])
view.addItem(item)

# Equivalently, you could use a ColorMap to generate the lookup table:

# pos = np.array([0.0, 0.5, 1.0])
# color = np.array([[0,0,0,255], [255,128,0,255], [255,255,0,255]], dtype=np.ubyte)
# map = pg.ColorMap(pos, color)
# lut = map.getLookupTable(0.0, 1.0, 256)

## Start Qt event loop unless running in interactive mode.
if __name__ == '__main__':
    import sys
示例#25
0
import initExample ## Add path to library (just for examples; you do not need this)

import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui, QtWidgets
import numpy as np

pg.mkQApp()

win = pg.GraphicsLayoutWidget()
win.setWindowTitle('pyqtgraph example: Image Analysis')

# A plot area (ViewBox + axes) for displaying the image
p1 = win.addPlot()

# Item for displaying image data
img = pg.ImageItem()
p1.addItem(img)

# Custom ROI for selecting an image region
roi = pg.ROI([-8, 14], [6, 5])
roi.addScaleHandle([0.5, 1], [0.5, 0.5])
roi.addScaleHandle([0, 0.5], [0.5, 0.5])
p1.addItem(roi)
roi.setZValue(10)  # make sure ROI is drawn above image

# Isocurve drawing
iso = pg.IsocurveItem(level=0.8, pen='g')
iso.setParentItem(img)
iso.setZValue(5)

# Contrast/color control
示例#26
0
    def __init__(self):
        TemplateBaseClass.__init__(self)
        self.setWindowTitle('pyqtgraph example: Qt Designer')

        # Create the main window
        self.ui = WindowTemplate()
        self.ui.setupUi(self)
        #frame view
        self.vb = pg.ViewBox()
        self.vb.setAspectLocked()
        self.ui.frameView.setCentralItem(self.vb)
        self.frameView = pg.ImageItem()
        self.vb.addItem(self.frameView)
        #load frames button
        self.ui.loadFrames.clicked.connect(self.loadFrames)
        #save data button
        self.ui.saveTracks.clicked.connect(self.saveTracks)
        self.ui.loadTracks.clicked.connect(self.loadTracks)
        ##scroll bar
        self.ui.frameScrollBar.valueChanged.connect(
            self.frameScrollBar_valueChanged)
        # Contrast/color control
        self.hist = pg.HistogramLUTItem()
        self.hist.setImageItem(self.frameView)
        self.ui.frameHist.setCentralItem(self.hist)
        self.current_frame = 0
        self.show()

        ### ROI's
        self.roi_b1 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                  closed=True,
                                  pen=(1, 8))
        self.roi_b1.img = pg.ImageItem()

        self.roi_b2 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                  closed=True,
                                  pen=(2, 8))
        self.roi_b2.img = pg.ImageItem()

        self.roi_b3 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                  closed=True,
                                  pen=(3, 8))
        self.roi_b3.img = pg.ImageItem()

        self.roi_i1 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                  closed=True,
                                  pen=(4, 8))
        self.roi_i1.img = pg.ImageItem()

        self.roi_i2 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                  closed=True,
                                  pen=(4, 8))
        self.roi_i2.img = pg.ImageItem()

        self.roi_iii1 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                    closed=True,
                                    pen=(5, 8))
        self.roi_iii1.img = pg.ImageItem()

        self.roi_iii234 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                      closed=True,
                                      pen=(6, 8))
        self.roi_iii234.img = pg.ImageItem()

        self.roi_hg1 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                   closed=True,
                                   pen=(7, 8))
        self.roi_hg1.img = pg.ImageItem()

        self.roi_hg234 = PolyMaskROI([[0., 0.], [5., 10.], [10., 5.]],
                                     closed=True,
                                     pen=(8, 8))
        self.roi_hg234.img = pg.ImageItem()

        self.view_b1 = pg.PlotWidget()
        self.view_b2 = pg.PlotWidget()
        self.view_b3 = pg.PlotWidget()
        self.view_i1 = pg.PlotWidget()
        self.view_i2 = pg.PlotWidget()
        self.view_iii1 = pg.PlotWidget()
        self.view_iii234 = pg.PlotWidget()
        self.view_hg1 = pg.PlotWidget()
        self.view_hg234 = pg.PlotWidget()

        self.roi_list = [
            self.roi_b1, self.roi_b2, self.roi_b3, self.roi_i1, self.roi_i2,
            self.roi_iii1, self.roi_iii234, self.roi_hg1, self.roi_hg234
        ]

        self.view_list = [
            self.view_b1,
            self.view_b2,
            self.view_b3,
            self.view_i1,
            self.view_i2,
            self.view_iii1,
            self.view_iii234,
            self.view_hg1,
            self.view_hg234,
        ]

        for i, r, r_view, name in zip(
                range(len(self.roi_list)), self.roi_list, self.view_list,
            ['b1', 'b2', 'b3', 'i1', 'i2', 'iii1', 'iii234', 'hg1', 'hg234']):
            self.viewb.addItem(r)
            r_view.addItem(r.img)
            r_view.invertY(True)
            r_view.setAspectLocked(True)
            self.roi_layout.addWidget(r_view, i, 1, 1, 1)
            r.sigRegionChanged.connect(self.updateRoi)
            c = self.roi_curves.plot(pen=r.pen)
            r.curve = c
            r.muscle_name = name

        self.muscle_data = dict()
        self.roi_layout.addWidget(self.roi_curves, 10, 1, 1, 1)
        self.main_layout.addLayout(self.roi_layout, 0, 3, 7, 1)
示例#27
0
i1 = model_data['i1']
iii3 = model_data['iii3']
i2 = model_data['i2']

basis = Basis()
basis['a2'] = e1[1] - e2[0]
basis['a1'] = e2[1] - e2[0]
basis['p'] = e2[0]

thorax = GeometricModel(muscle_dict, basis)
thorax_view = ModelView(thorax)

app = QtGui.QApplication([])
#img = pg.ImageItem(np.transpose(sumimg,(1,0,2)))
img = pg.ImageItem(sumimg)
plt = pg.plot()
plt.addItem(img)
img.setZValue(-100)
roi = BasisROI(thorax.basis)
plt.addItem(roi)
plt.disableAutoRange('xy')
plt.autoRange()

#import polygonitem as pgi
#pgitem = pgi.PolygonItem(data = [[(1,0),(3,2),(2,4)]])
#plt.addItem(pgitem)

import copy
plot_basis = copy.copy(thorax.basis)
thorax_view.plot(plot_basis, plt)
示例#28
0
    def createLayout(self):
        print 'Creating layout...'
        self.setWindowTitle('Interferometry Acquisition GUI')
        #self.widget = QtGui.QWidget()
        #self.setCentralWidget(self.widget)
        self.layout = pg.LayoutWidget()
        #self.widget.setLayout(self.layout)
        self.setCentralWidget(self.layout)

        #Create GUI
        sizePolicyBt = QtGui.QSizePolicy(1, 1)
        sizePolicyBt.setHorizontalStretch(0)
        sizePolicyBt.setVerticalStretch(0)

        self.btOpen = QtGui.QPushButton("Open\nprevious results")
        sizePolicyBt.setHeightForWidth(
            self.btOpen.sizePolicy().hasHeightForWidth())
        self.btOpen.setSizePolicy(sizePolicyBt)
        self.btOpen.setStyleSheet(
            "background-color: yellow; font-size: 16px; font: bold")

        self.btStart = QtGui.QPushButton("Start\nacquisition")
        sizePolicyBt.setHeightForWidth(
            self.btStart.sizePolicy().hasHeightForWidth())
        self.btStart.setSizePolicy(sizePolicyBt)
        self.btStart.setStyleSheet(
            "background-color: green; font-size: 16px; font: bold")
        self.btStart.clicked.connect(self.startAcquisition)

        self.btStop = QtGui.QPushButton("Stop\nacquisition")
        sizePolicyBt.setHeightForWidth(
            self.btStop.sizePolicy().hasHeightForWidth())
        self.btStop.setSizePolicy(sizePolicyBt)
        self.btStop.setStyleSheet(
            "background-color: red; font-size: 16px; font: bold")
        self.btStop.clicked.connect(self.stopAcquisition)
        self.btStop.setEnabled(False)

        self.paramTree = ParameterTree()
        self.paramTree.setParameters(Parameters.paramObject, showTop=False)
        self.paramTree.setWindowTitle('pyqtgraph example: Parameter Tree')
        self.paramTree.setMinimumWidth(350)
        self.paramTree.setMaximumWidth(350)
        sizePolicyPt = QtGui.QSizePolicy(1, 1)
        sizePolicyPt.setHorizontalStretch(QtGui.QSizePolicy.Fixed)
        sizePolicyPt.setVerticalStretch(1)
        self.paramTree.setSizePolicy(sizePolicyPt)

        ## Create random 2D data
        data = np.random.normal(size=(
            512, 512)) + pg.gaussianFilter(np.random.normal(size=(512, 512)),
                                           (5, 5)) * 20 + 100
        data = data[:, :, np.newaxis]
        data = data.repeat(3, 2)

        self.plotTl = pg.GraphicsView()
        self.plotTlImage = pg.ImageItem(data[:, :, :])  #parent=self.plotTl
        self.plotTlViewBox = pg.ViewBox()
        self.plotTl.setCentralWidget(self.plotTlViewBox)
        self.plotTlViewBox.addItem(self.plotTlImage)

        self.plotTr = pg.PlotWidget(title="Interferometry",
                                    labels={
                                        'left': 'Signal amplitude (A.U.)',
                                        'bottom': 'Distance (mm)'
                                    })
        #self.plotTlViewBox2.addItem(self.plotTr)
        self.plotTrCurve = self.plotTr.plot(pen=(255, 0, 0), name='C1')  #Red
        self.plotTrCurve2 = self.plotTr.plot(pen=(0, 255, 0),
                                             name='C2')  #Green
        #self.plotTlViewBox2.enableAutoRange('xy', True)  ## stop auto-scaling after the first data set is plotted
        #self.plotTr.addLegend('Test')
        self.plotTr.setYRange(-1000, 1000)

        self.plotBl = pg.PlotWidget(title="Distance",
                                    labels={
                                        'left': 'Distance (mm)',
                                        'bottom': 'Number of acquisitions'
                                    })

        self.plotBlCurve = self.plotBl.plot(pen=(255, 0, 0), name='C1')
        self.plotBl.enableAutoRange(
            'xy',
            True)  ## stop auto-scaling after the first data set is plotted
        self.plotBl.setMaximumWidth(3500)

        self.tbInfo = QtGui.QTextEdit()
        self.tbInfo.setEnabled(False)
        palette = self.tbInfo.palette()
        palette.setColor(QtGui.QPalette.Base,
                         QtGui.QColor("white"))  #White background
        self.tbInfo.setPalette(palette)
        self.tbInfo.setTextColor(QtGui.QColor("black"))
        self.tbInfo.insertPlainText("Useful information will appear here.")

        #Create list view of multiple items
        self.tbStatus = QtGui.QListView()
        self.tbStatus.setEnabled(False)
        palette = self.tbStatus.palette()
        palette.setColor(QtGui.QPalette.Base,
                         QtGui.QColor("white"))  #White background
        self.tbStatus.setPalette(palette)
        itemModelStatus = QtGui.QStandardItemModel(self.tbStatus)
        self.tbStatus.setModel(itemModelStatus)
        #Add system status
        self.itemStatus = QtGui.QStandardItem()
        self.setStatus(False)
        itemModelStatus.appendRow(self.itemStatus)
        #Add camera status
        self.itemCameraStatus = QtGui.QStandardItem()
        self.setCameraStatus(False)
        itemModelStatus.appendRow(self.itemCameraStatus)
        #Add memory usage
        self.itemMemory = QtGui.QStandardItem(
            "Acquisition board memory usage: N/A")
        self.itemMemory.setForeground(QtGui.QColor("black"))
        itemModelStatus.appendRow(self.itemMemory)
        #Add max value position
        self.itemMaxValPos = QtGui.QStandardItem(
            "Maximum RF value position: N/A")
        self.itemMaxValPos.setForeground(QtGui.QColor("black"))
        itemModelStatus.appendRow(self.itemMaxValPos)

        #layout.addWidget(QtGui.QLabel("These are two views of the same data. They should always display the same values."), 0, 0, 1, 2)
        self.layout.addWidget(self.btOpen, 9, 6, 1, 1)
        self.layout.addWidget(self.btStart, 9, 7, 1, 1)
        self.layout.addWidget(self.btStop, 9, 8, 1, 1)
        self.layout.addWidget(self.paramTree, 0, 0, 10, 3)
        self.layout.addWidget(self.plotTl, 0, 3, 5, 3)
        self.layout.addWidget(self.plotTr, 0, 6, 5, 3)
        self.layout.addWidget(self.plotBl, 5, 3, 5, 3)
        self.layout.addWidget(self.tbInfo, 5, 6, 2, 3)
        self.layout.addWidget(self.tbStatus, 7, 6, 2, 3)

        self.layout.layout.setColumnStretch(3, 1)
        self.layout.layout.setColumnStretch(4, 1)
        self.layout.layout.setColumnStretch(5, 1)
        self.layout.layout.setColumnStretch(6, 1)
        self.layout.layout.setColumnStretch(7, 1)
        self.layout.layout.setColumnStretch(8, 1)

        self.show()
        self.resize(1500, 800)
        self.move(100, 100)

        Parameters.paramObject.param('Save/Restore functionality',
                                     'Save State').sigActivated.connect(
                                         self.saveParam)
        Parameters.paramObject.param('Save/Restore functionality',
                                     'Restore State').sigActivated.connect(
                                         self.restoreParam)

        Parameters.paramObject.child(
            "Acquisition Parameters",
            "Rotation speed (%)").sigValueChanged.connect(
                self.motorSpeedChanged)
        Parameters.paramObject.child(
            "Trigger Options",
            "Acquisition mode").sigValueChanged.connect(self.triggerChanged)
        Parameters.paramObject.child(
            "Trigger Options",
            "Trigger amplitude").sigValueChanged.connect(self.triggerChanged)
        Parameters.paramObject.child(
            "Trigger Options",
            "Trigger switch 1/2").sigActivated.connect(self.triggerHalfSwitch)

        # adding by emitting signal in different thread
        self.workThread = AcquisitionWorker()
        self.workThread.updateDataCamera.connect(self.setDataCurveTl)
        self.workThread.updateDataInterf.connect(self.setDataCurveTr)
        self.workThread.updateDataDistance.connect(self.setDataCurveBl)
        self.workThread.updateDataDistance2.connect(self.setDataCurveBl2)
        self.workThread.updateWire.connect(self.setWire)
        self.workThread.setStatus.connect(self.setStatus)
        self.workThread.setInfo.connect(self.setInfo)
        self.testCount = 0

        #Fill the plots with dummy data
        self.data = np.random.normal(size=(10, 1000))
        self.plotTrXAxis = np.arange(1000) * (0.01)
        self.plotBlXAxis = np.arange(1000) * (1)
        self.plotTrCurve.setData(x=self.plotTrXAxis,
                                 y=self.data[2 % 10],
                                 name='C1')
        self.plotTrCurve2.setData(x=self.plotTrXAxis,
                                  y=self.data[3 % 10],
                                  name='C2')
        self.plotBlCurve.setData(x=self.plotBlXAxis,
                                 y=self.data[4 % 10],
                                 name='C1')

        self.valueTest = 1
示例#29
0
    def __init__(self, main_window):

        super(DataViewWidget, self).__init__()

        # Currently displayed field
        self.current_field = 'velocity'
        # Keep ref to main window
        self.main_window = main_window


        ### Create image items for each data field

        fields = ['smb', 'bed', 'surface', 'thickness', 'velocity']

        # Image items, color bars, and color maps for each data field
        self.image_items = {}
        self.cbars = {}


        for field in fields:
            # Load image
            color_data = main_window.color_loader.color_data[field]
            self.image_items[field] = pg.ImageItem(color_data)
            self.image_items[field].setOpts(axisOrder = 'row-major')
            self.image_items[field].setZValue(0)
            # Respond to mouse click event
            self.image_items[field].mouseClickEvent = main_window.mouseClick

            # Load color bar
            cmap, cbar = main_window.color_loader.get_cmap_cbar(field)
            self.cbars[field] = cbar

        # Set displayed field
        self.addItem(self.image_items[self.current_field])


        ### Setup the plot widget

        # Set some options of the plot widget
        self.setAspectLocked(True)

        # Create a widget that will anchor the color bar in the top right corner
        self.cbar_anchor = ColorBarAnchorWidget()
        self.cbar_anchor.hideAxis('left')
        self.cbar_anchor.hideAxis('bottom')
        self.cbar_anchor.addItem(self.cbars[self.current_field])
        self.addItem(self.cbar_anchor)
        self.cbar_anchor.setFixedWidth(158)
        self.cbar_anchor.setFixedHeight(250)
        self.cbar_anchor.setAspectLocked(True)
        self.cbar_anchor.getViewBox().setRange(xRange = [-64.0, 114], yRange = [-15, 247], padding = 0.0)
        self.cbar_anchor.invertY(True)
        self.cbar_anchor.setParentItem(self.getPlotItem())
        self.cbar_anchor.getViewBox().setMouseEnabled(x = False, y = False)
        self.cbar_anchor.anchor(itemPos = (1, 0), parentPos=(1, 0), offset = (-10, -10))

        # Set view ranges
        self.getViewBox().setRange(xRange=[0, 10018], yRange=[0, 17964], padding=0.1)
        # Mouse move event
        self.getViewBox().hoverEvent = main_window.mouseMove


        ### Flow line stuff

        # List of flowlines
        self.flowlines = []
        # Pen for flow line drawing
        self.flowline_pen =  pg.mkPen(color=(255, 0, 0), width=2)
        # Object for integrating velocity field along flowline
        self.flow_integrator = FlowIntegrator(self.main_window.data_loader)


        ### Flow region stuff
        self.flowline_graphs = []
示例#30
0
def check_getArrayRegion(roi, name, testResize=True, transpose=False):
    initState = roi.getState()
    
    #win = pg.GraphicsLayoutWidget()
    win = pg.GraphicsView()
    win.show()
    resizeWindow(win, 200, 400)
    # Don't use Qt's layouts for testing--these generate unpredictable results.
    #vb1 = win.addViewBox()
    #win.nextRow()
    #vb2 = win.addViewBox()
    
    # Instead, place the viewboxes manually 
    vb1 = pg.ViewBox()
    win.scene().addItem(vb1)
    vb1.setPos(6, 6)
    vb1.resize(188, 191)

    vb2 = pg.ViewBox()
    win.scene().addItem(vb2)
    vb2.setPos(6, 203)
    vb2.resize(188, 191)
    
    img1 = pg.ImageItem(border='w')
    img2 = pg.ImageItem(border='w')

    vb1.addItem(img1)
    vb2.addItem(img2)
    
    np.random.seed(0)
    data = np.random.normal(size=(7, 30, 31, 5))
    data[0, :, :, :] += 10
    data[:, 1, :, :] += 10
    data[:, :, 2, :] += 10
    data[:, :, :, 3] += 10
    
    if transpose:
        data = data.transpose(0, 2, 1, 3)
    
    img1.setImage(data[0, ..., 0])
    vb1.setAspectLocked()
    vb1.enableAutoRange(True, True)
    
    roi.setZValue(10)
    vb1.addItem(roi)

    if isinstance(roi, pg.RectROI):
        if transpose:
            assert roi.getAffineSliceParams(data, img1, axes=(1, 2)) == ([28.0, 27.0], ((1.0, 0.0), (0.0, 1.0)), (1.0, 1.0))
        else:
            assert roi.getAffineSliceParams(data, img1, axes=(1, 2)) == ([27.0, 28.0], ((1.0, 0.0), (0.0, 1.0)), (1.0, 1.0))

    rgn = roi.getArrayRegion(data, img1, axes=(1, 2))
    #assert np.all((rgn == data[:, 1:-2, 1:-2, :]) | (rgn == 0))
    img2.setImage(rgn[0, ..., 0])
    vb2.setAspectLocked()
    vb2.enableAutoRange(True, True)
    
    app.processEvents()
    assertImageApproved(win, name+'/roi_getarrayregion', 'Simple ROI region selection.')

    with pytest.raises(TypeError):
        roi.setPos(0, False)

    roi.setPos([0.5, 1.5])
    rgn = roi.getArrayRegion(data, img1, axes=(1, 2))
    img2.setImage(rgn[0, ..., 0])
    app.processEvents()
    assertImageApproved(win, name+'/roi_getarrayregion_halfpx', 'Simple ROI region selection, 0.5 pixel shift.')

    roi.setAngle(45)
    roi.setPos([3, 0])
    rgn = roi.getArrayRegion(data, img1, axes=(1, 2))
    img2.setImage(rgn[0, ..., 0])
    app.processEvents()
    assertImageApproved(win, name+'/roi_getarrayregion_rotate', 'Simple ROI region selection, rotation.')

    if testResize:
        roi.setSize([60, 60])
        rgn = roi.getArrayRegion(data, img1, axes=(1, 2))
        img2.setImage(rgn[0, ..., 0])
        app.processEvents()
        assertImageApproved(win, name+'/roi_getarrayregion_resize', 'Simple ROI region selection, resized.')

    img1.scale(1, -1)
    img1.setPos(0, img1.height())
    img1.rotate(20)
    rgn = roi.getArrayRegion(data, img1, axes=(1, 2))
    img2.setImage(rgn[0, ..., 0])
    app.processEvents()
    assertImageApproved(win, name+'/roi_getarrayregion_img_trans', 'Simple ROI region selection, image transformed.')

    vb1.invertY()
    rgn = roi.getArrayRegion(data, img1, axes=(1, 2))
    img2.setImage(rgn[0, ..., 0])
    app.processEvents()
    # on windows, one edge of one ROI handle is shifted slightly; letting this slide with pxCount=10
    if sys.platform == 'win32' and pg.Qt.QT_LIB in ('PyQt4', 'PySide'):
        pxCount = 10
    else:
        pxCount=-1
    assertImageApproved(win, name+'/roi_getarrayregion_inverty', 'Simple ROI region selection, view inverted.', pxCount=pxCount)

    roi.setState(initState)
    img1.resetTransform()
    img1.setPos(0, 0)
    img1.scale(1, 0.5)
    rgn = roi.getArrayRegion(data, img1, axes=(1, 2))
    img2.setImage(rgn[0, ..., 0])
    app.processEvents()
    assertImageApproved(win, name+'/roi_getarrayregion_anisotropic', 'Simple ROI region selection, image scaled anisotropically.')
    
    # allow the roi to be re-used
    roi.scene().removeItem(roi)

    win.hide()