Esempio n. 1
0
        def __init__(self, parent=None):
                super(Window, self).__init__(parent)

                #Variables Init
                self.figure = plt.figure()
                self.ax = self.figure.add_subplot(111)
                
                canvas = FigureCanvas(self.figure)
                
                self.mat = self.ax.matshow(np.zeros((num_rows,num_cols)))
                
                #global ax, mat, ser, Array, data
                
                toolbar = NavigationToolbar(canvas, self)
                toolbar.hide()

                
                # Start Button
                self.button = QtGui.QPushButton('Start')
                self.button.clicked.connect(plot)
                #self.button1 = QtGui.QPushButton('Record')
                #self.button.clicked.connect(self.plot)

                # set the layout
                layout = QtGui.QVBoxLayout()
                layout.addWidget(canvas)
                layout.addWidget(self.button)
                self.setLayout(layout)

                self.figure.canvas.draw()
                self.timer = self.startTimer(3)
Esempio n. 2
0
class Window(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)

        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()

        # Just some button
        self.button = QtGui.QPushButton('Plot')
        self.button.clicked.connect(self.plot)

        self.button1 = QtGui.QPushButton('Zoom')
        self.button1.clicked.connect(self.zoom)

        self.button2 = QtGui.QPushButton('Pan')
        self.button2.clicked.connect(self.pan)

        self.button3 = QtGui.QPushButton('Home')
        self.button3.clicked.connect(self.home)

        # set the layout
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        layout.addWidget(self.button)
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        layout.addWidget(self.button3)
        self.setLayout(layout)

    def home(self):
        self.toolbar.home()

    def zoom(self):
        self.toolbar.zoom()

    def pan(self):
        self.toolbar.pan()

    def plot(self):
        ''' plot some random stuff '''
        data = [random.random() for i in range(25)]
        ax = self.figure.add_subplot(111)
        ax.hold(False)
        ax.plot(data, '*-')
        self.canvas.draw()
Esempio n. 3
0
class matplotlibWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.canvas = MplCanvas()
        self.vbl = QtGui.QVBoxLayout()

        #        print self.width(), self.height()
        #        self.canvas.setMinimumSize(self.canvas.size())

        self.vbl.addWidget(self.canvas)
        #--
        self.mpl_toolbar = NavigationToolbar(self.canvas, self)
        self.mpl_toolbar.hide()
        #        self.vbl.addWidget(self.mpl_toolbar)
        #--

        self.setLayout(self.vbl)
Esempio n. 4
0
class PlotManager(QtGui.QWidget):
    def __init__(self, parent=None):
        super(PlotManager, self).__init__(parent)
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()
        self.zoombut = QtGui.QPushButton("Збільшити")
        self.zoombut.clicked.connect(self.zoom)
        self.panbut = QtGui.QPushButton("Перемістити")
        self.panbut.clicked.connect(self.pan)
        self.homebut = QtGui.QPushButton("Повністю")
        self.homebut.clicked.connect(self.home)
        self.savebut = QtGui.QPushButton("Зберегти")
        self.savebut.clicked.connect(self.save)
        layout = QtGui.QVBoxLayout()
        buttonbox = QtGui.QHBoxLayout()
        buttonbox.addWidget(self.zoombut)
        buttonbox.addWidget(self.panbut)
        buttonbox.addWidget(self.homebut)
        buttonbox.addWidget(self.savebut)
        layout.addLayout(buttonbox)
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        self.setLayout(layout)
        self.ax = self.figure.add_subplot(111)

    def home(self):
        self.toolbar.home()

    def zoom(self):
        self.toolbar.zoom()

    def pan(self):
        self.toolbar.pan()

    def save(self):
        timestr = time.strftime("%Y%m%d_%H%M%S", time.gmtime())
        self.figure.savefig(f'{timestr}.png')
Esempio n. 5
0
class mGraph(QtGui.QWidget):
    def __init__(self, device, parent=None):
        QtGui.QWidget.__init__(self, parent)
        # Create a matplotlib figure.
        self.figure = plt.figure()
        self.figure.set_facecolor('r')
        # Create a QFrame to house the plot. This is not necessary,
        # just makes it look nice.
        self.matframe = QtGui.QFrame()
        self.matLayout = QtGui.QVBoxLayout()
        self.matLayout.setSpacing(0)
        self.matframe.setLayout(self.matLayout)
        self.matframe.setFrameShape(QtGui.QFrame.Panel)
        self.matframe.setFrameShadow(QtGui.QFrame.Plain)
        self.matframe.setStyleSheet(
            "background-color: rgb(70,80,88); "
            "margin:0px; border:2px solid rgb(0, 0, 0); ")
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setSizePolicy(QtGui.QSizePolicy.Preferred,
                                  QtGui.QSizePolicy.Preferred)
        # This is the device we want to use.
        self.device = device
        # This sets up axis on which to plot.
        color = (189. / 255, 195. / 255, 199. / 255)
        self.ax = self.figure.add_subplot(111, axisbg=color)
        ax = self.ax
        # Add the matplotlib canvas to the QFrame.
        self.matLayout.addWidget(self.canvas)
        # The following lines set up all the colors, makes it look nice.
        # The code to do it is far from pretty and I am planning
        # on cleaning this up a bit.
        self.figure.patch.set_color((70. / 255, 80. / 255, 88. / 255))
        self.figure.patch.set_edgecolor((70. / 255, 80. / 255, 88. / 255))
        ax.spines['bottom'].set_color(color)
        ax.spines['top'].set_color(color)
        ax.spines['right'].set_color(color)
        ax.spines['left'].set_color(color)
        ax.tick_params(axis='x', colors=color)
        ax.tick_params(axis='y', colors=color)
        ax.title.set_color(color)
        ax.yaxis.label.set_color(color)
        ax.xaxis.label.set_color(color)
        ax.xaxis.get_offset_text().set_color(color)
        ax.yaxis.get_offset_text().set_color(color)
        # This is an array of all the lines on the plot. A line for
        # every parameter.
        self.line = []
        self.mins = 0
        self.maxes = 1
        # Each element of line holds a plot, to be combined onto
        # the same graph.
        self.line.append(ax.plot(1, 1, label="Getting Data...")[0])

        # In order to handle interactivity, I had to do some odd stuff
        # with the toolbar buttons: self.home holds the original
        # function called when the home button on the toolbar
        # is clicked.
        self.home = NavigationToolbar.home
        # We now change the function that is called when the toolbar is
        # clicked.
        NavigationToolbar.home = self.enableAutoScaling
        self.toolbar = NavigationToolbar(self.canvas, self)

        self.cid = self.canvas.mpl_connect('button_press_event',
                                           self.disableAutoScaling)
        self.setStyleSheet("QPushButton{\
                    color:rgb(189,195, 199); \
                    background:rgb(70, 80, 88)};")
        self.fullGraphBtn = QtGui.QPushButton("Show Interactive Graph")
        self.fullGraphBtn.clicked.connect(self.openFullGraphGui)
        self.toolbarFrame = QtGui.QFrame()
        toolbarFrameLayout = QtGui.QVBoxLayout()
        toolbarFrameLayout.addWidget(self.toolbar)
        self.toolbar.setParent(None)
        self.toolbarFrame.setLayout(toolbarFrameLayout)
        self.toolbarFrame.setStyleSheet("\
                   border:2px solid rgb(0,0,0);\
                   color:rgb(189,195,199); \
                   background:rgb(70, 80, 88);")
        self.toolbar.setStyleSheet("\
                   border:0px solid rgb(0,0,0);\
                   QDialog{background:rgb(70, 80, 88)}")
        self.matPlotInfo = QtGui.QLabel()
        self.alertFont = QtGui.QFont()
        self.alertFont.setPointSize(12)
        self.matPlotInfo.setStyleSheet("color:rgb(200, 69, 50);")
        self.matPlotInfo.setText("Auto refresh disabled, "
                                 "click HOME button to enable.")
        self.matPlotInfo.setFont(self.alertFont)

        #self.refreshRateSec = device.getFrame().getPlotRefreshRate()
        self.refreshRateSec = device.getFrame().getPlotRefreshRate()
        self.timer = QtCore.QTimer(self)

        self.hidden = True
        self.home = True
        self.initialized = False
        self.currTimeRange = 120
        self.lineSelect = MCheckableComboBox()
        self.lineSelect.setSizeAdjustPolicy(0)
        self.lineSelect.setStyleSheet("\
                    background-color:rgb(70, 80, 88);\
                    color:rgb(189,195, 199);")
        self.plot(self.currTimeRange)

        self.timer.timeout.connect(partial(self.plot, self.currTimeRange))
        self.timer.start(self.refreshRateSec * 1000)

        # Did it store data?
        self.dataOk = True
        self.hideButton = QtGui.QPushButton("Show Plot")
        self.hideButton.clicked.connect(self.togglePlot)
        self.oneMinButton = QtGui.QPushButton("1 min")
        self.oneMinButton.clicked.connect(partial(self.plot, 60))
        self.tenMinButton = QtGui.QPushButton("10 min")
        self.tenMinButton.clicked.connect(partial(self.plot, 600))
        self.twoHrButton = QtGui.QPushButton("2 hr")
        self.twoHrButton.clicked.connect(partial(self.plot, 7200))
        self.twelveHrButton = QtGui.QPushButton("12 hr")
        self.twelveHrButton.clicked.connect(partial(self.plot, 43200))
        self.threeDayButton = QtGui.QPushButton("3 day")
        self.threeDayButton.clicked.connect(partial(self.plot, 259200))
        self.oneWkButton = QtGui.QPushButton("1 week")
        self.oneWkButton.clicked.connect(partial(self.plot, 604800))
        self.allButton = QtGui.QPushButton("All Time")
        self.allButton.clicked.connect(partial(self.plot, None))

        self.canvas.hide()
        self.toolbar.hide()

        # Set the layout.
        buttonLayout1 = QtGui.QHBoxLayout()
        buttonLayout1.addWidget(self.hideButton)
        buttonLayout1.addWidget(self.fullGraphBtn)
        buttonLayout1.addStretch(0)
        buttonLayout2 = QtGui.QHBoxLayout()
        settingsbuttons1 = QtGui.QHBoxLayout()

        buttonLayout2.addWidget(self.oneMinButton)
        buttonLayout2.addWidget(self.tenMinButton)
        buttonLayout2.addWidget(self.twoHrButton)
        buttonLayout2.addWidget(self.twelveHrButton)
        buttonLayout2.addWidget(self.threeDayButton)
        buttonLayout2.addWidget(self.oneWkButton)
        buttonLayout2.addWidget(self.allButton)
        buttonLayout2.addStretch(0)
        self.oneMinButton.hide()
        self.tenMinButton.hide()
        self.twoHrButton.hide()
        self.twelveHrButton.hide()
        self.threeDayButton.hide()
        self.oneWkButton.hide()
        self.allButton.hide()
        self.lineSelect.hide()
        self.matframe.hide()
        self.matPlotInfo.hide()
        self.toolbarFrame.hide()

        settingsbuttons1.addWidget(self.lineSelect)
        layout = QtGui.QVBoxLayout()
        allButtonsLayout = QtGui.QHBoxLayout()
        timeButtonsLayout = QtGui.QVBoxLayout()
        allButtonsLayout.addLayout(timeButtonsLayout)
        layout.addLayout(allButtonsLayout)
        allButtonsLayout.addLayout(settingsbuttons1)
        timeButtonsLayout.addLayout(buttonLayout1)
        timeButtonsLayout.addLayout(buttonLayout2)
        timeButtonsLayout.addWidget(self.matPlotInfo)
        layout.addWidget(self.matframe)
        layout.addWidget(self.toolbarFrame)

        self.setLayout(layout)

    def enableAutoScaling(self):
        self.timer.start(self.refreshRateSec * 1000)
        self.home = True
        self.matPlotInfo.hide()
        self.plot(self.currTimeRange)

    def disableAutoScaling(self, event):
        self.home = False
        self.matPlotInfo.show()
        self.canvas.update()
        self.timer.stop()

    def togglePlot(self):
        if not self.hidden:
            self.canvas.hide()
            self.toolbar.hide()
            self.oneMinButton.hide()
            self.tenMinButton.hide()
            self.twoHrButton.hide()
            self.twelveHrButton.hide()
            self.threeDayButton.hide()
            self.oneWkButton.hide()
            self.allButton.hide()
            self.matPlotInfo.hide()
            self.matframe.hide()
            self.lineSelect.hide()
            self.toolbarFrame.hide()
            self.timer.stop()
            self.hideButton.setText("Show Plot")
            self.hidden = True
        elif self.hidden:
            self.canvas.show()
            self.toolbar.show()
            self.oneMinButton.show()
            self.tenMinButton.show()
            self.twoHrButton.show()
            self.twelveHrButton.show()
            self.threeDayButton.show()
            self.oneWkButton.show()
            self.allButton.show()
            self.plot(self.currTimeRange)
            self.matframe.show()
            self.lineSelect.show()
            self.toolbarFrame.show()
            self.timer.start(self.refreshRateSec * 1000)
            self.hideButton.setText("Hide Plot")
            self.enableAutoScaling()
            self.hidden = False

    def initializePlot(self, dataSet):
        if dataSet:
            varNames = dataSet.getVariables()
            varNames = [varNames[1][i][0] for i in range(len(varNames[1]))]
            self.dropdownFont = QtGui.QFont()
            self.dropdownFont.setPointSize(12)
        if dataSet is not None:
            self.initialized = True
            self.line[0].remove()
            self.line = []

            for i in range(len(varNames)):
                self.line.append(self.ax.plot(1, 1, label=varNames[i])[0])
                text = QtCore.QString(varNames[i])
                self.lineSelect.addItem(text)
                self.lineSelect.setFont(self.dropdownFont)
                self.lineSelect.setChecked(i, True)

    def changeIndependenVarRange(self, timeRange):
        if not self.hidden:
            if timeRange != self.currTimeRange:
                self.timer.stop()
                self.timer.timeout.disconnect()
                self.currTimeRange = timeRange
                self.timer.timeout.connect(
                    lambda: self.plot(self.currTimeRange))
                self.timer.start(self.refreshRateSec * 1000)
            plotRefreshRate = self.device.getFrame().getPlotRefreshRate()
            if self.refreshRateSec != plotRefreshRate:
                self.refreshRateSec = plotRefreshRate
                self.timer.stop()
                self.timer.timeout.disconnect()
                self.currTimeRange = timeRange
                self.timer.timeout.connect(
                    lambda: self.plot(self.currTimeRange))
                self.timer.start(self.refreshRateSec * 1000)

    def getDataRangeFromDataSet(self, dataSet, time):
        if dataSet:
            data = dataSet.getData()
            i = len(data) - 1
            if time:
                while data[i][0] > (data[-1][0] - time):
                    i -= 1
                    if -1 * i > len(data):
                        return data
                data = data[i:-1]
            return data
        else:
            return None

    def openFullGraphGui(self):
        # print "opening full graph gui."
        dataSet = self.device.getFrame().getDataSet().getData()
        # print dataSet
        times = [dt.datetime.fromtimestamp(elem[0]) for elem in dataSet]
        vars = self.device.getFrame().getDataSet().getVariables()

        self.fullgraphcont = fullGraphContainer(times, vars, dataSet)
        self.fullgraphcont.show()

    def plot(self, time):
        times = None
        self.changeIndependenVarRange(time)
        dataSet = self.device.getFrame().getDataSet()

        if not self.initialized:
            self.initializePlot(dataSet)
            self.legend = self.ax.legend(loc='upper left')
            # This is the ONLY time canvas.draw is called. It should
            # NOT be called anywhere else if the graphing speed is
            # to be fast.
            self.canvas.draw()
        else:
            data = self.getDataRangeFromDataSet(dataSet, time)
            for i in range(len(data[0]) - 1):
                if self.lineSelect.isChecked(i):
                    times = [dt.datetime.fromtimestamp(row[0]) for row in data]
                    column = [row[i + 1] for row in data]
                    if not self.line[i].get_visible():
                        self.line[i].set_visible(True)
                    self.line[i].set_data(times, column)
                    self.legend = self.ax.legend(loc='upper left')
                    self.ax.grid(True)
                    self.ax.hold(True)
                else:
                    self.line[i].set_visible(False)
                pass
            self.ax.set_title(self.device.getFrame().getTitle(),
                              color=(189. / 255, 195. / 255, 199. / 255))
            if self.home and times:
                self.ax.set_xlim(times[0], times[-1])
                self.ax.relim(visible_only=True)
                self.ax.autoscale(axis='y')

            frame = self.device.getFrame()
            yLabel = frame.getYLabel()
            if yLabel is not None:
                if frame.getCustomUnits():
                    self.ax.set_ylabel("%s (%s)" %
                                       (yLabel, frame.getCustomUnits()))
                elif frame.getUnits()[i - 1]:
                    self.ax.set_ylabel("%s (%s)" %
                                       (yLabel, frame.getUnits()[i - 1]))

            locator = AutoDateLocator()

            self.ax.xaxis.set_major_locator(locator)
            self.ax.xaxis.set_major_formatter(DateFormatter('%m/%d %H:%M:%S'))
            self.figure.autofmt_xdate()
            self.ax.draw_artist(self.figure)
            self.ax.draw_artist(self.ax.patch)
            self.ax.draw_artist(self.ax.yaxis)
            self.ax.draw_artist(self.ax.xaxis)

            for i, line in enumerate(self.line):
                self.ax.draw_artist(line)

            self.ax.set_xlabel("Time")
            self.ax.draw_artist(self.legend)

            self.canvas.update()

            self.canvas.flush_events()
class MplGraphWidget(QtGui.QWidget):

    def __init__(self, parent=None, width=3, height=3, dpi=100):

        super(MplGraphWidget, self).__init__(parent)

        self._dataY = np.array([])
        self._dataX = np.array([])

        self._spCols = 1
        self._spRows = 1
        self.all_sp_axes = []
        self.fig = Figure(figsize=(width,height), dpi=dpi)
        self.all_sp_axes.append(self.fig.add_subplot(self._spCols, self._spRows, 1))
        self.fig.set_frameon(False)
        self.fig.set_tight_layout(True)

        self.canvas = Canvas(self.fig)

        self._navBarOn = True
        self.mpl_toolbar = NavigationToolbar(self.canvas, parent)

        self.canvas.mpl_connect('key_press_event', self.on_key_press)
        self.canvas.mpl_connect('button_press_event', self.on_button_press)
        self.canvas.mpl_connect('motion_notify_event', self.on_mouse_move)
        self.canvas.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.canvas.setFocus()

        self.canvas.setParent(parent)
        self.canvas.clearMask()
        self.canvas.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        self.canvas.updateGeometry()

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.canvas)
        if self._navBarOn:
            vbox.addWidget(self.mpl_toolbar)
        self.setLayout(vbox)

    key_pressed = QtCore.pyqtSignal(object, name='keyPressed')

    def on_key_press(self, event):
        self.key_pressed.emit(event)
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    button_pressed = QtCore.pyqtSignal(object, name='buttonPressed')

    def on_button_press(self, event):
        self.button_pressed.emit(event)
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    mouse_move = QtCore.pyqtSignal(object, name='mouseMoved')

    def on_mouse_move(self, event):
        self.mouse_move.emit(event)
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    def get_icon(name):
        """Return Matplotlib icon *name*"""
        return QtGui.QIcon(osp.join(rcParams['datapath'], 'images', name))

    def generateNewAxes(self):
        for ax in self.all_sp_axes:
            self.fig.delaxes(ax)
        self.all_sp_axes = []
        numOfAxes = (self._spRows*self._spCols)+1
        for i in np.arange(1,numOfAxes):
            self.all_sp_axes.append(self.fig.add_subplot(self._spRows, self._spCols, i))
        self.canvas.setGeometry(100, 100, 300, 300)  #Used to update the new number of axes
        self.canvas.updateGeometry()  #This will bring the size of the canvas back to the original (defined by the vbox)

    spRowsChanged = QtCore.pyqtSignal(int)

    def getspRows(self):
        return self._spRows

    @QtCore.pyqtSlot(int)
    def setspRows(self, spRows):
        self._spRows = spRows
        self.generateNewAxes()
        self.spRowsChanged.emit(spRows)

    def resetspRows(self):
        self.setspRows(1)

    spRows = QtCore.pyqtProperty(int, getspRows, setspRows, resetspRows)

    spColsChanged = QtCore.pyqtSignal(int)

    def getspCols(self):
        return self._spCols

    @QtCore.pyqtSlot(int)
    def setspCols(self, spCols):
        self._spCols = spCols
        self.generateNewAxes()
        self.spRowsChanged.emit(spCols)

    def resetspCols(self):
        self.setspCols(1)

    spCols = QtCore.pyqtProperty(int, getspCols, setspCols, resetspCols)

    dataChanged = QtCore.pyqtSignal(bool)

    def get_Y_data(self):
        return self._dataY

    @QtCore.pyqtSlot(int)
    def set_Y_data(self, y_data):
        self._dataY = y_data
        self.dataChanged.emit(True)


    def plot(self, on_axes=0):
        if np.size(self._dataX) == 0:
            self.all_sp_axes[on_axes].plot(self._dataY)
        else:
            self.all_sp_axes[on_axes].plot(self._dataX, self._dataY)

    def getNavBarOn(self):
        return self._navBarOn

    def setNavBarOn(self, navBarOn):
        self._navBarOn = navBarOn
        if not navBarOn:
            self.mpl_toolbar.hide()
        else:
            self.mpl_toolbar.show()

    def resetNavBarOn(self):
        self._navBarOn = True

    navBarOn = QtCore.pyqtProperty(bool, getNavBarOn, setNavBarOn, resetNavBarOn)


    # def getautoscale(self):
    #     return self._autoscale
    #
    # def setautoscale(self, autoscale):
    #     self._autoscale = autoscale
    #     for axis in self.all_sp_axes:
    #         axis.set_autoscale(autoscale)
    #
    # def resetautoscale(self):
    #     self._autoscale = False
    #
    # autoscale = QtCore.pyqtProperty(bool, getautoscale, setautoscale, resetautoscale)

    @QtCore.pyqtSlot(bool)
    def set_autoscale(self, autoscale):
        for axis in self.all_sp_axes:
            axis.set_autoscale(autoscale)
Esempio n. 7
0
class mGraph(QtGui.QWidget):
    def __init__(self, device, parent=None):
        QtGui.QWidget.__init__(self, parent)
        # Create a matplotlib figure
        self.figure = plt.figure()
        self.figure.set_facecolor("r")
        # Create a QFrame to house the plot. This is not necessary, just makes it look nice
        self.matframe = QtGui.QFrame()
        self.matLayout = QtGui.QVBoxLayout()
        self.matLayout.setSpacing(0)
        self.matframe.setLayout(self.matLayout)
        self.matframe.setFrameShape(QtGui.QFrame.Panel)
        self.matframe.setFrameShadow(QtGui.QFrame.Plain)
        self.matframe.setStyleSheet("background-color: rgb(70,80,88); margin:0px; border:2px solid rgb(0, 0, 0); ")
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
        # This is the device we want to use
        self.device = device
        # This sets up axis on which to plot
        self.ax = self.figure.add_subplot(111, axisbg=(189.0 / 255, 195.0 / 255, 199.0 / 255))
        # Add the matplotlib canvas to the QFrame
        self.matLayout.addWidget(self.canvas)
        # The following lines set up all the colors, makes it look nice. The code to do it is
        # far from pretty and I am planning on cleaning this up a bit.
        self.figure.patch.set_color((70.0 / 255, 80.0 / 255, 88.0 / 255))
        self.figure.patch.set_edgecolor((70.0 / 255, 80.0 / 255, 88.0 / 255))
        self.ax.spines["bottom"].set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.spines["top"].set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.spines["right"].set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.spines["left"].set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.tick_params(axis="x", colors=(189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.tick_params(axis="y", colors=(189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.title.set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.yaxis.label.set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.xaxis.label.set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.xaxis.get_offset_text().set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        self.ax.yaxis.get_offset_text().set_color((189.0 / 255, 195.0 / 255, 199.0 / 255))
        # This is an array of all the lines on the plot. A line for every parameter
        self.line = []
        # Each element of line holds a plot, to be combined onto the same graph
        self.line.append(self.ax.plot(1, 1, label="Getting Data...")[0])
        # This is the ONLY time canvas.draw is called. It should NOT be called anywhere else if
        # the graphing speed is to be fast.
        self.canvas.draw()
        # In order to handle interactivity, I had to do some odd stuff with the
        # toolbar buttons. Self.home holds the original function called when the home button on the toolbar
        # is clicked.
        self.home = NavigationToolbar.home
        # We now change the function that is called when the toolbar is clicked.
        NavigationToolbar.home = self.enableAutoScaling
        self.toolbar = NavigationToolbar(self.canvas, self)
        # print [item for item in dir(self.toolbar) if type(item) == QtGui.QDialog]
        self.cid = self.canvas.mpl_connect("button_press_event", self.disableAutoScaling)
        self.setStyleSheet(
            "QPushButton{\
                    color:rgb(189,195, 199); \
                    background:rgb(70, 80, 88)}"
        )
        self.toolbarFrame = QtGui.QFrame()
        toolbarFrameLayout = QtGui.QVBoxLayout()
        toolbarFrameLayout.addWidget(self.toolbar)
        self.toolbar.setParent(None)
        self.toolbarFrame.setLayout(toolbarFrameLayout)
        self.toolbarFrame.setStyleSheet(
            "\
                    border:2px solid rgb(0,0,0);\
                    color:rgb(189,195,199); \
                    background:rgb(70, 80, 88);\
                    "
        )
        self.toolbar.setStyleSheet(
            "\
                    border:0px solid rgb(0,0,0);\
                    QDialog{background:rgb(250, 80, 88)}\
                    "
        )
        # print dir(self.toolbar)
        # print self.toolbar.children()
        # print self.toolbar.setPalette
        self.matPlotInfo = QtGui.QLabel()
        self.alertFont = QtGui.QFont()
        self.alertFont.setPointSize(12)
        self.matPlotInfo.setStyleSheet("color:rgb(200, 69, 50);")
        self.matPlotInfo.setText("Auto refresh disabled, click HOME button to enable.")
        self.matPlotInfo.setFont(self.alertFont)

        self.refreshRateSec = device.getFrame().getPlotRefreshRate()
        self.timer = QtCore.QTimer(self)

        self.hidden = True
        self.home = True
        self.currTimeRange = 120
        self.plot(self.currTimeRange)

        self.timer.timeout.connect(partial(self.plot, self.currTimeRange))
        self.timer.start(self.refreshRateSec * 1000)
        # did it store data?
        self.dataOk = True
        self.hideButton = QtGui.QPushButton("Show Plot")
        self.hideButton.clicked.connect(self.togglePlot)
        self.thrtysecButton = QtGui.QPushButton("30 Sec")
        self.thrtysecButton.clicked.connect(partial(self.plot, 30))
        self.twoMinButton = QtGui.QPushButton("2 Min")
        self.twoMinButton.clicked.connect(partial(self.plot, 120))
        self.fiveMinButton = QtGui.QPushButton("5 Min")
        self.fiveMinButton.clicked.connect(partial(self.plot, 300))
        self.thrtyMinButton = QtGui.QPushButton("30 Min")
        self.thrtyMinButton.clicked.connect(partial(self.plot, 1800))
        self.twoHrButton = QtGui.QPushButton("2 Hr")
        self.twoHrButton.clicked.connect(partial(self.plot, 7200))
        self.tenHrButton = QtGui.QPushButton("10 Hr")
        self.tenHrButton.clicked.connect(partial(self.plot, 36000))
        self.oneDayButton = QtGui.QPushButton("24 Hr")
        self.oneDayButton.clicked.connect(partial(self.plot, 86400))
        self.oneWkButton = QtGui.QPushButton("1 Wk")
        self.oneWkButton.clicked.connect(partial(self.plot, 604800))
        self.twoWkButton = QtGui.QPushButton("2 Wk")
        self.twoWkButton.clicked.connect(partial(self.plot, 1209600))
        self.allButton = QtGui.QPushButton("All Time")
        self.allButton.clicked.connect(partial(self.plot, None))
        self.canvas.hide()
        self.toolbar.hide()

        # set the layout

        buttonLayout = QtGui.QHBoxLayout()
        buttonLayout.addWidget(self.hideButton)
        buttonLayout.addStretch(0)
        buttonLayout2 = QtGui.QHBoxLayout()

        buttonLayout3 = QtGui.QHBoxLayout()

        buttonLayout2.addWidget(self.thrtysecButton)
        buttonLayout2.addWidget(self.twoMinButton)
        buttonLayout2.addWidget(self.fiveMinButton)
        buttonLayout2.addWidget(self.thrtyMinButton)
        buttonLayout2.addWidget(self.twoHrButton)
        buttonLayout2.addStretch(0)
        buttonLayout3.addWidget(self.tenHrButton)
        buttonLayout3.addWidget(self.oneDayButton)
        buttonLayout3.addWidget(self.oneWkButton)
        buttonLayout3.addWidget(self.twoWkButton)
        buttonLayout3.addWidget(self.allButton)
        buttonLayout3.addStretch(0)
        self.thrtysecButton.hide()
        self.twoMinButton.hide()
        self.fiveMinButton.hide()
        self.thrtyMinButton.hide()
        self.twoHrButton.hide()
        self.tenHrButton.hide()
        self.oneDayButton.hide()
        self.oneWkButton.hide()
        self.twoWkButton.hide()
        self.allButton.hide()
        self.matframe.hide()
        self.matPlotInfo.hide()
        self.toolbarFrame.hide()

        layout = QtGui.QVBoxLayout()
        layout.addLayout(buttonLayout)
        layout.addLayout(buttonLayout2)
        layout.addLayout(buttonLayout3)
        layout.addWidget(self.matPlotInfo)
        layout.addWidget(self.matframe)
        layout.addWidget(self.toolbarFrame)

        self.setLayout(layout)

    def enableAutoScaling(self):
        self.timer.start(self.refreshRateSec * 1000)
        # self.canvas.mpl_disconnect(self.cid)
        # self.cid = self.canvas.mpl_connect('button_press_event', self.disableAutoScaling)
        self.home = True
        self.matPlotInfo.hide()
        # self.deviceThread = threading.Thread(target =
        # self.plot, args=[self.currTimeRange])
        # If the main thread stops, stop the child thread
        # self.deviceThread.daemon = True
        # Start the thread
        # self.deviceThread.start()

        self.plot(self.currTimeRange)

    def disableAutoScaling(self, event):
        self.home = False
        self.matPlotInfo.show()
        self.canvas.update()
        # plt.show()
        # print event.name
        # self.canvas.mpl_disconnect(self.cid)
        # self.cid = self.canvas.mpl_connect('button_press_event', self.enableAutoScaling)
        self.timer.stop()
        # self.zoom(self.toolbar)

    def togglePlot(self):

        if not self.hidden:
            self.canvas.hide()
            self.toolbar.hide()
            self.thrtysecButton.hide()
            self.twoMinButton.hide()
            self.fiveMinButton.hide()
            self.thrtyMinButton.hide()
            self.twoHrButton.hide()
            self.tenHrButton.hide()
            self.oneDayButton.hide()
            self.oneWkButton.hide()
            self.twoWkButton.hide()
            self.allButton.hide()
            self.matPlotInfo.hide()
            self.matframe.hide()
            self.toolbarFrame.hide()
            self.timer.stop()
            self.hideButton.setText("Show Plot")
            self.hidden = True

        elif self.hidden:
            self.canvas.show()
            self.toolbar.show()
            self.thrtysecButton.show()
            self.twoMinButton.show()
            self.fiveMinButton.show()
            self.thrtyMinButton.show()
            self.twoHrButton.show()
            self.tenHrButton.show()
            self.oneDayButton.show()
            self.oneWkButton.show()
            self.twoWkButton.show()
            self.allButton.show()
            self.plot(self.currTimeRange)
            self.matframe.show()
            self.toolbarFrame.show()
            self.timer.start(self.refreshRateSec * 1000)
            self.hideButton.setText("Hide Plot")
            self.enableAutoScaling()
            self.hidden = False

    def plot(self, timeRange):
        if not self.hidden:
            if timeRange != self.currTimeRange:
                self.timer.stop()
                self.timer.timeout.disconnect()
                self.currTimeRange = timeRange
                self.timer.timeout.connect(lambda: self.plot(self.currTimeRange))
                self.timer.start(self.refreshRateSec * 1000)
            if self.refreshRateSec != self.device.getFrame().getPlotRefreshRate():
                # print "New plot refresh rate: ", self.device.getFrame().getPlotRefreshRate()
                self.refreshRateSec = self.device.getFrame().getPlotRefreshRate()
                self.timer.stop()
                self.timer.timeout.disconnect()
                self.currTimeRange = timeRange
                self.timer.timeout.connect(lambda: self.plot(self.currTimeRange))
                self.timer.start(self.refreshRateSec * 1000)
            dataSet = self.device.getFrame().getDataSet()
            # If the dataset exists
            if dataSet is not None:
                # Get all data from the dataset
                data = dataSet.getData()
                self.ax.hold(False)
                try:
                    # for each entry in the dataset [[time], [[data], [data], [data...]]]
                    # print data
                    # Get the corresponding times that the values were recorded

                    for i in range(1, len(data[-1])):
                        # Get colum. aka all values from parameter i over time
                        column = [row[i] for row in data]

                        # print times
                        # If the there is  no defined a time range
                        if self.currTimeRange is None:
                            times = [datetime.datetime.fromtimestamp(row[0]) for row in data]
                            # Plot all of the data (columns) vs time
                            # self.ax.plot_date(times, column, label =
                            # dataSet.getVariables()[1][i-1][0])
                            pass
                        else:
                            # Otherwise, if the user PREVIOUSLY defined a time range,
                            # we need to look for the beginning of it.
                            # Start by getting the current time
                            dstamp = dateStamp()
                            # The dataset should be from now to -timerange
                            # time(now)-time(range)
                            startTime = dstamp.utcNowFloat() - self.currTimeRange
                            # If timeRange is not None, then we know we need
                            # to display only a certain range of values
                            # However, if the starttime defined is less than the lowest time, we
                            # do not have enough data to display the whole thing, so we must
                            # display all that we have instead. We do this by setting
                            # currTimeRange = 0.
                            if timeRange is not None and startTime < float(data[0][0]):
                                self.currTimeRange = None
                            # For all entries in data
                            for y in range(len(data)):
                                # We are searching backwards through the dataset to find a time
                                # just before the time range specified
                                if data[len(data) - y - 1][0] < startTime:
                                    # once we find it, we know the beginning index of the data to be
                                    # displayed
                                    index = y
                                    # Get the times and datafrom the index and columns to the end of the dataset
                                    times = [datetime.datetime.fromtimestamp(row[0]) for row in data[-index:]]
                                    # print times[0]
                                    column = [row[i] for row in data[-index:]]
                                    # Exit the loop
                                    break

                        try:
                            while len(self.line) <= i:
                                self.line.append(self.ax.plot(1, 1, label=dataSet.getVariables()[1][i - 1][0])[0])

                            self.line[i].set_data(times, column)
                            self.ax.legend(loc="upper left", shadow=True, fancybox=True)
                            # maxi = max(column)
                            # mini = min(column)
                            # newMax = max(column)
                            # newMini = min(column)
                            # if(newMax>maxi)
                            # maxi=newMax
                            # self.ax.set_ylim(mini-mini/2, maxi+maxi/2)
                            # if(newMini<mini)
                            # self.ax.set_ylim(mini-mini/2, maxi+maxi/2)
                            # maxi = max(column)
                            # mini = min(column)

                            # self.ax.set_ylim(mini-mini/2, maxi+maxi/2)
                            # self.ax.set_xlim(min(times), max(times))
                            # self.ax.draw_artist(self.line[i])
                        except:

                            traceback.print_exc()

                            # print "Failed to log data"
                        # Add a legend
                        legend = self.ax.legend(loc="upper left")
                        self.ax.set_title(
                            self.device.getFrame().getTitle(), color=(189.0 / 255, 195.0 / 255, 199.0 / 255)
                        )

                        if (
                            self.device.getFrame().getYLabel() is not None
                            and len(self.device.getFrame().getCustomUnits()) is not 0
                        ):
                            self.ax.set_ylabel(
                                self.device.getFrame().getYLabel()
                                + " ("
                                + self.device.getFrame().getCustomUnits()
                                + ")"
                            )
                        elif (
                            self.device.getFrame().getYLabel() is not None
                            and len(self.device.getFrame().getUnits()[i - 1]) is not 0
                        ):

                            self.ax.set_ylabel(
                                self.device.getFrame().getYLabel()
                                + " ("
                                + self.device.getFrame().getUnits()[i - 1]
                                + ")"
                            )

                        self.ax.set_xlabel("Time")

                        self.ax.hold(True)
                        # locator = AutoDateLocator()
                        # self.ax.fmt_xdata = AutoDateFormatter()
                        # self.ax.xaxis.set_major_locator(locator)
                        # self.ax.xaxis.set_major_locator(locator)
                        # self.ax.xaxis.set_major_formatter(DateFormatter('%m/%d'))

                        # self.ax.fmt_xdata = mdates.DateFormatter('%m/%d %H:%M:%S')
                        # print "type: ", type(times[-1])
                        # print "time[-1]: ",times[-1]
                        # self.ax.set_ylim(bottom = 733681, top = 733682)

                        # self.figure.tight_layout()
                        self.ax.grid(True)

                except Exception as e:
                    print "Error"
                try:

                    self.ax.grid(True)
                    # self.ax.clear(self.ax.yaxis)
                    # self.ax.cla()

                    if self.home:
                        self.ax.set_xlim(times[0], times[-1])
                        self.ax.relim()
                        self.ax.autoscale()

                    # print self.ax.get_data_interval()
                    self.ax.draw_artist(self.figure)
                    self.ax.draw_artist(self.ax.patch)

                    locator = AutoDateLocator()

                    self.ax.xaxis.set_major_locator(locator)
                    self.ax.xaxis.set_major_formatter(DateFormatter("%m/%d %H:%M:%S"))
                    self.figure.autofmt_xdate()
                    # print [time.toordinal() for time in times]
                    self.ax.draw_artist(self.ax.yaxis)
                    self.ax.draw_artist(self.ax.xaxis)

                    for line in self.line:
                        self.ax.draw_artist(line)

                    # self.ax.axis('off')

                    self.ax.draw_artist(legend)

                    self.canvas.update()

                    self.canvas.flush_events()

                except:
                    times = [datetime.datetime.fromtimestamp(row[0]) for row in data]
                    traceback.print_exc()
                    self.ax.set_xlim(times[0], times[-1])
                    self.ax.relim()
                    self.ax.autoscale()
                    # print self.ax.get_data_interval()
                    pass
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(1150, 655)
        MainWindow.setMinimumSize(QtCore.QSize(1500, 250))
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
        self.pushButton_2.setMinimumSize(QtCore.QSize(0, 30))
        self.pushButton_2.setMaximumSize(QtCore.QSize(70, 16777215))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.pushButton_2.clicked.connect(self.zoom)  ########### zoom 함수 연결
        self.gridLayout.addWidget(self.pushButton_2, 2, 1, 1, 1)
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setMinimumSize(QtCore.QSize(0, 30))
        self.pushButton.setMaximumSize(QtCore.QSize(70, 16777215))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton.clicked.connect(self.pan)  ###########pan 함수 연결
        self.gridLayout.addWidget(self.pushButton, 2, 2, 1, 1)
        self.pushButton_3 = QtGui.QPushButton(self.centralwidget)
        self.pushButton_3.setMinimumSize(QtCore.QSize(0, 30))
        self.pushButton_3.setMaximumSize(QtCore.QSize(70, 16777215))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
        self.pushButton_3.clicked.connect(self.home)  ##########home 함수 연결
        self.gridLayout.addWidget(self.pushButton_3, 2, 3, 1, 1)
        self.frame_4 = QtGui.QFrame(self.centralwidget)
        self.frame_4.setMinimumSize(QtCore.QSize(150, 0))
        self.frame_4.setMaximumSize(QtCore.QSize(16777215, 40))
        self.frame_4.setFrameShape(QtGui.QFrame.StyledPanel)
        self.frame_4.setFrameShadow(QtGui.QFrame.Plain)
        self.frame_4.setLineWidth(1)
        self.frame_4.setObjectName(_fromUtf8("frame_4"))
        self.horizontalLayout = QtGui.QHBoxLayout(self.frame_4)
        self.horizontalLayout.setContentsMargins(-1, 0, -1, -1)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.label = QtGui.QLabel(self.frame_4)
        self.label.setMinimumSize(QtCore.QSize(0, 35))
        self.label.setMaximumSize(QtCore.QSize(40, 30))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout.addWidget(self.label)
        self.dateEdit = QtGui.QDateEdit(self.frame_4)
        self.dateEdit.setMinimumSize(QtCore.QSize(0, 30))
        self.dateEdit.setMaximumSize(QtCore.QSize(121, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.dateEdit.setFont(font)
        self.dateEdit.setAlignment(QtCore.Qt.AlignCenter)
        self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
        self.dateEdit.setDateTime(
            QtCore.QDateTime.currentDateTime())  ########## 현재 날짜로 업데이트
        self.dateEdit.setCalendarPopup(True)  ########## 캘린더 팝업
        self.dateEdit.dateChanged.connect(
            self.ShowDate)  ########## 선택한 날짜로 데이터 업데이트
        self.horizontalLayout.addWidget(self.dateEdit)
        self.label_2 = QtGui.QLabel(self.frame_4)
        self.label_2.setMinimumSize(QtCore.QSize(0, 35))
        self.label_2.setMaximumSize(QtCore.QSize(81, 30))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.horizontalLayout.addWidget(self.label_2)
        self.textEdit = QtGui.QTextEdit(self.frame_4)
        self.textEdit.setMinimumSize(QtCore.QSize(600, 30))
        self.textEdit.setMaximumSize(QtCore.QSize(16777215, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.textEdit.setFont(font)
        self.textEdit.setFrameShape(QtGui.QFrame.StyledPanel)
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.horizontalLayout.addWidget(self.textEdit)
        self.comboBox = QtGui.QComboBox(self.frame_4)
        self.comboBox.setMinimumSize(QtCore.QSize(0, 30))
        self.comboBox.setMaximumSize(QtCore.QSize(16777215, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.comboBox.setFont(font)
        self.comboBox.setObjectName(_fromUtf8("comboBox"))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.addItem(_fromUtf8(""))
        self.comboBox.activated.connect(self.convert_utc)
        self.horizontalLayout.addWidget(self.comboBox)
        self.gridLayout.addWidget(self.frame_4, 0, 0, 1, 4)
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.fig = plt.figure()  ########## figure 만들기
        self.canvas = FigureCanvas(self.fig)  ########## canvas 만들기
        self.verticalLayout.addWidget(self.canvas)  ########## figure 삽입
        self.toolbar = NavigationToolbar(self.canvas,
                                         MainWindow)  ##########툴바 생성
        self.toolbar.hide()  ##########툴바 숨김
        self.gridLayout.addLayout(self.verticalLayout, 1, 0, 1, 4)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1150, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        self.menuOpen = QtGui.QMenu(self.menubar)
        self.menuOpen.setObjectName(_fromUtf8("menuOpen"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        self.actionFile = QtGui.QAction(MainWindow)
        self.actionFile.setObjectName(_fromUtf8("actionFile"))
        self.actionFile.triggered.connect(
            self.OpenFile)  ########## OpenFile 연결
        self.actionDirectory = QtGui.QAction(MainWindow)
        self.actionDirectory.setObjectName(_fromUtf8("actionDirectory"))
        self.actionDirectory.triggered.connect(
            self.OpenDirectory)  ########## OpenDirectory 연결
        self.menuOpen.addAction(self.actionFile)
        self.menuOpen.addAction(self.actionDirectory)
        self.menubar.addAction(self.menuOpen.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.pushButton_2.setText(_translate("MainWindow", "ZOOM", None))
        self.pushButton.setText(_translate("MainWindow", "PAN", None))
        self.pushButton_3.setText(_translate("MainWindow", "HOME", None))
        self.label.setText(_translate("MainWindow", "Date", None))
        self.label_2.setText(_translate("MainWindow", "Duration", None))
        self.comboBox.setCurrentIndex(14)
        self.comboBox.setItemText(0,
                                  _translate("MainWindow", "UTC -12:00", None))
        self.comboBox.setItemText(1,
                                  _translate("MainWindow", "UTC -11:00", None))
        self.comboBox.setItemText(2,
                                  _translate("MainWindow", "UTC -10:00", None))
        self.comboBox.setItemText(3,
                                  _translate("MainWindow", "UTC -09:30", None))
        self.comboBox.setItemText(4,
                                  _translate("MainWindow", "UTC -09:00", None))
        self.comboBox.setItemText(5,
                                  _translate("MainWindow", "UTC -08:00", None))
        self.comboBox.setItemText(6,
                                  _translate("MainWindow", "UTC -07:00", None))
        self.comboBox.setItemText(7,
                                  _translate("MainWindow", "UTC -06:00", None))
        self.comboBox.setItemText(8,
                                  _translate("MainWindow", "UTC -05:00", None))
        self.comboBox.setItemText(9,
                                  _translate("MainWindow", "UTC -04:00", None))
        self.comboBox.setItemText(10,
                                  _translate("MainWindow", "UTC -03:30", None))
        self.comboBox.setItemText(11,
                                  _translate("MainWindow", "UTC -03:00", None))
        self.comboBox.setItemText(12,
                                  _translate("MainWindow", "UTC -02:00", None))
        self.comboBox.setItemText(13,
                                  _translate("MainWindow", "UTC -01:00", None))
        self.comboBox.setItemText(14,
                                  _translate("MainWindow", "UTC +00:00", None))
        self.comboBox.setItemText(15,
                                  _translate("MainWindow", "UTC +01:00", None))
        self.comboBox.setItemText(16,
                                  _translate("MainWindow", "UTC +02:00", None))
        self.comboBox.setItemText(17,
                                  _translate("MainWindow", "UTC +03:00", None))
        self.comboBox.setItemText(18,
                                  _translate("MainWindow", "UTC +03:30", None))
        self.comboBox.setItemText(19,
                                  _translate("MainWindow", "UTC +04:00", None))
        self.comboBox.setItemText(20,
                                  _translate("MainWindow", "UTC +04:30", None))
        self.comboBox.setItemText(21,
                                  _translate("MainWindow", "UTC +05:00", None))
        self.comboBox.setItemText(22,
                                  _translate("MainWindow", "UTC +05:30", None))
        self.comboBox.setItemText(23,
                                  _translate("MainWindow", "UTC +05:45", None))
        self.comboBox.setItemText(24,
                                  _translate("MainWindow", "UTC +06:00", None))
        self.comboBox.setItemText(25,
                                  _translate("MainWindow", "UTC +06:30", None))
        self.comboBox.setItemText(26,
                                  _translate("MainWindow", "UTC +07:00", None))
        self.comboBox.setItemText(27,
                                  _translate("MainWindow", "UTC +08:00", None))
        self.comboBox.setItemText(28,
                                  _translate("MainWindow", "UTC +08:30", None))
        self.comboBox.setItemText(29,
                                  _translate("MainWindow", "UTC +08:45", None))
        self.comboBox.setItemText(30,
                                  _translate("MainWindow", "UTC +09:00", None))
        self.comboBox.setItemText(31,
                                  _translate("MainWindow", "UTC +09:30", None))
        self.comboBox.setItemText(32,
                                  _translate("MainWindow", "UTC +10:00", None))
        self.comboBox.setItemText(33,
                                  _translate("MainWindow", "UTC +10:30", None))
        self.comboBox.setItemText(34,
                                  _translate("MainWindow", "UTC +11:00", None))
        self.comboBox.setItemText(35,
                                  _translate("MainWindow", "UTC +12:00", None))
        self.comboBox.setItemText(36,
                                  _translate("MainWindow", "UTC +12:45", None))
        self.comboBox.setItemText(37,
                                  _translate("MainWindow", "UTC +13:00", None))
        self.comboBox.setItemText(38,
                                  _translate("MainWindow", "UTC +14:00", None))
        self.menuOpen.setTitle(_translate("MainWindow", "Open", None))
        self.actionFile.setText(_translate("MainWindow", "File", None))
        self.actionDirectory.setText(
            _translate("MainWindow", "Directory", None))

    def convert_utc(self):
        global utc_timezone
        temp = self.comboBox.currentText().split(" ")[1]
        if temp[0] == '-':
            utc_timezone = float(temp[0:3]) - float(temp[4:6]) / 60
        else:
            utc_timezone = float(temp[0:3]) + float(temp[4:6]) / 60

        if time_list is not None:
            int_time_list = []
            del int_time_list[:]
            for i in time_list:
                convert_time = self.convert_utc_timezone(i, utc_timezone)
                if convert_time.find('-') >= 0:
                    temp = convert_time.split('-')[0] + convert_time.split(
                        '-')[1] + convert_time.split('-')[2]
                    int_time_list.append(temp)

            min_time = min(int_time_list)[0:4] + '/' + min(
                int_time_list)[4:6] + '/' + min(int_time_list)[6:8]
            max_time = max(int_time_list)[0:4] + '/' + max(
                int_time_list)[4:6] + '/' + max(int_time_list)[6:8]
            self.textEdit.setText(min_time + ' ~ ' + max_time)  ###duration 설정
        else:
            pass

        self.View()

    def convert_utc_timezone(self, get_time, gap):
        get_time = get_time.replace("-", " ")
        get_time = get_time.replace(":", " ")
        temp = datetime(
            int(get_time.split(' ')[0]), int(get_time.split(' ')[1]),
            int(get_time.split(' ')[2]), int(get_time.split(' ')[3]),
            int(get_time.split(' ')[4]), int(get_time.split(' ')[5]), 0)
        convert_time = temp + timedelta(hours=gap)

        return str(convert_time)

    def zoom(self):
        self.toolbar.zoom()

    def pan(self):
        self.toolbar.pan()

    def home(self):
        self.toolbar.home()

    def ShowDate(self):
        date = self.dateEdit.date()
        string_date = str(date.toPyDate())
        Date["year"] = string_date.split('-')[0]
        Date["month"] = string_date.split('-')[1]
        Date["day"] = string_date.split('-')[2]

        self.View()

    def OpenFile(self):
        find = ['Onhub', 'Database', 'Amazon Echo']
        file_list = []
        del file_list[:]  #리스트 초기화
        del device_list[:]
        device_list.append('')  # y축 한 줄 띄려고 추가

        reload(sys)
        sys.setdefaultencoding('utf-8')

        FilePath = QtGui.QFileDialog.getOpenFileName()

        if FilePath:
            if FilePath[-4:] == '.csv':  # 확장자로 csv 파일만 필터링
                f = open(FilePath, 'r')
                first = f.readline().split(',')[0].split('-')[0]

                if first.split('(')[0] in find:  # 분석 대상 파일 필터링
                    file_list.append(FilePath)
                    device_list.append(first)
                f.close()

            self.Analyze_Data(file_list)
        else:
            pass

        self.init_view()

    def OpenDirectory(self):
        reload(sys)
        sys.setdefaultencoding('utf-8')

        DirPath = str(QtGui.QFileDialog.getExistingDirectory())

        if DirPath:
            self.Directory_Search(DirPath)
        else:
            pass

        self.init_view()

    def Directory_Search(self, DirPath):
        find = ['Onhub', 'Database', 'Amazon Echo']
        file_list = []
        del file_list[:]  #리스트 초기화
        del device_list[:]

        device_list.append('')  # y축 한 줄 띄려고 추가
        for (path, dir, files) in os.walk(
                unicode(DirPath)):  #unicode(DirPath): 한글 경로 가능하게
            for filename in files:
                if filename[-4:] == '.csv':  #확장자로 csv 파일만 필터링
                    f = open(os.path.join(path, filename), 'r')
                    first = f.readline()
                    if first[0:5] == 'Onhub':  #분석 대상 파일 필터링
                        file_list.append(os.path.join(path, filename))
                        device_list.append(first.split(',')[0].split('-')[0])
                    elif first[0:8] == 'Database':
                        file_list.append(os.path.join(path, filename))
                        device_list.append(
                            first.split('_')[0] + '(' +
                            first.split('(')[1].split('-')[0])
                    elif first[0:11] == 'Amazon Echo':
                        file_list.append(os.path.join(path, filename))
                        device_list.append(first.split(',')[0].split('-')[0])
                    f.close()

        self.Analyze_Data(file_list)

    def Analyze_Data(self, file_list):
        empty_list = []
        out_data["onhub_disconnect"] = empty_list
        out_data["onhub_connect"] = empty_list
        out_data["amazon_echo"] = empty_list
        out_data["Database"] = empty_list
        in_data = {}  #기기별 모든 데이터가 포함되어 있는 딕셔너리
        del time_list[:]
        index = 1
        for i in range(1, len(device_list)):
            data = self.Read_Data(file_list[i - 1], time_list, index)  #모든 데이터
            if in_data is None:
                in_data[device_list[i]] = data
            else:
                if device_list[i] in in_data:
                    in_data[device_list[i]] = data
                else:
                    in_data[device_list[i]] = data
            index += 1

        int_time_list = []
        del int_time_list[:]
        for i in time_list:
            if i.find('-') >= 0:
                temp = i.split('-')[0] + i.split('-')[1] + i.split('-')[2]
                int_time_list.append(temp)

        min_time = min(int_time_list)[0:4] + '/' + min(
            int_time_list)[4:6] + '/' + min(int_time_list)[6:8]
        max_time = max(int_time_list)[0:4] + '/' + max(
            int_time_list)[4:6] + '/' + max(int_time_list)[6:8]
        self.textEdit.setText(min_time + ' ~ ' + max_time)  ###duration 설정

        connect = []
        disconnect = []
        database = []
        echo = []

        for key in in_data:
            if key[0:5] == 'Onhub':
                temp1 = in_data[key]  #temp1은 각 기기별 데이터 리스트들
                for temp2 in temp1:  #temp2는 temp1의 리스트 하나
                    if temp2[2] == 'Connected':
                        connect.append(temp2[0] + ' ' + temp2[1] + ' ' +
                                       temp2[3] + ' ' + temp2[4])
                    elif temp2[2] == 'Disconnected':
                        disconnect.append(temp2[0] + ' ' + temp2[1] + ' ' +
                                          temp2[3] + ' ' + temp2[4])
                    else:
                        continue
                out_data["onhub_connect"] = connect
                out_data["onhub_disconnect"] = disconnect
            elif key[0:11] == 'Amazon Echo':
                temp1 = in_data[key]  # temp1은 각 기기별 데이터 리스트들
                for temp2 in temp1:  # temp2는 temp1의 리스트 하나
                    echo.append(temp2)
                out_data["amazon_echo"] = echo
            elif key[0:8] == 'Database':
                temp1 = in_data[key]  # temp1은 각 기기별 데이터 리스트들
                for temp2 in temp1:  # temp2는 temp1의 리스트 하나
                    database.append(temp2)
                out_data["Database"] = database

        ###View 함수로 이동

    def Read_Data(self, Filepath, time_list, index):
        global utc_timezone

        f = open(Filepath, 'r')

        data_a = csv.reader(f)
        count = 0
        list = []
        device_name = 0

        for data in data_a:
            if not data:
                pass
            else:
                if count == 0:
                    if data[0][0:5] == 'Onhub':
                        device_name = data[0].split('-')[0]
                    elif data[0][0:11] == 'Amazon Echo':
                        device_name = data[0].split('-')[0]
                    elif data[0][0:8] == 'Database':
                        device_name = data[0].split(
                            '_')[0] + '(' + data[0].split('(')[1].split('-')[0]
                    temp = QtCore.QString(data[1].split("UTC")[1])
                    if temp[0] == '-':
                        utc_timezone_temp = float(
                            temp[0:3]) - float(temp[4:6]) / 60
                    else:
                        utc_timezone_temp = float(
                            temp[0:3]) + float(temp[4:6]) / 60
                    utc_timezone_dic[device_name] = utc_timezone_temp
                    count = 1
                elif data[0].find('Time') >= 0:
                    count = 2
                elif count == 2:
                    if data[0] == '="None"':
                        pass
                    else:
                        data.append(
                            device_name)  # 기기정보 추가(날짜, 맥주소, 연결/연결해제, 기기정보)
                        data.append(str(index))
                        list.append(data)
                        if utc_timezone_dic[device_name] == utc_timezone:
                            time_list.append(data[0].split('"')[1].split('"')
                                             [0])  # time_list는 시간정보
                        else:
                            time_temp = data[0].split('"')[1].split('"')[0]
                            time_temp = self.convert_utc_timezone(
                                time_temp,
                                utc_timezone - utc_timezone_dic[device_name])
                            time_list.append(time_temp)  # time_list는 시간정보
        f.close()
        return list

    def init_view(self):
        plt.clf()
        plt.ylim(0, len(device_list))  # y축 최소,최대값 설정
        plt.yticks(np.arange(0, len(device_list)), device_list)  # y축 눈금
        plt.xlim(0, 24)  # x축 최소,최대값 설정
        plt.xticks(np.arange(0, 25))  # x축 눈금
        plt.xlabel('time(hours)')
        plt.ylabel('devices')
        plt.title('Result')

    def View(self):
        self.init_view()
        global utc_timezone
        sc_onhub_connect = []
        del sc_onhub_connect[:]
        sc_onhub_connect_index = []
        del sc_onhub_connect_index[:]
        sc_onhub_disconnect = []
        del sc_onhub_disconnect[:]
        sc_onhub_disconnect_index = []
        del sc_onhub_disconnect_index[:]
        onhub_disconnect_annot.clear
        onhub_connect_annot.clear
        sc_Database = []
        del sc_Database[:]
        sc_Database_index = []
        del sc_Database_index[:]
        Database_annot.clear
        sc_amazon_echo = []
        del sc_amazon_echo[:]
        sc_amazon_echo_index = []
        del sc_amazon_echo_index[:]
        echo_annot.clear

        if (out_data["onhub_connect"] is ''
            ) & (out_data["onhub_disconnect"] is '') & (
                out_data["Database"] is '') & (out_data["amazon_echo"] is ''):
            self.canvas.draw()
            self.clear_view()
        else:
            self.annot = plt.annotate("",
                                      xy=(0, 0),
                                      xytext=(20, 20),
                                      textcoords="offset points",
                                      bbox=dict(boxstyle="round", fc="w"),
                                      arrowprops=dict(arrowstyle="->"))
            if out_data["onhub_connect"]:
                sc_onhub_connect_temp = out_data["onhub_connect"]
                if utc_timezone_dic[sc_onhub_connect_temp[0].split(' ')
                                    [3]] == utc_timezone:
                    for i in range(len(sc_onhub_connect_temp)):
                        time = sc_onhub_connect_temp[i].split(' ')[0].split(
                            '"')[1]
                        if (Date["year"] == time.split('-')[0]) & (
                                Date["month"] == time.split('-')[1]) & (
                                    Date["day"] == time.split('-')[2]):
                            time2 = sc_onhub_connect_temp[i].split(
                                ' ')[1].split('"')[0]
                            add_data = float(time2.split(":")[0]) + (
                                float(time2.split(":")[1]) / 60) + (
                                    (float(time2.split(":")[2]) / 60) / 60
                                )  # X축 시간 계산  ##########split 데이터 수정
                            sc_onhub_connect.append(round(add_data, 4))
                            index = sc_onhub_connect_temp[i].split(' ')[4]
                            onhub_connect_annot[round(
                                add_data, 4
                            )] = index + '|' + 'MAC address : ' + sc_onhub_connect_temp[
                                i].split(' ')[2].split('"')[1].split(
                                    '"'
                                )[0] + '\n' + 'time : ' + sc_onhub_connect_temp[
                                    i].split(' ')[0].split(
                                        '"')[1] + ' ' + sc_onhub_connect_temp[
                                            i].split(' ')[1].split('"')[
                                                0] + '\n' + 'Action: Connected'
                            sc_onhub_connect_index.append(int(index))
                        else:
                            continue
                else:
                    gap = utc_timezone - utc_timezone_dic[
                        sc_onhub_connect_temp[0].split(' ')[3]]
                    for i in range(len(sc_onhub_connect_temp)):
                        time_temp = sc_onhub_connect_temp[i].split(
                            '"')[1].split('"')[0]
                        convert_time = self.convert_utc_timezone(
                            time_temp, gap)
                        time = convert_time.split(' ')[0]
                        if (Date["year"] == time.split('-')[0]) & (
                                Date["month"] == time.split('-')[1]) & (
                                    Date["day"] == time.split('-')[2]):
                            time2 = convert_time.split(' ')[1]
                            add_data = float(time2.split(":")[0]) + (
                                float(time2.split(":")[1]) / 60) + (
                                    (float(time2.split(":")[2]) / 60) / 60
                                )  # X축 시간 계산  ##########split 데이터 수정
                            sc_onhub_connect.append(round(add_data, 4))
                            index = sc_onhub_connect_temp[i].split(' ')[4]
                            onhub_connect_annot[round(
                                add_data, 4
                            )] = index + '|' + 'MAC address : ' + sc_onhub_connect_temp[
                                i].split(' ')[2].split('"')[1].split(
                                    '"'
                                )[0] + '\n' + 'time : ' + convert_time + '\n' + 'Action: Connected'
                            sc_onhub_connect_index.append(int(index))
                self.onhub_connect = plt.scatter(sc_onhub_connect,
                                                 sc_onhub_connect_index,
                                                 color='R',
                                                 edgecolors='R',
                                                 s=50,
                                                 label='Connected')
            else:
                self.onhub_connect = plt.scatter(sc_onhub_connect,
                                                 sc_onhub_connect_index,
                                                 color='R',
                                                 edgecolors='R',
                                                 s=50)

            if out_data["onhub_disconnect"]:
                sc_onhub_disconnect_temp = out_data["onhub_disconnect"]
                if utc_timezone_dic[sc_onhub_disconnect_temp[0].split(' ')
                                    [3]] == utc_timezone:
                    for i in range(len(sc_onhub_disconnect_temp)):
                        time = sc_onhub_disconnect_temp[i].split(' ')[0].split(
                            '"')[1]
                        if (Date["year"] == time.split('-')[0]) & (
                                Date["month"] == time.split('-')[1]) & (
                                    Date["day"] == time.split('-')[2]):
                            time2 = sc_onhub_disconnect_temp[i].split(
                                ' ')[1].split('"')[0]
                            add_data = float(time2.split(":")[0]) + (
                                float(time2.split(":")[1]) / 60) + (
                                    (float(time2.split(":")[2].split(".")[0]) /
                                     60) / 60)  # X축 시간 계산
                            sc_onhub_disconnect.append(round(add_data, 4))
                            index = sc_onhub_disconnect_temp[i].split(' ')[4]
                            sc_onhub_disconnect_index.append(int(index))
                            onhub_disconnect_annot[round(
                                add_data, 4
                            )] = index + '|' + 'MAC address : ' + sc_onhub_disconnect_temp[
                                i].split(' ')[2].split('"')[1].split(
                                    '"'
                                )[0] + '\n' + 'time : ' + sc_onhub_disconnect_temp[
                                    i].split(' ')[0].split(
                                        '"'
                                    )[1] + ' ' + sc_onhub_disconnect_temp[
                                        i].split(' ')[1].split('"')[
                                            0] + '\n' + 'Action: Disconnected'
                        else:
                            continue
                else:
                    gap = utc_timezone - utc_timezone_dic[
                        sc_onhub_disconnect_temp[0].split(' ')[3]]
                    for i in range(len(sc_onhub_disconnect_temp)):
                        time_temp = sc_onhub_disconnect_temp[i].split(
                            '"')[1].split('"')[0]
                        convert_time = self.convert_utc_timezone(
                            time_temp, gap)
                        time = convert_time.split(' ')[0]
                        if (Date["year"] == time.split('-')[0]) & (
                                Date["month"] == time.split('-')[1]) & (
                                    Date["day"] == time.split('-')[2]):
                            time2 = convert_time.split(' ')[1]
                            add_data = float(time2.split(":")[0]) + (
                                float(time2.split(":")[1]) / 60) + (
                                    (float(time2.split(":")[2].split(".")[0]) /
                                     60) / 60)  # X축 시간 계산
                            sc_onhub_disconnect.append(round(add_data, 4))
                            index = sc_onhub_disconnect_temp[i].split(' ')[4]
                            sc_onhub_disconnect_index.append(int(index))
                            onhub_disconnect_annot[round(
                                add_data, 4
                            )] = index + '|' + 'MAC address : ' + sc_onhub_disconnect_temp[
                                i].split(' ')[2].split('"')[1].split(
                                    '"'
                                )[0] + '\n' + 'time : ' + convert_time + '\n' + 'Action: Disconnected'
                self.onhub_disconnect = plt.scatter(sc_onhub_disconnect,
                                                    sc_onhub_disconnect_index,
                                                    marker='X',
                                                    color='k',
                                                    label='Disconnected')
            else:
                self.onhub_disconnect = plt.scatter(sc_onhub_disconnect,
                                                    sc_onhub_disconnect_index,
                                                    marker='X',
                                                    color='k')

            if out_data["amazon_echo"]:
                sc_amazon_echo_temp = out_data["amazon_echo"]
                if utc_timezone_dic[sc_amazon_echo_temp[0][3]] == utc_timezone:
                    for i in range(len(sc_amazon_echo_temp)):
                        time = sc_amazon_echo_temp[i][0].split('"')[1].split(
                            ' ')[0]
                        if (Date["year"] == time.split('-')[0]) & (
                                Date["month"] == time.split('-')[1]) & (
                                    Date["day"] == time.split('-')[2]):
                            time2 = sc_amazon_echo_temp[i][0].split(
                                ' ')[1].split('"')[0]
                            add_data = float(time2.split(":")[0]) + (
                                float(time2.split(":")[1]) / 60) + (
                                    (float(time2.split(":")[2].split(".")[0]) /
                                     60) / 60)  # X축 시간 계산
                            sc_amazon_echo.append(round(add_data, 4))
                            index = sc_amazon_echo_temp[i][4]
                            sc_amazon_echo_index.append(int(index))
                            echo_annot[round(
                                add_data, 4
                            )] = 'File name : ' + sc_amazon_echo_temp[i][
                                1] + '\n' + 'time : ' + sc_amazon_echo_temp[i][
                                    0].split('"')[1].split(
                                        '"'
                                    )[0] + '\n' + 'command : ' + sc_amazon_echo_temp[
                                        i][2]
                        else:
                            continue
                else:
                    gap = utc_timezone - utc_timezone_dic[
                        sc_amazon_echo_temp[0][3]]
                    for i in range(len(sc_amazon_echo_temp)):
                        time_temp = sc_amazon_echo_temp[i][0].split(
                            '"')[1].split('"')[0]
                        convert_time = self.convert_utc_timezone(
                            time_temp, gap)
                        time = convert_time.split(' ')[0]
                        if (Date["year"] == time.split('-')[0]) & (
                                Date["month"] == time.split('-')[1]) & (
                                    Date["day"] == time.split('-')[2]):
                            time2 = convert_time.split(' ')[1]
                            add_data = float(time2.split(":")[0]) + (
                                float(time2.split(":")[1]) / 60) + (
                                    (float(time2.split(":")[2].split(".")[0]) /
                                     60) / 60)  # X축 시간 계산
                            sc_amazon_echo.append(round(add_data, 4))
                            index = sc_amazon_echo_temp[i][4]
                            sc_amazon_echo_index.append(int(index))
                            echo_annot[round(
                                add_data, 4
                            )] = 'File name : ' + sc_amazon_echo_temp[i][
                                1] + '\n' + 'time : ' + convert_time + '\n' + 'command : ' + sc_amazon_echo_temp[
                                    i][2]
                self.amazon_echo = plt.scatter(sc_amazon_echo,
                                               sc_amazon_echo_index,
                                               marker='*',
                                               color='b',
                                               label='Command Event')
            else:
                self.amazon_echo = plt.scatter(sc_amazon_echo,
                                               sc_amazon_echo_index,
                                               marker='*',
                                               color='b')

            if out_data["Database"]:
                sc_Database_temp = out_data["Database"]
                if utc_timezone_dic[sc_Database_temp[0][2]] == utc_timezone:
                    for i in range(len(sc_Database_temp)):
                        time = sc_Database_temp[i][0].split('"')[1].split(
                            ' ')[0]
                        if (Date["year"] == time.split('-')[0]) & (
                                Date["month"] == time.split('-')[1]) & (
                                    Date["day"] == time.split('-')[2]):
                            time2 = sc_Database_temp[i][0].split(' ')[1].split(
                                '"')[0]
                            add_data = float(time2.split(":")[0]) + (
                                float(time2.split(":")[1]) / 60) + (
                                    (float(time2.split(":")[2].split(".")[0]) /
                                     60) / 60)  # X축 시간 계산
                            sc_Database.append(round(add_data, 4))
                            index = sc_Database_temp[i][3]
                            sc_Database_index.append(int(index))
                            Database_annot[round(
                                add_data,
                                4)] = 'File name : ' + sc_Database_temp[i][
                                    1] + '\n' + 'time : ' + sc_Database_temp[
                                        i][0].split('"')[1].split('"')[
                                            0] + '\n' + 'Action: File Modified'
                        else:
                            continue
                else:
                    gap = utc_timezone - utc_timezone_dic[sc_Database_temp[0]
                                                          [2]]
                    for i in range(len(sc_Database_temp)):
                        time_temp = sc_Database_temp[i][0].split('"')[1].split(
                            '"')[0]
                        convert_time = self.convert_utc_timezone(
                            time_temp, gap)
                        time = convert_time.split(' ')[0]
                        if (Date["year"] == time.split('-')[0]) & (
                                Date["month"] == time.split('-')[1]) & (
                                    Date["day"] == time.split('-')[2]):
                            time2 = convert_time.split(' ')[1]
                            add_data = float(time2.split(":")[0]) + (
                                float(time2.split(":")[1]) / 60) + (
                                    (float(time2.split(":")[2].split(".")[0]) /
                                     60) / 60)  # X축 시간 계산
                            sc_Database.append(round(add_data, 4))
                            index = sc_Database_temp[i][3]
                            sc_Database_index.append(int(index))
                            Database_annot[round(
                                add_data, 4
                            )] = 'File name : ' + sc_Database_temp[i][
                                1] + '\n' + 'time : ' + convert_time + '\n' + 'Action: File Modified'
                self.Database = plt.scatter(sc_Database,
                                            sc_Database_index,
                                            marker='<',
                                            color='g',
                                            label='File Modified')
            else:
                self.Database = plt.scatter(sc_Database,
                                            sc_Database_index,
                                            marker='<',
                                            color='g')

            plt.legend(loc='best')
            self.annot.set_visible(False)
            self.canvas.draw()
            self.canvas.mpl_connect("motion_notify_event", self.event)

    def event(self, event):
        if event.inaxes is not None:
            if self.onhub_connect.contains(event)[0] is True:
                onhub_connect_x, onhub_connect_index = self.onhub_connect.contains(
                    event)
                self.update_connect_onhub(onhub_connect_index)
                self.annot.set_visible(True)
                event.canvas.draw()
            elif self.onhub_disconnect.contains(event)[0] is True:
                onhub_disconnect_x, onhub_disconnect_index = self.onhub_disconnect.contains(
                    event)
                self.update_disconnect_onhub(onhub_disconnect_index)
                self.annot.set_visible(True)
                event.canvas.draw()
            elif self.amazon_echo.contains(event)[0] is True:
                amazon_echo_x, amazon_echo_index = self.amazon_echo.contains(
                    event)
                self.update_amazon_echo(amazon_echo_index)
                self.annot.set_visible(True)
                event.canvas.draw()
            elif self.Database.contains(event)[0] is True:
                Database_x, Database_index = self.Database.contains(event)
                self.updat_database(Database_index)
                self.annot.set_visible(True)
                event.canvas.draw()
            else:
                self.annot.set_visible(False)
                self.canvas.draw_idle()

    def updat_database(self, ind):
        pos = self.Database.get_offsets()[ind["ind"][0]]
        self.annot.xy = pos
        text = Database_annot[pos[0]]
        self.annot.set_text(text)

    def update_amazon_echo(self, ind):
        pos = self.amazon_echo.get_offsets()[ind["ind"][0]]
        self.annot.xy = pos
        text = echo_annot[pos[0]]
        self.annot.set_text(text)

    def update_connect_onhub(self, ind):
        pos = self.onhub_connect.get_offsets()[ind["ind"][0]]
        self.annot.xy = pos
        text = onhub_connect_annot[pos[0]]
        if int(text.split('|')[0]) == pos[1]:
            self.annot.set_text(text.split('|')[1])
        else:
            pass

    def update_disconnect_onhub(self, ind):
        pos = self.onhub_disconnect.get_offsets()[ind["ind"][0]]
        self.annot.xy = pos
        text = onhub_disconnect_annot[pos[0]]
        if int(text.split('|')[0]) == pos[1]:
            self.annot.set_text(text.split('|')[1])
        else:
            pass
Esempio n. 9
0
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.setWindowTitle('OpenWave-2KE V%s'%__version__)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("openwave.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.setWindowIcon(icon)

        #Waveform area.
        self.figure = plt.figure()
        self.figure.set_facecolor('white')

        self.canvas = FigureCanvas(self.figure)
        self.canvas.setMinimumSize(800,  400)
        
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()

        #Zoom In/out and Capture Buttons
        self.zoomBtn = QtGui.QPushButton('Zoom')
        self.zoomBtn.setFixedSize(100, 30)
        self.zoomBtn.clicked.connect(self.toolbar.zoom)

        self.panBtn = QtGui.QPushButton('Pan')
        self.panBtn.setFixedSize(100, 30)
        self.panBtn.clicked.connect(self.toolbar.pan)

        self.homeBtn = QtGui.QPushButton('Home')
        self.homeBtn.setFixedSize(100, 30)
        self.homeBtn.clicked.connect(self.toolbar.home)

        self.captureBtn = QtGui.QPushButton('Capture')
        self.captureBtn.setFixedSize(100, 50)
        self.captureBtn.clicked.connect(self.manualCapture)
        if(dso.connection_status==0):
            self.captureBtn.setEnabled(False)
            
        self.continuousBtn = QtGui.QRadioButton('Continuous')
        self.continuousBtn.setEnabled(True)
        self.continuousBtn.clicked.connect(self.setContinuous)

        #Continuous capture selection
        self.captureLayout = QtGui.QHBoxLayout()
        self.captureLayout.addWidget(self.captureBtn)
        self.captureLayout.addWidget(self.continuousBtn)

        #Type: Raw Data/Image
        self.typeBtn = QtGui.QPushButton('Raw Data')
        self.typeBtn.setToolTip("Switch to get raw data or image from DSO.")
        self.typeBtn.setFixedSize(120, 50)
        self.typeFlag=True #Initial state -> Get raw data
        self.typeBtn.setCheckable(True)
        self.typeBtn.setChecked(True)
        self.typeBtn.clicked.connect(self.typeAction)
        
        #Channel Selection.
        self.ch1checkBox = QtGui.QCheckBox('CH1')
        self.ch1checkBox.setFixedSize(60, 30)
        self.ch1checkBox.setChecked(True)
        self.ch2checkBox = QtGui.QCheckBox('CH2')
        self.ch2checkBox.setFixedSize(60, 30)
        if(dso.chnum==4):
            self.ch3checkBox = QtGui.QCheckBox('CH3')
            self.ch3checkBox.setFixedSize(60, 30)
            self.ch4checkBox = QtGui.QCheckBox('CH4')
            self.ch4checkBox.setFixedSize(60, 30)
        
        #Set channel selection layout.
        self.selectLayout = QtGui.QHBoxLayout()
        self.selectLayout.addWidget(self.ch1checkBox)
        self.selectLayout.addWidget(self.ch2checkBox)
        if(dso.chnum==4):
            self.selectLayout2 = QtGui.QHBoxLayout()
            self.selectLayout2.addWidget(self.ch3checkBox)
            self.selectLayout2.addWidget(self.ch4checkBox)

        self.typeLayout = QtGui.QHBoxLayout()
        self.typeLayout.addWidget(self.typeBtn)
        self.typeLayout.addLayout(self.selectLayout)
        if(dso.chnum==4):
            self.typeLayout.addLayout(self.selectLayout2)

        self.zoominoutLayout = QtGui.QHBoxLayout()
        self.zoominoutLayout.addWidget(self.zoomBtn)
        self.zoominoutLayout.addWidget(self.panBtn)
        self.zoominoutLayout.addWidget(self.homeBtn)

        #Save/Load/Quit button
        self.saveBtn = QtGui.QPushButton('Save')
        self.saveBtn.setFixedSize(100, 50)
        self.saveMenu = QtGui.QMenu(self)
        self.csvAction = self.saveMenu.addAction("&As CSV File")
        self.pictAction = self.saveMenu.addAction("&As PNG File")
        self.saveBtn.setMenu(self.saveMenu)
        self.saveBtn.setToolTip("Save waveform to CSV file or PNG file.")
        self.connect(self.csvAction, QtCore.SIGNAL("triggered()"), self.saveCsvAction)
        self.connect(self.pictAction, QtCore.SIGNAL("triggered()"), self.savePngAction)

        self.loadBtn = QtGui.QPushButton('Load')
        self.loadBtn.setToolTip("Load CHx's raw data from file(*.csv, *.lsf).")
        self.loadBtn.setFixedSize(100, 50)
        self.loadBtn.clicked.connect(self.loadAction)

        self.quitBtn = QtGui.QPushButton('Quit')
        self.quitBtn.setFixedSize(100, 50)
        self.quitBtn.clicked.connect(self.quitAction)

        # set the layout
        self.waveLayout = QtGui.QHBoxLayout()
        self.waveLayout.addWidget(self.canvas)
        
        self.wave_box=QtGui.QVBoxLayout()
        self.wave_box.addLayout(self.waveLayout)
        
        self.wavectrlLayout = QtGui.QHBoxLayout()
        self.wavectrlLayout.addStretch(1)
        self.wavectrlLayout.addLayout(self.zoominoutLayout)
        self.wavectrlLayout.addStretch(1)
        self.wavectrlLayout.addLayout(self.captureLayout)
        self.wavectrlLayout.addStretch(1)
        
        self.saveloadLayout = QtGui.QHBoxLayout()
        self.saveloadLayout.addWidget(self.saveBtn)
        self.saveloadLayout.addWidget(self.loadBtn)
        self.saveloadLayout.addWidget(self.quitBtn)
        
        self.ctrl_box=QtGui.QHBoxLayout()
        self.ctrl_box.addLayout(self.typeLayout)
        self.ctrl_box.addLayout(self.saveloadLayout)
        
        main_box=QtGui.QVBoxLayout()
        main_box.addLayout(self.wave_box)         #Waveform area.
        main_box.addLayout(self.wavectrlLayout)   #Zoom In/Out...
        main_box.addLayout(self.ctrl_box)         #Save/Load/Quit
        self.setLayout(main_box)
        
        self.captured_flag=0
        self.timer=QtCore.QTimer()
        self.timer.timeout.connect(self.timerCapture)

    def typeAction(self):
        if(self.typeFlag==True):
            self.typeFlag=False
            self.typeBtn.setText("Image")
            self.csvAction.setEnabled(False)
        else:
            self.typeFlag=True
            self.typeBtn.setText("Raw Data")
            self.csvAction.setEnabled(True)
        self.typeBtn.setChecked(self.typeFlag)
        self.ch1checkBox.setEnabled(self.typeFlag)
        self.ch2checkBox.setEnabled(self.typeFlag)
        if(dso.chnum==4):
            self.ch3checkBox.setEnabled(self.typeFlag)
            self.ch4checkBox.setEnabled(self.typeFlag)

    def saveCsvAction(self):
        if(self.typeFlag==True): #Save raw data to csv file.
            file_name=QtGui.QFileDialog.getSaveFileName(self, "Save as", 'DS0001', "Fast CSV File(*.csv)")[0]
            num=len(dso.ch_list)
            #print num
            for ch in xrange(num):
                if(dso.info[ch]==[]):
                    print('Failed to save data, raw data information is required!')
                    return
            f = open(file_name, 'wb')
            item=len(dso.info[0])
            #Write file header.
            f.write('%s,\r\n' % dso.info[0][0])
            for x in xrange(1,  24):
                str=''
                for ch in xrange(num):
                    str+=('%s,' % dso.info[ch][x])
                str+='\r\n'
                f.write(str)
            #Write Fast CSV mode only.
            str=''
            for ch in xrange(num):
                str+='Mode,Fast,'
            str+='\r\n'
            f.write(str)

            str=''
            if(num==1):
                str+=('%s,' % dso.info[0][25])
            else:
                for ch in xrange(num):
                    str+=('%s,,' % dso.info[ch][25])
            str+='\r\n'
            f.write(str)
            #Write raw data.
            item=len(dso.iWave[0])
            #print item
            tenth=int(item/10)
            n_tenth=tenth-1
            percent=10
            for x in xrange(item):
                str=''
                if(num==1):
                    str+=('%s,' % dso.iWave[0][x])
                else:
                    for ch in xrange(num):
                        str+=('%s, ,' % dso.iWave[ch][x])
                str+='\r\n'
                f.write(str)
                if(x==n_tenth):
                    n_tenth+=tenth
                    print('%3d %% Saved\r'%percent),
                    percent+=10
            f.close()

    def savePngAction(self):
        #Save figure to png file.
        file_name=QtGui.QFileDialog.getSaveFileName(self, "Save as", 'DS0001', "PNG File(*.png)")[0]
        if(file_name==''):
            return
        if(self.typeFlag==True): #Save raw data waveform as png file.
            main.figure.savefig(file_name)
        else:  #Save figure to png file.
            if(dso.osname=='pi'): #For raspberry pi only.
                img=dso.im.transpose(Image.FLIP_TOP_BOTTOM)
                img.save(file_name)
            else:
                dso.im.save(file_name)
        print('Saved image to %s.'%file_name)

    def loadAction(self):
        dso.ch_list=[]
        full_path_name=QtGui.QFileDialog.getOpenFileName(self,self.tr("Open File"),".","CSV/LSF files (*.csv *.lsf);;All files (*.*)")  
        sFileName=unicode(full_path_name).split(',')[0][3:-1] #For PySide
        print sFileName
        if(len(sFileName)<=0):
            return
        if os.path.exists(sFileName):
            print 'Reading file...'
            count=dso.readRawDataFile(sFileName)
            #Draw waveform.
            if(count>0):
                total_chnum=len(dso.ch_list)
                if(total_chnum==0):
                    return
                self.drawWaveform(0)
        else:
            print('File not found!')

    def quitAction(self):
        if(dso.connection_status==1):
            dso.closeIO()
        self.close()
    
    def timerCapture(self):
        self.captureAction()
        if(self.continuousBtn.isChecked()==True):
            self.timer.start(10)  #Automatic capturing. 
        
    def manualCapture(self):
        if(self.continuousBtn.isChecked()==True):
            if(self.captured_flag ==0):
                self.captured_flag = 1   #Continuous capture started.
                self.captureBtn.setText("Click to Stop")
                self.loadBtn.setEnabled(False)
                self.timer.start()
            else:
                self.captured_flag = 0   #Continuous capture stopped.
                self.captureBtn.setText("Capture")
                self.loadBtn.setEnabled(True)
                self.timer.stop()
        self.captureAction()
    
    def captureAction(self):
        dso.iWave=[[], [], [], []]
        dso.ch_list=[]
        if(self.typeFlag==True): #Get raw data.
            draw_flag=False
            #Turn on the selected channels.
            if((self.ch1checkBox.isChecked()==True) and (dso.isChannelOn(1)==False)):
                dso.write(":CHAN1:DISP ON\n")           #Set CH1 on.
            if((self.ch2checkBox.isChecked()==True) and (dso.isChannelOn(2)==False)):
                dso.write(":CHAN2:DISP ON\n")           #Set CH2 on.
            if(dso.chnum==4):
                if((self.ch3checkBox.isChecked()==True) and (dso.isChannelOn(3)==False)):
                    dso.write(":CHAN3:DISP ON\n")       #Set CH3 on.
                if((self.ch4checkBox.isChecked()==True) and (dso.isChannelOn(4)==False)):
                    dso.write(":CHAN4:DISP ON\n")       #Set CH4 on.
            #Get all the selected channel's raw datas.
            if(self.ch1checkBox.isChecked()==True):
                dso.getRawData(True, 1)              #Read CH1's raw data from DSO (including header).
            if(self.ch2checkBox.isChecked()==True):
                dso.getRawData(True, 2)              #Read CH2's raw data from DSO (including header).
            if(dso.chnum==4):
                if(self.ch3checkBox.isChecked()==True):
                    dso.getRawData(True, 3)          #Read CH3's raw data from DSO (including header).
                if(self.ch4checkBox.isChecked()==True):
                    dso.getRawData(True, 4)          #Read CH4's raw data from DSO (including header).
            #Draw waveform.
            total_chnum=len(dso.ch_list)
            if(total_chnum==0):
                return
            if(self.drawWaveform(1)==-1):
                time.sleep(5)
                self.drawWaveform(0)
        else: #Get image.
            img_type=1   #1 for RLE format, 0 for PNG format.
            if(img_type):
                dso.write(':DISP:OUTP?\n')                 #Send command to get image from DSO.
            else:
                dso.write(':DISP:PNGOutput?\n')            #Send command to get image from DSO.
            dso.getBlockData()
            dso.ImageDecode(img_type)
            self.showImage()
            plt.tight_layout(True)
            self.canvas.draw()
            print('Image is ready!')

    def setContinuous(self):
        if(self.continuousBtn.isChecked()==False):
            self.captured_flag = 0   #Continuous capture stopped.
            self.timer.stop()
            self.loadBtn.setEnabled(True)
            self.captureBtn.setText("Capture")

    def showImage(self):
        #Turn the ticks off and show image.
        plt.clf()
        ax = plt.gca()
        ax.xaxis.set_visible(False)
        ax.yaxis.set_visible(False)
        plt.imshow(dso.im)

    def drawWaveform(self, mode):
        total_chnum=len(dso.ch_list)
        num=dso.points_num
        ch_colortable=['#C0B020',  '#0060FF',  '#FF0080',  '#00FF60']
        ch=int(dso.ch_list[0][2])-1 #Get the channel of first waveform.
        plt.cla()
        plt.clf()
        #Due to the memory limitation of matplotlib, we must reduce the sample points.
        if(num==10000000):
            if(total_chnum>2):
                down_sample_factor=4
            elif(total_chnum==2):
                down_sample_factor=4
            else:
                down_sample_factor=1
            num=num/down_sample_factor
        elif(num==20000000):
            if(total_chnum > 1):
                down_sample_factor=4
            else:
                down_sample_factor=2
            num=num/down_sample_factor
        else:
            down_sample_factor=1
        dt=dso.dt[0] #Get dt from the first opened channel.
        t_start=dso.hpos[0]-num*dt/2
        t_end  =dso.hpos[0]+num*dt/2
        t = np.arange(t_start, t_end, dt)
        #print t_start, t_end, dt, len(t)
        if((len(t)-num)==1): #Avoid floating point rounding error.
            t=t[:-1]
        wave_type='-' #Set waveform type to vector.
        #Draw waveforms.
        ax=[[], [], [], []]
        p=[]
        for ch in xrange(total_chnum):
            if(ch==0):
                ax[ch]=host_subplot(111, axes_class=AA.Axes)
                ax[ch].set_xlabel("Time (sec)")
            else:
                ax[ch]=ax[0].twinx()
            ax[ch].set_ylabel("%s Units: %s" %(dso.ch_list[ch],  dso.vunit[ch]))
            ch_color=ch_colortable[int(dso.ch_list[ch][2])-1]
            if(ch>1):
                new_fixed_axis = ax[ch].get_grid_helper().new_fixed_axis
                ax[ch].axis["right"] = new_fixed_axis(loc="right", axes=ax[ch], offset=(60*(ch-1), 0))
            ax[ch].set_xlim(t_start, t_end)
            ax[ch].set_ylim(-4*dso.vdiv[ch]-dso.vpos[ch], 4*dso.vdiv[ch]-dso.vpos[ch]) #Setup vertical display range.
            fwave=dso.convertWaveform(ch, down_sample_factor)
            #print('Length=%d'%(len(fwave)))
            if(ch==0):
                try:
                    p=ax[ch].plot(t, fwave, color=ch_color, ls=wave_type, label = dso.ch_list[ch])
                except:
                    if(mode==1):
                        #print sys.exc_info()[0]
                        time.sleep(5)
                        print 'Trying to plot again!',
                    return -1
            else:
                try:
                    p+=ax[ch].plot(t, fwave, color=ch_color, ls=wave_type, label = dso.ch_list[ch])
                except:
                    if(mode==1):
                        #print sys.exc_info()[0]
                        time.sleep(5)
                        print 'Trying to plot again!',
                    return -1
        if(total_chnum>1):
            labs = [l.get_label() for l in p]
            plt.legend(p, labs,   loc='upper right')
        plt.tight_layout() 
        self.canvas.draw()
        del ax, t, p
        return 0
Esempio n. 10
0
class MplGraphWidget(QtGui.QWidget):
    def __init__(self, parent=None, width=3, height=3, dpi=100):

        super(MplGraphWidget, self).__init__(parent)

        self._dataY = np.array([])
        self._dataX = np.array([])

        self._spCols = 1
        self._spRows = 1
        self.all_sp_axes = []
        self.fig = Figure(figsize=(width, height), dpi=dpi)
        self.all_sp_axes.append(
            self.fig.add_subplot(self._spCols, self._spRows, 1))
        self.fig.set_frameon(False)
        self.fig.set_tight_layout(True)

        self.canvas = Canvas(self.fig)

        self._navBarOn = True
        self.mpl_toolbar = NavigationToolbar(self.canvas, parent)

        self.canvas.mpl_connect('key_press_event', self.on_key_press)
        self.canvas.mpl_connect('button_press_event', self.on_button_press)
        self.canvas.mpl_connect('motion_notify_event', self.on_mouse_move)
        self.canvas.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.canvas.setFocus()

        self.canvas.setParent(parent)
        self.canvas.clearMask()
        self.canvas.setSizePolicy(QtGui.QSizePolicy.Expanding,
                                  QtGui.QSizePolicy.Expanding)
        self.canvas.updateGeometry()

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.canvas)
        if self._navBarOn:
            vbox.addWidget(self.mpl_toolbar)
        self.setLayout(vbox)

    key_pressed = QtCore.pyqtSignal(object, name='keyPressed')

    def on_key_press(self, event):
        self.key_pressed.emit(event)
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    button_pressed = QtCore.pyqtSignal(object, name='buttonPressed')

    def on_button_press(self, event):
        self.button_pressed.emit(event)
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    mouse_move = QtCore.pyqtSignal(object, name='mouseMoved')

    def on_mouse_move(self, event):
        self.mouse_move.emit(event)
        key_press_handler(event, self.canvas, self.mpl_toolbar)

    def get_icon(name):
        """Return Matplotlib icon *name*"""
        return QtGui.QIcon(osp.join(rcParams['datapath'], 'images', name))

    def generateNewAxes(self):
        for ax in self.all_sp_axes:
            self.fig.delaxes(ax)
        self.all_sp_axes = []
        numOfAxes = (self._spRows * self._spCols) + 1
        for i in np.arange(1, numOfAxes):
            self.all_sp_axes.append(
                self.fig.add_subplot(self._spRows, self._spCols, i))
        self.canvas.setGeometry(100, 100, 300,
                                300)  #Used to update the new number of axes
        self.canvas.updateGeometry(
        )  #This will bring the size of the canvas back to the original (defined by the vbox)

    spRowsChanged = QtCore.pyqtSignal(int)

    def getspRows(self):
        return self._spRows

    @QtCore.pyqtSlot(int)
    def setspRows(self, spRows):
        self._spRows = spRows
        self.generateNewAxes()
        self.spRowsChanged.emit(spRows)

    def resetspRows(self):
        self.setspRows(1)

    spRows = QtCore.pyqtProperty(int, getspRows, setspRows, resetspRows)

    spColsChanged = QtCore.pyqtSignal(int)

    def getspCols(self):
        return self._spCols

    @QtCore.pyqtSlot(int)
    def setspCols(self, spCols):
        self._spCols = spCols
        self.generateNewAxes()
        self.spRowsChanged.emit(spCols)

    def resetspCols(self):
        self.setspCols(1)

    spCols = QtCore.pyqtProperty(int, getspCols, setspCols, resetspCols)

    dataChanged = QtCore.pyqtSignal(bool)

    def get_Y_data(self):
        return self._dataY

    @QtCore.pyqtSlot(int)
    def set_Y_data(self, y_data):
        self._dataY = y_data
        self.dataChanged.emit(True)

    def plot(self, on_axes=0):
        if np.size(self._dataX) == 0:
            self.all_sp_axes[on_axes].plot(self._dataY)
        else:
            self.all_sp_axes[on_axes].plot(self._dataX, self._dataY)

    def getNavBarOn(self):
        return self._navBarOn

    def setNavBarOn(self, navBarOn):
        self._navBarOn = navBarOn
        if not navBarOn:
            self.mpl_toolbar.hide()
        else:
            self.mpl_toolbar.show()

    def resetNavBarOn(self):
        self._navBarOn = True

    navBarOn = QtCore.pyqtProperty(bool, getNavBarOn, setNavBarOn,
                                   resetNavBarOn)

    # def getautoscale(self):
    #     return self._autoscale
    #
    # def setautoscale(self, autoscale):
    #     self._autoscale = autoscale
    #     for axis in self.all_sp_axes:
    #         axis.set_autoscale(autoscale)
    #
    # def resetautoscale(self):
    #     self._autoscale = False
    #
    # autoscale = QtCore.pyqtProperty(bool, getautoscale, setautoscale, resetautoscale)

    @QtCore.pyqtSlot(bool)
    def set_autoscale(self, autoscale):
        for axis in self.all_sp_axes:
            axis.set_autoscale(autoscale)
Esempio n. 11
0
class Plot(Widget, QtGui.QWidget):
    def __init__(self, parent=None):
        Widget.__init__(self)
        QtGui.QWidget.__init__(self, parent)
        self._data = 0
        self._amostras = 20
        self._datas = deque(maxlen=self._amostras)
        
        self.create_main_frame()
        #self.plot()

    def create_main_frame(self):
        self.main_frame = QWidget()

        self.fig = Figure((5.0, 4.0), dpi=90)
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)
        self.canvas.setFocusPolicy(Qt.StrongFocus)
        self.canvas.setFocus()
        self.axis = self.fig.add_subplot(111, axisbg='w')
        self.axis.hold(False)
        

        self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
        self.mpl_toolbar.hide()
        self.canvas.mpl_connect('key_press_event', self.on_key_press)
        
        vbox = QVBoxLayout()
        vbox.addWidget(self.canvas)  # the matplotlib canvas
        vbox.addWidget(self.mpl_toolbar)

        #self.main_frame.setLayout(vbox)
        self.setLayout(vbox)
        #self.setCentralWidget(self.main_frame)
        
  
    def plot(self):
        ''' plot some random stuff '''
        self.axis.plot(self._datas, '*-')
        self.canvas.draw()
    
    @property
    def value(self):
        return self._data
    
    def add(self, value):
        self._datas.append(value)
            
    @value.setter
    def value(self, data):
        self._data = data
        self.add(data)
        self.plot()
    
        
    def setValue(self, data):
        self._data = data
        self.add(data)
        self.plot()

        
    def amostras(self, amostras):
        self._amostras = amostras
        self._datas = deque(maxlen=self._amostras)
        
    def on_key_press(self, event):
        print('Plot pressed', event.key)
        # implement the default mpl key press events described at
        # http://matplotlib.org/users/navigation_toolbar.html#navigation-keyboard-shortcuts
        try:
            key_press_handler(event, self.canvas, self.mpl_toolbar)
        except:
            pass
class PlotWindow(QMainWindow):
    def __init__(self, parent, controller):
        # create window
        QMainWindow.__init__(self)
        self.setWindowTitle("Plot")
        self.setGeometry(600, 200, 10, 10)

        # set controller
        self.controller = controller

        # set parent's plot_window to point to self
        parent.plot_window = self

        # create main widget & layout
        self.main_widget = QWidget(self)
        self.main_widget.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)
        self.main_layout = QVBoxLayout(self.main_widget)

        # create plot canvas
        self.plot_canvas  = MplCanvas(None, width=10, height=5, dpi=75)
        self.main_layout.addWidget(self.plot_canvas)

        # create matplotlib's toolbar but hide it
        self.mpl_plot_toolbar = NavigationToolbar(self.plot_canvas, self)
        self.mpl_plot_toolbar.hide()

        # create toolbar
        self.create_plot_toolbar(self.main_layout)

        # set central widget
        self.setCentralWidget(self.main_widget)

        # set window titlebar buttons
        self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint)

        self.show()

    def create_plot_toolbar(self, parent_layout):
        # create buttons
        zoom_button = QPushButton('Zoom')
        zoom_button.clicked.connect(self.mpl_plot_toolbar.zoom)
         
        pan_button = QPushButton('Pan')
        pan_button.clicked.connect(self.mpl_plot_toolbar.pan)
         
        home_button = QPushButton('Home')
        home_button.clicked.connect(self.mpl_plot_toolbar.home)

        save_button = QPushButton('Save')
        save_button.clicked.connect(self.mpl_plot_toolbar.save_figure)

        # create button layout
        button_layout = QHBoxLayout()
        button_layout.setSpacing(5)
        button_layout.addStretch(1)

        # add buttons to button layout
        button_layout.addWidget(zoom_button)
        button_layout.addWidget(pan_button)
        button_layout.addWidget(home_button)
        button_layout.addWidget(save_button)

        # add button layout to parent layout
        parent_layout.addLayout(button_layout)

    def plot_tail_angle_array(self, array, extra_tracking=None, keep_xlim=True):
        self.plot_canvas.plot_tail_angle_array(array, extra_tracking, keep_xlim)

    def plot_heading_angle_array(self, array, keep_xlim=True):
        print(array.shape)
        self.plot_canvas.plot_heading_angle_array(array, keep_xlim)
Esempio n. 13
0
class mainWindow(QMainWindow):
    def __init__(self):
        super(mainWindow, self).__init__()

        self.full_filename_dict = {}  # {    full_filename:  group_name   }
        self.group_name_dict = {}  #group name dict, not necessary now?
        self.current_full_filename = None  #current selected full filename
        self.current_hdf5 = None  #open(  self.current_full_filename, r )
        self.current_hdf5_item = None
        self.current_group_name = None
        self.current_base_filename = ''  #current selected   base filename
        self.current_item_path = ''  #current item full path. /io/md/...
        self.current_item_name = ''  #current selected item name  md

        self.legend = None
        self.values = np.array([])
        self.logX_plot = False
        self.logY_plot = False

        self.X = None
        self.guiplot_count = 0
        self.testplot_count = 1
        self.image_plot_count = 0
        self.surface_plot_count = 0
        self.plot_type = 'curve'

        self.colormap_string = 'jet'
        self.colorscale_string = 'log'
        self.show_image_data = False
        self.rot_image_data = False
        self.attributes_flag = False
        self.current_selected_HDF = ''
        self.dataset_type_list = [
            'CFN',
            'LiX',
            'CHX',
        ]
        self.default_dataset_type = 'CFN'
        self.current_dataset_type = 'CFN'

        #########################Tobecleaned
        self.image_data_keys = [
            'avg_img', 'mask', 'pixel_mask', 'roi_mask', 'g12b'
        ]
        self.pds_keys = [
            'g2_fit_paras', 'g2b_fit_paras', 'spec_km_pds', 'spec_pds',
            'qr_1d_pds'
        ]
        #####################

        self.PWT = PlotWidget(self)
        self.MPWT = MATPlotWidget(self)
        self.initialise_user_interface()

        self.vstack_sampling = 20
        self.vstack_yshift = 10

    def initialise_user_interface(self):
        '''
        Initialises the main window. '''

        grid = QGridLayout()
        grid.setSpacing(10)
        self.grid = grid
        #self.file_items_list = ht.titledTree('File Tree')
        self.file_items_list = ht.tree()
        self.file_items_list_property = {}
        self.file_items_list.tree.itemClicked.connect(self.item_clicked)
        #self.file_items_list.tree.itemDoubleClicked.connect(self.item_double_clicked)
        self.guiplot_grid_fromRow = 5
        self.guiplot_grid_fromColumn = 1
        self.guiplot_grid_rowSpan = 5
        self.guiplot_grid_columnSpan = 8
        self.testplot_grid_fromRow = 6
        self.testplot_grid_fromColumn = 1
        self.testplot_grid_rowSpan = 4
        self.testplot_grid_columnSpan = 8
        self.plotLibrary = 'matplotlib'
        self.plot_buttons_array = []
        # Make dataset table
        self.dataset_table = ht.titledTable('Values')
        # Make attribute table
        self.attribute_table = ht.titledTable('Attribute')  # QTableWidget()
        self.attribute_table.table.setShowGrid(True)
        #dataset type to set buttons layout
        self.dataset_type_obj_string = self.default_dataset_type
        # Initialise all buttons
        self.open_button = self.add_open_button()
        self.remove_button = self.add_remove_button()
        self.create_button = self.add_create_button()
        self.dataset_type_box = self.add_dataset_type_box()
        self.add_all_plot_buttons()
        self.setX_button = self.add_setX_button()
        self.resetX_button = self.add_resetX_button()
        self.setlogX_box = self.add_setlogX_box()
        self.setlogY_box = self.add_setlogY_box()
        #self.clr_plot_checkbox = self.add_clr_plot_box()
        self.clr_plot_button = self.add_clr_plot_button()
        self.resizeEvent = self.onresize
        # Add 'extra' window components
        self.make_menu_bar()
        self.filename_label = QLabel('H5FileName')
        ## Add plot window
        self.guiplot = pg.PlotWidget()  ##using pg
        self.testplot = Figure()
        self.ax = self.testplot.add_subplot(111)
        self.canvas = FigureCanvas(self.testplot)
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.cbWidget = None
        #self.guiplot = pg.ImageView()
        # Add the created layouts and widgets to the window
        grid.addLayout(self.open_button, 1, 0, 1, 1, QtCore.Qt.AlignLeft)
        grid.addLayout(self.remove_button, 6, 0, 1, 1, QtCore.Qt.AlignLeft)
        grid.addLayout(self.create_button, 7, 0, 1, 1, QtCore.Qt.AlignLeft)
        grid.addLayout(self.dataset_type_box, 1, 0, 1, 1, QtCore.Qt.AlignRight)
        grid.addLayout(self.clr_plot_button, 1, 4, 1, 1, QtCore.Qt.AlignLeft)
        grid.addLayout(self.setX_button, 1, 8, 1, 1, QtCore.Qt.AlignLeft)
        grid.addLayout(self.resetX_button, 2, 8, 1, 1, QtCore.Qt.AlignLeft)
        grid.addLayout(self.setlogX_box, 1, 7, 1, 1, QtCore.Qt.AlignLeft)
        grid.addLayout(self.setlogY_box, 2, 7, 1, 1, QtCore.Qt.AlignLeft)

        grid.addWidget(self.filename_label, 2, 0, 1, 1)
        #filename list
        #grid.addLayout(self.file_items_list.layout, 4, 0, 3, 1)
        grid.addLayout(self.file_items_list.datalayout, 4, 0, 2, 1)
        #data dataset table
        grid.addLayout(self.dataset_table.layout, 4, 1, 1, 8)
        # Add toolbar
        grid.addWidget(self.toolbar, 5, 1, 1, 7)
        ## Add guiplot window, it's not the default so hide
        grid.addWidget(self.guiplot, self.guiplot_grid_fromRow,
                       self.guiplot_grid_fromColumn, self.guiplot_grid_rowSpan,
                       self.guiplot_grid_columnSpan)
        self.guiplot.setWindowOpacity(0)
        self.guiplot.hide()
        grid.addWidget(self.canvas, self.testplot_grid_fromRow,
                       self.testplot_grid_fromColumn,
                       self.testplot_grid_rowSpan,
                       self.testplot_grid_columnSpan)
        # attribute tabel
        grid.addLayout(self.attribute_table.layout, 8, 0, 3, 1)
        #grid.addWidget(self.attribute_table, 7, 0, 2, 1 )
        self.dev_cur_layout(plot_type='curve')
        self.dev_cur_layout(plot_type='image')
        self.setCentralWidget(QWidget(self))
        self.centralWidget().setLayout(grid)
        # Other tweaks to the window such as icons etc
        self.setWindowTitle('XSH5View--Ver1')
        #QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))
        self.initialise_layout(
        )  #to add different type of layout based on self.dataset_type_obj_string

    ########Start Deal with layout
    def initialise_layout(self):
        if self.dataset_type_obj_string == 'CFN':
            self.delete_dataset_buttons('CHX')
            self.dev_dataset_buttons(self.dataset_type_obj_string)
        elif self.dataset_type_obj_string == 'LIX':
            self.delete_dataset_buttons('CHX')
        elif self.dataset_type_obj_string == 'CHX':
            self.dev_dataset_buttons(self.dataset_type_obj_string)
        else:
            pass

    def dev_cur_layout(self, plot_type):
        if plot_type in plot_curve_type:
            self.CurCrossHair = QLabel()
            self.CurCrossHair.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
            self.grid.addWidget(self.CurCrossHair, 9, 2, 1, 1)
            self.CrossHair_type = 'curve'
        elif plot_type in plot_image_type:
            self.imageCrossHair = QLabel()
            self.imageCrossHair.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
            self.grid.addWidget(self.imageCrossHair, 9, 1, 1, 1)
            self.CrossHair_type = 'image'
        else:
            self.CrossHair_type = 'None'

    def delete_cur_layout(self, plot_type):
        if plot_type in plot_curve_type:
            try:
                self.deleteLayout(self.imageCrossHair)
            except:
                pass
        elif plot_type in plot_image_type:
            try:
                self.deleteLayout(self.CurCrossHair)
            except:
                pass
        else:
            pass

    def dev_dataset_buttons(self, dataset_type):
        if dataset_type == 'CHX':
            self.plot_g2_button = self.add_plot_g2_button()
            self.plot_c12_button = self.add_plot_c12_button()
            self.q_box_input = self.add_q_box()
            self.plot_qiq_button = self.add_plot_qiq_button()
            self.grid.addLayout(self.plot_g2_button, 2, 1, 1, 1,
                                QtCore.Qt.AlignLeft)
            self.grid.addLayout(self.plot_c12_button, 2, 2, 1, 1,
                                QtCore.Qt.AlignLeft)
            self.grid.addLayout(self.plot_qiq_button, 2, 3, 1, 1,
                                QtCore.Qt.AlignLeft)
            self.grid.addLayout(self.q_box_input, 2, 6, 1, 1,
                                QtCore.Qt.AlignLeft)

        if dataset_type == 'CFN':
            self.rot_image_button = self.add_rot_image_button()
            self.grid.addLayout(self.rot_image_button, 2, 2, 1, 1,
                                QtCore.Qt.AlignLeft)
            self.stack_plot_button = self.add_stack_plot_button()
            self.grid.addLayout(self.stack_plot_button, 2, 1, 1, 1,
                                QtCore.Qt.AlignLeft)

    def add_rot_image_button(self):
        rot_image_button = QPushButton("rot image")
        rot_image_button.clicked.connect(self.rot_image)
        button_section = QHBoxLayout()
        button_section.addWidget(rot_image_button)
        return button_section

    def rot_image(self):
        #print('here')
        try:
            self.value = self.value.T
        except:
            pass

    def delete_dataset_buttons(self, dataset_type):
        if dataset_type == 'CHX' and self.current_dataset_type == 'CHX':
            self.deleteLayout(self.plot_g2_button)
            self.deleteLayout(self.plot_c12_button)
            self.deleteLayout(self.plot_qiq_button)
            self.deleteLayout(self.q_box_input)

    def deleteLayout(self, layout):
        for i in range(layout.count()):
            layout.itemAt(i).widget().close()

    ########End Deal with layout
    def onresize(self, event):
        #print('Here for resize')
        self.file_items_list.tree.setMaximumWidth(int(0.3 * self.width()))
        #self.dataset_table.table.setMinimumHeight(0.1*self.height())
        #self.dataset_table.table.setMaximumWidth( 0.3*self.height() )
        self.attribute_table.table.setMaximumWidth(int(0.3 * self.width()))
        #self.guiplot.setMinimumHeight( 0.6*self.height() )
        #self.guiplot.setMinimumHeight( 0.6*self.height() )
    def add_open_button(self):
        '''
        Initialises the buttons in the button bar at the top of the main window. '''
        open_file_btn = QPushButton('Open')
        open_file_btn.clicked.connect(self.choose_file)
        button_section = QHBoxLayout()
        button_section.addWidget(open_file_btn)
        #button_section.addStretch(0)
        return button_section

    def add_remove_button(self):
        remove_file_btn = QPushButton('Remove File')
        remove_file_btn.clicked.connect(self.remove_file)
        button_section = QHBoxLayout()
        button_section.addWidget(remove_file_btn)
        return button_section

    def add_create_button(self):
        create_file_btn = QPushButton('Create File')
        create_file_btn.clicked.connect(self.create_file)
        button_section = QHBoxLayout()
        button_section.addWidget(create_file_btn)
        return button_section

    def add_dataset_type_box(self):
        self.dataset_type_obj = QComboBox()
        self.dataset_type_obj.addItems(self.dataset_type_list)
        self.dataset_type_obj.currentIndexChanged.connect(
            self.dataset_type_selection_change)
        self.dataset_type_obj_string = self.dataset_type_obj.currentText()
        box_section = QHBoxLayout()
        box_section.addWidget(self.dataset_type_obj)
        return box_section

    def dataset_type_selection_change(self, i):
        self.dataset_type_obj_string = self.dataset_type_obj.currentText()
        self.initialise_layout()
        self.current_dataset_type = self.dataset_type_obj.currentText()
        #print( self.dataset_type_obj_string , self.dataset_type_obj.currentText() )

    def add_all_plot_buttons(self):
        self.plot_curve_button = self.add_plot_curve_button()
        self.plot_img_button = self.add_plot_img_button()
        if self.plotLibrary != 'matplotlib':
            self.plot_surface_button = self.add_plot_surface_button()
            self.grid.addLayout(self.plot_surface_button, 1, 3, 1, 1,
                                QtCore.Qt.AlignLeft)
        else:
            self.plot_acr_datasets_button = self.add_plot_acr_datasets_button()
            self.grid.addLayout(self.plot_acr_datasets_button, 2, 3, 1, 1,
                                QtCore.Qt.AlignLeft)
        self.grid.addLayout(self.plot_curve_button, 1, 1, 1, 1,
                            QtCore.Qt.AlignLeft)
        self.grid.addLayout(self.plot_img_button, 1, 2, 1, 1,
                            QtCore.Qt.AlignLeft)

    def add_stack_plot_button(self):
        return self.add_generic_plot_button(plot_type='plot_stack',
                                            button_name='Stack Plot')

    def add_plot_acr_datasets_button(self):
        return self.add_generic_plot_button(
            plot_type='stack_across', button_name='Stack Across Datasets')

    def add_plot_g2_button(self):
        return self.add_generic_plot_button(plot_type='g2',
                                            button_name='Plot_g2')

    def add_plot_c12_button(self):
        return self.add_generic_plot_button(plot_type='C12',
                                            button_name='Plot_TwoTime')

    def add_plot_curve_button(self):
        return self.add_generic_plot_button(plot_type='curve',
                                            button_name='Plot_Curve')

    def add_plot_qiq_button(self):
        return self.add_generic_plot_button(plot_type='qiq',
                                            button_name='Plot_qiq')

    def add_plot_img_button(self):
        return self.add_generic_plot_button(plot_type='image',
                                            button_name='Plot_Image')

    def add_plot_surface_button(self):
        return self.add_generic_plot_button(plot_type='surface',
                                            button_name='Plot_Surface')

    def add_generic_plot_button(self, plot_type, button_name):
        plot_btn = QPushButton(button_name)
        pg_plot_type_dict = {
            'curve': self.PWT.plot_curve,
            'g2': self.PWT.plot_g2,
            'qiq': self.PWT.plot_qiq,
            'surface': self.PWT.plot_surface,
            'image': self.PWT.plot_image,
            'C12': self.PWT.plot_C12,
            'plot_stack': self.PWT.plot_stack,
        }
        mat_plot_type_dict = {
            'curve': self.MPWT.plot_curve,
            'g2': self.PWT.plot_g2,
            'qiq': self.PWT.plot_qiq,
            'surface': self.MPWT.plot_surface,
            'image': self.MPWT.plot_image,
            'C12': self.PWT.plot_C12,
            'plot_stack': self.MPWT.plot_stack,
            'stack_across': self.MPWT.plot_across,
        }
        if self.plotLibrary == 'pyqtgraph':
            plot_btn.clicked.connect(pg_plot_type_dict[plot_type])
        if self.plotLibrary == 'matplotlib':
            plot_btn.clicked.connect(mat_plot_type_dict[plot_type])
        button_section = QHBoxLayout()
        button_section.addWidget(plot_btn)
        self.plot_buttons_array.append(plot_btn)
        return button_section

    def add_setlogX_box(self):
        self.setlogX_box_obj = QCheckBox("logX")
        self.setlogX_box_obj.stateChanged.connect(self.click_setlogX_box)
        button_section = QHBoxLayout()
        button_section.addWidget(self.setlogX_box_obj)
        return button_section

    def click_setlogX_box(self, state):
        if state == QtCore.Qt.Checked:
            self.logX_plot = True
        else:
            self.logX_plot = False
        try:
            self.guiplot.setLogMode(x=self.logX_plot, y=self.logY_plot)
        except:
            pass

    def add_setlogY_box(self):
        self.setlogY_box_obj = QCheckBox("logY")
        self.setlogY_box_obj.stateChanged.connect(self.click_setlogY_box)
        button_section = QHBoxLayout()
        button_section.addWidget(self.setlogY_box_obj)
        return button_section

    def click_setlogY_box(self, state):
        if state == QtCore.Qt.Checked:
            self.logY_plot = True
        else:
            self.logY_plot = False
        try:
            self.guiplot.setLogMode(x=self.logX_plot, y=self.logY_plot)
        except:
            pass

    def get_dict_from_qval_dict(self):
        l = list(self.current_hdf5['qval_dict'].attrs.items())
        dc = {int(i[0]): i[1] for i in l}
        return dc

    def add_setX_button(self):
        self.setX_btn = QPushButton('SetX')
        self.setX_btn.clicked.connect(self.setX)
        button_section = QHBoxLayout()
        button_section.addWidget(self.setX_btn)
        return button_section

    def add_resetX_button(self):
        self.resetX_btn = QPushButton('ReSetX')
        self.resetX_btn.clicked.connect(self.resetX)
        button_section = QHBoxLayout()
        button_section.addWidget(self.resetX_btn)
        return button_section

    def add_clr_plot_button(self):
        self.clr_plot_button = QPushButton("clear plot")
        self.clr_plot_button.clicked.connect(self.plot_clear)
        button_section = QHBoxLayout()
        button_section.addWidget(self.clr_plot_button)
        return button_section

    def plot_clear(self):
        if self.plotLibrary == 'matplotlib':
            if self.plot_type in plot_curve_type or self.plot_type in plot_image_type:
                if self.plot_type in plot_image_type:
                    self.grid.removeWidget(self.MPWT.cb)
                    self.MPWT.cb.setWindowOpacity(0)
                    self.MPWT.cb.hide()
                self.ax.clear()
                self.canvas.draw()
                self.canvas.hide()
                self.canvas.show()
                self.testplot_count = 0
        elif self.plotLibrary == 'pyqtgraph':
            self.guiplot.clear()
            #self.surface_plot_count = 0
            #self.grid.removeWidget(self.testplot)
            #self.guiplot.setWindowOpacity(0)
            #self.guiplot.hide()
        try:
            self.legend.scene().removeItem(self.legend)
        except:
            pass

    def add_q_box(self):
        # Create textbox
        self.q_box = QLineEdit(
            placeholderText="Please enter q-number (int) of two-time function."
        )
        button_section = QHBoxLayout()
        button_section.addWidget(self.q_box)
        return button_section

    def make_menu_bar(self):
        '''
        Initialises the menu bar at the top. '''
        menubar = self.menuBar()
        # Create a File menu and add an open button
        self.file_menu = menubar.addMenu('&File')
        open_action = QtGui.QAction('&Open', self)
        open_action.setShortcut('Ctrl+o')
        open_action.triggered.connect(self.choose_file)
        self.file_menu.addAction(open_action)
        # Add a shortcut to copy and paste data
        copy_data_action = QtGui.QAction('&Copy Data', self)
        copy_data_action.setShortcut('Ctrl+c')
        copy_data_action.triggered.connect(self.copy_data)
        self.file_menu.addAction(copy_data_action)
        paste_data_action = QtGui.QAction('&Paste Data', self)
        paste_data_action.setShortcut('Ctrl+v')
        paste_data_action.triggered.connect(self.paste_data)
        self.file_menu.addAction(paste_data_action)
        new_key_action = QtGui.QAction('&Add New Key', self)
        new_key_action.setShortcut('Ctrl+n')
        new_key_action.triggered.connect(self.create_key)
        self.file_menu.addAction(new_key_action)
        # Add an exit button to the file menu
        exit_action = QtGui.QAction('&Exit', self)
        exit_action.setShortcut('Ctrl+Z')
        exit_action.setStatusTip('Exit application')
        exit_action.triggered.connect(QtGui.qApp.quit)
        self.file_menu.addAction(exit_action)
        ## Create a view manu
        self.view_menu = menubar.addMenu('&View')
        #self.view_menu.setShortcut('Alt+v')
        self.plot_type_options_menu = self.view_menu.addMenu('&Plot Library')
        group = QActionGroup(self.plot_type_options_menu)
        texts = ["matplotlib", "pyqtgraph"]
        for text in texts:
            action = QAction(text,
                             self.plot_type_options_menu,
                             checkable=True,
                             checked=text == texts[0])
            self.plot_type_options_menu.addAction(action)
            group.addAction(action)
        group.setExclusive(True)
        group.triggered.connect(self.onTriggered_plotLibrary)

        self.image_plot_options_menu = self.view_menu.addMenu(
            '&Image Plot Options')
        self.colormap_options_menu = self.image_plot_options_menu.addMenu(
            '&Colormap')
        group = QActionGroup(self.colormap_options_menu)
        texts = image_colors
        for text in texts:
            action = QAction(text,
                             self.colormap_options_menu,
                             checkable=True,
                             checked=text == texts[0])
            self.colormap_options_menu.addAction(action)
            group.addAction(action)
        group.setExclusive(True)
        group.triggered.connect(self.onTriggered_colormap)
        self.colorscale_options_menu = self.image_plot_options_menu.addMenu(
            '&ColorScale')
        group = QActionGroup(self.colorscale_options_menu)
        texts = ["linear", "log"]
        for text in texts:
            action = QAction(text,
                             self.colormap_options_menu,
                             checkable=True,
                             checked=text == texts[1])
            self.colorscale_options_menu.addAction(action)
            group.addAction(action)
        group.setExclusive(True)
        group.triggered.connect(self.onTriggered_colorscale)
        self.display_image_data_options_menu = self.view_menu.addMenu(
            '&Display Image Data')
        show_image_data_action = QAction('show data',
                                         self,
                                         checkable=True,
                                         checked=False)
        show_image_data_action.triggered.connect(
            self.onTriggered_show_image_data)
        self.display_image_data_options_menu.addAction(show_image_data_action)

        self.stack_plot_options_menu = self.view_menu.addMenu(
            '&Stack Plot Options')
        set_stack_action = QtGui.QAction('Sampling and yshift', self)
        set_stack_action.triggered.connect(self.onTriggered_set_stack)
        self.stack_plot_options_menu.addAction(set_stack_action)

        # Create a Help menu and add an about button
        help_menu = menubar.addMenu('&Help')
        about_action = QtGui.QAction('About XSH5FView', self)
        about_action.setStatusTip('About this program')
        about_action.triggered.connect(self.show_about_menu)
        help_menu.addAction(about_action)

    def onTriggered_set_stack(self, action):
        print('set stack opt here.')
        i, okPressed = QInputDialog.getInt(self, "Set Sampling Number",
                                           "sampling:", self.vstack_sampling,
                                           0, 10000, 10)
        if okPressed:
            self.vstack_sampling = i
            print(i)
        d, okPressed = QInputDialog.getDouble(self, "Set yshift", "Value:",
                                              self.vstack_yshift, 0, 1e8, 2)
        if okPressed:
            self.vstack_yshift = d
            print(d)

    def onTriggered_show_image_data(self, action):
        #print(action.text())
        self.show_image_data = action  #.text()

    def onTriggered_colormap(self, action):
        #print(action.text())
        self.colormap_string = action.text()

    def onTriggered_colorscale(self, action):
        #print(action.text())
        self.colorscale_string = action.text()

    def onTriggered_plotLibrary(self, action):
        self.plotLibrary = action.text()
        for i in range(len(self.plot_buttons_array)):
            button_to_remove = self.plot_buttons_array.pop()
            self.grid.removeWidget(button_to_remove)
            button_to_remove.setWindowOpacity(0)
            button_to_remove.hide()
        if action.text() == 'matplotlib':
            self.toolbar.setWindowOpacity(100)
            self.toolbar.show()
            self.canvas.setWindowOpacity(100)
            self.canvas.show()
        else:
            self.toolbar.setWindowOpacity(0)
            self.toolbar.hide()
            self.canvas.setWindowOpacity(0)
            self.canvas.hide()
        if action.text() == 'pyqtgraph':
            self.guiplot.setWindowOpacity(100)
            self.guiplot.show()
        else:
            self.guiplot.setWindowOpacity(0)
            self.guiplot.hide()
        self.add_all_plot_buttons()
        self.initialise_layout()

    def show_about_menu(self):
        '''
        Shows the about menu by initialising an about_window object. This class is described in _window_classes.py '''
        self.about_window = ht.aboutWindow()
        self.about_window.show()

    def choose_file(self):
        '''
        Opens a QFileDialog window to allow the user to choose the hdf5 file they would like to view. '''
        filenames_list = QtGui.QFileDialog.getOpenFileNames(
            self,
            'Open file',
            '/home/yugang/Desktop/XPCS_GUI/TestData/test.h5',
            filter='*.hdf5 *.h5 *.lst')[0]
        for f in filenames_list:
            ext = f.split('/')[-1].split('.')[-1]
            if ext == 'lst':
                full_filename_list = np.loadtxt(
                    f,
                    dtype=object,
                )
                group_name = f.split('/')[-1]
                if group_name not in list(self.group_name_dict.keys()):
                    self.group_name_dict[group_name] = full_filename_list
                for fp in full_filename_list:
                    self.initiate_file_open(fp, group_name=group_name)
            else:
                self.initiate_file_open(f)

    def initiate_file_open(self, full_filename, group_name=None):
        base_filename = full_filename.split('/')[-1]
        self.full_filename_dict[full_filename] = group_name
        self.dataset_table.clear()
        self.attribute_table.clear()
        try:
            self.file_items_list.add_file(full_filename, group_name)
            if group_name is None:
                self.filename_label.setText(base_filename)
            else:
                self.filename_label.setText(group_name)
            self.setWindowTitle('XSH5View@CHX - ' + base_filename)
        except:
            self.filename = ''  # if it didn't work keep the old value
            self.filename_label.setText('')
            self.setWindowTitle('XSH5View@CHX')
            self.clear_file_items()
            self.dataset_table.clear()
            self.attribute_table.clear()
            print("Error opening file")

    def create_file(self):
        filename = self.file_items_list.create_file()
        self.initiate_file_open(filename)

    def remove_file(self, filename):
        self.file_items_list.remove_file()

    def clear_file_items(self):
        self.file_items_list.clear()

    def copy_data(self):
        self.file_items_list.copy_data()

    def paste_data(self):
        destination = self.file_items_list.tree.currentItem().text(1)
        item_path = self.file_items_list.tree.currentItem().text(2)
        #self.file_items_list.remove_file()
        self.file_items_list.paste_data(destination, item_path, self)
        #self.initiate_file_open(destination)

    def create_key(self):
        item = self.file_items_list.tree.currentItem()
        self.file_items_list.create_key(item.text(1), item.text(2), self)

    def get_selected_row_col(self):
        selected_items = self.dataset_table.table.selectedItems()
        shape = np.shape(self.value)
        Ns = len(shape)
        if len(selected_items) > 0:
            min_row = selected_items[0].row()
            max_row = selected_items[-1].row() + 1
            min_col = selected_items[0].column()
            max_col = selected_items[-1].column() + 1
            self.selected_flag = True
        else:
            if len(shape) == 1:
                max_col = 1
            else:
                max_col = shape[1]
            min_row = 0
            max_row = shape[0]
            min_col = 0
            self.selected_flag = False
        self.min_row, self.max_row, self.min_col, self.max_col = min_row, max_row, min_col, max_col

    def setX(self):
        self.get_selected_row_col()
        min_row, max_row, min_col, max_col = self.min_row, self.max_row, self.min_col, self.max_col
        if self.selected_flag:
            try:
                self.X = self.value[min_row:max_row, min_col]
            except:
                self.X = self.value[min_row:max_row]

    def resetX(self):
        self.X = None

    def get_filename_selected(self):
        self.dataset_table.clear()
        self.item = self.file_items_list.tree.currentItem()
        self.current_full_filename = self.item.text(1)
        self.current_group_name = self.full_filename_dict[
            self.current_full_filename]
        #print("in get filename selected:", self.current_full_filename)
        self.current_hdf5 = h5py.File(self.current_full_filename, 'r')
        self.current_base_filename = self.current_full_filename.split('/')[-1]
        self.current_item_path = self.item.text(2)
        if self.current_item_path == '':
            self.current_hdf5_item = self.current_hdf5
            self.current_item_name = self.item.text(2)
        else:
            self.current_hdf5_item = self.current_hdf5[self.current_item_path]
            self.current_item_name = self.item.text(2).split('/')[-1]

    def display_dataset(self):
        self.get_filename_selected()
        text = self.current_item_path  #self.item.text(2)
        if self.current_item_path != '':
            hdf5_file = self.current_hdf5_item
            if isinstance(hdf5_file, h5py.Dataset):
                #print( 'shows dataset-------------->')
                self.group_data = False
                #self.current_dataset = self.item_path.split('/')[-1]
                shape = hdf5_file.shape
                Ns = len(shape)
                if Ns == 0:
                    try:
                        self.value = bstring_to_string(hdf5_file)  #[0]
                    except:
                        self.value = np.array([hdf5_file])  #[0]
                    numrows = 1
                    numcols = 1
                elif Ns == 1:
                    numrows = shape[0]
                    numcols = 1
                    self.value = hdf5_file[:]
                elif Ns == 2:
                    numrows = shape[0]
                    numcols = shape[1]
                    self.value = hdf5_file[:]
                elif Ns >= 3:  #a 3D array, [x,y,z], show [x,y ]
                    if self.current_dataset_type == 'CHX':
                        numrows = shape[0]
                        numcols = shape[1]
                        try:
                            self.value = hdf5_file[:, :, self.qth]
                        except:
                            print('The max q-th is %s.' % shape[2])
                            self.value = hdf5_file[text][:, :, 0]
                    else:
                        numrows = shape[-2]
                        numcols = shape[-1]
                        try:
                            self.value = hdf5_file[self.qth, :, :]
                        except:
                            print('The max q-th is %s.' % shape[0])

            elif isinstance(hdf5_file, h5py.Group):
                print('display the group data here')
                if text in self.pds_keys:
                    d = pds.read_hdf(self.filename, key=text)  #[:]
                    self.value = np.array(d)
                    shape = self.value.shape
                    numrows = shape[0]
                    numcols = shape[1]
                    Ns = len(shape)
                    self.group_data_label = np.array(d.columns)[:]
                    self.group_data = True
                else:
                    self.dataset_table.clear()
                    self.value = np.array([])
                    self.plot_btn.hide()
            else:
                print('Other format!')
            try:
                self.dataset_table.table.setRowCount(numrows)
                self.dataset_table.table.setColumnCount(numcols)
                show_data_flag = True
                if not self.show_image_data:
                    if text in self.image_data_keys:
                        self.dataset_table.clear()
                        show_data_flag = False
                    try:
                        if self.value.shape[0] > 100 and self.value.shape[
                                1] > 100:
                            show_data_flag = False
                    except:
                        pass
                if show_data_flag:
                    if Ns != -1:
                        for i in range(numrows):
                            if numcols > 1:
                                for j in range(numcols):
                                    self.dataset_table.set_item(
                                        i, j, str(self.value[i, j]))
                            else:
                                self.dataset_table.set_item(
                                    i, 0, str(self.value[i]))
                #print( self.attributes_flag  )
                if not self.attributes_flag:
                    self.attribute_table.clear()
                    self.attribute_table.table.setRowCount(1)
                    self.attribute_table.table.setColumnCount(Ns + 1)
                    self.attribute_table.table.setItem(
                        0, 0, QTableWidgetItem('shape'))
                    for i, s in enumerate(shape):
                        self.attribute_table.table.setItem(
                            0, i + 1, QTableWidgetItem('%s' % s))
            except:
                pass
        self.current_hdf5.close()

    def display_attributes(self):
        # reset the value
        self.attribute_table.clear()
        self.get_filename_selected()
        if self.current_item_path != '':
            #print('Here shows the attributes')
            hdf5_file = self.current_hdf5_item
            try:
                attributes = list(hdf5_file.attrs.items())
                num_attributes = len(attributes)
                self.attribute_table.table.setRowCount(num_attributes)
                self.attribute_table.table.setColumnCount(0)
            except:
                num_attributes = 0

            if num_attributes > 0:
                self.attribute_table.table.setColumnCount(2)
                self.attributes_flag = True
            else:
                self.attributes_flag = False
            print(num_attributes, self.attributes_flag)
            # Populate the table
            for i in range(num_attributes):
                value = attributes[i][1]
                self.attribute_table.table.setItem(
                    i, 0, QTableWidgetItem(attributes[i][0]))
                if isinstance(value, np.ndarray):
                    N = len(value)
                    self.attribute_table.table.setColumnCount(N + 1)
                    j = 1
                    for v in value:
                        self.attribute_table.table.setItem(
                            i, j, QTableWidgetItem(str(v)))
                        #self.attribute_table.setItem(i, 1, QTableWidgetItem(str(value[0].decode())))
                        j += 1
                else:
                    self.attribute_table.table.setItem(
                        i, 1, QTableWidgetItem(str(value)))
        self.current_hdf5.close()

    def item_double_clicked(self):
        '''
        Responds to a double click on an item in the file_items_list.'''

        #self.display_attributes()
        try:
            self.display_attributes()
            #print('display attributes')
        except:
            pass

    def item_clicked(self):

        #############
        #self.display_dataset()
        #################3

        try:
            self.qth = int(self.q_box.text())
        except:
            self.qth = 0
        try:
            self.display_attributes()
            #print('display attributes')
        except:
            pass
        try:
            self.display_dataset()
        except:
            pass
        try:

            self.filename_label.setText(self.current_base_filename)
            self.setWindowTitle('XSH5View@CHX - ' + self.current_full_filename)
        except:
            pass
Esempio n. 14
0
class PlotMaps(QtGui.QDialog, Ui_PlotMaps):
    def __init__(self, modellst, type="sel", parent=None):
        QtGui.QDialog.__init__(self,parent)
        self.setupUi(self)

        # Create the plot
        #self.figure = plt.figure()
        self.figure, self.axes = plt.subplots(nrows=3, ncols=1)
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()
        # set the layout
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.plotterBox.setLayout(layout)
        self.closeButton.clicked.connect(self.close_)

        if type == "sel":
            self.modelBox.currentIndexChanged.connect(self.plotselectivitymap)
        else:
            self.modelBox.currentIndexChanged.connect(self.plotresolutionmap)

        self.modellst = modellst
        for model in self.modellst:
            self.modelBox.addItem(model.modname)

    def close_(self):
        self.reject()

    def plotchromatogram(self):
        ''' plot some random stuff '''
        data = [random.random() for i in range(25)]
        ax = self.figure.add_subplot(111)
        ax.hold(False)
        ax.plot(data, '*-')
        self.canvas.draw()


    def plotresolutionmap(self):
        indx = self.modelBox.currentIndex()
        if indx >= 0 and indx < len(self.modellst):
          lss = self.modellst[indx].lss
          flow_sofware = self.modellst[indx].flow
          v_m = self.modellst[indx].v_m
          v_d = self.modellst[indx].v_d
          c_particle = self.modellst[indx].c_particle
          c_length = self.modellst[indx].c_length

          opt = OptSep(v_m, v_d, flow_sofware, lss)
          opt.c_particle = c_particle
          opt.c_length = c_length
          [gcondlst, reslst, trlst] =  opt.getResMapPlot("lss", float(flow_sofware), g_start_min=0.00, g_start_max=0.30, g_stop_min=0.50, g_stop_max=1.0, time_grad_min=2, time_grad_max=60)

          #Plot resolution map
          x = []
          y_gsteepness = []
          y_final_b = []
          y_tg = []
          z = []
          for i in range(len(gcondlst)):
              #gcondlst.append([init_b, final_b, tg, self.flow, lowest_alpha])
              x.append(float(gcondlst[i][0])*100)
              y_gsteepness.append(float((gcondlst[i][1]-gcondlst[i][0])/gcondlst[i][2])) # alpha
              y_final_b.append(float(gcondlst[i][1])*100) # final b
              y_tg.append(float(gcondlst[i][2])) # tg
              z.append(float(gcondlst[i][-1]))

          x = np.asarray(x)
          y_gsteepness = np.asarray(y_gsteepness)
          y_final_b = np.asarray(y_final_b)
          y_tg = np.asarray(y_tg)
          z = np.asarray(z)

          # Set up a regular grid of interpolation points
          npoints = 500
          xi, yi_gsteepness  = np.linspace(x.min(), x.max(), npoints), np.linspace(y_gsteepness .min(), y_gsteepness .max(), npoints)
          xi, yi_gsteepness  = np.meshgrid(xi, yi_gsteepness )

          xi, yi_final_b = np.linspace(x.min(), x.max(), npoints), np.linspace(y_final_b.min(), y_final_b.max(), npoints)
          xi, yi_final_b = np.meshgrid(xi, yi_final_b)

          xi, yi_tg = np.linspace(x.min(), x.max(), npoints), np.linspace(y_tg.min(), y_tg.max(), npoints)
          xi, yi_tg = np.meshgrid(xi, yi_tg)

          # Interpolate
          #rbf = scipy.interpolate.Rbf(x, y, z, function='linear')
          #zi = rbf(xi, yi)

          zi_gsteepness = scipy.interpolate.griddata((x, y_gsteepness ), z, (xi, yi_gsteepness ), method='linear')
          zi_final_b = scipy.interpolate.griddata((x, y_final_b), z, (xi, yi_final_b), method='linear')
          zi_tg = scipy.interpolate.griddata((x, y_tg), z, (xi, yi_tg), method='linear')


          #f, axarr = plt.subplots(3, sharex=True)
          #axes = self.figure.add_subplot(nrows=3, ncols=1)

          im = self.axes.flat[0].imshow(zi_gsteepness , vmin=z.min(), vmax=z.max(), origin='lower', extent=[x.min(), x.max(), y_gsteepness .min(), y_gsteepness .max()], aspect='auto')
          self.axes.flat[0].set_xlabel('Initial B (%)')
          self.axes.flat[0].set_ylabel('Gradient steepness')

          im = self.axes.flat[1].imshow(zi_final_b, vmin=z.min(), vmax=z.max(), origin='lower',
                    extent=[x.min(), x.max(), y_final_b.min(), y_final_b.max()],  aspect='auto')

          self.axes.flat[1].set_xlabel('Initial B (%)')
          self.axes.flat[1].set_ylabel('Final B (%)')

          im = self.axes.flat[2].imshow(zi_tg, vmin=z.min(), vmax=z.max(), origin='lower',
                    extent=[x.min(), x.max(), y_tg.min(), y_tg.max()], aspect='auto')

          self.axes.flat[2].set_xlabel('Initial B (%)')
          self.axes.flat[2].set_ylabel('Time gradient (min)')

          self.figure.colorbar(im, ax=self.axes.ravel().tolist())
          self.canvas.draw()


    def plotselectivitymap(self):
        plt.cla()
        indx = self.modelBox.currentIndex()
        if indx >= 0 and indx < len(self.modellst):
          lss = self.modellst[indx].lss
          flow_sofware = self.modellst[indx].flow
          v_m = self.modellst[indx].v_m
          v_d = self.modellst[indx].v_d

          opt = OptSep(v_m, v_d, flow_sofware, lss)
          [gcondlst, sellst, trlst] = opt.getSelMapPlot("lss", float(flow_sofware), g_start_min=0.00, g_start_max=0.30, g_stop_min=0.50, g_stop_max=1.0, time_grad_min=2, time_grad_max=60)

          #Plot selectivity map
          x = []
          y_gsteepness = []
          y_final_b = []
          y_tg = []
          z = []
          for i in range(len(gcondlst)):
              #gcondlst.append([init_b, final_b, tg, self.flow, lowest_alpha])
              x.append(float(gcondlst[i][0])*100)
              y_gsteepness.append(float((gcondlst[i][1]-gcondlst[i][0])/gcondlst[i][2]+1)) # alpha
              y_final_b.append(float(gcondlst[i][1])*100) # final b
              y_tg.append(float(gcondlst[i][2])) # tg
              z.append(float(gcondlst[i][-1]))

          x = np.asarray(x)
          y_gsteepness = np.asarray(y_gsteepness)
          y_final_b = np.asarray(y_final_b)
          y_tg = np.asarray(y_tg)
          z = np.asarray(z)

          # Set up a regular grid of interpolation points
          npoints = 500
          xi, yi_gsteepness = np.linspace(x.min(), x.max(), npoints), np.linspace(y_gsteepness.min(), y_gsteepness.max(), npoints)
          xi, yi_gsteepness = np.meshgrid(xi, yi_gsteepness)

          xi, yi_final_b = np.linspace(x.min(), x.max(), npoints), np.linspace(y_final_b.min(), y_final_b.max(), npoints)
          xi, yi_final_b = np.meshgrid(xi, yi_final_b)

          xi, yi_tg = np.linspace(x.min(), x.max(), npoints), np.linspace(y_tg.min(), y_tg.max(), npoints)
          xi, yi_tg = np.meshgrid(xi, yi_tg)

          # Interpolate
          #rbf = scipy.interpolate.Rbf(x, y, z, function='linear')
          #zi = rbf(xi, yi)

          zi_gsteepness = scipy.interpolate.griddata((x, y_gsteepness), z, (xi, yi_gsteepness), method='linear')
          zi_final_b = scipy.interpolate.griddata((x, y_final_b), z, (xi, yi_final_b), method='linear')
          zi_tg = scipy.interpolate.griddata((x, y_tg), z, (xi, yi_tg), method='linear')


          #f, axarr = plt.subplots(3, sharex=True)
          #axes = self.figure.add_subplot(nrows=3, ncols=1)


          im = self.axes.flat[0].imshow(zi_gsteepness, vmin=z.min(), vmax=z.max(), origin='lower',
                    extent=[x.min(), x.max(), y_gsteepness.min(), y_gsteepness.max()], aspect='auto')
          self.axes.flat[0].set_xlabel('Initial B (%)')
          self.axes.flat[0].set_ylabel('Gradient steepness')

          im = self.axes.flat[1].imshow(zi_final_b, vmin=z.min(), vmax=z.max(), origin='lower',
                    extent=[x.min(), x.max(), y_final_b.min(), y_final_b.max()],  aspect='auto')

          self.axes.flat[1].set_xlabel('Initial B (%)')
          self.axes.flat[1].set_ylabel('Final B (%)')

          im = self.axes.flat[2].imshow(zi_tg, vmin=z.min(), vmax=z.max(), origin='lower',
                    extent=[x.min(), x.max(), y_tg.min(), y_tg.max()], aspect='auto')

          self.axes.flat[2].set_xlabel('Initial B (%)')
          self.axes.flat[2].set_ylabel('Time gradient (min)')

          self.figure.colorbar(im, ax=self.axes.ravel().tolist())
          self.canvas.draw()
Esempio n. 15
0
class Window(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)

        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()

        # Just some button
        self.button = QtGui.QPushButton('Plot')
        self.button.clicked.connect(self.plot)

        self.button1 = QtGui.QPushButton('Zoom')
        self.button1.clicked.connect(self.zoom)

        self.button2 = QtGui.QPushButton('Pan')
        self.button2.clicked.connect(self.pan)

        self.button3 = QtGui.QPushButton('Home')
        self.button3.clicked.connect(self.home)

        # set the layout
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        layout.addWidget(self.button)
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        layout.addWidget(self.button3)
        self.setLayout(layout)

    def home(self):
        self.toolbar.home()

    def zoom(self):
        self.toolbar.zoom()

    def pan(self):
        self.toolbar.pan()

    def plot(self):
        ''' DO NOT CHANGE. Original sample '''
        #data = [random.random() for i in range(25)]
        #ax = self.figure.add_subplot(111)      # create an axis
        #ax.hold(False)                         # discards the old graph
        #ax.plot(data, '*-')                    # plot data
        #self.canvas.draw()                     # refresh canvas

        ra = [45, 40, 90, -75, 80.2,
              102.63]  # angle  --> change to buffer_angle[4000]
        ra = [x / 180.0 * 3.141593 for x in ra]  # convert angle to radian
        dec = [1.01, 6.05, 5.6, 4.02, 9.1,
               7.85]  # distance --> change to buffer_distance[4000]

        ax = self.figure.add_axes([0.1, 0.1, 0.8, 0.8], polar=True)

        ax.set_ylim(0, 10.0)
        ax.set_yticks(numpy.arange(0, 6, 2))
        ax.scatter(ra, dec, c='r')  # plot the first microphone

        self.canvas.draw()
Esempio n. 16
0
class ComputeBestGradient(QtGui.QDialog, Ui_ComputeBestGradient):
    def __init__(self, models, parent=None):
        QtGui.QDialog.__init__(self,parent)
        self.setupUi(self)
        self.closeButton.clicked.connect(self.close_)
        self.calculateButton.clicked.connect(self.calculate)
        self.models = models
        for model in self.models:
            self.modelBox.addItem(model.modname)

        # Create the plot
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()
        # set the layout
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.plotterBox.setLayout(layout)

    def close_(self):
        self.reject()

    def calculate(self):
        indx = self.modelBox.currentIndex()

        logkw_s_tab = self.models[indx].lss
        v_m = self.models[indx].v_m
        v_d = self.models[indx].v_d
        flow = self.models[indx].flow

        opt = OptSep(v_m, v_d, flow, logkw_s_tab)
        best_gcond, tr, rs_avg = opt.getgradientconditions(self.tr_min.value(), self.tr_max.value())

        init_b = best_gcond[0]
        final_b = best_gcond[1]
        tg = best_gcond[2]

        # Constant flow!
        flow_min = flow-(flow*0.2)
        flow_max = flow+(flow*0.2)
        grad_start_min = init_b-(init_b*0.2)
        grad_stop_min = init_b+(init_b*0.2)
        grad_start_max = final_b-(final_b*0.2)
        grad_stop_max = final_b+(final_b*0.2)

        tg_min = tg-(tg*0.2)
        tg_max = tg+(tg*0.2)

        [gcondlst, rslst, trlst] = opt.getplotgradientconditions(flow_min, flow_max, grad_start_min, grad_start_max, grad_stop_min, grad_stop_max, tg_min, tg_max)

        plt.clf()
        ax = self.figure.gca(projection='3d')
        #X = np.arange(-5, 5, 0.25)
        #Y = np.arange(-5, 5, 0.25)
        X = []
        Y = []
        Z = []
        for i in range(len(gcondlst)):
            row = gcondlst[i]
            X.append(100 * ((row[1]-row[0])/row[2]))
            Y.append(row[0])
            if rslst[i] == -9999:
                    Z.append(0)
            else:
                Z.append(rslst[i])

        t = Z
        scatterplot = ax.scatter(X, Y, Z, c=t, cmap='jet', marker='o')
        #X, Y = np.meshgrid(X, Y)
        #R = np.sqrt(X**2 + Y**2)
        #Z = np.sin(R)
        #surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
        #                       linewidth=0, antialiased=False)

        self.figure.colorbar(scatterplot, shrink=0.5, aspect=5).remove()
        self.figure.colorbar(scatterplot, shrink=0.5, aspect=5)

        ax.hold(False)
        ax.set_xlabel('Gradient slope %/min')
        ax.set_ylabel('% initial of gradient')
        ax.set_zlabel('Resolution')

        self.canvas.draw()

        best = Z.index(max(Z))
        self.doubleSpinBox_5.setValue(rs_avg)
        self.doubleSpinBox_1.setValue(init_b*100)
        self.doubleSpinBox_2.setValue(final_b*100)
        self.doubleSpinBox_3.setValue(tg)
        self.doubleSpinBox_4.setValue(flow)
Esempio n. 17
0
class MainWindow(QtGui.QMainWindow, mw.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.datalst = []
        self.modellst = []
        self.lstdatamodel = QtGui.QStandardItemModel(self.listView)
        self.listView.setModel(self.lstdatamodel)
        self.current_lst_index = -1
        self.addButton.clicked.connect(self.add)
        self.removeButton.clicked.connect(self.remove)
        self.actionCalcLSSParameter.triggered.connect(self.calculatelss)
        self.actionAutomaticElutionWindowStretching.triggered.connect(self.calcautelwindowstretch)
        self.actionSelectivityMap.triggered.connect(self.pltselectivitymap)
        self.actionResolutionMap.triggered.connect(self.pltresolutionmap)
        self.actionAbout.triggered.connect(self.about)
        self.actionQuit.triggered.connect(self.quit)
        self.listView.clicked.connect(self.viewmatrix)
        self.toolBox.currentChanged.connect(self.viewmatrix)

        self.zoomButton.clicked.connect(self.zoom)
        self.panButton.clicked.connect(self.pan)
        self.rescaleButton.clicked.connect(self.home)
        self.modelBox.currentIndexChanged.connect(self.gradientanalyser)
        self.doubleSpinBox_1.valueChanged.connect(self.gradientanalyser)
        self.doubleSpinBox_2.valueChanged.connect(self.gradientanalyser)
        self.doubleSpinBox_3.valueChanged.connect(self.gradientanalyser)
        self.doubleSpinBox_4.valueChanged.connect(self.gradientanalyser)
        self.doubleSpinBox_5.valueChanged.connect(self.gradientanalyser)
        self.ColumnLenghtSpinBox.valueChanged.connect(self.gradientanalyser)
        self.CulumnDiameterSpinBox.valueChanged.connect(self.gradientanalyser)
        self.ColumnPorositySpinBox.valueChanged.connect(self.gradientanalyser)

        # Add plot
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()

        # set the layout
        layout_chormatogram = QtGui.QVBoxLayout()
        layout_chormatogram.addWidget(self.canvas)
        self.plotterBox.setLayout(layout_chormatogram)

        # Add selectivity map plot
        #self.figure_smap = plt.figure()
        #self.canvas_smap = FigureCanvas(self.figure_smap)
        #self.toolbar_smap = NavigationToolbar(self.canvas_smap, self)
        #self.toolbar_smap.hide()

        #layout_smap = QtGui.QVBoxLayout()
        #layout_smap.addWidget(self.canvas_smap)
        #self.plotterBox_2.setLayout(layout_smap)

        self.tablemodel = TableModel(self)
        self.tableView.setModel(self.tablemodel)
        self.tableView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.tableView.customContextMenuRequested.connect(self.openTableMenu)

        # constant parameters
        self.crit_resolution = 1.8
        self.crit_alpha = 1.1

    def openTableMenu(self, position):
        """ context menu event """
        menu = QtGui.QMenu(self)
        exportAction = menu.addAction("Export table as CSV")
        action = menu.exec_(self.tableView.viewport().mapToGlobal(position))

        if action == exportAction:
            fname = QtGui.QFileDialog.getSaveFileName(self, "Save File", "CSV (*.csv)");
            #fname = QtGui.getSaveFileName.getOpenFileName(self, tr('Save File'), )
            self.tablemodel.SaveTable(fname)
        else:
            return


        return


    def keyPressEvent(self, e):
        if (e.modifiers() & QtCore.Qt.ControlModifier):
            if e.key() == QtCore.Qt.Key_C: #copy
                if len(self.tableView.selectionModel().selectedIndexes()) > 0:
                    previous = self.tableView.selectionModel().selectedIndexes()[0]
                    columns = []
                    rows = []
                    for index in self.tableView.selectionModel().selectedIndexes():
                        if previous.column() != index.column():
                            columns.append(rows)
                            rows = []
                        rows.append(str(index.data().toPyObject()))
                        previous = index
                    columns.append(rows)

                    # add rows and columns to clipboard
                    clipboard = ""
                    nrows = len(columns[0])
                    ncols = len(columns)
                    for r in xrange(nrows):
                        for c in xrange(ncols):
                            clipboard += columns[c][r]
                            if c != (ncols-1):
                                clipboard += '\t'
                        clipboard += '\n'

                    # copy to the system clipboard
                    sys_clip = QtGui.QApplication.clipboard()
                    sys_clip.setText(clipboard)

    def home(self):
        self.toolbar.home()
    def zoom(self):
        self.toolbar.zoom()
    def pan(self):
        self.toolbar.pan()

    def plotchromatogram(self):
        ''' plot some random stuff '''
        data = [random.random() for i in range(25)]
        ax = self.figure.add_subplot(111)
        ax.hold(False)
        ax.plot(data, '*-')
        self.canvas.draw()

    def add(self):
        idialog = ImportDialog()
        if idialog.exec_() == 1:
            [name, molname, trdata, grad, tg, td, t0, flow, c_length, c_diameter, c_particle] = idialog.getdata()
            self.datalst.append(Data(name, molname, trdata, grad, tg, td, t0, flow, c_length, c_diameter, c_particle))
            self.lstdatamodel.appendRow(QtGui.QStandardItem(name))

    def remove(self):
        if self.current_lst_index >= 0 and self.current_lst_index < len(self.datalst):
            del self.datalst[self.current_lst_index]
            self.lstdatamodel.removeRow(self.current_lst_index)

    def viewmatrix(self, indx):
        if self.toolBox.currentIndex() == 0:
            if indx:
                self.current_lst_index =  indx.row()
                del self.tablemodel.arraydata[:]
                del self.tablemodel.header[:]
                self.tablemodel.clean()
                self.tableView.model().layoutChanged.emit()
                molname = self.datalst[self.current_lst_index].molname
                trdata = self.datalst[self.current_lst_index].trdata
                grad = self.datalst[self.current_lst_index].grad
                tg = self.datalst[self.current_lst_index].tg
                header = ["Molecule"]
                for j in range(len(tg)):
                    header.append(str("%.1f%% %.1f%% %.1f min" % (round(grad[j][0]*100,1), round(grad[j][1]*100,1), tg[j])))
                self.tablemodel.setHeader(header)
                for i in range(len(trdata)):
                    row = [molname[i]]
                    for j in range(len(trdata[i])):
                        row.append(round(trdata[i][j], 2))
                    self.tablemodel.addRow(row)
                self.tableView.model().layoutChanged.emit()
        else:
            del self.tablemodel.arraydata[:]
            del self.tablemodel.header[:]
            self.tablemodel.clean()
            self.tableView.model().layoutChanged.emit()
            self.gradientanalyser()

    def about(self):
        adialog = AboutDialog()
        adialog.exec_()

    def quit(self):
        QtGui.QApplication.quit()

    def calculatelss(self):
        items = []
        lstmodel = self.listView.model()
        for index in range(lstmodel.rowCount()):
            item = lstmodel.item(index)
            items.append(item.text())

        runlss = ComputeLSS(items)
        if runlss.exec_() == 1:
            [indx, modelname] = runlss.getdata()
            t0 = self.datalst[indx].t0
            v_d = self.datalst[indx].vd
            flow = self.datalst[indx].flow

            lssmol = SSGenerator(None, None, None, t0, v_d, flow)

            self.modellst.append(Model())
            self.modellst[-1].modname = modelname
            self.modellst[-1].molname = self.datalst[indx].molname
            self.modellst[-1].flow = self.datalst[indx].flow
            self.modellst[-1].c_length = self.datalst[indx].c_length
            self.modellst[-1].c_diameter = self.datalst[indx].c_diameter
            self.modellst[-1].c_particle = self.datalst[indx].c_particle
            self.modelBox.addItem(modelname)

            tg = self.datalst[indx].tg
            init_B = []
            final_B = []
            for i in range(len(tg)):
                init_B.append(self.datalst[indx].grad[i][0])
                final_B.append(self.datalst[indx].grad[i][1])

            self.modellst[-1].v_d = v_d
            self.modellst[-1].v_m = t0 * flow

            for row in self.datalst[indx].trdata:
                lss_logkw, lss_s = lssmol.getlssparameters(row, tg, init_B, final_B)
                self.modellst[-1].lss.append([lss_logkw, lss_s])

            if len(self.modellst) == 1:
                self.gradientanalyser()

    def calcautelwindowstretch(self):
        aws = AutomaticElutionWindowStretching(self.modellst)
        aws.exec_()

    def pltselectivitymap(self):
        smap = PlotMaps(self.modellst, "sel")
        smap.exec_()

    def pltresolutionmap(self):
        rsmap = PlotMaps(self.modellst, "res")
        rsmap.exec_()

    def gradientanalyser(self):
        indx = self.modelBox.currentIndex()
        del self.tablemodel.arraydata[:]
        del self.tablemodel.header[:]
        self.tablemodel.clean()
        header = ["Molecule", "log kW", "S", "tR"]
        self.tablemodel.setHeader(header)
        self.tableView.model().layoutChanged.emit()
        if indx >= 0 and indx < len(self.modellst):
            #predict the retention time for each compound
            molname = [name for name in self.modellst[indx].molname]
            lss = self.modellst[indx].lss
            flow_sofware = float(self.doubleSpinBox_1.value())
            init_B_soft = float(self.doubleSpinBox_2.value())/100.
            final_B_soft = float(self.doubleSpinBox_3.value())/100.
            tg_soft = float(self.doubleSpinBox_4.value())

            c_length = self.ColumnLenghtSpinBox.value()
            c_diameter = self.CulumnDiameterSpinBox.value()
            c_particle = self.ColumnPorositySpinBox.value()

            t0_soft = 0.
            td_soft = 0.

            v_m = None
            v_d = float(self.doubleSpinBox_5.value())

            #if c_length > 0 and c_diameter > 0 and c_porosity > 0:
            #    v_m = ((square(self.c_diameter)*self.c_length*pi*self.c_porosity)/4.)/1000.
            #else:
            v_m = self.modellst[indx].v_m

            t0_soft = float(v_m/flow_sofware)
            td_soft = float(v_d/flow_sofware)

            A = 1.0

            #N = (c_length*10000.)/(3.4*c_particle)
            trtab = []
            lssmol = SSGenerator(None, None, None, t0_soft, float(self.modellst[indx].v_d), flow_sofware)
            i = 0
            trlst = []
            for row in lss:
                lss_logkw = float(row[0])
                lss_s = float(row[1])
                W = get_lss_peak_width(c_length, c_particle, lss_logkw, lss_s, init_B_soft, final_B_soft, tg_soft, flow_sofware, self.modellst[indx].v_m, self.modellst[indx].v_d, None)
                tr = lssmol.rtpred(lss_logkw, lss_s, tg_soft, init_B_soft, final_B_soft, t0_soft, td_soft)
                if tr < t0_soft:
                    trtab.append([t0_soft, A, W])
                else:
                    trtab.append([tr, A, W])
                trlst.append([round(trtab[-1][0], 2), W, molname[i]])
                row = [molname[i], round(lss_logkw, 3), round(lss_s, 3), round(trtab[-1][0],2)]
                self.tablemodel.addRow(row)
                self.tableView.model().layoutChanged.emit()
                i += 1

            # Calculate the critical resolution
            trlst = sorted(trlst, key=lambda x:x[0])
            # get min and max time
            tr_min = tr_max = 0.
            if len(trlst) > 0:
                tr_min = trlst[0][0]
                tr_max = trlst[-1][0]
                # calculate resolution and critical couple
                # get the peak width at base multiplying by 1.7
                self.plainTextEdit.clear()
                text = "Critical couples:\n"
                self.plainTextEdit.appendPlainText(text)

                crit_trtab = []
                crit_molname = []
                ncc = 0
                for i in range(1, len(trlst)):
                    width1 = trlst[i][1] * 1.7
                    width2 = trlst[i-1][1] * 1.7
                    tr1 = trlst[i-1][0]
                    tr2 = trlst[i][0]
                    tmp_rs = (2*(tr2-tr1)) / (width1+width2)
                    if tmp_rs < self.crit_resolution:
                        molname_a = trlst[i-1][2]
                        molname_b = trlst[i][2]
                        text =  "  - %s  %.2f min\n" % (molname_a, round(trlst[i-1][0], 2))
                        text += "  - %s  %.2f min\n" % (molname_b, round(trlst[i][0], 2))
                        text += "Rs: %.2f\n" % round(tmp_rs, 2)
                        text += "#"*20
                        text += "\n"
                        self.plainTextEdit.appendPlainText(text)
                        ncc += 1
                        if molname_a not in crit_molname:
                            # add to critical tr tab
                            a_indx = molname.index(molname_a)
                            crit_trtab.append(trtab.pop(a_indx))
                            crit_molname.append(molname.pop(a_indx))

                        if molname_b not in crit_molname:
                            b_indx = molname.index(molname_b)
                            crit_trtab.append(trtab.pop(b_indx))
                            crit_molname.append(molname.pop(b_indx))
                    else:
                        continue

                self.plainTextEdit.appendPlainText("Total critical couples: %d" % (ncc))

                #Create a cromatogram
                peaks = BuildChromatogram(trtab, tg_soft, 0.01)
                peaks = zip(*peaks)

                crit_peaks = BuildChromatogram(crit_trtab, tg_soft, 0.01)
                crit_peaks = zip(*crit_peaks)

                y = []
                x = []
                for i in range(len(peaks)):
                    x.append(peaks[i][0])
                    y.append(0.)
                    len(peaks[0])
                    for j in range(1, len(peaks[0])):
                        y[-1] += peaks[i][j]

                crit_y = []
                crit_x = []
                for i in range(len(crit_peaks)):
                    crit_x.append(crit_peaks[i][0])
                    crit_y.append(0.)
                    len(peaks[0])
                    for j in range(1, len(crit_peaks[0])):
                        crit_y[-1] += crit_peaks[i][j]
                ax = self.figure.add_subplot(111)
                ax.hold(False)
                ax.plot(x, y, "b", crit_x, crit_y, "r")

                #ax.plot(x, y, '-', color='blue')
                #ax.plot(crit_x, crit_y, '-', color='red')
                plt.xlabel('Time')
                plt.ylabel('Signal')
                plt.xlim([tr_min-((tr_min*10.)/100.), tr_max+((tr_max*10.)/100.)])
                self.canvas.draw()
Esempio n. 18
0
File: plot.py Progetto: xyhuy/essa
class Plot(Widget, QtGui.QWidget):
    def __init__(self, parent=None):
        Widget.__init__(self)
        QtGui.QWidget.__init__(self, parent)
        self._data = 0
        self._amostras = 20
        self._datas = deque(maxlen=self._amostras)

        self.create_main_frame()
        #self.plot()

    def create_main_frame(self):
        self.main_frame = QWidget()

        self.fig = Figure((5.0, 4.0), dpi=90)
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)
        self.canvas.setFocusPolicy(Qt.StrongFocus)
        self.canvas.setFocus()
        self.axis = self.fig.add_subplot(111, axisbg='w')
        self.axis.hold(False)

        self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
        self.mpl_toolbar.hide()
        self.canvas.mpl_connect('key_press_event', self.on_key_press)

        vbox = QVBoxLayout()
        vbox.addWidget(self.canvas)  # the matplotlib canvas
        vbox.addWidget(self.mpl_toolbar)

        #self.main_frame.setLayout(vbox)
        self.setLayout(vbox)
        #self.setCentralWidget(self.main_frame)

    def plot(self):
        ''' plot some random stuff '''
        self.axis.plot(self._datas, '*-')
        self.canvas.draw()

    @property
    def value(self):
        return self._data

    def add(self, value):
        self._datas.append(value)

    @value.setter
    def value(self, data):
        self._data = data
        self.add(data)
        self.plot()

    def setValue(self, data):
        self._data = data
        self.add(data)
        self.plot()

    def amostras(self, amostras):
        self._amostras = amostras
        self._datas = deque(maxlen=self._amostras)

    def on_key_press(self, event):
        print('Plot pressed', event.key)
        # implement the default mpl key press events described at
        # http://matplotlib.org/users/navigation_toolbar.html#navigation-keyboard-shortcuts
        try:
            key_press_handler(event, self.canvas, self.mpl_toolbar)
        except:
            pass
Esempio n. 19
0
class PyWeramiWindow(QtGui.QMainWindow, Ui_MainWindow):

    def __init__(self, filename=None, parent=None):
        super(PyWeramiWindow,self).__init__(parent)
        self.settings = QtCore.QSettings("LX", "pywerami")
        self.setupUi(self)
        self._fig = plt.figure(facecolor="white")
        self._ax = self._fig.add_subplot(111)

        self._canvas = FigureCanvas(self._fig)
        self._canvas.setParent(self.widget)
        self._canvas.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.matplot.addWidget(self._canvas)
        self.mpl_toolbar = NavigationToolbar(self._canvas,self.widget)
        self.mpl_toolbar.hide()
        self.matplot.addWidget(self.mpl_toolbar)

        #set combos
        self.cmaps = [m for m in plt.cm.datad if not m.endswith("_r")]
        self.mapstyle.addItems(self.cmaps)

        # set validators
        self.levelmin.setValidator(QtGui.QDoubleValidator(self.levelmin))
        self.levelmax.setValidator(QtGui.QDoubleValidator(self.levelmax))
        self.levelnum.setValidator(QtGui.QIntValidator(self.levelmin))
        self.levelstep.setValidator(QtGui.QDoubleValidator(self.levelstep))
        self.clipmin.setValidator(QtGui.QDoubleValidator(self.clipmin))
        self.clipmax.setValidator(QtGui.QDoubleValidator(self.clipmax))
        
        # Set icons in toolbar
        self.actionOpen.setIcon(QtGui.QIcon.fromTheme('document-open'))
        self.actionSave.setIcon(QtGui.QIcon.fromTheme('document-save'))
        self.actionSaveas.setIcon(QtGui.QIcon.fromTheme('document-save-as'))
        self.actionImport.setIcon(QtGui.QIcon.fromTheme('x-office-spreadsheet'))
        self.actionHome.setIcon(self.mpl_toolbar._icon('home.png'))
        self.actionPan.setIcon(self.mpl_toolbar._icon('move.png'))
        self.actionZoom.setIcon(self.mpl_toolbar._icon('zoom_to_rect.png'))
        self.actionGrid.setIcon(QtGui.QIcon.fromTheme('format-justify-fill'))
        self.actionAxes.setIcon(self.mpl_toolbar._icon('qt4_editor_options.png'))
        self.actionSavefig.setIcon(self.mpl_toolbar._icon('filesave.png'))
        #self.action3D.setIcon(QtGui.QIcon.fromTheme(''))
        self.actionProperties.setIcon(QtGui.QIcon.fromTheme('preferences-other'))
        self.actionQuit.setIcon(QtGui.QIcon.fromTheme('application-exit'))
        self.actionAbout.setIcon(QtGui.QIcon.fromTheme('help-about'))
        
        self.actionImport.triggered.connect(self.import_data)
        self.actionHome.triggered.connect(self.mpl_toolbar.home)
        self.actionPan.triggered.connect(self.plotpan)
        self.actionZoom.triggered.connect(self.plotzoom)
        self.actionGrid.triggered.connect(self.plotgrid)
        self.actionAxes.triggered.connect(self.mpl_toolbar.edit_parameters)
        self.actionSavefig.triggered.connect(self.mpl_toolbar.save_figure)
        self.actionProperties.triggered.connect(self.edit_options)
        self.actionQuit.triggered.connect(self.close)
        if filename:
            self.import_data(filename)
        
        # ready
        self.statusbar.showMessage("Ready", 5000)

    def closeEvent(self,event):
        reply=QtGui.QMessageBox.question(self,'Message',"Are you sure to quit?",QtGui.QMessageBox.Yes,QtGui.QMessageBox.No)
        if reply==QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def import_data(self, filename=None):
        if not filename:
            filename = QtGui.QFileDialog.getOpenFileName(self, "Import tab file", ".", "TAB (*.tab);;All files (*.*)")
        if filename:
            self.data = WeramiData.from_tab(filename)

            # populate listview and setup properties
            self.props = {}
            self._model = QtGui.QStandardItemModel(self.listView)
            for var in self.data.dep:
                item = QtGui.QStandardItem(var)
                item.setCheckable(True)
                self._model.appendRow(item)
                self.default_var_props(var)

            self.listView.setModel(self._model)
            self.listView.show()
            # connect listview signals
            self.varSel = self.listView.selectionModel()
            self.varSel.selectionChanged.connect(self.on_var_changed)
            self._model.itemChanged.connect(self.plot)
            # buttons signals
            self.buttonBox.button(QtGui.QDialogButtonBox.Apply).clicked.connect(self.apply_props)
            self.buttonBox.button(QtGui.QDialogButtonBox.RestoreDefaults).clicked.connect(self.restore_props)
            self.contcolor.clicked.connect(self.contours_color)
            self.action3D.triggered.connect(self.switch3d)
            # signals to calculate step size
            self.levelmin.editingFinished.connect(self.step_from_levels)
            self.levelmax.editingFinished.connect(self.step_from_levels)
            self.levelnum.editingFinished.connect(self.step_from_levels)
            self.setlevels.toggled.connect(self.step_from_levels)
            
            # all done focus
            self.action3D.setChecked(False) # no 3d on import
            self.varSel.setCurrentIndex(self._model.index(0, 0), QtGui.QItemSelectionModel.ClearAndSelect | QtGui.QItemSelectionModel.Rows)
            self.listView.setFocus()
            self.plot()
            self.statusbar.showMessage("Data from {} imported".format(self.data.label), 5000)

    def contours_color(self):
    	col = QtGui.QColorDialog.getColor()
    	if col.isValid():
            self.contcolor.setStyleSheet("background-color: {}".format(col.name()))

    def step_from_levels(self):
        if self.setlevels.isChecked():
            step = (float(self.levelmax.text()) - float(self.levelmin.text())) / (int(self.levelnum.text()) - 1)
            self.levelstep.setText(repr(step))
            self.props[self.var]['step'] = step

    def default_var_props(self, var):
        data = self.data.get_var(var)
        prop = {}
        #levels
        prop['min'] = data.min()
        prop['max'] = data.max()
        prop['num'] = 10
        prop['step'] = (prop['max'] - prop['min']) / (prop['num'] - 1)
        prop['levels'] = 'num'
        prop['type'] = 'linear'
        #style
        prop['fill'] = False
        prop['opacity'] = 100
        prop['cmap'] = 'jet'
        prop['contours'] = 'color'
        prop['color'] = '#000000'
        prop['label'] = False
        #processing
        prop['resample'] = 1
        prop['median'] = 1
        prop['gauss'] = 0
        prop['clipmin'] = data.min()
        prop['clipmax'] = data.max()

        self.props[var] = prop

    def set_var_props(self, var):
        #levels
        self.levelmin.setText(repr(self.props[var]['min']))
        self.levelmax.setText(repr(self.props[var]['max']))
        self.levelnum.setText(repr(self.props[var]['num']))
        self.levelstep.setText(repr(self.props[var]['step']))
        if self.props[var]['levels'] == 'num':
            self.setlevels.setChecked(True)
        else:
            self.setstep.setChecked(True)
        if self.props[var]['type'] == 'linear':
            self.linlevel.setChecked(True)
        else:
            self.cdflevel.setChecked(True)
        #style
        if self.props[var]['fill']:
            self.fillstyle.setChecked(True)
        else:
            self.fillstyle.setChecked(False)
        self.opacity.setValue(self.props[var]['opacity'])
        self.mapstyle.setCurrentIndex(self.cmaps.index(self.props[var]['cmap']))
        self.contcolor.setStyleSheet("background-color: {}".format(self.props[var]['color']))
        if self.props[var]['contours'] == 'map':
            self.contcheckmap.setChecked(True)
        elif self.props[var]['contours'] == 'color':
            self.contcheckcolor.setChecked(True)
        else:
            self.contchecknone.setChecked(True)
        if self.props[var]['label']:
            self.contlabel.setChecked(True)
        else:
            self.contlabel.setChecked(False)
        #processing
        self.resample.setValue(self.props[var]['resample'])
        self.filtersize.setValue(self.props[var]['median'])
        self.filtersigma.setValue(self.props[var]['gauss'])
        self.clipmin.setText(repr(self.props[var]['clipmin']))
        self.clipmax.setText(repr(self.props[var]['clipmax']))

    def on_var_changed(self, selected):
        self.var = self.data.dep[selected.indexes()[0].row()]
        self.set_var_props(self.var)
        if self.action3D.isChecked():
            self.plot()

    def apply_props(self):
        #levels
        self.props[self.var]['min'] = float(self.levelmin.text())
        self.props[self.var]['max'] = float(self.levelmax.text())
        self.props[self.var]['num'] = int(self.levelnum.text())
        self.props[self.var]['step'] = float(self.levelstep.text())
        if self.setlevels.isChecked():
            self.props[self.var]['levels'] = 'num'
        else:
            self.props[self.var]['levels'] = 'step'
        if self.linlevel.isChecked():
            self.props[self.var]['type'] = 'linear'
        else:
            self.props[self.var]['type'] = 'cdf'
        #style
        if self.fillstyle.isChecked():
            self.props[self.var]['fill'] = True
        else:
            self.props[self.var]['fill'] = False
        self.props[self.var]['opacity'] = self.opacity.value()
        self.props[self.var]['cmap'] = str(self.mapstyle.currentText())
        self.props[self.var]['color'] = str(self.contcolor.palette().color(1).name())
        if self.contcheckmap.isChecked():
            self.props[self.var]['contours'] = 'map'
        elif self.contcheckcolor.isChecked():
            self.props[self.var]['contours'] = 'color'
        else:
            self.props[self.var]['contours'] = ''
        if self.contlabel.isChecked():
            self.props[self.var]['label'] = True
        else:
            self.props[self.var]['label'] = False
        #processing
        self.props[self.var]['resample'] = self.resample.value()
        self.props[self.var]['median'] = self.filtersize.value()
        self.props[self.var]['gauss'] = self.filtersigma.value()
        self.props[self.var]['clipmin'] = float(self.clipmin.text())
        self.props[self.var]['clipmax'] = float(self.clipmax.text())
        self.plot()

    def restore_props(self):
        self.default_var_props(self.var)
        self.set_var_props(self.var)
        self.plot()

    def edit_options(self):
        dlg = OptionsForm(self)
        dlg.exec_()

    def plotpan(self):
        self.actionZoom.setChecked(False)
        self.mpl_toolbar.pan()

    def plotzoom(self):
        self.actionPan.setChecked(False)
        self.mpl_toolbar.zoom()

    def plotgrid(self):
        plt.grid()
        self._canvas.draw()

    def switch3d(self):
        if not self.action3D.isChecked():
            self._fig.clear()
            self._ax = self._fig.add_subplot(111)
        else:
            self._fig.clear()
            self._ax = self._fig.add_subplot(111, projection='3d')
        self.plot()

    def plot(self):
        self._ax.cla()
        if not self.action3D.isChecked():
            extent = self.data.get_extent()
            i = 0
            while self._model.item(i):
                if self._model.item(i).checkState():
                    CS = None
                    var = str(self._model.item(i).text())
                    # get data, smooth and clip
                    data = self.data.get_var(var,nan=np.float(self.settings.value("nan", "NaN", type=str)))
                    if self.props[var]['resample'] > 1:
                        data = np.ma.array(ndimage.zoom(data.filled(0), self.props[var]['resample']), mask=ndimage.zoom(data.mask, self.props[var]['resample'], order=0))
                    if self.props[var]['median'] > 1:
                        data = np.ma.array(ndimage.median_filter(data, size=self.props[var]['median']*self.props[var]['resample']), mask=data.mask)
                    if self.props[var]['gauss'] > 0:
                        data = np.ma.array(ndimage.gaussian_filter(data, sigma=self.props[var]['gauss']*self.props[var]['resample']), mask=data.mask)
                    data = np.ma.masked_outside(data, self.props[var]['clipmin'], self.props[var]['clipmax'])
                    if self.props[var]['fill']:
                        self._ax.imshow(data, interpolation='none', origin='lower', extent=extent, aspect='auto', cmap=plt.get_cmap(self.props[var]['cmap']), alpha=self.props[var]['opacity']/100.0)
                    if self.props[var]['type'] == 'linear':
                        if self.props[var]['levels'] == 'num':
                            clevels = np.linspace(self.props[var]['min'], self.props[var]['max'], self.props[var]['num'])
                        else:
                            # trick to include max in levels
                            clevels = np.arange(self.props[var]['min'], self.props[var]['max'] + 10**np.ceil(np.log10(np.abs(self.props[var]['max']))), self.props[var]['step'])
                    else:
                        # cdf based on histogram binned acording to the Freedman-Diaconis rule
                        v = np.sort(data.compressed())
                        IQR = v[int(round((v.size-1) * float(0.75)))] - v[int(round((v.size-1) * float(0.25)))]
                        bin_size = 2 * IQR * v.size**(-1.0/3)
                        nbins = int(round(max(self.props[var]['num'], (v[-1]-v[0]) / (bin_size+0.001))))
                        hist, bin_edges = np.histogram(v, bins=nbins)
                        cdf = np.cumsum(hist)
                        cdfx = np.cumsum(np.diff(bin_edges)) + bin_edges[:2].sum()/2
                        clevels = np.interp(np.linspace(cdf[0],cdf[-1],self.props[var]['num'] + 2)[1:-1], cdf, cdfx)
                    if self.props[var]['contours'] == 'map':
                        CS = self._ax.contour(self.data.get_xrange(self.props[var]['resample']), self.data.get_yrange(self.props[var]['resample']), data, clevels, cmap=plt.get_cmap(self.props[var]['cmap']))
                    elif self.props[var]['contours'] == 'color':
                        CS = self._ax.contour(self.data.get_xrange(self.props[var]['resample']), self.data.get_yrange(self.props[var]['resample']), data, clevels, colors=self.props[var]['color'])
                    if self.props[var]['label'] and CS:
                        self._ax.clabel(CS, fontsize=8, inline=1)
                i += 1

            self._ax.axis(extent)
            plt.title(self.data.label)
        else:
            # get data, smooth and clip
            data = self.data.get_var(self.var)
            if self.props[self.var]['resample'] > 1:
                data = np.ma.array(ndimage.zoom(data.filled(0), self.props[self.var]['resample']), mask=ndimage.zoom(data.mask, self.props[self.var]['resample'], order=0))
            if self.props[self.var]['median'] > 1:
                data = np.ma.array(ndimage.median_filter(data, size=self.props[self.var]['median']*self.props[self.var]['resample']), mask=data.mask)
            if self.props[self.var]['gauss'] > 0:
                data = np.ma.array(ndimage.gaussian_filter(data, sigma=self.props[self.var]['gauss']*self.props[self.var]['resample']), mask=data.mask)
            data = np.ma.masked_outside(data, self.props[self.var]['clipmin'], self.props[self.var]['clipmax'])
            x,y = np.meshgrid(self.data.get_xrange(self.props[self.var]['resample']), self.data.get_yrange(self.props[self.var]['resample']))
            self._ax.plot_surface(x, y, data.filled(np.NaN), vmin=data.min(), vmax=data.max(), cmap=plt.get_cmap(self.props[self.var]['cmap']), linewidth=0.5, alpha=self.props[self.var]['opacity']/100.0)
            self._ax.view_init(azim=235, elev=30)

        plt.xlabel(self.data.ind[self.data.xvar]['name'])
        plt.ylabel(self.data.ind[self.data.yvar]['name'])
        plt.tight_layout()
        self._canvas.draw()
Esempio n. 20
0
class Window(Qt.QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.startButton = Qt.QPushButton()
        self.startButton.setFixedSize(100, 100)
        self.startButton.setIcon(Qt.QIcon('Green_Start.png'))
        self.startButton.setIconSize(Qt.QSize(75, 75))

        self.stopButton = Qt.QPushButton()
        self.stopButton.setFixedSize(100, 100)
        self.stopButton.setIcon(Qt.QIcon('Red_Stop.png'))
        self.stopButton.setIconSize(Qt.QSize(75, 75))

        self.vidThread = Qt.QThread()
        self.ardThread = Qt.QThread()
        self.vidThread.start()
        self.ardThread.start()

        self.vidTracking = VideoTracking()
        self.vidTracking.moveToThread(self.vidThread)

        self.arduino = Arduino()
        self.arduino.moveToThread(self.ardThread)

        self.stopButton.clicked.connect(lambda: self.arduino.stop())
        self.stopButton.clicked.connect(lambda: self.vidTracking.stop())
        self.startButton.clicked.connect(self.arduino.Run)
        self.startButton.clicked.connect(self.start_pressed)

        self.table = Qt.QTableWidget()
        self.table_rowCount = 0
        self.table.setRowCount(self.table_rowCount)
        self.table.setColumnCount(6)
        self.table.setHorizontalHeaderLabels([
            'Trial #', 'Date', 'Start Time', 'End Time', 'Duration (sec)',
            'Comments'
        ])
        #self.table.horizontalHeader().setResizeMode(Qt.QHeaderView.Stretch)
        self.table.horizontalHeader().setStretchLastSection(True)

        self.table.cellChanged.connect(self.cell_was_clicked)

        boldFont = Qt.QFont()
        boldFont.setBold(True)

        label1 = Qt.QLabel("Python Console Output")
        label1.setFont(boldFont)

        self.txtEdt1 = Qt.QTextEdit()
        self.txtEdt1.setReadOnly(True)

        # Install the custom output stream
        sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)

        self.actButton1 = Qt.QPushButton(self.tr("&actButton1"))
        self.actButton1.setCheckable(True)
        self.actButton1.toggled.connect(
            lambda: self.arduino.actButton1(self.actButton1.isChecked()))
        self.actButton2 = Qt.QPushButton(self.tr("&actButton2"))
        self.actButton2.setCheckable(True)
        self.actButton2.toggled.connect(
            lambda: self.arduino.actButton2(self.actButton2.isChecked()))
        self.actButton3 = Qt.QPushButton(self.tr("&actButton3"))
        self.actButton3.setCheckable(True)
        self.actButton3.toggled.connect(
            lambda: self.arduino.actButton3(self.actButton3.isChecked()))
        self.actButton4 = Qt.QPushButton(self.tr("&actButton4"))
        self.actButton4.setCheckable(True)
        self.actButton4.toggled.connect(
            lambda: self.arduino.actButton4(self.actButton4.isChecked()))
        self.actButton5 = Qt.QPushButton(self.tr("&actButton5"))
        self.actButton5.setCheckable(True)
        self.actButton5.toggled.connect(
            lambda: self.arduino.actButton5(self.actButton5.isChecked()))
        self.actButton6 = Qt.QPushButton(self.tr("&actButton6"))
        self.actButton6.setCheckable(True)
        self.actButton6.toggled.connect(
            lambda: self.arduino.actButton6(self.actButton6.isChecked()))
        self.actButton7 = Qt.QPushButton(self.tr("&actButton7"))
        self.actButton7.setCheckable(True)
        self.actButton7.toggled.connect(
            lambda: self.arduino.actButton7(self.actButton7.isChecked()))
        self.actButton8 = Qt.QPushButton(self.tr("&actButton8"))
        self.actButton8.setCheckable(True)
        self.actButton8.toggled.connect(
            lambda: self.arduino.actButton8(self.actButton8.isChecked()))

        self.frame4 = Qt.QFrame()
        self.frame4.setFrameStyle(1)
        self.frame4.setFixedSize(350, 370)

        self.arena_setup_new_edit = Qt.QPushButton("New/Edit")
        self.arena_setup_new_edit.clicked.connect(self.new_edit_arena_setup)

        self.arena_setup_load = Qt.QPushButton("Load")
        self.arena_setup_load.clicked.connect(self.load_arena_setup)

        self.arena_setup_save = Qt.QPushButton("Save")
        self.arena_setup_save.clicked.connect(self.save_arena_setup)

        layout6 = Qt.QHBoxLayout()
        layout6.addWidget(self.arena_setup_new_edit)
        layout6.addWidget(self.arena_setup_load)
        layout6.addWidget(self.arena_setup_save)

        self.main_frame = Qt.QWidget()
        self.main_frame.setFixedSize(325, 325)
        self.fig = Figure((5.0, 4.0), dpi=100)
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)

        self.fig.canvas.mpl_connect("motion_notify_event", self.mouse_movement)

        self.fig_toolbar = NavigationToolbar(self.canvas, self.main_frame)
        self.fig_toolbar.hide()

        self.homeBtn = Qt.QPushButton()
        self.homeBtn.setFixedSize(25, 25)
        self.homeBtn.setIcon(Qt.QIcon('home.png'))
        self.homeBtn.setIconSize(Qt.QSize(20, 20))
        self.homeBtn.clicked.connect(self.home)

        self.panBtn = Qt.QPushButton()
        self.panBtn.setCheckable(True)
        self.panBtn.setFixedSize(25, 25)
        self.panBtn.setIcon(Qt.QIcon('move.png'))
        self.panBtn.setIconSize(Qt.QSize(20, 20))
        self.panBtn.clicked.connect(self.pan)

        self.zoomBtn = Qt.QPushButton()
        self.zoomBtn.setCheckable(True)
        self.zoomBtn.setFixedSize(25, 25)
        self.zoomBtn.setIcon(Qt.QIcon('zoom_to_rect.png'))
        self.zoomBtn.setIconSize(Qt.QSize(20, 20))
        self.zoomBtn.clicked.connect(self.zoom_to_rect)

        self.lblsBtn = Qt.QPushButton()
        self.lblsBtn.setCheckable(True)
        self.lblsBtn.setFixedSize(25, 25)
        self.lblsBtn.setIcon(Qt.QIcon('label_icon.png'))
        self.lblsBtn.setIconSize(Qt.QSize(20, 20))
        self.lblsBtn.clicked.connect(self.show_hide_labels)

        self.drawBtn = Qt.QPushButton()
        self.drawBtn.setFixedSize(25, 25)
        self.drawBtn.setIcon(Qt.QIcon('refresh_icon.jpeg'))
        self.drawBtn.setIconSize(Qt.QSize(20, 20))
        self.drawBtn.clicked.connect(self.redraw_arena_setup)

        self.coords_label = Qt.QLabel()
        self.coords_label.setAlignment(QtCore.Qt.AlignCenter)

        self.fig_statusbar = Qt.QStatusBar()
        self.fig_statusbar.setSizeGripEnabled(False)
        self.fig_statusbar.addWidget(self.homeBtn)
        self.fig_statusbar.addWidget(self.panBtn)
        self.fig_statusbar.addWidget(self.zoomBtn)
        self.fig_statusbar.addWidget(self.lblsBtn)
        self.fig_statusbar.addWidget(self.drawBtn)
        self.fig_statusbar.addWidget(self.coords_label, 1)

        frame_layout4 = Qt.QVBoxLayout()
        frame_layout4.addLayout(layout6)
        frame_layout4.addWidget(self.main_frame)
        frame_layout4.addWidget(self.fig_statusbar)
        self.frame4.setLayout(frame_layout4)

        self.radBtn1 = Qt.QRadioButton(
            self.tr("Connect to Raspberry Pi Camera"))
        self.radBtn1.setFont(boldFont)
        self.radBtn1.setChecked(False)
        self.radBtn1.toggled.connect(self.connect_to_camera)

        self.radBtn4 = Qt.QRadioButton(self.tr("Video Record Trial"))
        self.radBtn4.setChecked(False)
        self.radBtn4.setDisabled(True)
        self.radBtn4.toggled.connect(self.video_record_trial)

        self.lneEdt1 = Qt.QLineEdit()
        self.lneEdt1.setDisabled(True)
        self.lneEdt1.setText("example_video_name.mp4")

        self.lneEdt1.textChanged.connect(self.video_record_trial)

        self.new_edit1 = Qt.QPushButton("New/Edit")
        self.new_edit1.clicked.connect(self.new_edit_video_tracking_method)
        self.new_edit1.setDisabled(True)

        self.load1 = Qt.QPushButton("Load")
        self.load1.clicked.connect(self.load_video_tracking_method)
        self.load1.setDisabled(True)

        self.save1 = Qt.QPushButton("Save")
        self.save1.clicked.connect(self.save_video_tracking_method)
        self.save1.setDisabled(True)

        butLayout1 = Qt.QHBoxLayout()
        butLayout1.addWidget(self.new_edit1)
        butLayout1.addWidget(self.load1)
        butLayout1.addWidget(self.save1)

        self.frame1 = Qt.QFrame()
        self.frame1.setFrameStyle(1)
        self.frame1.setFixedSize(350, 140)

        frame_layout1 = Qt.QVBoxLayout()
        frame_layout1.addWidget(self.radBtn1)
        frame_layout1.addLayout(butLayout1)
        frame_layout1.addWidget(self.radBtn4)
        frame_layout1.addWidget(self.lneEdt1)
        self.frame1.setLayout(frame_layout1)

        self.radBtn2 = Qt.QRadioButton(self.tr("Load Video Recording"))
        self.radBtn2.setFont(boldFont)
        self.radBtn2.setChecked(False)
        self.radBtn2.toggled.connect(self.load_video_recording)

        self.btnLneEdt1 = ButtonLineEdit()
        self.btnLneEdt1.setReadOnly(True)
        self.btnLneEdt1.setDisabled(True)
        self.btnLneEdt1.buttonClicked.connect(self.find_video_recording)

        self.vid_len_label = Qt.QLabel(
            "Loaded video length / Trial Runtime (seconds):")
        self.vid_len_label.setDisabled(True)

        self.vid_len_spnBox = Qt.QSpinBox()
        self.vid_len_spnBox.setMaximum(86400)
        self.vid_len_spnBox.setDisabled(True)

        vidLenLayout = Qt.QFormLayout()
        vidLenLayout.addRow(self.vid_len_label, self.vid_len_spnBox)
        vidLenLayout.setLabelAlignment(QtCore.Qt.AlignRight)

        self.new_edit2 = Qt.QPushButton("New/Edit")
        self.new_edit2.clicked.connect(self.new_edit_video_tracking_method)
        self.new_edit2.setDisabled(True)

        self.load2 = Qt.QPushButton("Load")
        self.load2.clicked.connect(self.load_video_tracking_method)
        self.load2.setDisabled(True)

        self.save2 = Qt.QPushButton("Save")
        self.save2.clicked.connect(self.save_video_tracking_method)
        self.save2.setDisabled(True)

        butLayout2 = Qt.QHBoxLayout()
        butLayout2.addWidget(self.new_edit2)
        butLayout2.addWidget(self.load2)
        butLayout2.addWidget(self.save2)

        self.frame2 = Qt.QFrame()
        self.frame2.setFrameStyle(1)
        self.frame2.setFixedSize(350, 145)

        frame_layout2 = Qt.QVBoxLayout()
        frame_layout2.addWidget(self.radBtn2)
        frame_layout2.addWidget(self.btnLneEdt1)
        frame_layout2.addLayout(vidLenLayout)
        frame_layout2.addLayout(butLayout2)
        self.frame2.setLayout(frame_layout2)

        self.radBtn3 = Qt.QRadioButton(self.tr("Connect to Arduino"))
        self.radBtn3.setFont(boldFont)
        self.radBtn3.setChecked(False)
        self.radBtn3.toggled.connect(self.connect_to_arduino)

        self.new_edit3 = Qt.QPushButton("New/Edit")
        self.new_edit3.clicked.connect(self.new_edit_ard_method)
        self.new_edit3.setDisabled(True)

        self.load3 = Qt.QPushButton("Load")
        self.load3.clicked.connect(self.load_ard_method)
        self.load3.setDisabled(True)

        self.save3 = Qt.QPushButton("Save")
        self.save3.clicked.connect(self.save_ard_method)
        self.save3.setDisabled(True)

        butLayout3 = Qt.QHBoxLayout()
        butLayout3.addWidget(self.new_edit3)
        butLayout3.addWidget(self.load3)
        butLayout3.addWidget(self.save3)

        self.frame3 = Qt.QFrame()
        self.frame3.setFrameStyle(1)
        self.frame3.setFixedSize(350, 80)

        frame_layout3 = Qt.QVBoxLayout()
        frame_layout3.addWidget(self.radBtn3)
        frame_layout3.addLayout(butLayout3)
        self.frame3.setLayout(frame_layout3)

        self.group = Qt.QButtonGroup()
        self.group.addButton(self.radBtn1)
        self.group.addButton(self.radBtn2)
        self.group.setExclusive(False)

        self.lcd = QtGui.QLCDNumber()
        self.lcd.setFixedSize(140, 40)

        self.frame6 = Qt.QFrame()
        self.frame6.setFrameStyle(1)

        frame_layout6 = Qt.QHBoxLayout()
        frame_layout6.addWidget(self.lcd)
        self.frame6.setLayout(frame_layout6)

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.timer_time)

        global s, m, h
        s = 0
        m = 0
        h = 0

        layout = Qt.QGridLayout()
        layout.addWidget(self.actButton1, 0, 0)
        layout.addWidget(self.actButton2, 1, 0)
        layout.addWidget(self.actButton3, 0, 1)
        layout.addWidget(self.actButton4, 1, 1)
        layout.addWidget(self.actButton5, 0, 2)
        layout.addWidget(self.actButton6, 1, 2)
        layout.addWidget(self.actButton7, 0, 3)
        layout.addWidget(self.actButton8, 1, 3)

        layout5 = Qt.QHBoxLayout()
        layout5.addWidget(self.startButton)
        layout5.addWidget(self.stopButton)

        self.frame5 = Qt.QFrame()
        self.frame5.setFrameStyle(1)

        frame_layout5 = Qt.QHBoxLayout()
        frame_layout5.addLayout(layout5)
        frame_layout5.addLayout(layout)
        self.frame5.setLayout(frame_layout5)

        layout1 = Qt.QHBoxLayout()
        layout1.addWidget(self.frame5)
        layout1.addWidget(self.frame6)

        layout2 = Qt.QVBoxLayout()
        layout2.addLayout(layout1)
        layout2.addWidget(self.table)
        layout2.addWidget(label1)
        layout2.addWidget(self.txtEdt1)

        layout5 = Qt.QVBoxLayout()
        layout5.addWidget(self.canvas)
        layout5.addWidget(self.fig_statusbar)
        self.main_frame.setLayout(layout5)

        layout3 = Qt.QVBoxLayout()
        layout3.addWidget(self.frame4)
        layout3.addWidget(self.frame1)
        layout3.addWidget(self.frame2)
        layout3.addWidget(self.frame3)
        layout3.addStretch(True)

        layout4 = Qt.QHBoxLayout()
        layout4.addLayout(layout3)
        layout4.addLayout(layout2)

        self.setLayout(layout4)

        global global_results, vidTrack_setup_parameters, ard_setup_parameters, arena_setup_parameters, camera, video_name, recording, record_name
        global_results = {}
        vidTrack_setup_parameters = None
        ard_setup_parameters = None
        arena_setup_parameters = None
        camera = None
        video_name = None
        recording = False
        record_name = None

    def __del__(self):
        # Restore sys.stdout
        sys.stdout = sys.__stdout__

    def normalOutputWritten(self, text):
        self.txtEdt1.append(text)

    def cell_was_clicked(self):
        global global_results
        try:
            current_row = self.table.currentRow()
            current_column = self.table.currentColumn()
            current_item_text = self.table.currentItem().text()
            if current_column == 5:
                global_results[str(current_row + 1)]["trial_info"].update(
                    {"Comments": current_item_text})
        except:
            pass

    def new_edit_arena_setup(self):
        global arena_setup_parameters
        if arena_setup_parameters == None:
            try:
                from setup_arena_picture import arena_setup_parameters
            except:
                pass
        self.new_edit_arena = setup_arena_picture.Window(
            cam=camera, vid_name=video_name, arena_sp=arena_setup_parameters)
        self.new_edit_arena.show()
        arena_setup_parameters = None

    def load_arena_setup(self):
        try:
            global arena_setup_parameters
            name = Qt.QFileDialog.getOpenFileName(self, 'Load Arena Setup')
            with open(name, 'r') as f:
                arena_setup_parameters = eval(f.read())
            print("loaded arena setup: %s" % (arena_setup_parameters))
        except:
            pass

    def save_arena_setup(self):
        global arena_setup_parameters
        try:
            try:
                from setup_arena_picture import arena_setup_parameters
            except:
                pass
            name = Qt.QFileDialog.getSaveFileName(self, 'Save Arena Setup')
            with open(name, 'w') as text_file:
                text_file.write(str(arena_setup_parameters))
            print("arena setup saved %s" % (arena_setup_parameters))
        except:
            pass

    def home(self):
        self.fig_toolbar.home()

    def pan(self):
        self.fig_toolbar.pan()

    def zoom_to_rect(self):
        self.fig_toolbar.zoom()

    def show_hide_labels(self):
        global arena_setup_parameters
        if self.lblsBtn.isChecked():
            # add labels to the grid squares
            self.grid_labels = []
            for j in range(self.num_height_divs):
                y = self.height_div / 2 + j * self.height_div
                for i in range(self.num_width_divs):
                    x = self.width_div / 2. + float(i) * self.width_div
                    if arena_setup_parameters['arena_pic_name'] != "no picture":
                        grid_label = self.axes.text(x,
                                                    y, ("(%d,%d)" % (i, j)),
                                                    fontsize=6,
                                                    color='w',
                                                    ha='center',
                                                    va='center')
                    else:
                        grid_label = self.axes.text(x,
                                                    y, ("(%d,%d)" % (i, j)),
                                                    fontsize=6,
                                                    color='b',
                                                    ha='center',
                                                    va='center')
                    self.grid_labels.append(grid_label)
                    self.canvas.draw()
        elif not self.lblsBtn.isChecked():
            for label in self.grid_labels:
                label.remove()
            self.canvas.draw()

    def redraw_arena_setup(self):
        global arena_setup_parameters

        if arena_setup_parameters == None:
            from setup_arena_picture import arena_setup_parameters

        self.lblsBtn.setChecked(False)

        self.arena_pic_name = arena_setup_parameters['arena_pic_name']
        try:
            self.arena_pic = mpimg.imread(self.arena_pic_name)
        except:
            pass
        self.arena_width = arena_setup_parameters['arena_width']
        self.arena_height = arena_setup_parameters['arena_height']
        self.width_div = arena_setup_parameters['width_div']
        self.height_div = arena_setup_parameters['height_div']
        self.num_width_divs = int(round(self.arena_width / self.width_div, 0))
        self.num_height_divs = int(
            round(self.arena_height / self.height_div, 0))

        self.fig.clear()

        self.axes = self.fig.add_subplot(111)
        try:
            self.axes.imshow(self.arena_pic,
                             origin="lower",
                             extent=(0, self.arena_width, 0,
                                     self.arena_height))
        except:
            npArray = np.array([[[0, 0, 0, 0]]], dtype="uint8")
            self.axes.imshow(npArray,
                             origin="lower",
                             extent=(0, self.arena_width, 0,
                                     self.arena_height))

        self.axes.set_xticks(
            np.arange(0, (self.arena_width + self.width_div), self.width_div))
        self.axes.set_yticks(
            np.arange(0, (self.arena_height + self.height_div),
                      self.height_div))
        self.axes.tick_params(axis="both", which="major", labelsize="6")

        self.axes.grid(which="major", axis="both", linestyle='-', color='r')
        self.axes.xaxis.tick_top()
        self.axes.invert_yaxis()
        self.axes.set_xlabel("Arena Width (cm)", fontsize=8)
        self.axes.set_ylabel("Arena Height (cm)", fontsize=8)
        self.axes.tick_params(axis="both", which="major", labelsize=6)

        self.canvas.draw()

    def mouse_movement(self, event):
        try:
            self.coords_label.setText("x=%.3f,   y=%.3f" %
                                      (event.xdata, event.ydata))
        except:
            if not self.coords_label.text == "":
                self.coords_label.setText("")
            else:
                pass

    def connect_to_camera(self):
        global camera, vidTrack_setup_parameters
        if self.radBtn1.isChecked():
            camera = True
            self.new_edit1.setDisabled(False)
            self.load1.setDisabled(False)
            self.save1.setDisabled(False)
            self.radBtn4.setDisabled(False)

            self.radBtn2.setChecked(False)
            #self.load_video_recording()

        elif not self.radBtn1.isChecked():
            camera = None
            vidTrack_setup_parameters = None
            self.new_edit1.setDisabled(True)
            self.load1.setDisabled(True)
            self.save1.setDisabled(True)
            self.radBtn4.setDisabled(True)
            self.lneEdt1.setDisabled(True)

    def new_edit_video_tracking_method(self):
        global camera, video_name, vidTrack_setup_parameters
        if vidTrack_setup_parameters == None:
            try:
                from Camera_Wizard_v2 import vidTrack_setup_parameters
            except:
                pass
        self.cwiz = Camera_Wizard_v2.CameraWizard(
            cam=camera,
            vid_name=video_name,
            vidTrack_sp=vidTrack_setup_parameters)
        self.cwiz.show()
        vidTrack_setup_parameters = None

    def load_video_tracking_method(self):
        try:
            global vidTrack_setup_parameters
            name = Qt.QFileDialog.getOpenFileName(self,
                                                  'Load Video Tracking Setup')
            with open(name, 'r') as f:
                vidTrack_setup_parameters = eval(f.read())
            print("loaded video tracking setup: %s" %
                  (vidTrack_setup_parameters))
        except:
            pass

    def save_video_tracking_method(self):
        global vidTrack_setup_parameters
        try:
            if vidTrack_setup_parameters == None:
                try:
                    from Camera_Wizard_v2 import vidTrack_setup_parameters
                except:
                    pass
            name = Qt.QFileDialog.getSaveFileName(self,
                                                  'Save Video Tracking Setup')
            with open(name, 'w') as text_file:
                text_file.write(str(vidTrack_setup_parameters))
            print("video tracking setup saved %s" %
                  (vidTrack_setup_parameters))
        except:
            pass

    def video_record_trial(self):
        global recording, record_name
        if self.radBtn4.isChecked():
            self.lneEdt1.setDisabled(False)
            recording = True
            record_name = self.lneEdt1.text()
        elif not self.radBtn4.isChecked():
            self.lneEdt1.setDisabled(True)
            recording = False
            record_name = None

    def load_video_recording(self):
        global video_name, vidTrack_setup_parameters
        if self.radBtn2.isChecked():
            self.btnLneEdt1.setDisabled(False)
            self.radBtn4.setChecked(False)
            self.radBtn4.setDisabled(False)

            self.radBtn1.setChecked(False)
            #self.connect_to_camera()

        elif not self.radBtn2.isChecked():
            video_name = None
            vidTrack_setup_parameters = None
            self.btnLneEdt1.clear()
            self.btnLneEdt1.setDisabled(True)
            self.vid_len_label.setDisabled(True)
            self.vid_len_spnBox.clear()
            self.vid_len_spnBox.setDisabled(True)
            self.new_edit2.setDisabled(True)
            self.load2.setDisabled(True)
            self.save2.setDisabled(True)

    def find_video_recording(self):
        try:
            global video_name
            video_name = Qt.QFileDialog.getOpenFileName(
                self, 'Find Video Recording')
            self.btnLneEdt1.setText(video_name)
            self.vid_len_label.setDisabled(False)
            self.vid_len_spnBox.setDisabled(False)
            self.new_edit2.setDisabled(False)
            self.load2.setDisabled(False)
            self.save2.setDisabled(False)
            print("video name: %s" % (video_name))
        except:
            pass

    def connect_to_arduino(self):
        global a, ard_setup_parameters
        if self.radBtn3.isChecked():
            try:
                from nanpy import (SerialManager, ArduinoApi)
                connection = SerialManager()
                a = ArduinoApi(connection=connection)
                self.new_edit3.setDisabled(False)
                self.load3.setDisabled(False)
                self.save3.setDisabled(False)
            except:
                print("Failed to connect to Arduino")
                self.radBtn3.setChecked(False)  # change back to False
        elif not self.radBtn3.isChecked():
            try:
                del a
            except:
                pass
            ard_setup_parameters = None
            self.new_edit3.setDisabled(True)
            self.load3.setDisabled(True)
            self.save3.setDisabled(True)

    def new_edit_ard_method(self):
        global ard_setup_parameters
        if ard_setup_parameters == None:
            try:
                from Arduino_Wizard_v2 import ard_setup_parameters
            except:
                pass
        self.awiz = Arduino_Wizard_v2.ArduinoWizard(
            arduino_sp=ard_setup_parameters)
        self.awiz.show()
        ard_setup_parameters = None

    def load_ard_method(self):
        global ard_setup_parameters
        try:
            name = Qt.QFileDialog.getOpenFileName(self, 'Load DAAC setup')
            with open(name, 'r') as f:
                ard_setup_parameters = eval(f.read())
            print("loaded DAAC setup: %s" % (ard_setup_parameters))
        except:
            pass

    def save_ard_method(self):
        global ard_setup_parameters
        try:
            if ard_setup_parameters == None:
                try:
                    from Arduino_Wizard_v2 import ard_setup_parameters
                except:
                    pass
            name = Qt.QFileDialog.getSaveFileName(self, 'Save DAAC setup')
            with open(name, 'w') as text_file:
                text_file.write(str(ard_setup_parameters))
            print("DAAC setup saved %s" % (ard_setup_parameters))
        except:
            pass

    def timer_start(self):
        global s, m, h

        self.timer.start(1000)

    def timer_time(self):
        global s, m, h

        if s < 59:
            s += 1
        else:
            if m < 59:
                s = 0
                m += 1
            elif m == 59 and h < 24:
                h += 1
                m = 0
                s = 0
            else:
                self.timer.stop()

        time = "{0}:{1}:{2}".format(h, m, s)

        self.lcd.setDigitCount(len(time))
        self.lcd.display(time)
        self.activateWindow()

    def timer_reset(self):
        global s, m, h

        self.timer.stop()

        s = 0
        m = 0
        h = 0

        time = "{0}:{1}:{2}".format(h, m, s)

        self.lcd.setDigitCount(len(time))
        self.lcd.display(time)

    def start_pressed(self):
        global global_results, ard_results, _isRunning2, vidTrack_setup_parameters, ard_setup_parameters

        date = strftime("%Y-%m-%d")
        start_time = strftime("%H:%M:%S")

        self.timer_reset()
        self.timer_start()

        if (self.radBtn1.isChecked() or self.radBtn2.isChecked()):
            trck = self.vidTracking.Run()

        while _isRunning2:
            Qt.qApp.processEvents()

        self.timer.stop()

        end_time = strftime("%H:%M:%S")

        self.actButton1.setChecked(False)
        self.actButton2.setChecked(False)
        self.actButton3.setChecked(False)
        self.actButton4.setChecked(False)
        self.actButton5.setChecked(False)
        self.actButton6.setChecked(False)
        self.actButton7.setChecked(False)
        self.actButton8.setChecked(False)

        vidTrack_results = {}
        trial_info = {}
        try:
            if (vidTrack_setup_parameters['video_tracking_algorithm']
                    == "Frame Differencing") or (
                        vidTrack_setup_parameters['video_tracking_algorithm']
                        == "MOG"):
                if self.radBtn1.isChecked() or (
                        self.radBtn2.isChecked() and
                    (int(self.vid_len_spnBox.value() == 0))):
                    vidTrack_results['run_time'] = trck[2]
                    trial_info['Trial_Duration'] = trck[2][-1]
                    vidTrack_results['vid_pts_time'] = trck[0]
                elif self.radBtn2.isChecked() and (int(
                        self.vid_len_spnBox.value()) != 0):
                    video_time_calibration_factor = trck[2][-1] / int(
                        self.vid_len_spnBox.value())
                    vidTrack_results['run_time'] = []
                    for time in trck[2]:
                        mod_time = round(time / video_time_calibration_factor,
                                         2)
                        vidTrack_results['run_time'].append(mod_time)
                    trial_info['Trial_Duration'] = vidTrack_results[
                        'run_time'][-1]
                    vidTrack_results['vid_pts_time'] = []
                    for time in trck[0]:
                        mod_time = round(time / video_time_calibration_factor,
                                         2)
                        vidTrack_results["vid_pts_time"].append(mod_time)
                vidTrack_results['position'] = trck[1]
            elif vidTrack_setup_parameters[
                    'video_tracking_algorithm'] == "None":
                if self.radBtn1.isChecked() or (
                        self.radBtn2.isChecked() and
                    (int(self.vid_len_spnBox.value()) == 0)):
                    vidTrack_results['run_time'] = trck
                    trial_info['Trial_Duration'] = trck[-1]
                elif self.radBtn2.isChecked() and (int(
                        self.vid_len_spnBox.value()) != 0):
                    video_time_calibration_factor = (
                        trck[-1] / int(self.vid_len_spnBox.value()))
                    vidTrack_results['vid_pts_time'] = []
                    for time in trck[0]:
                        mod_time = round(time / video_time_calibration_factor,
                                         2)
                        vidTrack_results['vid_pts_time'].append(mod_time)
                    trial_info['Trial_Duration'] = vidTrack_results[
                        'run_time'][-1]
        except:
            pass

        try:
            try:
                duration = str(trial_info['Trial_Duration'])
            except:
                duration = str(ard_results['ard_loop_time'][-1])
        except:
            duration = str(0)

        trial_info["Date"] = date
        trial_info["Start_Time"] = start_time
        trial_info["End_Time"] = end_time
        trial_info["Trial_Duration"] = duration

        self.table_rowCount += 1
        self.table.setRowCount(self.table_rowCount)

        global_results[str(self.table_rowCount)] = {}
        global_results[str(self.table_rowCount)]["trial_info"] = trial_info
        try:
            global_results[str(
                self.table_rowCount)]["results"] = vidTrack_results
            global_results[str(
                self.table_rowCount)]["results"].update(ard_results)
            try:
                ard_results = {}
                global_results[str(
                    self.table_rowCount)]["results"].update(ard_results)
            except:
                pass
        except:
            pass

        self.table.setItem(self.table_rowCount - 1, 0,
                           Qt.QTableWidgetItem(str(self.table_rowCount)))
        self.table.setItem(self.table_rowCount - 1, 1,
                           Qt.QTableWidgetItem(date))
        self.table.setItem(self.table_rowCount - 1, 2,
                           Qt.QTableWidgetItem(start_time))
        self.table.setItem(self.table_rowCount - 1, 3,
                           Qt.QTableWidgetItem(end_time))
        self.table.setItem(self.table_rowCount - 1, 4,
                           Qt.QTableWidgetItem(duration))
Esempio n. 21
0
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.setWindowTitle('OpenWave-2KE V%s'%__version__)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("openwave.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.setWindowIcon(icon)

        #Waveform area.
        self.figure = plt.figure()
        self.figure.set_facecolor('white')

        self.canvas = FigureCanvas(self.figure)
        self.canvas.setMinimumSize(800,  400)
        
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()

        #Zoom In/out and Capture Buttons
        self.zoomBtn = QtGui.QPushButton('Zoom')
        self.zoomBtn.setFixedSize(100, 30)
        self.zoomBtn.clicked.connect(self.toolbar.zoom)

        self.panBtn = QtGui.QPushButton('Pan')
        self.panBtn.setFixedSize(100, 30)
        self.panBtn.clicked.connect(self.toolbar.pan)

        self.homeBtn = QtGui.QPushButton('Home')
        self.homeBtn.setFixedSize(100, 30)
        self.homeBtn.clicked.connect(self.toolbar.home)

        self.captureBtn = QtGui.QPushButton('Capture')
        self.captureBtn.setFixedSize(100, 50)
        self.captureBtn.clicked.connect(self.captureAction)
        if(dso.connection_status==0):
            self.captureBtn.setEnabled(False)

        #Type: Raw Data/Image
        self.typeBtn = QtGui.QPushButton('Raw Data')
        self.typeBtn.setToolTip("Switch to get raw data or image from DSO.")
        self.typeBtn.setFixedSize(120, 50)
        self.typeFlag=True #Initial state -> Get raw data
        self.typeBtn.setCheckable(True)
        self.typeBtn.setChecked(True)
        self.typeBtn.clicked.connect(self.typeAction)
        
        #Channel Selection.
        self.ch1checkBox = QtGui.QCheckBox('CH1')
        self.ch1checkBox.setFixedSize(60, 30)
        self.ch2checkBox = QtGui.QCheckBox('CH2')
        self.ch2checkBox.setFixedSize(60, 30)
        if(dso.chnum==4):
            self.ch3checkBox = QtGui.QCheckBox('CH3')
            self.ch3checkBox.setFixedSize(60, 30)
            self.ch4checkBox = QtGui.QCheckBox('CH4')
            self.ch4checkBox.setFixedSize(60, 30)
        
        #Set channel selection layout.
        self.selectLayout = QtGui.QHBoxLayout()
        self.selectLayout.addWidget(self.ch1checkBox)
        self.selectLayout.addWidget(self.ch2checkBox)
        if(dso.chnum==4):
            self.selectLayout2 = QtGui.QHBoxLayout()
            self.selectLayout2.addWidget(self.ch3checkBox)
            self.selectLayout2.addWidget(self.ch4checkBox)

        self.typeLayout = QtGui.QHBoxLayout()
        self.typeLayout.addWidget(self.typeBtn)
        self.typeLayout.addLayout(self.selectLayout)
        if(dso.chnum==4):
            self.typeLayout.addLayout(self.selectLayout2)

        #Save/Load/Quit button
        self.saveBtn = QtGui.QPushButton('Save')
        self.saveBtn.setFixedSize(100, 50)
        self.saveMenu = QtGui.QMenu(self)
        self.csvAction = self.saveMenu.addAction("&As CSV File")
        self.pictAction = self.saveMenu.addAction("&As PNG File")
        self.saveBtn.setMenu(self.saveMenu)
        self.saveBtn.setToolTip("Save waveform to CSV file or PNG file.")
        self.connect(self.csvAction, QtCore.SIGNAL("triggered()"), self.saveCsvAction)
        self.connect(self.pictAction, QtCore.SIGNAL("triggered()"), self.savePngAction)

        self.loadBtn = QtGui.QPushButton('Load')
        self.loadBtn.setToolTip("Load CHx's raw data from file(*.csv, *.lsf).")
        self.loadBtn.setFixedSize(100, 50)
        self.loadBtn.clicked.connect(self.loadAction)

        self.quitBtn = QtGui.QPushButton('Quit')
        self.quitBtn.setFixedSize(100, 50)
        self.quitBtn.clicked.connect(self.quitAction)

        # set the layout
        self.waveLayout = QtGui.QHBoxLayout()
        self.waveLayout.addWidget(self.canvas)
        
        self.wave_box=QtGui.QVBoxLayout()
        self.wave_box.addLayout(self.waveLayout)
        
        self.wavectrlLayout = QtGui.QHBoxLayout()
        self.wavectrlLayout.addWidget(self.zoomBtn)
        self.wavectrlLayout.addWidget(self.panBtn)
        self.wavectrlLayout.addWidget(self.homeBtn)
        self.wavectrlLayout.addWidget(self.captureBtn)
        
        self.saveloadLayout = QtGui.QHBoxLayout()
        self.saveloadLayout.addWidget(self.saveBtn)
        self.saveloadLayout.addWidget(self.loadBtn)
        self.saveloadLayout.addWidget(self.quitBtn)
        
        self.ctrl_box=QtGui.QHBoxLayout()
        self.ctrl_box.addLayout(self.typeLayout)
        self.ctrl_box.addLayout(self.saveloadLayout)
        
        main_box=QtGui.QVBoxLayout()
        main_box.addLayout(self.wave_box)         #Waveform area.
        main_box.addLayout(self.wavectrlLayout)   #Zoom In/Out...
        main_box.addLayout(self.ctrl_box)         #Save/Load/Quit
        self.setLayout(main_box)
        
    def typeAction(self):
        if(self.typeFlag==True):
            self.typeFlag=False
            self.typeBtn.setText("Image")
            self.csvAction.setEnabled(False)
        else:
            self.typeFlag=True
            self.typeBtn.setText("Raw Data")
            self.csvAction.setEnabled(True)
        self.typeBtn.setChecked(self.typeFlag)
        self.ch1checkBox.setEnabled(self.typeFlag)
        self.ch2checkBox.setEnabled(self.typeFlag)
        if(dso.chnum==4):
            self.ch3checkBox.setEnabled(self.typeFlag)
            self.ch4checkBox.setEnabled(self.typeFlag)

    def saveCsvAction(self):
        if(self.typeFlag==True): #Save raw data to csv file.
            file_name=QtGui.QFileDialog.getSaveFileName(self, "Save as", '', "Fast CSV File(*.CSV)")[0]
            num=len(dso.ch_list)
            #print num
            for ch in xrange(num):
                if(dso.info[ch]==[]):
                    print('Failed to save data, raw data information is required!')
                    return
            f = open(file_name, 'wb')
            item=len(dso.info[0])
            #Write file header.
            f.write('%s,\r\n' % dso.info[0][0])
            for x in xrange(1,  24):
                str=''
                for ch in xrange(num):
                    str+=('%s,' % dso.info[ch][x])
                str+='\r\n'
                f.write(str)
            #Write Fast CSV mode only.
            str=''
            for ch in xrange(num):
                str+='Mode,Fast,'
            str+='\r\n'
            f.write(str)

            str=''
            if(num==1):
                str+=('%s,' % dso.info[0][25])
            else:
                for ch in xrange(num):
                    str+=('%s,,' % dso.info[ch][25])
            str+='\r\n'
            f.write(str)
            #Write raw data.
            item=len(dso.iWave[0])
            #print item
            tenth=int(item/10)
            n_tenth=tenth-1
            percent=10
            for x in xrange(item):
                str=''
                if(num==1):
                    str+=('%s,' % dso.iWave[0][x])
                else:
                    for ch in xrange(num):
                        str+=('%s, ,' % dso.iWave[ch][x])
                str+='\r\n'
                f.write(str)
                if(x==n_tenth):
                    n_tenth+=tenth
                    print('%3d %% Saved\r'%percent),
                    percent+=10
            f.close()

    def savePngAction(self):
        #Save figure to png file.
        file_name=QtGui.QFileDialog.getSaveFileName(self, "Save as", '', "PNG File(*.png)")[0]
        if(file_name==''):
            return
        if(self.typeFlag==True): #Save raw data waveform as png file.
            main.figure.savefig(file_name)
        else:  #Save figure to png file.
            if(dso.osname=='pi'): #For raspberry pi only.
                img=dso.im.transpose(Image.FLIP_TOP_BOTTOM)
                img.save(file_name)
            else:
                dso.im.save(file_name)
        print('Saved image to %s.'%file_name)

    def loadAction(self):
        dso.ch_list=[]
        full_path_name=QtGui.QFileDialog.getOpenFileName(self,self.tr("Open File"),".","CSV/LSF files (*.csv *.lsf);;All files (*.*)")  
        sFileName=unicode(full_path_name).split(',')[0][3:-1] #For PySide
        print sFileName
        if(len(sFileName)<=0):
            return
        if os.path.exists(sFileName):
            print 'Reading file...'
            count=dso.readRawDataFile(sFileName)
            #Draw waveform.
            if(count>0):
                total_chnum=len(dso.ch_list)
                if(total_chnum==0):
                    return
                self.drawWaveform(0)
        else:
            print('File not found!')

    def quitAction(self):
        if(dso.connection_status==1):
            dso.closeIO()
        self.close()
    
    def captureAction(self):
        dso.iWave=[[], [], [], []]
        dso.ch_list=[]
        if(self.typeFlag==True): #Get raw data.
            draw_flag=False
            #Turn on the selected channels.
            if((self.ch1checkBox.isChecked()==True) and (dso.isChannelOn(1)==False)):
                dso.write(":CHAN1:DISP ON\n")           #Set CH1 on.
            if((self.ch2checkBox.isChecked()==True) and (dso.isChannelOn(2)==False)):
                dso.write(":CHAN2:DISP ON\n")           #Set CH2 on.
            if(dso.chnum==4):
                if((self.ch3checkBox.isChecked()==True) and (dso.isChannelOn(3)==False)):
                    dso.write(":CHAN3:DISP ON\n")       #Set CH3 on.
                if((self.ch4checkBox.isChecked()==True) and (dso.isChannelOn(4)==False)):
                    dso.write(":CHAN4:DISP ON\n")       #Set CH4 on.
            #Get all the selected channel's raw datas.
            if(self.ch1checkBox.isChecked()==True):
                dso.getRawData(True, 1)              #Read CH1's raw data from DSO (including header).
            if(self.ch2checkBox.isChecked()==True):
                dso.getRawData(True, 2)              #Read CH2's raw data from DSO (including header).
            if(dso.chnum==4):
                if(self.ch3checkBox.isChecked()==True):
                    dso.getRawData(True, 3)          #Read CH3's raw data from DSO (including header).
                if(self.ch4checkBox.isChecked()==True):
                    dso.getRawData(True, 4)          #Read CH4's raw data from DSO (including header).
            #Draw waveform.
            total_chnum=len(dso.ch_list)
            if(total_chnum==0):
                return
            if(self.drawWaveform(1)==-1):
                time.sleep(5)
                self.drawWaveform(0)
        else: #Get image.
            img_type=1   #1 for RLE format, 0 for PNG format.
            if(img_type):
                dso.write(':DISP:OUTP?\n')                 #Send command to get image from DSO.
            else:
                dso.write(':DISP:PNGOutput?\n')            #Send command to get image from DSO.
            dso.getBlockData()
            dso.ImageDecode(img_type)
            self.showImage()
            plt.tight_layout(True)
            self.canvas.draw()
            print('Image is ready!')

    def showImage(self):
        #Turn the ticks off and show image.
        plt.clf()
        ax = plt.gca()
        ax.xaxis.set_visible(False)
        ax.yaxis.set_visible(False)
        plt.imshow(dso.im)

    def drawWaveform(self, mode):
        total_chnum=len(dso.ch_list)
        num=dso.points_num
        ch_colortable=['#C0B020',  '#0060FF',  '#FF0080',  '#00FF60']
        ch=int(dso.ch_list[0][2])-1 #Get the channel of first waveform.
        plt.cla()
        plt.clf()
        #Due to the memory limitation of matplotlib, we must reduce the sample points.
        if(num==10000000):
            if(total_chnum>2):
                down_sample_factor=4
            elif(total_chnum==2):
                down_sample_factor=4
            else:
                down_sample_factor=1
            num=num/down_sample_factor
        else:
            down_sample_factor=1
        dt=dso.dt[0] #Get dt from the first opened channel.
        t_start=dso.hpos[0]-num*dt/2
        t_end  =dso.hpos[0]+num*dt/2
        t = np.arange(t_start, t_end, dt)
        #print t_start, t_end, dt, len(t)
        if((len(t)-num)==1): #Avoid floating point rounding error.
            t=t[:-1]
        wave_type='-' #Set waveform type to vector.
        #Draw waveforms.
        ax=[[], [], [], []]
        p=[]
        for ch in xrange(total_chnum):
            if(ch==0):
                ax[ch]=host_subplot(111, axes_class=AA.Axes)
                ax[ch].set_xlabel("Time (sec)")
            else:
                ax[ch]=ax[0].twinx()
            ax[ch].set_ylabel("%s Units: %s" %(dso.ch_list[ch],  dso.vunit[ch]))
            ch_color=ch_colortable[int(dso.ch_list[ch][2])-1]
            if(ch>1):
                new_fixed_axis = ax[ch].get_grid_helper().new_fixed_axis
                ax[ch].axis["right"] = new_fixed_axis(loc="right", axes=ax[ch], offset=(60*(ch-1), 0))
            ax[ch].set_xlim(t_start, t_end)
            ax[ch].set_ylim(-4*dso.vdiv[ch]-dso.vpos[ch], 4*dso.vdiv[ch]-dso.vpos[ch]) #Setup vertical display range.
            fwave=dso.convertWaveform(ch, down_sample_factor)
            #print('Length=%d'%(len(fwave)))
            if(ch==0):
                try:
                    p=ax[ch].plot(t, fwave, color=ch_color, ls=wave_type, label = dso.ch_list[ch])
                except:
                    if(mode==1):
                        #print sys.exc_info()[0]
                        time.sleep(5)
                        print 'Trying to plot again!',
                    return -1
            else:
                try:
                    p+=ax[ch].plot(t, fwave, color=ch_color, ls=wave_type, label = dso.ch_list[ch])
                except:
                    if(mode==1):
                        #print sys.exc_info()[0]
                        time.sleep(5)
                        print 'Trying to plot again!',
                    return -1
        if(total_chnum>1):
            labs = [l.get_label() for l in p]
            plt.legend(p, labs,   loc='upper right')
        plt.tight_layout() 
        self.canvas.draw()
        del ax, t, p
        return 0
Esempio n. 22
-1
class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.shot = None  #opened shot
        self.folder_name = ''  #folder to search for shots
        self.current_num = 0  #current diagram
        self.currently_selected = None  #selected point plot
        self.selected_points = OrderedSet()  #point to be added
        self.current_point = None  #plot of current point
        self.overall_selected = None  #points added to selected list
        #super(Window, self).__init__(parent)
        # a figure instance to plot on
        self.figure = plt.figure()

        # this is the Canvas Widget that displays the `figure`
        # it takes the `figure` instance as a parameter to __init__
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setParent(parent)
        self.canvas.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.canvas.setFocus()
        self.canvas.setMinimumSize(500, 0)
        self.canvas.mpl_connect('pick_event', self.on_pick)
        self.canvas.mpl_connect('motion_notify_event', self.on_move)
        self.canvas.hide()

        # this is the Navigation widget
        # it takes the Canvas widget and a pa rent
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()

        # Show files widget
        self.files = QtGui.QListWidget()
        self.files.itemDoubleClicked.connect(self.select_file)
        self.files.setMaximumSize(200, 100000)
        self.files.setMinimumSize(100, 0)
        self.files.hide()

        # Show selected points
        self.points = ThumbListWidget(self)
        #self.points.itemDoubleClicked.connect(self.unselect_point)
        self.points.itemClicked.connect(self.points_clicked)
        self.points.itemDoubleClicked.connect(self.points_doubleclicked)
        self.points.setMaximumSize(200, 100000)
        self.points.setMinimumSize(100, 0)
        self.points.hide()

        #Show diagram widget
        self.diagrams = QtGui.QListWidget()
        self.diagrams.itemClicked.connect(self.select_item)
        self.diagrams.setMaximumSize(250, 100000)
        self.diagrams.setMinimumSize(190, 0)
        self.diagrams.hide()

        #save result button
        self.save_button = QtGui.QPushButton('Add time point', self)
        self.save_button.clicked.connect(self.add_time)
        self.save_button.hide()

        #filter menu
        self.filters_button = QtGui.QPushButton('Manage filters', self)
        self.filters_button.clicked.connect(self.show_filters)
        self.filters_button.hide()
        self.filters = OrderedDict
        self.read_filters()


        #diagramms
        self.bottom_layout = QtGui.QGridLayout()
        self.diagrams_figure = plt.figure()
        self.diagrams_canvas = FigureCanvas(self.diagrams_figure)
        self.diagrams_canvas.setParent(parent)
        self.diagrams_canvas.setMinimumSize(250, 250)
        self.diagrams_canvas.setMaximumSize(500, 500)
        self.diagrams_toolbar = NavigationToolbar(self.diagrams_canvas, self)
        self.diagrams_toolbar.setMaximumWidth(250)
        self.diagrams_ax = self.diagrams_figure.add_subplot(111)
        self.diagrams_ax.set_ylim(ymin=0)
        self.diagrams_ax.set_xlim(xmin=0)
        self.diagrams_canvas.draw()

        self.enlargre_button = QtGui.QPushButton('Enlarge diagram', self)
        self.enlargre_button.clicked.connect(self.enlarge_diagram)

        self.bottom_layout.addWidget(self.diagrams_toolbar, 0, 2)
        self.bottom_layout.addWidget(self.diagrams_canvas, 1, 2, QtCore.Qt.AlignRight)
        self.bottom_layout.addWidget(self.enlargre_button, 0, 1)

        # set the layout
        self.layout = QtGui.QGridLayout()
        self.layout.addWidget(self.filters_button, 0, 1)
        self.layout.addWidget(self.toolbar, 0, 2)
        self.layout.addWidget(self.canvas, 1, 2)
        self.layout.addWidget(self.diagrams, 1, 1)
        self.layout.addWidget(self.files, 1, 0)
        self.layout.addWidget(self.points, 1, 3)
        self.layout.addWidget(self.save_button, 0, 3)
        self.layout.addLayout(self.bottom_layout, 2, 2)
        self.setLayout(self.layout)


    def enlarge_diagram(self): #меняет местами диаграммы
        pass

    def points_doubleclicked(self):
        if self.points._mouse_button == 1:
            num = self.points.currentRow()
            point = list(self.selected_points)[num]
            diag = self.shot.get_diagram(self.current_num)

            xs = np.array(diag.x)
            ys = np.array(diag.y)

            idx = np.absolute(xs - point[0]).argmin()

            npoint = (xs[idx], ys[idx], self.current_num, self.shot.file[0])
            for point in list(self.selected_points):
                if point[2] == self.current_point[2] and point[3] == self.current_point[3]:
                    self.selected_points.remove(point)
            self.selected_points.add(npoint)
            self.refresh_points()


    def greenvald(self): #диаграмма хьюгилла #TODO - move to another file
        temp = {}
        names = self.shot.get_diagram_names()
        for x in self.selected_points:
            if x[3] not in temp:
                temp[x[3]] = {}
            tag = ""
            for name, value in self.filters.items():
                if re.compile(value).match(names[x[2]]):
                    tag = name
                    break
            if tag:
                temp[x[3]][tag] = x[0], x[1], x[3] #X, Y, Shot
        points = []
        for x in temp:
            if "Ip" in temp[x] and "neL" in temp[x] and "ITF" in temp[x]:
                a = 24
                R = 36
                k = 1.65

                #print("wololo")

                Ip = temp[x]["Ip"][1]/1000
                Itf = temp[x]["ITF"][1]/1000
                neL = temp[x]["neL"][1]
                Bt = Itf*0.001*100*16*0.2/R
                print(Ip)
                print(Itf)
                print(neL)
                print(Bt)
                qcyl = 5*a*a*0.01*0.01*Bt*100*1000/(R*Ip)
                print(qcyl)
                #print(temp[x])
                #print(Itf)
                #print(neL)

                rqcyl = 1/qcyl
                print(rqcyl)
                print("wololo")
                ne = neL*0.03/k
                BtrR = Bt*100/R
                print(ne)
                print(BtrR)
                neRrBt = ne/BtrR
                print(neRrBt)
                points.append(((neRrBt, rqcyl), temp[x]["Ip"][2]))
        return points

    def update_diagramms(self):
        points = self.greenvald()
        x = [tmp[0][0] for tmp in points]
        y = [tmp[0][1] for tmp in points]
        #self.diagrams_figure.clf()
        self.diagrams_ax.set_xlabel('neR/BT, 10^20/(T*m^2)')
        self.diagrams_ax.set_ylabel('1/qcyl')
        self.diagrams_ax.set_title("Greenwald")
        self.diagrams_ax.plot(x, y, 'bo', ms=5, alpha=0.8, markersize=5)
        self.diagrams_canvas.draw()
        print(points)

    def points_clicked(self):#один клик, правая кнопка - удалить точку, левая - подсветить
        if self.points._mouse_button == 1:
            num = self.points.currentRow()
            point = list(self.selected_points)[num]
            diag = self.shot.get_diagram(self.current_num)

            xs = np.array(diag.x)
            ys = np.array(diag.y)

            idx = np.absolute(xs - point[0]).argmin()

            self.highlight.set_xdata([xs[idx]])
            self.highlight.set_ydata([ys[idx]])
        else:
            self.unselect_point(None)


    def read_filters(self):
        with open("filters.conf") as inp:
            lines = inp.readlines()
        n = int(lines[0])
        mass = []
        for i in range(n):
            mass.append((lines[2*i+1].strip(), lines[2*(i+1)].strip()))
        self.filters = OrderedDict(mass)


    def show_filters(self):
        self.f = FiltersPopup(self.filters)
        self.f.setGeometry(100, 100, 400, 200)
        self.f.exec_()
        self.filters = self.f.getValues()
        self.show_diagrams()



    def add_time(self):
        time, ok = QtGui.QInputDialog.getText(self, 'Time point', 'enter time point in seconds(e.g. 0.123):')
        if ok:
            if time.isdigit:
                diag = self.shot.get_diagram(self.current_num)

                xs = np.array(diag.x)
                ys = np.array(diag.y)

                idx = np.absolute(xs - float(time)/1000).argmin()

                npoint = (xs[idx], ys[idx], self.current_num, self.shot.file[0])
                for point in list(self.selected_points):
                    if point[2] == self.current_point[2] and point[3] == self.current_point[3]:
                        print("wololololololo")
                        self.selected_points.remove(point)
                self.selected_points.add(npoint)
                self.refresh_points()

    def select_item(self, current):
        self.figure.clf()
        name = self.diagrams.currentItem().text()
        names = self.shot.get_diagram_names()
        if name in names:
            self.current_num = names.index(name)
        else:
            self.current_num = names.index("".join(name.split(':')[1:])[1:])
        self.plot(self.shot.get_diagram(self.current_num))

    def unselect_point(self, current):
        num = self.points.currentRow()
        self.selected_points.remove(list(self.selected_points)[num])
        self.refresh_points()

    def select_file(self, current):
        self.figure.clf()
        self.show_shot(Shot(join(self.folder_name, self.files.currentItem().text())))
        self.canvas.setFocus()

    def on_pick(self, event):
        print(self.selected_points)
        if self.current_point in self.selected_points:
            self.selected_points.remove(self.current_point)
        else:
            for point in list(self.selected_points):
                if point[2] == self.current_point[2] and point[3] == self.current_point[3]:
                    print("wololo")
                    self.selected_points.remove(point)
            self.selected_points.add(self.current_point)
        self.refresh_points()

    def refresh_points(self):
        self.update_diagramms()
        self.points.clear()
        self.points.addItems([str(x[0]) for x in self.selected_points])
        self.overall_selected.set_xdata(self.active_points[0])
        self.overall_selected.set_ydata(self.active_points[1])


    def on_move(self, event):
        # get the x and y pixel coords
        x, y = event.x, event.y

        if event.inaxes:
            ax = event.inaxes  # the axes instance
            diag = self.shot.get_diagram(self.current_num)

            xs = np.array(diag.x)
            ys = np.array(diag.y)

            idx = np.absolute(xs - event.xdata).argmin()
            self.currently_selected.set_xdata([diag.x[idx]])
            self.currently_selected.set_ydata([diag.y[idx]])
            self.current_point = (diag.x[idx], diag.y[idx], self.current_num, self.shot.file[0])
            self.canvas.draw()

    @property
    def active_points(self):
        x = [x[0] for x in self.selected_points if x[2] == self.current_num and x[3] == self.shot.file[0]]
        y = [x[1] for x in self.selected_points if x[2] == self.current_num and x[3] == self.shot.file[0]]
        return x, y

    def plot(self, diagram=None):
        # create an axis
        ax = self.figure.add_subplot(111)

        # discards the old graph


        #pridicted max value
        ind = np.argmax(np.array(diagram.y))
        # plot data
        if diagram:
            self.highlight, = ax.plot([diagram.x[ind]], [diagram.y[ind]], 'bo', ms=12, alpha=0.8, markersize=8)
            ax.plot(diagram.x, diagram.y, 'b-')
            self.currently_selected, = ax.plot([diagram.x[ind]], [diagram.y[ind]], 'yo', ms=12, alpha=0.6, markersize=6,
                                               picker=15)
            self.overall_selected, = ax.plot(self.active_points[0], self.active_points[1], 'ro', ms=12, alpha=0.9,
                                             markersize=4)
            ax.set_xlabel('t, sec')
            ax.set_ylabel(diagram.unit)
            ax.set_title(diagram.comment)
            self.figure.tight_layout()
        # refresh canvas
        self.canvas.draw()

    def show_diagrams(self):
        names = self.shot.get_diagram_names()
        self.diagrams.clear()
        res = set()
        for x in names:
            for name, reg in self.filters.items():
                try:
                    if re.compile(reg).match(x):
                        res.add(str(name) + ': ' + str(x))
                        break
                except:
                    pass
        #self.diagrams.addItems(list(names))
        self.diagrams.addItems(list(res))
        self.diagrams.show()

    def show_shot(self, shot):
        self.shot = shot
        self.show_diagrams()
        self.toolbar.show()
        self.canvas.show()
        self.files.show()
        self.points.show()
        self.save_button.show()
        self.filters_button.show()
        self.current_num = 0
        self.plot(self.shot.get_diagram(0))
        self.canvas.setFocus()