예제 #1
0
class GraphPage(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(GraphPage, self).__init__()
        uic.loadUi("graphPage.ui", self)
        self.fig_dict = {}
        self.listWidget.itemClicked.connect(self.changeFig)
        fig = Figure()
        self.addplot(fig)

    def addplot(self, fig):
        self.canvas = FigureCanvas(fig)
        self.verticalLayout.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.widget,
                                         coordinates=True)
        self.verticalLayout.addWidget(self.toolbar)

    def rmPlot(self):
        self.verticalLayout.removeWidget(self.canvas)
        self.canvas.close()
        self.verticalLayout.removeWidget(self.toolbar)
        self.toolbar.close()

    def addfig(self, name, fig):
        self.fig_dict[name] = fig
        self.listWidget.addItem(name)

    def changeFig(self, item):
        text = item.text()
        self.rmPlot()
        self.addplot(self.fig_dict[text])
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        self.fig_dict = {}

        self.mplfigs.itemClicked.connect(self.change_fig)

    def change_fig(self, item):
        text = item.text()
        self.rm_mpl()
        self.add_mpl(self.fig_dict[text])

    def add_mpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()

        self.toolbar = NavigationToolbar(self.canvas, self, coordinates=True)
        self.addToolBar(self.toolbar)

    def rm_mpl(self, ):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def add_fig(self, name, fig):
        self.fig_dict[name] = fig
        self.mplfigs.addItem(name)
예제 #3
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        fig = Figure()
        self.addmpl(fig)
        self.rdBtn.clicked.connect(self.read)
        self.df = {}
    
    def read(self):
        try:
            self.df[str(self.inp.text()).split('.')[0]]=pd.read_csv(str(self.inp.text()))
        except IOError:
            print 'No such file'
    def clear(self): 
        self.mplfigs.clear()
        self.rmmpl()

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, 
                self.mplwindow, coordinates=True)
        self.mplvl.addWidget(self.toolbar)
    
    def rmmpl(self,):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
예제 #4
0
class Mpl(QtGui.QWidget, Ui_Form):
    def __init__(self, fig_dict, name_list):
        super(Mpl, self).__init__()
        self.setupUi(self)
        self.fig_dict = fig_dict
        self.name_list = name_list
        self.index = 0

        self.btnBack.clicked.connect(self.back)
        self.btnForward.clicked.connect(self.forward)

        self.comboBoxSelect.addItems(self.name_list)
        self.comboBoxSelect.setCurrentIndex(self.index)
        self.comboBoxSelect.activated.connect(self.select)

        if self.fig_dict and self.name_list:
            fig = self.fig_dict[self.name_list[self.index]]
        else:
            fig = Figure()
        self.addmpl(fig)

    def changefig(self, ):
        self.comboBoxSelect.setCurrentIndex(self.index)
        fig = self.fig_dict[self.name_list[self.index]]
        self.rmmpl()
        self.addmpl(fig)

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        # self.canvas.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
        self.ltMPL.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.wgtToolbox,
                                         coordinates=True)
        self.ltToolbox.addWidget(self.toolbar)

    def rmmpl(self, ):
        self.ltMPL.removeWidget(self.canvas)
        self.canvas.close()
        self.ltToolbox.removeWidget(self.toolbar)
        self.toolbar.close()

    def back(self):
        self.index = self.index - 1 if self.index != 0 else len(
            self.name_list) - 1
        self.changefig()

    def forward(self):
        self.index = self.index + 1 if self.index != len(
            self.name_list) - 1 else 0
        self.changefig()

    def select(self):
        self.index = self.comboBoxSelect.currentIndex()
        self.changefig()
class Main(QMainWindow, Ui_MainWindow) :
    def __init__(self, ) :
        super(Main, self).__init__()
        self.setupUi(self)
        
        self.thisDir = os.path.dirname(os.path.abspath(__file__))
        self.btOpenImage.clicked.connect(self.openImage)

        fig = Figure()
        
        self.canvas = FigureCanvas(fig)
        self.canvasGraph.addWidget(self.canvas)
        self.canvas.draw()
                      
        return

    def openImage(self) :
        texto = 'Escolha uma imagem'
        path = QtGui.QFileDialog.getOpenFileNameAndFilter(self,
                                                          texto,
                                                          self.thisDir,
                                                          "Images (*.png *.jpg)")
                                                    
        datafile = cbook.get_sample_data(str(path[0]))
        img = imread(datafile)

        self.updateCanvas(self.initializeCanvas(img))

        return

    def initializeCanvas(self, img) :

        fig = Figure()
        fig.clear()
        Graph = fig.add_subplot(111)
        Graph.imshow(img, zorder=0, extent=[0.0, 1.0, 0.0, 1.0])
       
        return fig
        
    def updateCanvas(self, fig) :
        self.canvasGraph.removeWidget(self.canvas)
        self.canvas.close()
        
        self.canvas = FigureCanvas(fig)
        self.canvasGraph.addWidget(self.canvas)
        self.canvas.draw()

        def onclick(event):
            x, y = event.xdata, event.ydata
            print x, y
         
        self.canvas.mpl_connect('button_press_event', onclick)
        
        return  
예제 #6
0
class Mpl(QtGui.QWidget, Ui_Form):
    def __init__(self, fig_dict, name_list):
        super(Mpl, self).__init__()
        self.setupUi(self)
        self.fig_dict = fig_dict
        self.name_list = name_list
        self.index = 0

        self.btnBack.clicked.connect(self.back)
        self.btnForward.clicked.connect(self.forward)

        self.comboBoxSelect.addItems(self.name_list)
        self.comboBoxSelect.setCurrentIndex(self.index)
        self.comboBoxSelect.activated.connect(self.select)
        
        if self.fig_dict and self.name_list:
            fig = self.fig_dict[self.name_list[self.index]]
        else:
            fig = Figure()
        self.addmpl(fig)

    def changefig(self,):
        self.comboBoxSelect.setCurrentIndex(self.index)
        fig = self.fig_dict[self.name_list[self.index]]
        self.rmmpl()
        self.addmpl(fig)

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        # self.canvas.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
        self.ltMPL.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, 
                self.wgtToolbox, coordinates=True)
        self.ltToolbox.addWidget(self.toolbar)

    def rmmpl(self,):
        self.ltMPL.removeWidget(self.canvas)
        self.canvas.close()
        self.ltToolbox.removeWidget(self.toolbar)
        self.toolbar.close()

    def back(self):
        self.index = self.index-1 if self.index!=0 else len(self.name_list)-1
        self.changefig()

    def forward(self):
        self.index = self.index+1 if self.index!=len(self.name_list)-1 else 0
        self.changefig()

    def select(self):
        self.index = self.comboBoxSelect.currentIndex()
        self.changefig()
예제 #7
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)

        self.thisDir = os.path.dirname(os.path.abspath(__file__))
        self.btOpenImage.clicked.connect(self.openImage)

        fig = Figure()

        self.canvas = FigureCanvas(fig)
        self.canvasGraph.addWidget(self.canvas)
        self.canvas.draw()

        return

    def openImage(self):
        texto = 'Escolha uma imagem'
        path = QtGui.QFileDialog.getOpenFileNameAndFilter(
            self, texto, self.thisDir, "Images (*.png *.jpg)")

        datafile = cbook.get_sample_data(str(path[0]))
        img = imread(datafile)

        self.updateCanvas(self.initializeCanvas(img))

        return

    def initializeCanvas(self, img):

        fig = Figure()
        fig.clear()
        Graph = fig.add_subplot(111)
        Graph.imshow(img, zorder=0, extent=[0.0, 1.0, 0.0, 1.0])

        return fig

    def updateCanvas(self, fig):
        self.canvasGraph.removeWidget(self.canvas)
        self.canvas.close()

        self.canvas = FigureCanvas(fig)
        self.canvasGraph.addWidget(self.canvas)
        self.canvas.draw()

        def onclick(event):
            x, y = event.xdata, event.ydata
            print x, y

        self.canvas.mpl_connect('button_press_event', onclick)

        return
예제 #8
0
class Main(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(Main,self).__init__()
        self.setupUi(self)
        self.cosPlot.clicked.connect(self.cosPlotFunc)
        self.sinPlot.clicked.connect(self.sinPlotFunc)
        self.loadData.clicked.connect(self.loadDataFunc)
        self.shotData = pd.DataFrame()
        
        fig = Figure()
        self.addmpl(fig)
    def addmpl(self,fig):
        self.canvas = FigureCanvas(fig)
        self.livePlotLay.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,self,coordinates=True)
        self.livePlotLay.addWidget(self.toolbar)
    def rmmpl(self):
        self.livePlotLay.removeWidget(self.canvas)
        self.canvas.close()
        self.livePlotLay.removeWidget(self.toolbar)
        self.toolbar.close()
    def cosPlotFunc(self):
        self.rmmpl()
        fig = Figure()
        axes = fig.add_subplot(111)
        x = np.linspace(0,2*np.pi,1000)
        axes.plot(x,np.cos(x))
        self.addmpl(fig)
    def sinPlotFunc(self):
        self.rmmpl()
        fig = Figure()
        axes = fig.add_subplot(111)
        x = np.linspace(0,2*np.pi,1000)
        axes.plot(x,np.sin(x))
        self.addmpl(fig)
    def loadDataFunc(self):
        fileDialog = QtGui.QFileDialog(self)
        fileDialog.setFilters('*.h5')
        fileDialog.setFileMode(QtGui.QFileDialog.ExistingFiles)
        fileDialog.exec_()
        for fileName in fileDialog.selectedFiles():
            print fileName
            self.shotData = self.shotData.append(shotProcessor(str(fileName), 'absGaussFit'), ignore_index=True)
            print self.shotData
예제 #9
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        self.fig_dict = {}

        self.mplfigs.itemClicked.connect(self.changefig)

        fig = Figure()
        self.addmpl(fig)

    def changefig(
        self, item
    ):  #signal for changing the figure, itemclicked is connected to this
        text = item.text()  #to get info and text of the item
        self.rmmpl()  #remove the old fig
        self.addmpl(self.fig_dict[text]
                    )  #add new fig based on the list item that was clicked

    def addfig(self, name, fig):
        self.fig_dict[name] = fig
        self.mplfigs.addItem(name)  #add fig to fig dictionary?

    def addmpl(self, fig):  #add plot
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)  #create the figure canvas widget
        self.canvas.draw()  #draw canvas on app window
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.mplwindow,
                                         coordinates=True)  #set toolbar
        self.mplvl.addWidget(self.toolbar)  #add toolbar to layout
# This is the alternate toolbar placement. Susbstitute the three lines above
# for these lines to see the different look.
#        self.toolbar = NavigationToolbar(self.canvas,
#                self, coordinates=True)
#        self.addToolBar(self.toolbar)

    def rmmpl(self, ):  #changing plots- removes plot
        self.mplvl.removeWidget(
            self.canvas)  #remove canvas and toolbar from vertical layout
        self.canvas.close()  #removes their display from the application window
        self.mplvl.removeWidget(self.toolbar)  #remove the toolbar
        self.toolbar.close()  #remove toolbar from window
예제 #10
0
파일: custommpl.py 프로젝트: wjh1001/python
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        self.fig_dict = {}

        self.mplfigs.itemClicked.connect(self.changefig)

        fig = Figure()
        self.addmpl(fig)

    def changefig(self, item):
        text = item.text()
        self.rmmpl()
        self.addmpl(self.fig_dict[text])

    def addfig(self, name, fig):
        self.fig_dict[name] = fig
        self.mplfigs.addItem(name)

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.mplwindow,
                                         coordinates=True)
        self.mplvl.addWidget(self.toolbar)


# This is the alternate toolbar placement. Susbstitute the three lines above
# for these lines to see the different look.
#        self.toolbar = NavigationToolbar(self.canvas,
#                self, coordinates=True)
#        self.addToolBar(self.toolbar)

    def rmmpl(self, ):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
예제 #11
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        self.fig_dict = {}

        self.mplfigs.itemClicked.connect(self.changefig)

        fig = Figure()
        self.addmpl(fig)

    def changefig(self, item):
        text = item.text()
        self.rmmpl()
        self.addmpl(self.fig_dict[text])

    def addfig(self, name, fig):
        self.fig_dict[name] = fig
        self.mplfigs.addItem(name)

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, 
                self.mplwindow, coordinates=True)
        self.mplvl.addWidget(self.toolbar)
# This is the alternate toolbar placement. Susbstitute the three lines above
# for these lines to see the different look.
#        self.toolbar = NavigationToolbar(self.canvas,
#                self, coordinates=True)
#        self.addToolBar(self.toolbar)

    def rmmpl(self,):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
예제 #12
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        ######################### Get database info #########################
        self.engine = '' # engine variable stores database information
        self.wedit = db.DBInfo(self)
        self.wedit.exec_()
        self.plot2D = True
        self.Echeck = True
        self.Eplot = True
        self.Ccheck = True
        self.Cplot = True
        self.plotall = False
        
        super(Main, self).__init__()
        self.setupUi(self)
        
        # TODO: make queries for max year and min year
        self.year = get_minyear(self.engine)
        self.slyear.setMaximum(get_maxyear(self.engine))
        self.slyear.setMinimum(self.year)

        ######################### Initialize text for selected year #########################
        self.txtyear.setText(str(self.slyear.value()))

        ######################### Program events #########################
        self.slyear.valueChanged.connect(self.updTxt)
        self.slyear.sliderReleased.connect(self.updFig)
        self.txtyear.returnPressed.connect(self.updSl)
        self.actionDatabase_info.triggered.connect(self.edit)
        self.btnglobe.clicked.connect(self.globebutton)
        self.chkconflicts.stateChanged.connect(self.conflictCheck)
        self.chkeclipses.stateChanged.connect(self.eclipseCheck)
        self.actionGenerate_Globe.triggered.connect(self.globemovie)
        self.actionPlot_all.triggered.connect(self.plot_all_datapoints)

        fig = plotmap()
        self.addmpl(fig)

        self.chkconflicts.toggle()
        self.chkeclipses.toggle()

    ######################### Plot all data #########################
    def plot_all_datapoints(self):
        self.plotall = True
        self.updFig()

    ######################### Map button #########################
    def globebutton(self):
        if self.plot2D:
            self.plot2D = False
            self.btnglobe.setText('Map view')
            self.slyear.setMaximum(0)
            self.slyear.setMaximum(360)
            self.updFig()

        else:
            self.plot2D = True
            self.btnglobe.setText('Globe view')
            self.year = get_minyear(self.engine)
            self.slyear.setMaximum(get_maxyear(self.engine))
            self.slyear.setMinimum(self.year)
            self.updFig()

    ######################### Checkbox features #########################
    def conflictCheck(self):
        if self.Ccheck:
            self.Cplot = True
            self.Ccheck = False
            self.updFig()
        else:
            self.Cplot = False
            self.Ccheck = True
            self.updFig()

    def eclipseCheck(self):
        if self.Echeck:
            self.Eplot = True
            self.Echeck = False
            self.updFig()
        else:
            self.Eplot = False
            self.Echeck = True
            self.updFig()

    ######################### Edit textbox and slider #########################
    def updTxt(self):
        if  self.plot2D:
            self.plotall = False
        self.txtyear.setText(str(self.slyear.value()))
    def updSl(self):
        if self.plot2D:
            self.plotall = False
        self.slyear.setValue(int(self.txtyear.text()))
        self.updFig()

    ######################### Update figure #########################
    def updFig(self):
        try:
            self.rmmpl()
        except:
            pass
        
        failed = False
        self.updYear()
        try:
            fig1 = get_conflicts(self.engine, self.year, self.Eplot, self.Cplot, self.plot2D, self.plotall, int(self.txtyear.text()))
            self.addmpl(fig1)
        except Exception as e:
            print(e)
            info = "Could not connect to database. Are you sure you're connected to one?"
            failed = True
            pass

        if failed:
            QtGui.QMessageBox.information(self, 'Error', info)
        else:
            self.updConflist()
            self.updExplist()

    def updYear(self):
        if self.plot2D:
            self.year = int(self.txtyear.text())
            

    ######################### Check if event is clicked #########################
    def onpick(self, event):
        ind = event.ind
        artist = event.artist
        xdata = artist.get_xdata()
        ydata = artist.get_ydata()

        if ind[0] in range(len(xdata)):
            self.updTxtinfo(ind, artist)
        return ind[0]

    def updTxtinfo(self, ind, artist):
        lat = artist.get_ydata()[ind[0]]
        lon = artist.get_xdata()[ind[0]]
        year = int(self.txtyear.text())
        conflict = True
        try:
            self.txtconfinfo.setText(get_confinfo(self.engine, lat, lon, year))
        except:
            conflict = False
        if not conflict:
            try:
                self.txteclipse.setText(get_eclipseinfo(self.engine, lat, lon, year))
            except:
                pass

    ######################### Create a movie #########################
    def globemovie(self):
        makethevideo(self.engine,int(self.txtyear.text()), self.Eplot,self.Cplot,self.plotall)

    def updConflist(self):
        self.txtconflist.setText(get_conflist(self.engine, int(self.txtyear.text())))
    def updExplist(self):
        self.txtexport.setText(get_exportlist(self.engine, int(self.txtyear.text())))
        
    ######################### Create Database #########################
    def edit(self):
        self.wedit = db.DBInfo(self)
        self.wedit.show()

    ######################### Create figure #########################
    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.canvas.mpl_connect('pick_event', self.onpick)
        self.mplvlayout.addWidget(self.canvas)
        self.canvas.draw()

    ######################### Remove figure #########################
    def rmmpl(self,):
        self.mplvlayout.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvlayout.removeWidget(self.toolbar)
        self.toolbar.close()
예제 #13
0
class GUIControl(QtGui.QMainWindow, design.Ui_controlMontura):

    #Señal para actualizar el FOV de Stellarium
    act_stell_pos = QtCore.pyqtSignal(str, str)

    def __init__(self, parent=None):
        super(GUIControl, self).__init__(parent)
        self.setupUi(self)
        self.RT = None
        self.fig_dict = {}

        self.m = 0
        self.az = 0
        self.el = 0
        self.m_az = 0
        self.m_el = 0
        self.vel = 0
        self.h = 0

        self.newRA = 0
        self.newDEC = 0
        self.sra = 0
        self.sdec = 0

        self.lon = 0
        self.lat = 0

        self.find = False
        self.track = False
        self.sweep = False

        self.i = 0
        self.j = 0
        self.g = 0
        self.k = False

        self.manualGPS = False
        self.timeBarrido = 0.0

        self.ori = 0
        self.yaori = 0

        #Variables de cuadro
        self.pasox = 0
        self.pasoy = 0
        self.tamanox = 0
        self.tamanoy = 0
        self.timeBarrido = 0
        self.totalx = 0
        self.totaly = 0

        self.adc = 0
        self.paro = 0

        self.vectGrap = [0] * 50

        #Se inician caracteristicas de la tabla
        self.mode.setCurrentIndex(0)

        #Se bloquean algunos campos
        self.textEdit_2.setDisabled(True)
        self.textEdit_3.setDisabled(True)
        self.textEdit.setDisabled(True)
        self.textEdit_4.setDisabled(True)

        #Conexion serie
        self.connectSerial()

        #Se declaran las conexiones de la GUI
        self.mode.currentChanged.connect(self.modeEdit)
        self.toolButton.clicked.connect(self.home)
        self.toolButton_2.clicked.connect(self.editPos)
        self.toolButton_3.clicked.connect(self.unlock)

        self.menubar.setNativeMenuBar(False)

        #Iniciamos la configuracion inicial
        self.modeEdit()

        #Conexiones del Modo Automatico
        self.checkBox.clicked.connect(self.justFirst)
        self.checkBox_2.clicked.connect(self.justSecond)
        self.checkBox_3.clicked.connect(self.justThird)
        self.frame.setDisabled(True)
        self.mode.setTabEnabled(1, False)

        #Conexion con Stellarium
        self.textEdit_11.setDisabled(True)
        self.textEdit_12.setDisabled(True)

        self.Server = Telescope_Server(pos_signal=self.act_stell_pos)
        self.Server.daemon = True
        self.Server.start()

        self.Server.stell_pos_recv.connect(self.stellariumRead)

        #Menu Bar

        #Archivo
        #Abrir Stellaium
        self.actionAbrir_Stellarium.triggered.connect(self.openSte)
        #Salir
        self.actionSalr.triggered.connect(self.closeApp)

        #Posicionamiento
        #Manual
        self.actionManual.triggered.connect(self.getManualGPS)

        #Acerca
        self.actionAcerca.triggered.connect(self.mensaje)

        #Boton Iniciar
        self.pushButton.clicked.connect(self.start)

        #Boton Stop
        self.pushButton_3.clicked.connect(self.stop)
        self.stopAuto = True

        self.mg = 0

        #Graficamos los valores
        self.fig1 = Figure()
        self.f1 = self.fig1.add_subplot(111)
        self.f1.set_ylabel('Potencia')

        self.addmpl(self.fig1)

        #Boton compas
        self.toolButton_4.clicked.connect(self.orientar)

    def orientar(self):
        self.mode.setDisabled(True)
        self.actionAcerca.setDisabled(True)
        self.actionManual.setDisabled(True)
        self.actionAbrir_Stellarium.setDisabled(True)
        self.statusbar.showMessage("Orientando la antena")

        self.ori = 1
        self.acumWord()

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.plotADC.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, self, coordinates=True)
        self.plotADC.addWidget(self.toolbar)

    def start(self):
        self.pushButton.setDisabled(True)
        os.system('./test')
        self.mg = 0
        if self.track == True or self.sweep == True:
            if self.sweep == True:
                self.timeBarrido = float(self.tiempoBarrido.toPlainText())
                self.pasox = float(self.azPaso.toPlainText())
                self.pasoy = float(self.elPaso.toPlainText())
                self.tamanox = float(self.azVentana.toPlainText())
                self.tamanoy = float(self.elVentana.toPlainText())
                self.totalx = math.ceil(self.tamanox / self.pasox)
                self.totaly = math.ceil(self.tamanoy / self.pasoy)
            #Conexion modo track
            self.Track = TrackMode(self.timeBarrido)
            self.Track.lat_lon.connect(self.writeInfo)
            self.Track.start()

    def stop(self):
        self.pushButton.setDisabled(False)
        self.stopAuto = True
        self.Track.cancel()

    def updateData(self, az, el, lat, lon, adc, paro, yaori):
        try:
            self.az = float(az)
            self.el = float(el)
            self.adc = int(adc)
            self.yaori = int(yaori)
            self.paro = int(paro)
        except:
            print self.az
            print self.el
            print self.adc
            print self.yaori
            print self.paro

        #aux = self.vectGrap[1:50]
        #aux.insert(0,self.adc)
        #self.vectGrap = aux

        #self.newGrap

        if self.manualGPS == False:
            if float(lon) > 18000 and float(lat) > 9000:
                self.textEdit_2.setText("Not Found")
                self.textEdit_3.setText("Not Found")
            else:
                self.lon = float(lon)
                self.lat = float(lat)

                lon_ax = 100 * float(self.lon)
                lat_ax = 100 * float(self.lat)

                self.lon = int(abs(lon_ax / 10000)) + float(
                    (int(abs(lon_ax / 100)) %
                     100)) / 60 + (float(int(abs(lon_ax)) % 100) +
                                   abs(lon_ax) - abs(int(lon_ax))) / 3600
                self.lat = int(abs(lat_ax / 10000)) + float(
                    (int(abs(lat_ax / 100)) %
                     100)) / 60 + (float(int(abs(lat_ax)) % 100) +
                                   abs(lat_ax) - abs(int(lat_ax))) / 3600

                self.textEdit_2.setText('{0:5f}'.format(self.lat))
                self.textEdit_3.setText('{0:5f}'.format(self.lon))

                if lon_ax < 0:
                    self.lon = -1 * self.lon
                    self.label_4.setText('W')
                else:
                    self.label_4.setText('E')
                if lat_ax < 0:
                    self.lat = -1 * self.lat
                    self.label_3.setText('S')
                else:
                    self.label_3.setText('N')

                self.mode.setTabEnabled(1, True)
                self.manualGPS = True

        if self.paro == 1:
            QtGui.QMessageBox.warning(self, 'Warning', "Motores inhabilitados")
            try:
                self.stop()
                self.frame.setDisabled(True)
                self.modoAuto.setDisabled(True)
                self.actionManual.setDisabled(True)
            except:
                print "Fallo al finalizar los motores"
        elif self.paro == 0:
            self.frame.setDisabled(False)
            self.modoAuto.setDisabled(False)
            self.actionManual.setDisabled(False)
            self.vel = 0

        if self.yaori == 1:
            self.writeLCD(0)
            self.mode.setDisabled(False)
            self.actionAcerca.setDisabled(False)
            self.actionManual.setDisabled(False)
            self.actionAbrir_Stellarium.setDisabled(False)
            self.statusbar.showMessage("Orientacion finalizada")

        elif self.yaori == 2:
            self.writeLCD(0)
            self.mode.setDisabled(False)
            self.actionAcerca.setDisabled(False)
            self.actionManual.setDisabled(False)
            self.actionAbrir_Stellarium.setDisabled(False)
            self.statusbar.showMessage(
                "NO se pudo orientar satisfactoriamente la antena")

        self.textEdit.setText(az)
        self.textEdit_4.setText(el)

    def mensaje(self):
        QtGui.QMessageBox.information(self, 'Acerca', "Control RT V1.0")

    def newGrap(self):
        self.rmmpl()
        self.f1.plot(self.vectGrap)
        self.addmpl(self.fig1)

    def rmmpl(self):
        self.plotADC.removeWidget(self.canvas)
        self.canvas.close()
        self.plotADC.removeWidget(self.toolbar)
        self.toolbar.close()

    def getManualGPS(self):
        self.manualGPS = True
        self.textEdit_2.setDisabled(False)
        self.textEdit_3.setDisabled(False)
        self.mode.setTabEnabled(1, True)

    def openSte(self):
        os.system('stellarium &')

    def closeApp(self):
        self.Server.close_socket()
        self.close()

    def stellariumRead(self, ra, dec, mtime):
        ra = float(ra)
        dec = float(dec)
        mtime = float(mtime)
        (self.sra, self.sdec, stime) = coords.eCoords2str(ra, dec, mtime)

        if self.find == True or self.mg < 1:
            self.writeInfo()

    def writeInfo(self):
        self.mg = 1

        self.newRA = 180 * coords.hourStr_2_rad(self.sra) / (math.pi * 15)
        self.newDEC = 180 * coords.degStr_2_rad(self.sdec) / math.pi

        self.ecuToalaz = EcuToHor(self.newRA, self.newDEC, self.lat, self.lon)
        (self.az, self.el) = self.ecuToalaz.getHor()

        if self.sweep == True:

            self.az = self.az - (self.tamanox / 2) + self.g * self.pasox
            self.el = self.el + (self.tamanoy / 2) - self.j * self.pasoy

            if self.i >= self.totalx:
                self.i = 0
                self.j = self.j + 1
                self.k = not self.k
                if self.j > self.totaly:
                    self.j = 0
                    self.g = 0
                    self.stop()
            else:
                self.i = self.i + 1
                if self.k == False:
                    self.g = self.g + 1
                else:
                    self.g = self.g - 1

        self.textEdit_11.setText('{0:.4f}'.format(self.az))
        self.textEdit_12.setText('{0:.4f}'.format(self.el))

        self.acumWord()

    def justFirst(self):
        self.stopAuto = True
        self.frame.setEnabled(False)
        self.find = True
        self.track = False
        self.sweep = False
        self.checkBox.setChecked(True)
        self.checkBox_2.setChecked(False)
        self.checkBox_3.setChecked(False)

    def justSecond(self):
        self.timeBarrido = 1
        self.stopAuto = False
        self.frame.setEnabled(False)
        self.find = False
        self.track = True
        self.sweep = False
        self.checkBox.setChecked(False)
        self.checkBox_2.setChecked(True)
        self.checkBox_3.setChecked(False)

    def justThird(self):
        self.stopAuto = False
        self.frame.setEnabled(True)
        self.find = False
        self.track = False
        self.sweep = True
        self.checkBox.setChecked(False)
        self.checkBox_2.setChecked(False)
        self.checkBox_3.setChecked(True)

    def fromJS(self, vel, m_az, m_el):
        self.vel = vel
        self.m_az = m_az
        self.m_el = m_el
        self.acumWord()

    def acumWord(self):
        if self.RT != None:
            if self.ori != 1:
                self.RT.writeWord(self.az, self.el, self.m, self.vel,
                                  self.m_az, self.m_el, self.h, self.ori)
            elif self.ori == 1 and self.yaori == 1:
                self.ori = 0
                self.RT.writeWord(self.az, self.el, self.m, self.vel,
                                  self.m_az, self.m_el, self.h, self.ori)
            self.h = 0

    def connectSerial(self):
        portSerial = availablePorts()
        for path_RT in portSerial:
            print "Conexion exitosa con " + path_RT
            self.connectRT(path_RT)

    def connectRT(self, path_RT):
        try:
            if self.RT == None:
                self.RT = comSerial(portSerial=path_RT)
                #Recepcion de la cadena
                self.RT.readAntena.connect(self.updateData)
                self.RT.start()
        except:
            QtGui.QMessageBox.warning(self, 'Warning', "RT no conectado")
            self.RT = None

    def home(self):
        self.textEdit_4.setText('0.0000000')
        self.az = 0

        self.h = 1
        self.acumWord()

    def unlock(self):
        self.textEdit.setDisabled(False)
        self.textEdit_4.setDisabled(False)

    def editPos(self):
        self.az = float(self.textEdit.toPlainText())
        self.el = float(self.textEdit_4.toPlainText())
        self.textEdit.setDisabled(True)
        self.textEdit_4.setDisabled(True)

        if self.az >= 360:
            self.az = 0
            self.textEdit.setText('0')
        elif self.az < 0:
            self.az = 0
            self.textEdit.setText('0')

        if self.el > 90:
            self.el = 90
            self.textEdit_4.setText('90')
        elif self.el < 0:
            self.el = 0
            self.textEdit_4.setText('0')
            self.statusbar.showMessage(
                "La antena no puede alcanzar elevacion menor a 0")

        self.acumWord()

    def modeEdit(self):
        if self.mode.currentIndex() == 0:
            #Se inicia el joystick
            self.JOY = joyStickControl(0.0001)
            self.JOY.start()

            #Conexion a la LCD
            self.JOY.jSvel.connect(self.writeLCD)

            #Conexion a la matriz de LED
            self.JOY.jSmov.connect(self.writeMLED)
            self.JOY.jMove.connect(self.fromJS)

            #Funcion Modo Manual
            self.confManualMode()

        else:
            self.lcdNumber.display('0')

            #Finalizamos el joystick
            self.JOY.cancel()

            #Funcion Modo Automatico
            self.confAutoMode()

    def modifyPosSte(self, cmdText, lat, lon):
        try:
            if not os.path.exists(
                    '/home/marcial/.stellarium/data/user_locations.txt'):
                archivo = open(
                    '/home/marcial/.stellarium/data/user_locations.txt', 'a')
                archivo.write(cmdText)
                archivo.close()
                archivo = open(
                    '/home/marcial/.stellarium/data/user_locations.txt', 'r')
            else:
                archivo = open(
                    '/home/marcial/.stellarium/data/user_locations.txt', 'r')

            lineas = list(archivo)

            for i in range(len(lineas)):
                if lineas[i][0:14] == cmdText:
                    lineas[i] = cmdText + '\t\tMexico\tX\t0\t' + str(
                        lat) + 'N\t' + str(lon) + 'E\t2144\t2\t\tEarth\n'
            archivo.close()
            fileNew = open('/home/marcial/.stellarium/data/user_locations.txt',
                           'w')
            strToLine = ''.join(lineas)
            fileNew.write(strToLine)
            fileNew.close()
        except IOError:
            QtGui.QMessageBox.warning(self, 'Warning',
                                      "Fallo al cargar parametros iniciales")

    def confManualMode(self):
        self.statusbar.showMessage("Bienvenido !!! Modo Manual")

        self.toolButton.setDisabled(False)
        self.toolButton_2.setDisabled(False)
        self.toolButton_3.setDisabled(False)
        self.toolButton_4.setDisabled(False)

        self.m = 2
        self.acumWord()

    def confAutoMode(self):
        self.statusbar.showMessage("Bienvenido !!! Modo Automatico")

        self.lat = float(self.textEdit_2.toPlainText())
        self.lon = float(self.textEdit_3.toPlainText())

        self.textEdit_2.setDisabled(True)
        self.textEdit_3.setDisabled(True)

        self.toolButton.setDisabled(True)
        self.toolButton_2.setDisabled(True)
        self.toolButton_3.setDisabled(True)
        self.toolButton_4.setDisabled(True)

        self.textEdit_2.setText('{0:.5f}'.format(abs(self.lat)))
        self.textEdit_3.setText('{0:.5f}'.format(abs(self.lon)))

        if self.lat < 0:
            self.label_3.setText('S')
        else:
            self.label_3.setText('N')

        if self.lon < 0:
            self.label_4.setText('W')
        else:
            self.label_4.setText('E')

        if self.lat > 90:
            self.lat = 90
            self.textEdit_2.setText('90')
        elif self.lat < -90:
            self.lat = -90
            self.textEdit_2.setText('-90')

        if self.lon > 180:
            self.lon = 180
            self.textEdit_3.setText('180')
        elif self.lon < -180:
            self.lon = -180
            self.textEdit_3.setText('-180')

        #Abrir Stellarium
        self.modifyPosSte('SkyExplorer RT', str(self.lat), str(self.lon))
        os.system('./CheckStellarium')

        self.m = 1
        self.acumWord()

    def writeLCD(self, vel):

        stateVel = ""
        if vel < 4:
            stateVel = "Baja"
        elif vel < 8:
            stateVel = "Media"
        else:
            stateVel = "Alta"

        self.statusbar.showMessage("Velocidad: " + stateVel)
        self.lcdNumber.display(vel)
        self.vel = vel

    def writeMLED(self, m_az, m_el):

        stateMov = ""
        self.clearButton()
        if m_az == 1 and m_el == 1:
            self.right_downButton()
            stateMov = "Abajo/Derecha"
        elif m_az == 1 and m_el == -1:
            self.right_upButton()
            stateMov = "Arriba/Derecha"
        elif m_az == -1 and m_el == 1:
            self.left_downButton()
            stateMov = "Abajo/Izquierda"
        elif m_az == -1 and m_el == -1:
            self.left_upButton()
            stateMov = "Arriba/Izquierda"
        elif m_az == 0 and m_el == 1:
            self.downButton()
            stateMov = "Abajo"
        elif m_az == 0 and m_el == -1:
            self.upButton()
            stateMov = "Arriba"
        elif m_az == 1 and m_el == 0:
            self.rightButton()
            stateMov = "Derecha"
        elif m_az == -1 and m_el == 0:
            self.leftButton()
            stateMov = "Izquierda"

        self.statusbar.showMessage("Movimiento: " + stateMov)

    def rightButton(self):
        self.qLed_1_4.setOffColour(QLed.Green)
        self.qLed_2_4.setOffColour(QLed.Green)
        self.qLed_2_5.setOffColour(QLed.Green)
        self.qLed_3_1.setOffColour(QLed.Green)
        self.qLed_3_2.setOffColour(QLed.Green)
        self.qLed_3_3.setOffColour(QLed.Green)
        self.qLed_3_4.setOffColour(QLed.Green)
        self.qLed_3_5.setOffColour(QLed.Green)
        self.qLed_3_6.setOffColour(QLed.Green)
        self.qLed_4_1.setOffColour(QLed.Green)
        self.qLed_4_2.setOffColour(QLed.Green)
        self.qLed_4_3.setOffColour(QLed.Green)
        self.qLed_4_4.setOffColour(QLed.Green)
        self.qLed_4_5.setOffColour(QLed.Green)
        self.qLed_4_6.setOffColour(QLed.Green)
        self.qLed_4_7.setOffColour(QLed.Green)
        self.qLed_7_4.setOffColour(QLed.Green)
        self.qLed_6_4.setOffColour(QLed.Green)
        self.qLed_6_5.setOffColour(QLed.Green)
        self.qLed_5_1.setOffColour(QLed.Green)
        self.qLed_5_2.setOffColour(QLed.Green)
        self.qLed_5_3.setOffColour(QLed.Green)
        self.qLed_5_4.setOffColour(QLed.Green)
        self.qLed_5_6.setOffColour(QLed.Green)
        self.qLed_5_7.setOffColour(QLed.Green)

    def upButton(self):
        self.qLed_1_4.setOffColour(QLed.Green)
        self.qLed_2_3.setOffColour(QLed.Green)
        self.qLed_2_4.setOffColour(QLed.Green)
        self.qLed_2_5.setOffColour(QLed.Green)
        self.qLed_3_2.setOffColour(QLed.Green)
        self.qLed_3_3.setOffColour(QLed.Green)
        self.qLed_3_4.setOffColour(QLed.Green)
        self.qLed_3_5.setOffColour(QLed.Green)
        self.qLed_3_6.setOffColour(QLed.Green)
        self.qLed_4_1.setOffColour(QLed.Green)
        self.qLed_4_2.setOffColour(QLed.Green)
        self.qLed_4_3.setOffColour(QLed.Green)
        self.qLed_4_4.setOffColour(QLed.Green)
        self.qLed_4_5.setOffColour(QLed.Green)
        self.qLed_4_6.setOffColour(QLed.Green)
        self.qLed_4_7.setOffColour(QLed.Green)
        self.qLed_5_3.setOffColour(QLed.Green)
        self.qLed_5_4.setOffColour(QLed.Green)
        self.qLed_5_6.setOffColour(QLed.Green)
        self.qLed_6_3.setOffColour(QLed.Green)
        self.qLed_6_4.setOffColour(QLed.Green)
        self.qLed_6_5.setOffColour(QLed.Green)
        self.qLed_7_3.setOffColour(QLed.Green)
        self.qLed_7_4.setOffColour(QLed.Green)
        self.qLed_7_5.setOffColour(QLed.Green)

    def downButton(self):
        self.qLed_7_4.setOffColour(QLed.Green)
        self.qLed_6_3.setOffColour(QLed.Green)
        self.qLed_6_4.setOffColour(QLed.Green)
        self.qLed_6_5.setOffColour(QLed.Green)
        self.qLed_5_2.setOffColour(QLed.Green)
        self.qLed_5_3.setOffColour(QLed.Green)
        self.qLed_5_4.setOffColour(QLed.Green)
        self.qLed_5_6.setOffColour(QLed.Green)
        self.qLed_5_7.setOffColour(QLed.Green)
        self.qLed_4_1.setOffColour(QLed.Green)
        self.qLed_4_2.setOffColour(QLed.Green)
        self.qLed_4_3.setOffColour(QLed.Green)
        self.qLed_4_4.setOffColour(QLed.Green)
        self.qLed_4_5.setOffColour(QLed.Green)
        self.qLed_4_6.setOffColour(QLed.Green)
        self.qLed_4_7.setOffColour(QLed.Green)
        self.qLed_3_3.setOffColour(QLed.Green)
        self.qLed_3_4.setOffColour(QLed.Green)
        self.qLed_3_5.setOffColour(QLed.Green)
        self.qLed_2_3.setOffColour(QLed.Green)
        self.qLed_2_4.setOffColour(QLed.Green)
        self.qLed_2_5.setOffColour(QLed.Green)
        self.qLed_1_3.setOffColour(QLed.Green)
        self.qLed_1_4.setOffColour(QLed.Green)
        self.qLed_1_5.setOffColour(QLed.Green)

    def leftButton(self):
        self.qLed_1_4.setOffColour(QLed.Green)
        self.qLed_2_3.setOffColour(QLed.Green)
        self.qLed_2_4.setOffColour(QLed.Green)
        self.qLed_3_2.setOffColour(QLed.Green)
        self.qLed_3_3.setOffColour(QLed.Green)
        self.qLed_3_4.setOffColour(QLed.Green)
        self.qLed_3_5.setOffColour(QLed.Green)
        self.qLed_3_6.setOffColour(QLed.Green)
        self.qLed_3_7.setOffColour(QLed.Green)
        self.qLed_4_1.setOffColour(QLed.Green)
        self.qLed_4_2.setOffColour(QLed.Green)
        self.qLed_4_3.setOffColour(QLed.Green)
        self.qLed_4_4.setOffColour(QLed.Green)
        self.qLed_4_5.setOffColour(QLed.Green)
        self.qLed_4_6.setOffColour(QLed.Green)
        self.qLed_4_7.setOffColour(QLed.Green)
        self.qLed_5_2.setOffColour(QLed.Green)
        self.qLed_5_3.setOffColour(QLed.Green)
        self.qLed_5_4.setOffColour(QLed.Green)
        self.qLed_5_6.setOffColour(QLed.Green)
        self.qLed_5_7.setOffColour(QLed.Green)
        self.qLed_5_8.setOffColour(QLed.Green)
        self.qLed_6_3.setOffColour(QLed.Green)
        self.qLed_6_4.setOffColour(QLed.Green)
        self.qLed_7_4.setOffColour(QLed.Green)

    def right_upButton(self):
        self.qLed_2_3.setOffColour(QLed.Green)
        self.qLed_2_4.setOffColour(QLed.Green)
        self.qLed_2_5.setOffColour(QLed.Green)
        self.qLed_2_6.setOffColour(QLed.Green)
        self.qLed_3_4.setOffColour(QLed.Green)
        self.qLed_3_5.setOffColour(QLed.Green)
        self.qLed_3_6.setOffColour(QLed.Green)
        self.qLed_4_3.setOffColour(QLed.Green)
        self.qLed_4_4.setOffColour(QLed.Green)
        self.qLed_4_5.setOffColour(QLed.Green)
        self.qLed_4_6.setOffColour(QLed.Green)
        self.qLed_5_2.setOffColour(QLed.Green)
        self.qLed_5_3.setOffColour(QLed.Green)
        self.qLed_5_4.setOffColour(QLed.Green)
        self.qLed_5_7.setOffColour(QLed.Green)
        self.qLed_6_3.setOffColour(QLed.Green)

    def left_upButton(self):
        self.qLed_2_2.setOffColour(QLed.Green)
        self.qLed_2_3.setOffColour(QLed.Green)
        self.qLed_2_4.setOffColour(QLed.Green)
        self.qLed_2_5.setOffColour(QLed.Green)
        self.qLed_3_2.setOffColour(QLed.Green)
        self.qLed_3_3.setOffColour(QLed.Green)
        self.qLed_3_4.setOffColour(QLed.Green)
        self.qLed_4_2.setOffColour(QLed.Green)
        self.qLed_4_3.setOffColour(QLed.Green)
        self.qLed_4_4.setOffColour(QLed.Green)
        self.qLed_4_5.setOffColour(QLed.Green)
        self.qLed_5_2.setOffColour(QLed.Green)
        self.qLed_5_4.setOffColour(QLed.Green)
        self.qLed_5_6.setOffColour(QLed.Green)
        self.qLed_5_7.setOffColour(QLed.Green)
        self.qLed_6_5.setOffColour(QLed.Green)

    def left_downButton(self):
        self.qLed_6_2.setOffColour(QLed.Green)
        self.qLed_6_3.setOffColour(QLed.Green)
        self.qLed_6_4.setOffColour(QLed.Green)
        self.qLed_6_5.setOffColour(QLed.Green)
        self.qLed_5_2.setOffColour(QLed.Green)
        self.qLed_5_3.setOffColour(QLed.Green)
        self.qLed_5_4.setOffColour(QLed.Green)
        self.qLed_4_2.setOffColour(QLed.Green)
        self.qLed_4_3.setOffColour(QLed.Green)
        self.qLed_4_4.setOffColour(QLed.Green)
        self.qLed_4_5.setOffColour(QLed.Green)
        self.qLed_3_2.setOffColour(QLed.Green)
        self.qLed_3_4.setOffColour(QLed.Green)
        self.qLed_3_6.setOffColour(QLed.Green)
        self.qLed_3_5.setOffColour(QLed.Green)
        self.qLed_2_5.setOffColour(QLed.Green)

    def right_downButton(self):
        self.qLed_6_3.setOffColour(QLed.Green)
        self.qLed_6_4.setOffColour(QLed.Green)
        self.qLed_6_5.setOffColour(QLed.Green)
        self.qLed_6_6.setOffColour(QLed.Green)
        self.qLed_5_4.setOffColour(QLed.Green)
        self.qLed_5_6.setOffColour(QLed.Green)
        self.qLed_5_7.setOffColour(QLed.Green)
        self.qLed_4_3.setOffColour(QLed.Green)
        self.qLed_4_4.setOffColour(QLed.Green)
        self.qLed_4_5.setOffColour(QLed.Green)
        self.qLed_4_6.setOffColour(QLed.Green)
        self.qLed_3_2.setOffColour(QLed.Green)
        self.qLed_3_3.setOffColour(QLed.Green)
        self.qLed_3_4.setOffColour(QLed.Green)
        self.qLed_3_6.setOffColour(QLed.Green)
        self.qLed_2_3.setOffColour(QLed.Green)

    def clearButton(self):
        self.qLed_1_1.setOffColour(QLed.Grey)
        self.qLed_1_2.setOffColour(QLed.Grey)
        self.qLed_1_3.setOffColour(QLed.Grey)
        self.qLed_1_4.setOffColour(QLed.Grey)
        self.qLed_1_5.setOffColour(QLed.Grey)
        self.qLed_1_6.setOffColour(QLed.Grey)
        self.qLed_1_7.setOffColour(QLed.Grey)
        self.qLed_2_1.setOffColour(QLed.Grey)
        self.qLed_2_2.setOffColour(QLed.Grey)
        self.qLed_2_3.setOffColour(QLed.Grey)
        self.qLed_2_4.setOffColour(QLed.Grey)
        self.qLed_2_5.setOffColour(QLed.Grey)
        self.qLed_2_6.setOffColour(QLed.Grey)
        self.qLed_2_7.setOffColour(QLed.Grey)
        self.qLed_3_1.setOffColour(QLed.Grey)
        self.qLed_3_2.setOffColour(QLed.Grey)
        self.qLed_3_3.setOffColour(QLed.Grey)
        self.qLed_3_4.setOffColour(QLed.Grey)
        self.qLed_3_5.setOffColour(QLed.Grey)
        self.qLed_3_6.setOffColour(QLed.Grey)
        self.qLed_3_7.setOffColour(QLed.Grey)
        self.qLed_4_1.setOffColour(QLed.Grey)
        self.qLed_4_2.setOffColour(QLed.Grey)
        self.qLed_4_3.setOffColour(QLed.Grey)
        self.qLed_4_4.setOffColour(QLed.Grey)
        self.qLed_4_5.setOffColour(QLed.Grey)
        self.qLed_4_6.setOffColour(QLed.Grey)
        self.qLed_4_7.setOffColour(QLed.Grey)
        self.qLed_5_1.setOffColour(QLed.Grey)
        self.qLed_5_2.setOffColour(QLed.Grey)
        self.qLed_5_3.setOffColour(QLed.Grey)
        self.qLed_5_4.setOffColour(QLed.Grey)
        self.qLed_5_6.setOffColour(QLed.Grey)
        self.qLed_5_7.setOffColour(QLed.Grey)
        self.qLed_5_8.setOffColour(QLed.Grey)
        self.qLed_6_1.setOffColour(QLed.Grey)
        self.qLed_6_2.setOffColour(QLed.Grey)
        self.qLed_6_3.setOffColour(QLed.Grey)
        self.qLed_6_4.setOffColour(QLed.Grey)
        self.qLed_6_5.setOffColour(QLed.Grey)
        self.qLed_6_6.setOffColour(QLed.Grey)
        self.qLed_6_7.setOffColour(QLed.Grey)
        self.qLed_7_1.setOffColour(QLed.Grey)
        self.qLed_7_2.setOffColour(QLed.Grey)
        self.qLed_7_3.setOffColour(QLed.Grey)
        self.qLed_7_4.setOffColour(QLed.Grey)
        self.qLed_7_5.setOffColour(QLed.Grey)
        self.qLed_7_6.setOffColour(QLed.Grey)
        self.qLed_7_7.setOffColour(QLed.Grey)

    #Salir
    def closeEvent(self, event):
        try:
            self.Server.close_socket()
            self.RT.cancel()
            event.accept()
        except:
            event.accept()
class MyMain(QMainWindow, Ui_MyMainWindow):
    """This class defines the application logic for a GUI construction 
    
    This class defines the application logic based on the GUI defined as
    the front end. The GUI is defined through the base classes Ui_MyMainWindow
    and QMainwindow. The class QMainWindow is part of every QT application ( at
    least one is need) and generates a window with the normal windows decorations,
    i.e. zou you can drag it around and resize it like any normal window.
    
    The class Ui_MyMainWindow is a subclass of QMainWindow customizing the 
    standard windows as created by an instance of QMainWindow. Ui_MyMainWindow 
    defines the overall GUI design while the class MyMain contains the necessary
    application logic to display matplotlib data plots and a plot selection
    list.    
    """
    def __init__(self, ):
        """
        Initialises an empty dictionary to store Figure instances by name.
        Clicks on list items are associated with the method changefig. 
        An empty figure instance is added to the plotting window during
        initialisation, such that the method changefig can remove the current 
        figure.
        """
        super(MyMain, self).__init__()
        self.setupUi(self)
        self.fig_dict = {}

        self.mplfigslist.itemClicked.connect(self.changefig)

        fig = Figure()
        self.addmpl(fig)

    def changefig(self, item):
        """
        Removes the current plot and displays the new one associated with the
        item clicked. 

        Parameters
        ----------
        item : instance of class QListWidgetItem, which defines a method 'text',
                which simply returns the text of the selectd item.
        """
        text = item.text()
        if text == 'Exit Application':
            self.close()
        else:
            self.rmmpl()
            self.addmpl(self.fig_dict[text])

    def addfig(self, name, fig):
        """
        The Figure fig is added to the dictionary under the 'name' key.
        The name key is added to the list Widget 'mplfigslist' an instance of
        QT class QListWidget.

        Parameters
        ----------
        name : string 
            denoting the name of Figure instance.
        fig : Figure
              Figure instance associated with keyword 'name' .

        """
        self.fig_dict[name] = fig
        self.mplfigslist.addItem(name)

    def addmpl(self, fig):
        """
        Displays the Figure instance fig in the matplotlib container, a
        generic QT container widget. A vertical layout named 'mplvl' is 
        enforced for any encapsulated widgets in this container. This 
        instance of QT class QVBoxLayout has an 'addWidget' method for
        adding new vertically alligned widgets into the matplolib container 
        widget. Thismethd is used to upload the FigureCanvas object 'canvas',
        which contains the plot.

        Parameters
        ----------
        fig : Figure instance
        """
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()

    def rmmpl(self):
        """
        Removes the container widget with the current plot from the
        GUI window and closes the canvas containing that current plot.
        The method 'removeWidget' of the 'mplv' QVBoxLayout is used.

        """
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
class MyWindowClass(QtGui.QMainWindow, form_class):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.start.clicked.connect(self.start_clicked)
        self.regioncontourbutton.clicked.connect(self.openfile1)
        self.twibutton.clicked.connect(self.openfile2)
        self.cityregionbutton.clicked.connect(self.openfile3)
        self.vegindexbutton.clicked.connect(self.openfile4)
        self.imageviewbutton.clicked.connect(self.openMainFig)
        self.rmvPointButton.clicked.connect(self.removeCell)
        self.MutValue.setText("5000")
        self.MutantQuantity.setText("0")
        self.table.setColumnCount(2)
        self.layout.addWidget(self.table, 1, 0)
        self.table.setHorizontalHeaderLabels(['index', 'mutant size'])
        self.MutantLIST = np.array([])
        self.THEimage = np.array([])
        self.fig = Figure()

    def openfile1(self):
        self.regioncontour.setText(
            QtGui.QFileDialog.getOpenFileName(
                self, 'Single File', '~/Desktop/',
                "Image files (*.jpg *.png *.tif)"))

    def openfile2(self):
        self.twi.setText(
            QtGui.QFileDialog.getOpenFileName(
                self, 'Single File', '~/Desktop/',
                "Image files (*.jpg *.png *.tif)"))

    def openfile3(self):
        self.cityregion.setText(
            QtGui.QFileDialog.getOpenFileName(
                self, 'Single File', '~/Desktop/',
                "Image files (*.jpg *.png *.tif)"))

    def openfile4(self):
        self.vegindex.setText(
            QtGui.QFileDialog.getOpenFileName(
                self, 'Single File', '~/Desktop/',
                "Image files (*.jpg *.png *.tif)"))

    def removeCell(self):
        pointNumber = int(self.rmvPointN.text())
        self.MutantLIST[pointNumber:-1] = self.MutantLIST[pointNumber + 1:]
        self.MutantLIST = self.MutantLIST[:-1]
        self.MutantQuantity.setText(
            str(
                int(self.MutantQuantity.text()) -
                int(self.table.item(pointNumber, 1).text())))
        self.table.removeRow(pointNumber)
        for i in range(len(self.MutantLIST)):
            self.table.setItem(i, 0, QtGui.QTableWidgetItem(str(i)))
        self.ImgAddPatches()
        self.rmvPointN.setText('')

    def onclick(self, event):
        #print('button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %(event.button, event.x, event.y, event.xdata, event.ydata))
        if event.button == 3:
            self.MutantLIST = np.array(self.MutantLIST.tolist() + [[
                int(event.ydata),
                int(event.xdata),
                int(str(self.MutValue.text()))
            ]])
            rowPosition = self.table.rowCount()
            self.table.insertRow(rowPosition)
            self.table.setItem(rowPosition, 0,
                               QtGui.QTableWidgetItem(str(rowPosition)))
            self.table.setItem(
                rowPosition, 1,
                QtGui.QTableWidgetItem(str(self.MutValue.text())))
            self.MutantQuantity.setText(
                str(
                    int(self.MutantQuantity.text()) +
                    int(str(self.MutValue.text()))))
            self.ImgAddPatches()

    def openMainFig(self):
        if self.THEimage.any() == True:
            self.rmmpl()
            for i in range(len(self.MutantLIST)):
                self.table.removeRow(0)
            self.MutantLIST = np.array([])

        name = QtGui.QFileDialog.getOpenFileName(
            self, 'Single File', '~/Desktop/',
            "Image files (*.jpg *.png *.tif)")
        image = misc.imread(str(name))
        self.THEimage = image
        baseimage = self.fig.add_subplot(111)
        baseimage.axis('off')
        baseimage.grid(False)
        baseimage.imshow(image)
        self.canvas = FigureCanvas(self.fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.widget,
                                         coordinates=True)
        self.mplvl.addWidget(self.toolbar)
        cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)

    def ImgAddPatches(self):
        self.fig, ax = subplots(1, 1)
        ax.imshow(self.THEimage)
        ax.grid(False)
        ax.axis('off')
        for number, blob in enumerate(self.MutantLIST):
            y, x, r = blob
            c = Circle((x, y),
                       self.THEimage.shape[0] * (log(r)**1.5) / 1000,
                       color='r',
                       linewidth=2,
                       alpha=0.5)
            ax.add_patch(c)
            ax.text(x, y, str(number), color='white')
        self.changeFIGURE(self.fig)

    def changeFIGURE(self, newFIG):
        self.rmmpl()
        self.canvas = FigureCanvas(newFIG)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.widget,
                                         coordinates=True)
        self.mplvl.addWidget(self.toolbar)
        cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)

    def rmmpl(self, ):
        #plt.close()
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def start_clicked(self):
        self.start.setText("Running")
        transgenic_type = 0
        if self.genedrive.isChecked() == True: transgenic_type = 1

        island_shape = misc.imread(str(self.regioncontour.text()))
        island_shape_gray = rgb2gray(island_shape)
        island_wet = ski.img_as_float(
            rgb2gray(misc.imread(str(self.twi.text()))))
        island_veg = adjust_gamma(
            ski.img_as_float(rgb2gray(misc.imread(str(self.vegindex.text())))),
            .2)
        if str(self.cityregion.text()) == '': island_city = np.zeros(grid_size)
        else: island_city = rgb2gray(misc.imread(str(self.cityregion.text())))

        mosquitos = Grid(island_shape_gray, island_veg, island_wet,
                         island_city, float(self.pixelSize.text()),
                         int(str(self.populationLimit.text())),
                         transgenic_type, int(self.Neq_step.text()))

        for single_point in self.MutantLIST:
            y, x, quantity = single_point
            mosquitos.GRID[y][x].amut = quantity

        CURSOR_UP_ONE = '\x1b[1A'
        ERASE_LINE = '\x1b[2K'
        mosquitos.images()
        for i in range(int(self.daysAfterRelease.text())):
            print("loading: " +
                  str(i / int(self.daysAfterRelease.text()) * 100) + "% done")
            mosquitos.updateall()
            mosquitos.images()
            print(CURSOR_UP_ONE + ERASE_LINE + CURSOR_UP_ONE)
        mosquitos.graph()
        system("convert timelapse/timelapse-*.png timelapse/dinamic.gif")
        system("rm timelapse/timelapse-*.png")
        print("End of simulation")
예제 #16
0
파일: main.py 프로젝트: PanosNikolaou/iSERM
class MyWindowClass(QtGui.QMainWindow,serm.Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = serm.Ui_MainWindow()
        self.setupUi(self)
        self.pushButton_predict_risk.clicked.connect(self.predict_risk)
        self.pushButton_DA_showplot.clicked.connect(self.showplot)
        self.pushButton_DA_pearson.clicked.connect(self.calc_consist)
        self.pushButton_PM_H2Oinit.clicked.connect(self.h2oinitfunc)
        self.pushButton_DA_data_consist.clicked.connect(self.data_integrity_check)
        self.pushButton_PM_Predict.clicked.connect(self.model_predict)
        self.pushButton_PM_FWI.clicked.connect(self.calc_FWI)
        self.pushButton_PM_BuildModel.clicked.connect(self.H2OBuildModel)
        self.pushButton_PM_LastWData.clicked.connect(self.h2ogetdata)
        self.pushButton_PM_addRecord.clicked.connect(self.addrow)
        self.pushButton_PM_addweatherRecord.clicked.connect(self.addweatherrow)
        self.tabMenu.connect(self.tabMenu,SIGNAL("currentChanged(int)"),self,SLOT("tabChangedSlot(int)"))
        self.dateTimeEdit.setDateTime(datetime.now()) 
        client.on_connect = self.on_connect
        client.on_message = self.on_message
        client.on_subscribe = self.on_subscribe
        #client.connect("broker.hivemq.com", 1883,keepalive=0)
        #client.connect("test.mosquitto.org",1883,keepalive=0)
        client.connect("localhost", 1883,keepalive=0)
        self.dial.valueChanged.connect(self.lbl_dialnum.setNum)
        self.fn_gphlr()
        scheduler.add_job(self.readData, 'interval', seconds=1, misfire_grace_time=2, id='readdata')
        scheduler.add_job(self.timed_job, 'interval', seconds=10, id='recmeans')
        scheduler.add_job(self.wunderground, 'interval', minutes=5, misfire_grace_time=2, id='wunderground')
        self.wunderground()        
        self.timed_job()

    model = None
    test = None
     
    def show_predictions_table(self):
        db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.tableView_PM.setWindowTitle("Connect to QSQLITE Database Example")                          
        db.setHostName("localhost")
        db.setDatabaseName("serm.db")
        db.setUserName("")
        db.setPassword("")

        if (db.open()==False): 
            message = "Database Error"
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Information)
            msg.setText("Error at opening database")
            msg.setInformativeText(message)
            msg.setWindowTitle("Informative Message")
            msg.setStandardButtons(QMessageBox.Close)
            msg.exec_()               
        
        projectModel = QSqlQueryModel()
        projectModel.setQuery("SELECT datetime,smoke,temperature,humidity,windspeed,fri,ffwi FROM predictions ORDER BY recid DESC",db)
        
        self.tableView_PM.setModel(projectModel)
        self.tableView_PM.adjustSize
        self.tableView_PM.setColumnWidth(0,160)
        self.tableView_PM.show()  
        
    def addrow(self):

        conn = sqlite3.connect('serm.db')

        with conn:
            dtm = self.dateTimeEdit_PM_datetime.text()
            smk = self.doubleSpinBox_PM_smoke.text()
            tmp = self.doubleSpinBox_PM_temp.text()
            hmd = self.doubleSpinBox_PM_humidity.text()
            wndspd = self.doubleSpinBox_PM_WindSpeed.text()
            ffwi = self.lineEdit_PM_calcFWI.text()
            risk = self.lineEdit_PM_predictRiskVal.text()          
            conn.execute("INSERT INTO predictions(datetime,smoke,temperature,humidity,windspeed,fri,ffwi) VALUES (?,?,?,?,?,?,?)", (dtm,smk,tmp,hmd,wndspd,risk,ffwi))
        conn.close()
        self.show_predictions_table()
        
    def addweatherrow(self):

        conn = sqlite3.connect('serm.db')

        with conn:
            dt = self.dateTimeEdit_PM_datetime.dateTime()
            dtm = datetime.strftime(dt.toPyDateTime(), '%Y-%m-%d %H:%M:%S')
            smk = self.doubleSpinBox_PM_smoke.value()
            print(smk)
            tmp = self.doubleSpinBox_PM_temp.value()
            hmd = self.doubleSpinBox_PM_humidity.value()
            wndspd = self.doubleSpinBox_PM_WindSpeed.value()
            ffwi = self.lineEdit_PM_calcFWI.text()
            risk = self.lineEdit_PM_predictRiskVal.text()
            ddate = self.dateTimeEdit_PM_datetime.dateTime()
            date_var = ddate.toPyDateTime()
            tstmp = time.mktime(date_var.timetuple())
            conn.execute("INSERT INTO data_means(timestamp,datetime,smoke,co,lpg,temperature,humidity,windspeed,winddir,risk,ffwi) VALUES (?,?,?,?,?,?,?,?,?,?,?)", (tstmp,dtm,smk,0,0,tmp,hmd,wndspd,'X',risk,ffwi))
        conn.close()
        self.show_predictions_table()

    def on_connect(self,client, userdata, flags, rc):
        print("CONNACK received with code %d." % (rc))
        client.subscribe("/SERM",0)

    def on_message(self,client, userdata, msg):
        if msg.payload:   
            self.dateTimeEdit.setDateTime(datetime.now())  
            data =  str(msg.payload).strip("b,',\n,\\")
            parsed_json = json.loads(data)
            smk = str(parsed_json['smk'])
            lpg = str(parsed_json['lpg'])
            co = str(parsed_json['co'])
            hum = str(parsed_json['hum'])
            temp = str(parsed_json['temp'])
            wndspd = str(parsed_json['wndspd'])
            wnddir = (parsed_json['wnddir'])
            datetimestamp = calendar.timegm(time.strptime(str(time.strftime('%Y-%m-%d %H:%M:%S')), '%Y-%m-%d %H:%M:%S'))
                
            T = float(temp)
            H = float(float(hum)/100)
            W = 349 + (1.29*T)+(0.0135*(T**2))
            K = 0.805 + 0.000736*T - 0.000000273*(T**2)
            K1 = 6.27 + 0.000938*T - 0.0000303*(T**2)
            K2 = 1.91 + 0.0407*T - 0.000293*(T**2)
            M = 1800/W *(((K*H)/(1-(K*H)))+(((K1*K*H)+(2*K1*K2*(K**2)*(H**2)))/(1+(K1*K*H)+(K1*K2*(K**2)*(H**2)))))
        
            WMPH = float(wndspd)
        
            M30 = M/30
            WSQR = WMPH*WMPH
            fmdc = 1 - 2*M30 + 1.5*M30**2 - 0.5*M30**3
            CMBE = (fmdc*sqrt(1+WSQR))/0.3002
        
            conn = sqlite3.connect('serm.db')
            with conn:
                conn.execute("INSERT INTO data(datetime,smoke,lpg,co,humidity,temperature,windspeed,winddir,ffwi) VALUES (?,?,?,?,?,?,?,?,?)", (datetimestamp,smk,lpg,co,hum,temp,wndspd,wnddir,str(CMBE)))    
                conn.commit()
            
                
    def on_subscribe(self,client, userdata, mid, granted_qos):
        print("Subscribed: "+str(mid)+" "+str(granted_qos))

    def on_log(self,client, obj, level, string):
        print(string)
        
    @pyqtSlot(int)
    def tabChangedSlot(self,argTabIndex):
        
        if argTabIndex==1:
            db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
            self.tableView.setWindowTitle("Connect to QSQLITE Database Example")                          
            db.setHostName("localhost")
            db.setDatabaseName("serm_shadow.db")
            db.setUserName("")
            db.setPassword("")
                        
            if (db.open()==False): 
                message = "Database Error"
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Information)
                msg.setText("Error at opening database")
                msg.setInformativeText(message)
                msg.setWindowTitle("Informative Message")
                msg.setStandardButtons(QMessageBox.Close)
                msg.exec_()  
                
            projectModel = QSqlQueryModel()
            projectModel.setQuery("SELECT datetime,temperature,humidity,smoke,lpg,co,windspeed,winddir,ffwi,risk FROM data_means ORDER BY recid DESC",db)
            self.tableView.setModel(projectModel)
            self.tableView.adjustSize
            self.tableView.setColumnWidth(0,168)
            self.tableView.show()
            
        elif argTabIndex==3:      
            conn = sqlite3.connect('serm.db')                 
            ds = pd.read_sql("SELECT timestamp,datetime,risk,smoke,temperature,humidity,windspeed,ffwi from data_means", conn);
            conn.close()
            ds.to_csv("serm.csv")
            self.show_predictions_table()
            
    def fn_gphlr(self):
        conn = sqlite3.connect('serm.db')                 
        ds = pd.read_sql("SELECT timestamp,recid,ffwi,risk,smoke from data_means", conn);
        dx = ds.recid
        dy = ds.risk
        pl2 = sns.regplot(dx,dy,data=dy,order=2)      
        fig2 = pl2.figure
        self.addmpl(fig2)

    def showplot(self):
        conn = sqlite3.connect('serm_shadow.db')                 
        df = pd.read_sql("SELECT ffwi,temperature,smoke,humidity,windspeed from data_means", conn)
        self.gridLayout_DA_plot.removeWidget(self.canvas)
        if self.comboBox_DA_diag.currentText() == "Histogram":
            g = sns.pairplot(df,dropna=True,diag_kind="hist",size=2.2)
        fig = g.fig
        self.canvas = FigureCanvas(fig)
        self.gridLayout_DA_plot.addWidget(self.canvas)
        self.canvas.draw()

    def calc_FWI(self):
        humidity = self.doubleSpinBox_PM_humidity.value()
        temperature = self.doubleSpinBox_PM_temp.value()
        windspeed = self.doubleSpinBox_PM_WindSpeed.value()
        ###############################################################################################
        T = float(temperature)
        H = float(float(humidity)/100)
        W = 349 + (1.29*T)+(0.0135*(T**2))
        K = 0.805 + 0.000736*T - 0.000000273*(T**2)
        K1 = 6.27 + 0.000938*T - 0.0000303*(T**2)
        K2 = 1.91 + 0.0407*T - 0.000293*(T**2)
        M = 1800/W *(((K*H)/(1-(K*H)))+(((K1*K*H)+(2*K1*K2*(K**2)*(H**2)))/(1+(K1*K*H)+(K1*K2*(K**2)*(H**2)))))
        
        WMPH = float(windspeed)
        
        M30 = M/30
        WSQR = WMPH*WMPH
        fmdc = 1 - 2*M30 + 1.5*M30**2 - 0.5*M30**3
        CMBE = (fmdc*sqrt(1+WSQR))/0.3002
        ###############################################################################################
        ffwi = str(round(CMBE,3))          
        self.lineEdit_PM_calcFWI.setText(ffwi)
            
    def model_predict(self):
        global model
        global test
        datevar = self.dateTimeEdit_PM_datetime.dateTime().toString("yyyy-MM-dd HH:mm:ss")
        ffwi = self.lineEdit_PM_calcFWI.text()
        smoke = self.doubleSpinBox_PM_smoke.value()
        humidity = self.doubleSpinBox_PM_humidity.value()
        temperature = self.doubleSpinBox_PM_temp.value()
        windspeed = self.doubleSpinBox_PM_WindSpeed.value()    
        d = [datevar, ffwi, smoke , temperature, humidity, windspeed]
        f = h2o.H2OFrame(d) 
        f.set_names(["datetime","ffwi","smoke","temperature", "humidity", "windspeed"])
        predict = model.predict(f)
        fnum = re.findall("[-+]?[0-9]*\.?[0-9]+", str(predict))
        self.lineEdit_PM_predictRiskVal.setText(fnum[0])
        
    def data_integrity_check(self):
        conn = sqlite3.connect('serm_shadow.db')  
        message = None
        data = pd.read_sql("SELECT risk,temperature,smoke,humidity,windspeed from data_means", conn)
        assert(0 < len(data))
        for index, row in data.iterrows():
            assert(row["smoke"] >= 0),message + "Undefined Smoke value(s)\n"
            assert(row["windspeed"] >= 0),message +"Undefined Windspeed value(s)\n"
            assert(row["risk"] >= 0),message + "Undefined Risk value(s)\n"
            assert(row["humidity"] >= 0),message + "Undefined Humidity value(s)\n"
        if message == None:
            message = "No errors on data"
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        msg.setText("Data consisteny completed successfully")
        msg.setInformativeText(message)
        msg.setWindowTitle("MessageBox")
        msg.setStandardButtons(QMessageBox.Close)
        msg.exec_()

    def calc_consist(self):
        var1 = "risk"
        var2 = None
        if self.radioButton_PM_FWI.isChecked()==True :
            var2 = "ffwi"

        if self.radioButton_PM_TMP.isChecked()==True :
            var2 = "temperature"  
            
        if self.radioButton_PM_HM.isChecked()==True :
            var2 = "humidity"

        if self.radioButton_PM_WNSPD.isChecked()==True :
            var2 = "windspeed"  
            
        if self.radioButton_PM_SMK.isChecked()==True :
            var2 = "smoke"  

        conn = sqlite3.connect('serm_shadow.db')                 
        data = pd.read_sql("SELECT risk,ffwi,temperature,smoke,humidity,windspeed from data_means", conn)

        if self.radioButton_DA_pears.isChecked() == True:        
            r_row, p_value = scipy.stats.pearsonr(data[var1], data[var2])
        elif self.radioButton_DA_spear.isChecked() == True:
            r_row, p_value = scipy.stats.spearmanr(data[var1], data[var2])
            
        self.lineEdit_DA_coefficient.setText(str(round(r_row,3)));
        self.lineEdit_DA_pvalue.setText(str(round(p_value,3)));

    def removeplot(self):
        self.gridLayout_DA_plot.removeWidget(self.canvas)
        self.canvas.close()

    def H2OBuildModel(self):
        weather = "serm.csv"
        weather_df = h2o.import_file(path=weather)   
        global model
        global test
        train,test,valid = weather_df.split_frame(ratios=(.7, .15))

        estimator_index = self.tabWidget_PM_Estimator.currentIndex()
        
        if estimator_index == 0:
            _distribution = self.comboBox_PM_distribution.currentText()
            _activation = self.comboBox_PM_activation.currentText()
            _hidden = self.comboBox_PM_hidden.currentText()
            _epochs = self.spinBox_PM_epochs.value()
            _sparse = self.comboBox_PM_sparse.currentText()
            _shuffle = self.comboBox_PM_shuffle.currentText()
            model = H2ODeepLearningEstimator(distribution=_distribution,activation=_activation,hidden=_hidden,shuffle = _shuffle,sparse=_sparse,epochs=_epochs)
                
        self.completed = 0

        while self.completed < 100:
            self.completed += 0.0001
            self.progressBar.setValue(self.completed)
            
        model.train(y="risk", x=["datetime","ffwi","smoke","temperature", "humidity", "windspeed"], training_frame=train)
        metrics = model.model_performance()
        self.lineEdit_PM_MSE.setText(str(round(metrics['MSE'],5)))
        self.lineEdit_PM_RMSE.setText(str(round(metrics['RMSE'],5)))
        self.lineEdit_PM_MAE.setText(str(round(metrics['mae'],5)))
        self.lineEdit_PM_MRD.setText(str(round(metrics['mean_residual_deviance'],5)))
                
        
    def predict_risk(self):
        selected_hours = int(self.lbl_dialnum.text())
        conn = sqlite3.connect('serm.db')

        with conn:        
        
            df = pd.read_sql("SELECT recid,risk from data_means", conn);
            lm = smf.ols("risk ~ recid", data=df).fit()            
            cur = conn.cursor()    
            cur.execute('SELECT MAX(recid) from data_means')
            data = cur.fetchone()
            c_recid = data[0]
            
        counts = int((selected_hours * 60)*60)
        
        total = counts+c_recid
        idx = []
        riskarr = []
        for x in range(c_recid, total):
            riskarr.append(lm.predict({'recid': x}))
            idx.append(x)
        df = pd.DataFrame(riskarr, index=idx)

        self.txt_mean.setText(str(round(df.mean()[0],3)))
        self.txt_max.setText(str(round(df.max()[0],3)))
        self.txt_min.setText(str(round(df.min()[0],3)))
                
        palette = QtGui.QPalette()
        risk = df.mean()[0]

        if risk < 10:
            palette.setColor(QtGui.QPalette.Foreground,QtCore.Qt.green)
            self.txt_max_2.setPalette(palette)
            self.txt_max_2.setText("LOW")
        elif risk >= 10 and risk < 30:
            palette.setColor(QtGui.QPalette.Foreground,QtCore.Qt.yellow)
            self.txt_max_2.setPalette(palette)
            self.txt_max_2.setText("AVERAGE")
        else:
            palette.setColor(QtGui.QPalette.Foreground,QtCore.Qt.red)
            self.txt_max_2.setPalette(palette)
            self.txt_max_2.setText("HIGH")
            

    def readData(self):
        client.loop()

    def h2ogetdata(self):
        weather = "serm.csv"
        weather_df = h2o.import_file(path=weather)   
        self.doubleSpinBox_PM_temp.setValue(weather_df.tail(1)['temperature'])
        self.doubleSpinBox_PM_humidity.setValue(weather_df.tail(1)['humidity'])
        self.doubleSpinBox_PM_smoke.setValue(weather_df.tail(1)['smoke'])
        self.doubleSpinBox_PM_WindSpeed.setValue(weather_df.tail(1)['windspeed'])
        #strfwi = re.findall("[-+]?[0-9]*\.?[0-9]+", str(weather_df.tail(1)['ffwi']))
        #self.lineEdit_PM_calcFWI.setText(strfwi[0])
        dttmstamp = datetime.utcfromtimestamp(weather_df.tail(1)['timestamp'])
        self.dateTimeEdit_PM_datetime.setDateTime(dttmstamp)
        
    def h2oinitfunc(self):
        h2o.init()
        if str(h2o.connection())=="<H2OConnection to http://localhost:54321, no session>":
            self.lineEdit_PM_h2o_response.setText("Connection to H2O cluster Successful")
        else:
            self.lineEdit_PM_h2o_response.setText("Connection to H2O cluster Failed")            
        
    def timed_job(self):

        conn = sqlite3.connect('serm.db')

        with conn:
            
            df = pd.read_sql_query("SELECT * from data", conn);
            df.humidity = np.array(df.humidity.astype(float))
            df.temperature = np.array(df.temperature.astype(float))
            df.smoke = np.array(df.smoke.astype(float))
            df.co = np.array(df.co.astype(float))
            df.lpg = np.array(df.lpg.astype(float))
            df.windspeed = np.array(df.windspeed.astype(float)) 
            df.ffwi = np.array(df.ffwi.astype(float))                    
            datetm = calendar.timegm(time.strptime(str(time.strftime('%Y-%m-%d %H:%M:%S')), '%Y-%m-%d %H:%M:%S'))
            datedt = time.strftime('%Y-%m-%d %H:%M:%S')
            winddir = df.winddir.tail(1).iget(0)

            predict_risk.input['FFWI'] = df.ffwi.mean()
            predict_risk.input['SMOKE'] = df.smoke.mean()
            predict_risk.compute()
            
            risk = predict_risk.output['RISK']
            
            conn.execute("INSERT INTO data_means(timestamp,datetime,smoke,lpg,co,temperature,humidity,windspeed,winddir,ffwi,risk) VALUES (?,?,?,?,?,?,?,?,?,?,?)", (datetm,datedt,round(df.smoke.mean(),3),round(df.lpg.mean(),3),round(df.co.mean(),3),round(df.temperature.mean(),3),round(df.humidity.mean(),3),round(df.windspeed.mean(),3),winddir,round(df.ffwi.mean(),3),round(risk,3)))
            conn.commit()
            
            sql = "DELETE FROM data WHERE recid <= ( SELECT recid FROM (SELECT recid FROM data ORDER BY recid DESC LIMIT 1 OFFSET 20)foo)"
            conn.execute(sql)
            conn.commit()

#        self.lcdNumber_ffwi.display(str(round(df.ffwi.mean(),-1)))           
        self.lcdNumber_ffwi.display(str(df.ffwi.mean()))
        self.lcdNumber_risk.display((risk))
        
        palette = QtGui.QPalette()

        if risk < 10:
            palette.setColor(QtGui.QPalette.Foreground,QtCore.Qt.green)
            self.lbl_RiskStateValue.setPalette(palette)
            self.lbl_RiskStateValue.setText("LOW")
        elif risk >= 10 and risk < 30:
            palette.setColor(QtGui.QPalette.Foreground,QtCore.Qt.yellow)
            self.lbl_RiskStateValue.setPalette(palette)
            self.lbl_RiskStateValue.setText("AVERAGE")
        else:
            palette.setColor(QtGui.QPalette.Foreground,QtCore.Qt.red)
            self.lbl_RiskStateValue.setPalette(palette)
            self.lbl_RiskStateValue.setText("HIGH")
            sound = QSound("smoke-detector-1.wav")
            sound.play() 
                    
    def setclock(self,):
        self.dateTimeEdit.setDateTime(datetime.now())  

    def rmmpl(self,):
        self.gridLayout.removeWidget(self.canvas)
        self.canvas.close()
            
    def addmpl(self,fig):
        self.canvas = FigureCanvas(fig)
        self.gridLayout.addWidget(self.canvas)
        self.canvas.draw()
        
    def wunderground(self):
        webURL = urllib.request.urlopen('http://api.wunderground.com/api/3efe05c687cbcdcb/geolookup/conditions/q/GR/Tripolis.json')
        json_string = webURL.read()
        encoding = webURL.info().get_content_charset('utf-8')
        parsed_json = json.loads(json_string.decode(encoding))
        temp_f = parsed_json['current_observation']['temp_c']
        relative_humidity = parsed_json['current_observation']['relative_humidity']
        wind_dir = parsed_json['current_observation']['wind_dir']
        wind_kph = parsed_json['current_observation']['wind_kph']
        self.ln_ctmp.setText(str(temp_f))
        self.ln_relh.setText(str(relative_humidity))
        self.ln_wndsp.setText(str(wind_kph))
        self.ln_wnd.setText(str(wind_dir))
        webURL.close()
예제 #17
0
class MainWindodw(QMainWindow, Ui_MainWindow):
    """main window of application"""
    def __init__(self):
        super(MainWindodw, self).__init__()
        self.setupUi(self)
        self.isTrigMode = False
        self.isRunMode = False
        self.button_list = [self.run_radio_button,
                            self.trig_radio_button,
                            self.run_push_button]
        self.data = []
        self.freq = []
        self.res = []

        # implement button's function
        self.trig_radio_button.clicked.connect(self.trig_toggled)
        self.run_radio_button.clicked.connect(self.run_toggled)
        self.run_push_button.clicked.connect(self.run_pushed)
        self.stop_push_button.clicked.connect(self.stop_pushed)
        self.saveraw_push_button.clicked.connect(self.saveraw_pushed)
        self.savefft_push_button.clicked.connect(self.savefft_pushed)

        # add empty plot
        fig1 = Figure()
        axfig1 = fig1.add_subplot(111)
        axfig1.plot()
        self.add_rawmpl(fig1)

        fig2 = Figure()
        axfig2 = fig2.add_subplot(111)
        axfig2.plot()
        self.add_fftmpl(fig2)

        thread = QtCore.QThread()
        self.reader = SerialReader()
        self.reader.moveToThread(thread)
        self.reader.sig_status.connect(self.serial_plot)
        self.reader.sig_termino.connect(self.enable_button)

    def add_rawmpl(self, fig):
        self.raw_canvas = FigureCanvas(fig)
        self.vl_raw.addWidget(self.raw_canvas)
        self.raw_canvas.draw()
        self.raw_toolbar = NavigationToolbar(self.raw_canvas,
            self, coordinates=True)
        self.vl_raw.addWidget(self.raw_toolbar)

    def add_fftmpl(self, fig):
        self.fft_canvas = FigureCanvas(fig)
        self.vl_fft.addWidget(self.fft_canvas)
        self.fft_canvas.draw()
        self.fft_toolbar = NavigationToolbar(self.fft_canvas,
            self, coordinates=True)
        self.vl_fft.addWidget(self.fft_toolbar)

    def remove_rawmpl(self):
        self.vl_raw.removeWidget(self.raw_canvas)
        self.raw_canvas.close()
        self.vl_raw.removeWidget(self.raw_toolbar)
        self.fft_toolbar.close()

    def remove_fftmpl(self):
        self.vl_fft.removeWidget(self.fft_canvas)
        self.fft_canvas.close()
        self.vl_fft.removeWidget(self.fft_toolbar)
        self.fft_toolbar.close()

    def trig_toggled(self):
        print('trig is toggled')
        self.isTrigMode = True
        self.isRunMode = False

    def run_toggled(self):
        print('run is toggled')
        self.isTrigMode = False
        self.isRunMode = True

    def run_pushed(self):
        if self.isTrigMode: self.reader.mode = b't'
        elif self.isRunMode: self.reader.mode = b'r'
        else:
            self.errorDialog('Select Mode')
            return
        self.disable_button()
        self.reader.run()
        time.sleep(5)

    def stop_pushed(self):
        self.reader.stop()
        self.reader.serial_close()

    def saveraw_pushed(self):
        if not self.data:
            self.errorDialog('No measurement')
            return
        filepath = QtGui.QFileDialog.getSaveFileName(filter='*.dat')[0]
        with open(filepath, 'w') as f:
            for item in self.data:
                f.write(str(item) + '\n')

    def savefft_pushed(self):
        if not self.freq:
            self.errorDialog('No measurement')
            return
        filepath = QtGui.QFileDialog.getSaveFileName(filter='*.dat')[0]
        with open(filepath, 'w') as f:
            for fre, res in zip(self.freq, self.res):
                f.write(str(fre) + ' ' + str(res) + '\n')

    def serial_plot(self, data):
        self.remove_rawmpl()
        self.remove_fftmpl()
        self.data = data
        self.freq, self.res = sig_fft(data, 1.0/20000)
        fig1 = Figure()
        axfig1 = fig1.add_subplot(111)
        axfig1.plot(self.data)
        fig2 = Figure()
        axfig2 = fig2.add_subplot(111)
        axfig2.plot(self.freq, self.res)
        self.add_rawmpl(fig1)
        self.add_fftmpl(fig2)

    def enable_button(self):
        for btn in self.button_list:
            btn.setEnabled(True)

    def disable_button(self):
        for btn in self.button_list:
            btn.setEnabled(False)

    def errorDialog(self, message):
        e = QtGui.QErrorMessage()
        e.showMessage(message)
        e.exec_()
예제 #18
0
class Main(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        
        icon = QtGui.QIcon(':/Icon.png')
        self.setWindowIcon(icon)
        
        self.coeffWH = CAPTUREHEIGHT/CAPTUREWIDTH
        
        self.objectName = self.objectLine.text()
        
        self.path = PATH
        self.directoryLine.setText(self.path)

        self.camara = CAMARA
        self.camaraLine.setText(self.camara)        
        
        self.status = False
        self.cam = None
        
        self.posSlider.valueChanged.connect(self.posChange)    
        
        self.sizeSlider.valueChanged.connect(self.sizeChange)    
        
        self.brightnessSlider.valueChanged.connect(self.brightnessChange)        
        self.contrastSlider.valueChanged.connect(self.contrastChange)
        self.saturationSlider.valueChanged.connect(self.saturationChange)
        self.hueSlider.valueChanged.connect(self.hueChange)        
        self.gainSlider.valueChanged.connect(self.gainChange)
        self.exposureSlider.valueChanged.connect(self.exposureChange)
        
        self.enable_camara_change.changed.connect(self.enableCamaraChangerAction)
        self.actionSave_in.triggered.connect(self.saveFiles)
        self.actionSave_in.setShortcut('Ctrl+S')
        self.aboutAction.triggered.connect(self.about)
        self.filesListWidget.currentRowChanged.connect(self.updateFileImage)
        
        self.startstopButton.clicked.connect(self.startStop)
        self.captureButton.clicked.connect(self.captureData)
        self.cleanButton.clicked.connect(self.cleanPlot)
        self.resetButton.clicked.connect(self.resetSettings)
        self.getFilesButton.clicked.connect(self.getfiles)
        self.analyzeButton.clicked.connect(self.analyzeImages)
        self.saveButton.clicked.connect(self.saveFiles)
        self.clearFilesButton.clicked.connect(self.clearFiles)
        self.comboBox_2.addItem("680 x 480")
        self.comboBox_2.addItem("1280 x 720")
#        self.comboBox_2.addItem("1920 x 1080")
         
        self.comboBox_2.activated[str].connect(self.resolutionBox)
        
        self.canvas = None
        self.filenames = []
        self.imagesFig = None
        self.namesOnly = []
        self.plot = None
        
    def enableCamaraChangerAction(self):
        value = self.enable_camara_change.isChecked()
        self.camaraLine.setEnabled(value)

    def startStop(self):
        self.camaraLine.setEnabled(False)
        if self.status:
            if self.cam != None:
                self.cam.closeInput()
                self.timer.stop()
                self.cam = None
            self.status = not self.status
            self.statusLabel.setText("Stopped")
            self.statusLabel.setStyleSheet('color: red')         
        else:
            self.status = not self.status
            self.videoStream()
            self.update()
            if self.cam != None:
                self.statusLabel.setText("Streaming")
                self.statusLabel.setStyleSheet('color: green')
            else:
                self.status = True
        
        if self.enable_camara_change.isChecked():
            self.enable_camara_change.setChecked(False)
        
    def videoStream(self):
        self.camara = self.camaraLine.text()
        if self.camara.isdigit():
            self.camara = int(self.camara)
        try:
            self.cam = specpy.GuiWindow("Stream", self.camara, self.objectName, STREAMWIDTH, STREAMHEIGHT, PATH, 
                                   POS, SIZE, BRIGHTNESS, CONTRAST, SATURATION, HUE,
                                   GAIN, EXPOSURE, "canvas")
            self.resolutionBox(self.comboBox_2.currentText())
            self.posChange()
            self.sizeChange()
            self.brightnessChange()
            self.contrastChange()
            self.saturationChange()
            self.hueChange()
            self.gainChange()
            self.exposureChange()
        except:
            w = QtGui.QWidget()
            QtGui.QMessageBox.critical(w, "Error", "An error has occurred. Try another camara")
            self.cam = None
        if self.cam != None:
            self.updateImage()
            self.fig_num = 0              
        
    def qImage(self, width, height, bytesPerLine):
        qImg = QtGui.QImage(self.cam.frame.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888)
        pix = QtGui.QPixmap(qImg)
        return pix
        
    def keyPressEvent(self, event):
        keyPressed = event.key()
        if keyPressed == QtCore.Qt.Key_Alt + QtCore.Qt.Key_F4: 
            self.cam.closeInput()
            self.close()
        elif keyPressed == QtCore.Qt.Key_Enter - 1:
            self.captureData()
        elif keyPressed == QtCore.Qt.Key_C:
            self.cleanPlot()
        elif keyPressed == QtCore.Qt.Key_R:
            self.resetSettings()
        elif keyPressed == QtCore.Qt.Key_Space:
            self.startStop()
        
    def updateImage(self):
        if self.cam == None:
            return
        width = self.CamaraStream.frameGeometry().width()
        height = int(self.coeffWH*width)
        realHeight = self.CamaraStream.frameGeometry().height()
        if height > realHeight:
            width = int(realHeight/self.coeffWH)
            height = realHeight
        self.cam.changeHeight(height)
        self.cam.changeWidth(width)
        bytesPerLine = 3*width
        answer = self.cam.eachPhotogram()
        if answer:
            pix = self.qImage(width, height, bytesPerLine)
            self.CamaraStream.setPixmap(pix)
        
    def update(self):
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.updateImage)
        self.timer.start(33)

        # Creates first plot
        self.updatePlot()
        
    def updatePlot(self):
        """
            Updates plot
        """
        def create():
            if self.cam == None:
                figure = self.imagesFig
            else:
                figure = self.cam.figure
            if figure != None:
                self.canvas = FigureCanvas(figure)
                self.figureFrame.addWidget(self.canvas)
                self.canvas.draw()
            else:
                self.canvas == None
                
        def removePlot():
            self.figureFrame.removeWidget(self.canvas)
            self.canvas.close()
        if self.cam == None and self.imagesFig == None:
            return
        if self.canvas == None:
            create()
        else:
            removePlot()
            create()
            
    def posSliderLimits(self):
        self.posSlider.setMinimum(0)
        temp = self.cam.analysisHeight
        self.posSlider.setMaximum(temp)
        self.posSlider.setValue(int(temp/2))
        
    def sizeSliderLimits(self):
        self.sizeSlider.setMinimum(0)
        temp = self.cam.analysisHeight
        self.sizeSlider.setMaximum(int(temp/2))
        self.sizeSlider.setValue(int(temp/4))
    
    def posChange(self):
        size = self.posSlider.value()
        if not self.status:
            self.camaraWarning()
            return
        self.cam.posTrackBar(size)
        
    def sizeChange(self):
        size = self.sizeSlider.value()
        if not self.status:
            self.camaraWarning()
            return
        self.cam.rangeTrackBar(size)
        
    def brightnessChange(self):
        size = self.brightnessSlider.value()
        if not self.status:
            self.camaraWarning()
            return
        self.cam.brightnessTrackBar(size)
        
    def contrastChange(self):
        size = self.contrastSlider.value()
        if not self.status:
            self.camaraWarning()
            return
        self.cam.contrastTrackBar(size)

    def saturationChange(self):
        size = self.saturationSlider.value()
        if not self.status:
            self.camaraWarning()
            return
        self.cam.saturationTrackBar(size)
        
    def hueChange(self):
        size = self.hueSlider.value()
        if not self.status:
            self.camaraWarning()
            return
        self.cam.hueTrackBar(size)
        
    def gainChange(self):
        size = self.gainSlider.value()
        if not self.status:
            self.camaraWarning()
            return
        self.cam.gainTrackBar(size)

    def exposureChange(self):
        size = self.exposureSlider.value()
        if not self.status:
            self.camaraWarning()
            return
        self.cam.exposureTrackBar(size)      
    
    def captureData(self):
        if not self.status:
            self.camaraWarning()
            return
        self.objectNameChanger()
        self.pathChanger()
        self.fig_num = self.cam.captureData(self.cam.notSquaredAnalysisFrame, self.fig_num)
        self.updatePlot()
        
    def resetSettings(self):
        if self.cam == None:
            self.camaraWarning()
            return
        self.cam.resetSettings(POS, SIZE, BRIGHTNESS, CONTRAST, SATURATION, HUE, GAIN, EXPOSURE)
        self.posSlider.setValue(POS)
        self.sizeSlider.setValue(SIZE)        
        self.brightnessSlider.setValue(BRIGHTNESS)
        self.contrastSlider.setValue(CONTRAST)
        self.saturationSlider.setValue(SATURATION)
        self.hueSlider.setValue(HUE)
        self.gainSlider.setValue(GAIN)
        self.exposureSlider.setValue(EXPOSURE)
#        self.path = PATH
#        self.directoryLine.setText(self.path)
        self.objectName = ""
        self.objectLine.setText(self.objectName)
        self.comboBox_2.setCurrentIndex(0)
        self.resolutionBox(self.comboBox_2.currentText())
        
    def closeEvent(self, event):
        if self.cam != None:
            self.cam.closeInput()
            self.timer.stop()
        self.close()
        
    def resolutionBox(self, text):
        parted_line = text.rpartition('x')
        width, _, height = parted_line
        width = int(width)
        height = int(height)
        self.coeffWH = height/width
        self.cam.setCaptureHeight(height)
        self.cam.setCaptureWidth(width)
        self.posSliderLimits()
        self.sizeSliderLimits()
        
    def objectNameChanger(self):
        self.objectName = self.objectLine.text()
        self.cam.objectName = self.objectName
#        print(text)
        
    def pathChanger(self):
        self.path = self.directoryLine.text()
        self.cam.path = self.path
        self.pathCleaner(False)
#        
    def pathCleaner(self, delete):
        import os, glob
        if not os.path.exists(self.path):
            os.makedirs(self.path)
        if delete:
            temp = glob.glob(self.path+'/*.jpg')
            temp2 = glob.glob(self.path+'/*.csv')
            temp += temp2
            for item in temp:
                os.remove(item)
                
    def cleanPlot(self):
        if self.plot != None:
            self.plot.cleanLines()
            self.updatePlot()
            
        if self.status:
            self.cam.cleanData()
            self.updatePlot()
            
        if self.plot == None and self.cam == None:
            self.camaraWarning()
        
    def about(self):            
        about = QtGui.QMessageBox()
        about.setIcon(QtGui.QMessageBox.Question)
        about.setWindowTitle("About")
        about.setText(
                    "Using a simple USB webcamara SpecPy is capable of recording frames "
                    + "as intensity data. With a Graphical User Interface based on Qt, "
                    + "camara settings are simple to control. Recorded frames are stored "
                    + "inside a dedicated folder, along with the generated data, thus "
                    + "allowing further analysis. <br><br>"
                    + "More in formation can be found at the <a href=https://github.com/jsbarbosa/SpecPy>repository</a>."
                    )
        about.exec()
        
    def camaraWarning(self):
        warning = QtGui.QMessageBox()
        warning.setIcon(QtGui.QMessageBox.Warning)
        warning.setWindowTitle("Warning")
        warning.setText("Please start streaming.")
        warning.exec()
        
    def getfiles(self):
        dlg = QtGui.QFileDialog()
        dlg.setFileMode(QtGui.QFileDialog.AnyFile)
        fileFilter = "Images (*.jpg *.jpeg *.png)"
        filenames = dlg.getOpenFileNames(self, filter = fileFilter)
        for file in filenames:
            self.filenames.append(file)
        self.filesListWidget.clear()
        self.updateFileList()
        
    def saveFiles(self):
        dlg = QtGui.QFileDialog()
        file = dlg.getExistingDirectory(self)
        while file == "":
            w = QtGui.QWidget()
            QtGui.QMessageBox.critical(w, "Error", "No path has been specified.")
            file = dlg.getExistingDirectory(self)
        self.path = file
        self.directoryLine.setText(self.path)
    
    def clearFiles(self):
        self.filenames = []
        self.filesListWidget.clear()
        
    def updateFileList(self):
        self.namesOnly = []
        if PLATFORM == "Linux":
            breaker = '/'
        else:
            breaker = '\\'
        for file in self.filenames:
            temp = file.rpartition(breaker)
            self.namesOnly.append(temp[-1])
            path = temp[:-1][0]
        self.inputLineEdit.setText(path)
        self.filesListWidget.addItems(self.namesOnly)
        
    def updateFileImage(self, pos):
        pix = QtGui.QPixmap(self.filenames[pos])

        coeff = pix.height()/pix.width()
        
        width = self.fileViewer.frameGeometry().width()
        height = int(coeff*width)
        realHeight = self.fileViewer.frameGeometry().height()
        if height > realHeight:
            width = int(realHeight/coeff)
            height = realHeight
        pix = pix.scaled(width, height, QtCore.Qt.KeepAspectRatio)
        self.fileViewer.setPixmap(pix)
        
    def analyzeImages(self):
        if self.cam != None:
            w = QtGui.QWidget()
            QtGui.QMessageBox.critical(w, "Error", "SpecPy is streaming.")
            return
            
        if self.filenames == []:
            w = QtGui.QWidget()
            QtGui.QMessageBox.critical(w, "Error", "No files loaded.")
            return
        
        class WorkThread(QtCore.QThread, Main):
            def __init__(self, plot, imagesFig, filenames, namesOnly, path):
                QtCore.QThread.__init__(self)
                
                self.plot = plot
                self.imagesFig = imagesFig
                self.filenames = filenames
                self.namesOnly = namesOnly
                self.path = path
            def __del__(self):
                self.wait()
                
            def run(self):             
                self.plot = specpy.RealTimePlot(1,1)
                i = 0       
                for (file, name) in zip(self.filenames, self.namesOnly):
                    capturedframe = specpy.CapturedFrame(file, name, "", None, None, self.path)
                    self.plot.width = capturedframe.width
                    self.plot.changeAxes()
                    self.plot.includeCapturedFrame(capturedframe)
                    self.imagesFig = self.plot.figureReturn()
                    if i <= 3:
                        self.plot.ax2.set_ylim(0, capturedframe.height*255)
                    i += 1                
                    self.emit(QtCore.SIGNAL('update(QString)'), str(i))
                self.terminate
                    
        self.pathCleaner(False) 
        number = len(self.filenames)
        progressBar_unit = int(100/number)
        def threadUpdate(pos):
            pos = int(pos)
            self.progressBar.setValue(pos*progressBar_unit)
            self.currentFileLabel.setText(self.namesOnly[pos-1])
            if pos == number:
                self.progressBar.setValue(100)
                self.plot = self.workThread.plot
                self.imagesFig = self.workThread.imagesFig
                self.updatePlot()
        
        self.workThread = WorkThread(self.plot, self.imagesFig, self.filenames, self.namesOnly, self.path)
        self.connect(self.workThread, QtCore.SIGNAL("update(QString)"), threadUpdate)
        self.workThread.start()
예제 #19
0
class Main(QtGui.QWidget):
    def __init__(self, parent = None):
        super(Main, self).__init__(parent)
        self.setWindowTitle('Data Chest Image Browser')
        # Add in Rabi plot.
        self.setWindowIcon(QtGui.QIcon('rabi.jpg'))
        
        self.root = os.environ["DATA_CHEST_ROOT"]
        self.pathRoot=QtCore.QString(self.root)

        self.filters =QtCore.QStringList()
        self.filters.append("*.hdf5")

        self.dataChest = dataChest(None, True)

        # Directory browser configuration.
        self.model = QtGui.QFileSystemModel(self)
        self.model.setRootPath(self.pathRoot)
        self.model.setNameFilterDisables(False)
        self.model.nameFilterDisables()
        self.model.setNameFilters(self.filters)

        self.indexRoot = self.model.index(self.model.rootPath())

        self.directoryBrowserLabel = QtGui.QLabel(self)
        self.directoryBrowserLabel.setText("Directory Browser:")
        
        self.directoryTree = QtGui.QTreeView(self)
        self.directoryTree.setModel(self.model)
        self.directoryTree.setRootIndex(self.indexRoot)
        self.directoryTree.header().setResizeMode(QtGui.QHeaderView.ResizeToContents)
        self.directoryTree.header().setStretchLastSection(False)
        self.directoryTree.clicked.connect(self.dirTreeSelectionMade)
        
        # Plot types drop down list configuration.
        self.plotTypesComboBoxLabel = QtGui.QLabel(self)
        self.plotTypesComboBoxLabel.setText("Available Plot Types:")

        self.plotTypesComboBox = QtGui.QComboBox(self)
        self.plotTypesComboBox.activated[str].connect(self.plotTypeSelected)

        # Configure scrolling widget.
        self.scrollWidget = QtGui.QWidget(self)
        self.scrollLayout = QtGui.QHBoxLayout(self)
        self.scrollWidget.setLayout(self.scrollLayout)
        self.scrollArea = QtGui.QScrollArea(self)
        self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        self.scrollArea.setWidget(self.scrollWidget)
        self.scrollArea.setWidgetResizable(True) # What happens without?
       
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.directoryBrowserLabel)
        vbox.addWidget(self.directoryTree)
        vbox.addWidget(self.plotTypesComboBoxLabel)
        vbox.addWidget(self.plotTypesComboBox)
        vbox.addWidget(self.scrollArea)

        self.mplwindow =QtGui.QWidget(self)
        self.mplvl = QtGui.QVBoxLayout(self.mplwindow)

        hbox = QtGui.QHBoxLayout()
        hbox.addLayout(vbox)
        hbox.addWidget(self.mplwindow)
        self.setLayout(hbox)

        self.currentFig = Figure()
        self.addFigureToCanvas(self.currentFig)
        
        self.filePath = None # redundant
        self.fileName = None # redundant
        self.plotType = None # redundant
        self.varsToIgnore = []

    def plotTypeSelected(self, plotType):
        # Called when a plotType selection is made from drop down.
        # self.plotTypesComboBox.adjustSize()
        if plotType != self.plotType:
            self.removeFigFromCanvas()
            self.currentFig = self.figFromFileInfo(self.filePath, self.fileName, selectedPlotType = plotType)
            self.addFigureToCanvas(self.currentFig)
            self.updatePlotTypeOptions(plotType)
            self.plotType = plotType
            # When is best time to do this?
            self.varsToIgnore = []

    def updatePlotTypeOptions(self, plotType, depVarName = None):
        # Update area below plotType, selection drop down (add/remove variables)
        self.clearLayout(self.scrollLayout)
        if plotType == "1D" or plotType == "Histogram":
            headerList = ["Dep Var:", "Status:"]
            widgetTypeList = ["QLabel", "QCheckBox"]
            depVarList = [row[0] for row in self.dataChest.getVariables()[1]]
            for ii in range(0,len(headerList)):
                optionsSlice = QtGui.QVBoxLayout()
                label = QtGui.QLabel(self) # widget to log
                label.setText(headerList[ii])
                optionsSlice.addWidget(label)
                for depVar in depVarList:
                    if widgetTypeList[ii] =="QLabel":
                        label = QtGui.QLabel(self) # widget to log
                        label.setText(depVar)
                        optionsSlice.addWidget(label)
                    elif widgetTypeList[ii] =="QCheckBox":
                        checkBox = QtGui.QCheckBox('', self)  # widget to log
                        checkBox.setCheckState(QtCore.Qt.Checked)
                        checkBox.stateChanged.connect(partial(self.varStateChanged, depVar))
                        optionsSlice.addWidget(checkBox)
                optionsSlice.addStretch(1)
                self.scrollLayout.addLayout(optionsSlice)
            self.scrollLayout.addStretch(1)
        elif plotType == '2D Image':
            headerList = ["Dep Var:", "Status:"]
            widgetTypeList = ["QLabel", "QCheckBox"]
            depVarList = [row[0] for row in self.dataChest.getVariables()[1]]
            if depVarName is None:
                depVarName = depVarList[0]
            for ii in range(0,len(headerList)):
                optionsSlice = QtGui.QVBoxLayout()
                label = QtGui.QLabel(self) # widget to log
                label.setText(headerList[ii])
                optionsSlice.addWidget(label)
                for depVar in depVarList:
                    if widgetTypeList[ii] =="QLabel":
                        label = QtGui.QLabel(self) # widget to log
                        label.setText(depVar)
                        optionsSlice.addWidget(label)
                    elif widgetTypeList[ii] =="QCheckBox":
                        checkBox = QtGui.QCheckBox('', self)  # widget to log
                        print "depVarName=", depVarName
                        if depVar == depVarName:
                            checkBox.setCheckState(QtCore.Qt.Checked)
                        checkBox.stateChanged.connect(partial(self.varStateChanged, depVar))
                        optionsSlice.addWidget(checkBox)
                optionsSlice.addStretch(1)
                self.scrollLayout.addLayout(optionsSlice)
            self.scrollLayout.addStretch(1)

    def clearLayout(self, layout):
        # Clear the plotType options layout and all widgets therein.
        for i in reversed(range(layout.count())):
            item = layout.itemAt(i)
            
            if isinstance(item, QtGui.QWidgetItem):
                item.widget().close()
            elif not isinstance(item, QtGui.QSpacerItem):
                self.clearLayout(item.layout())
            # remove the item from layout
            layout.removeItem(item) 

    def varStateChanged(self, name, state):
        # Add/remove variables from current displayed plot.
        if state == QtCore.Qt.Checked:
            self.varsToIgnore.remove(name)
            # Remove old figure, needs garbage collection too.
            self.removeFigFromCanvas()
            self.currentFig = self.figFromFileInfo(self.filePath,
                                                   self.fileName,
                                                   selectedPlotType=self.plotType,
                                                   varsToIgnore =self.varsToIgnore) 
            self.addFigureToCanvas(self.currentFig)
        else: # unchecked
            if name not in self.varsToIgnore:
                self.varsToIgnore.append(name)
            # Remove old figure, needs garbage collection too.
            self.removeFigFromCanvas()
            self.currentFig = self.figFromFileInfo(self.filePath,
                                                   self.fileName,
                                                   selectedPlotType=self.plotType,
                                                   varsToIgnore=self.varsToIgnore)
            self.updatePlotTypeOptions(self.plotType, '')
            self.addFigureToCanvas(self.currentFig)

    def convertPathToArray(self, path):
        if self.root + "/" in path:
            path = path.replace(self.root+"/", '')
        elif self.root in path:
            path = path.replace(self.root, '')
        return path.split('/')
        
    def addFigureToCanvas(self, fig):
        # Addsmpl fig to the canvas.
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, 
                self.mplwindow, coordinates=True)
        self.mplvl.addWidget(self.toolbar)

    def removeFigFromCanvas(self):
        # Remove fig from the canvas.
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
        self.currentFig.clf()
        
    @QtCore.pyqtSlot(QtCore.QModelIndex) # logical flow could be improved
    def dirTreeSelectionMade(self, index):
        # Called when a directory tree selection is made.
        indexItem = self.model.index(index.row(), 0, index.parent())
        fileName = str(self.model.fileName(indexItem))
        filePath = str(self.model.filePath(indexItem))

        if ".hdf5" in filePath:
            # Removes fileName from path if file is chosen.
            filePath = filePath[:-(len(fileName)+1)]

        if self.fileName != fileName or self.filePath != filePath:
            # If an actual change occurs update check what happens for
            # just a folder.
            self.filePath = filePath # Is there a point in storing this?
            self.fileName = fileName
            
            if ".hdf5" in fileName:
                # fileName is not a directory, otherwise leave as is
                # till a file is selected.
                self.removeFigFromCanvas()
                # Remove old figure, needs garbage collection too.
                self.currentFig = self.figFromFileInfo(self.filePath, self.fileName)
                self.addFigureToCanvas(self.currentFig)
                variables = self.dataChest.getVariables() # fine
                dataCategory = self.categorizeDataset(variables) # fine
                self.updatePlotTypesList(self.supportedPlotTypes(dataCategory)) # fine: updates list
                self.updatePlotTypeOptions(self.supportedPlotTypes(dataCategory)[0])
                self.plotType = self.supportedPlotTypes(dataCategory)[0]
                self.varsToIgnore = [] # When is best time to do this?
            else:
                self.fileName = None
                           
    def updatePlotTypesList(self, plotTypes):
        # Update plotTypes list based on selected dataset.
        self.plotTypesComboBox.clear()
        for element in plotTypes:
            if ".dir" not in str(element) and ".ini" not in str(element):
                self.plotTypesComboBox.addItem(str(element))
   
    def categorizeDataset(self, variables):
        # Categorizes dataset, this is now redundant.
        indepVarsList = variables[0]
        numIndepVars = len(indepVarsList)
        if numIndepVars == 1:
            return "1D"
        elif numIndepVars == 2:
            return "2D"
        else:
            return (str(numIndepVars)+"D")

    def supportedPlotTypes(self, dimensionality):
        # Provide list of plotTypes based on datasetType.
        if dimensionality == "1D":
            plotTypes = ["1D", "Histogram"]
        elif dimensionality == "2D":
            plotTypes = ["2D Image"]
        else:
            plotTypes = []
        return plotTypes

    # Some shape checking needs to go into this function to ensure 
    # 1D array inputs.
    def plot1D(self, dataset, variables, plotType, dataClass, varsToIgnore = []):
        # Shorten this monstrosity!
        # print "varsToIgnore=", varsToIgnore
        if plotType == None:
            plotType = self.supportedPlotTypes("1D")[0] # defaults
        elif plotType not in self.supportedPlotTypes("1D"):
            print "Unrecognized plot type was provided"
            # Return bum fig with something cool, maybe a gif.
        if plotType =="1D":
            fig = self.basic1DPlot(dataset, variables, varsToIgnore)
        elif plotType == "Histogram":
            # Adjust bin size.
            fig = self.basic1DHistogram(dataset, variables, varsToIgnore)
        return fig

    # Some shape checking needs to go into this function to ensure 
    # 2D array inputs.
    def plot2D(self, dataset, variables, plotType, dataClass, varsToIgnore = []):
        # Shorten this monstrosity!
        # print "varsToIgnore=", varsToIgnore
        if plotType == None:
            plotType = self.supportedPlotTypes("2D")[0] #defaults
        elif plotType not in self.supportedPlotTypes("2D"):
            print "Unrecognized plot type was provided"
            # Return bum fig with something cool, maybe a gif.
        if plotType =="2D Image":
            fig = self.basic2DImage(dataset, variables, varsToIgnore)
        #elif plotType == "Histogram": #adjust bin size
        #    fig = self.basic1DHistogram(dataset, variables, varsToIgnore)
        return fig

    def basic2DImage(self, dataset, variables, varsToIgnore):
        fig = Figure(dpi=100)
        ax = fig.add_subplot(111)
        indepVars = variables[0]
        depVars = variables[1]
        if varsToIgnore == [depVars[ii][0] for ii in range(0,len(depVars))]:
            return fig
        dataset = np.asarray(dataset)
        print dataset[0]
        xlabel = self.dataChest.getParameter("X Label", True)
        if xlabel is None:
            xlabel = indepVars[0][0]
        ylabel = self.dataChest.getParameter("Y Label", True) 
        if ylabel is None:
            # For data with more than one dep, recommend ylabel.
            ylabel = depVars[0][0]
        plotTitle = self.dataChest.getParameter("Plot Title", True)
        if plotTitle is None:
            plotTitle = self.dataChest.getDatasetName()
        ax.set_title(plotTitle)
        ax.set_xlabel(xlabel+" "+"("+indepVars[0][3]+")")
        ax.set_ylabel(ylabel+" "+"("+depVars[0][3]+")")
        # For multiple deps with different units this is ambiguous.
        imageType = self.dataChest.getParameter("Image Type", True)
        if imageType is None:
            # Add or "scatter"
            imageType = "Scatter"
            print "Scatter"
            for ii in range(0, len(depVars)):
                x = dataset[::,0]
                y = dataset[::,1]
                z = dataset[::,2]
                im = ax.tricontourf(x,y,z, 100, cmap=cm.gist_rainbow, antialiased=True)
                fig.colorbar(im, fraction = 0.15)
                break
        elif imageType == "Pixel":
            xGridRes = self.dataChest.getParameter("X Resolution", True)
            xIncrement = self.dataChest.getParameter("X Increment", True)
            yGridRes = self.dataChest.getParameter("Y Resolution", True)
            yIncrement = self.dataChest.getParameter("Y Increment", True)
            x = dataset[::,0].flatten()
            y = dataset[::,1].flatten()
            z = dataset[::,2].flatten()
            if len(x)>1:
                if x[0]==x[1]:
                    sweepType = "Y"
                else:
                    sweepType = "X"
                print "sweepType=", sweepType
                new = self.makeGrid(x, xGridRes, xIncrement, y, yGridRes, yIncrement, sweepType, z) #makeGrid(self, x, xGridRes, dX, y, yGridRes, dY, sweepType, z)
                X = new[0]
                Y = new[1]
                Z = new[2]
                im = ax.imshow(Z, extent=(X.min(), X.max(), Y.min(), Y.max()), interpolation='nearest', cmap=cm.gist_rainbow, origin='lower')
                fig.colorbar(im, fraction = 0.15)
            else:
                print "return jack shit"
        elif imageType == "Buffered":
            print "Buffered"
        return fig
    
    def basic1DPlot(self, dataset, variables, varsToIgnore):
        fig = Figure(dpi=100)
        ax = fig.add_subplot(111)
        indepVars = variables[0]
        depVars = variables[1]
        containsDatetime = False
        for ii in range(0, len(indepVars)):
            if 'utc_datetime' in indepVars[ii]:
                containsDatetime = True

        scanType = self.dataChest.getParameter("Scan Type", True)
        xlabel = self.dataChest.getParameter("X Label", True)
        if xlabel is None:
            xlabel = indepVars[0][0]
        ylabel = self.dataChest.getParameter("Y Label", True) 
        if ylabel is None:
            # For data with more than one dep, recommend ylabel.
            ylabel = depVars[0][0]
        plotTitle = self.dataChest.getParameter("Plot Title", True)
        if plotTitle is None:
            plotTitle = self.dataChest.getDatasetName()
        ax.set_title(plotTitle)
        dataset = np.asarray(dataset)
        ax.set_xlabel(xlabel+" "+"("+indepVars[0][3]+")")
        ax.set_ylabel(ylabel+" "+"("+depVars[0][3]+")")
        # For multiple deps with different units this is ambiguous.
        for ii in range(0, len(depVars)):
            if depVars[ii][0] not in varsToIgnore:
                if scanType is None:
                    x = dataset[::,0].flatten()
                    # Only works when all dims are same => perform checks.
                    y = dataset[::,1+ii].flatten()
                    if containsDatetime:
                        months = MonthLocator(range(1, 13), bymonthday=1, interval=3)
                        monthsFmt = DateFormatter("%b %d %Y %H:%M:%S")
                        mondays = WeekdayLocator(MONDAY)
                        ax.plot_date(x, y)
                        ax.xaxis.set_major_locator(months)
                        ax.xaxis.set_major_formatter(monthsFmt)
                        ax.grid(True)
                        ax.xaxis.set_minor_locator(mondays)
                        ax.autoscale_view()
                        fig.autofmt_xdate()
                elif scanType == "Lin":
                    y = np.asarray(dataset[0][1+ii])
                    # Only one row of data for this and log type supported.
                    x = np.linspace(dataset[0][0][0], dataset[0][0][1], num = len(y))
                elif scanType == "Log":
                    y = dataset[0][1+ii]
                    x = np.logspace(np.log10(dataset[0][0][0]), np.log10(dataset[0][0][1]), num = len(y))
                    ax.set_xscale('log')
                ax.plot(x, y, "o", label = depVars[ii][0])
                #ax.plot(x, y, label = depVars[ii][0])
        ax.legend(fontsize = 10)
        return fig

    def basic1DHistogram(self, dataset, variables, varsToIgnore):
        fig = Figure(dpi=100)
        ax = fig.add_subplot(111)
        indepVars = variables[0]
        depVars = variables[1]
        scanType = self.dataChest.getParameter("Scan Type", True)
        xlabel = self.dataChest.getParameter("X Label", True)
        ylabel = self.dataChest.getParameter("Y Label", True) 
        if ylabel is None:
            ylabel = depVars[0][0]
            # For data with more than one dep, recommend ylabel.
        plotTitle = self.dataChest.getParameter("Plot Title", True)
        if plotTitle is None:
            plotTitle = self.dataChest.getDatasetName()
        ax.set_title(plotTitle)
        dataset = np.asarray(dataset)
        ax.set_xlabel(ylabel+" "+"("+depVars[0][3]+")")
        # For multiple deps with different units this is ambiguous.
        ax.set_ylabel("Statistical Frequency")
        for ii in range(0, len(depVars)):
            if depVars[ii][0] not in varsToIgnore:
                if scanType is None:
                    y = dataset[::,1+ii].flatten()
                elif scanType == "Lin":
                    y = dataset[0][1+ii] 
                elif scanType == "Log":
                    y = dataset[0][1+ii]
                weights = np.ones_like(y)/float(len(y))
                ax.hist(y, 100, weights =weights, alpha=0.5, label = depVars[ii][0])
                #ax.hist(y, 50, normed=1,weights =weights, alpha=0.5, label = depVars[ii][0])
        ax.legend()
        return fig
   
    def figFromFileInfo(self, filePath, fileName, selectedPlotType = None, varsToIgnore =[]):
        relPath = self.convertPathToArray(filePath)
        self.dataChest.cd(relPath)
        self.dataChest.openDataset(fileName) 
        variables = self.dataChest.getVariables()
        dataCategory = self.categorizeDataset(variables)
        #otherwise refer to dataset name needs to be implemented
        dataset = self.dataChest.getData()
        if dataCategory == "1D":
            fig = self.plot1D(dataset, variables, selectedPlotType, None, varsToIgnore = varsToIgnore) 
            # plot1D(self, dataset, variables, plotType, dataClass, varsToIgnore = [])
        elif dataCategory =="2D": #was "2D Sweep"
            fig = self.plot2D(dataset, variables, selectedPlotType, None, varsToIgnore = varsToIgnore)
        else:
            print("1D data is the only type currently \r\n"+
                   "supported by this grapher.")
            print("Attempted to plot "+dataCategory+" data.")
            fig = Figure(dpi=100)
        self.dataChest.cd("")
        # yield self.cxn.data_vault.dump_existing_sessions()
        return fig

    def makeGrid(self, x, xGridRes, dX, y, yGridRes, dY, sweepType, z):
        
        totalNumPts = len(x)
        
        if sweepType =="Y":
            # Y sweep type ==> fix x, sweep y, then go to x+dx and
            # sweep y again... 
            divNmod = divmod(len(x), yGridRes)
            numFullYslices = divNmod[0]
            numPartiallyComplete = divNmod[1]
            if numFullYslices < xGridRes:
                npxRemainder = np.array([])
                npyRemainder = np.array([])
                # What kind of beast is the line below?
                nanArray = np.zeros(shape = (yGridRes*xGridRes -yGridRes*numFullYslices-numPartiallyComplete,))
                nanArray[:] = np.NAN
                # Is this pseudo-23 dimensional space definition?
                npzRemainder = np.concatenate([z[yGridRes*numFullYslices:yGridRes*numFullYslices+numPartiallyComplete], nanArray])
                for ii in range(numFullYslices, xGridRes):
                    npxRemainder = np.concatenate([npxRemainder, np.linspace(dX*ii+x[0], dX*ii+x[0], num = yGridRes)])
                    npyRemainder = np.concatenate([npyRemainder, np.linspace(y[0], y[0]+(yGridRes-1)*dY, num = yGridRes)])
            else:
                npxRemainder = np.array([])
                npyRemainder = np.array([])
                npzRemainder = np.array([])

            npx = np.concatenate([x[0:yGridRes*numFullYslices], npxRemainder])
            npy = np.concatenate([y[0:yGridRes*numFullYslices], npyRemainder])
            npz = np.concatenate([z[0:yGridRes*numFullYslices], npzRemainder])

            npx = npx.reshape(xGridRes, yGridRes).T
            npy = npy.reshape(xGridRes, yGridRes).T
            npz = npz.reshape(xGridRes, yGridRes).T
        elif sweepType =="X":
            # X sweep type ==> fix y, sweep x, then go to x+dy and
            # sweep y again...
            divNmod = divmod(len(x), xGridRes)
            numFullXslices = divNmod[0]
            numPartiallyComplete = divNmod[1]
            if numFullXslices < yGridRes:
                npxRemainder = np.array([])
                npyRemainder = np.array([])
                nanArray = np.zeros(shape = (yGridRes*xGridRes -xGridRes*numFullXslices-numPartiallyComplete,))
                nanArray[:] = np.NAN
                npzRemainder = np.concatenate([z[xGridRes*numFullXslices:xGridRes*numFullXslices+numPartiallyComplete], nanArray])
                for ii in range(numFullXslices, yGridRes):
                    npyRemainder = np.concatenate([npyRemainder, np.linspace(dY*ii+y[0], dY*ii+y[0], num = xGridRes)])
                    npxRemainder = np.concatenate([npxRemainder, np.linspace(x[0], x[0]+(xGridRes-1)*dX, num = xGridRes)])
            else:
                npxRemainder = np.array([])
                npyRemainder = np.array([])
                npzRemainder = np.array([])
            npx = np.concatenate([x[0:xGridRes*numFullXslices], npxRemainder])
            npy = np.concatenate([y[0:xGridRes*numFullXslices], npyRemainder])
            npz = np.concatenate([z[0:xGridRes*numFullXslices], npzRemainder])

            npx = npx.reshape(xGridRes, yGridRes)
            npy = npy.reshape(xGridRes, yGridRes)
            npz = npz.reshape(xGridRes, yGridRes)   
        return (npx,npy,npz)        
예제 #20
0
class Main(QMainWindow, Ui_MainWindow):

    # Define plate arrays as global variables to be able use them elsewhere in the program.
    global w_plate
    global mx_plate
    global my_plate
    global qx_plate
    global qy_plate

    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)

        self.btnPlot.setStyleSheet('color: red')
        self.textEdit.setTextColor(QtGui.QColor("magenta"))

        # Check deflections radio button by default
        self.deflections_radio.setChecked(False)

        # Creating a QButtonGroup and adding the plot options ratio buttons.
        # This will be used to make sure new results are plotted every time the solve button is pressed.
        # Otherwise, if the deflections radio button is already selected, new run won't plot results.
        self.group = QtGui.QButtonGroup()
        self.group.addButton(self.deflections_radio)
        self.group.addButton(self.mx_radio)
        self.group.addButton(self.my_radio)
        self.group.addButton(self.qx_radio)
        self.group.addButton(self.qy_radio)
        self.plot_options_group.setEnabled(False)

        self.infoLabel.setStyleSheet('color: blue')
        self.infoLabel.setText('  Theory of Plates and Shells\n' +
                               '  Süleyman Muti\n' + '  Spring 2016')

        self.btnPlot.clicked.connect(lambda: self.fdm())
        self.deflections_radio.toggled.connect(
            lambda: self.deflections_radio_checked())
        self.mx_radio.toggled.connect(lambda: self.mx_radio_checked())
        self.my_radio.toggled.connect(lambda: self.my_radio_checked())
        self.qx_radio.toggled.connect(lambda: self.qx_radio_checked())
        self.qy_radio.toggled.connect(lambda: self.qy_radio_checked())

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.mplwindow,
                                         coordinates=True)
        self.mplvl.addWidget(self.toolbar)

    def rmmpl(self, ):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def get_grid_size(self):
        if self.rBtn15x10.isChecked():
            return 15, 1e-6
        if self.rBtn30x20.isChecked():
            return 30, 1e-6
        elif self.rBtn180x120.isChecked():
            return 180, 1e-7
        elif self.rBtn540x360.isChecked():
            return 540, 1e-9

    def deflections_radio_checked(self):
        if self.deflections_radio.isChecked():
            self.rmmpl()
            self.print_plot(w_plate, 'Plate Deflections', 'viridis')

    def mx_radio_checked(self):
        if self.mx_radio.isChecked():
            self.rmmpl()
            self.print_plot(mx_plate, 'Mx Bending Moment', 'plasma')

    def my_radio_checked(self):
        if self.my_radio.isChecked():
            self.rmmpl()
            self.print_plot(my_plate, 'My Bending Moment', 'plasma')

    def qx_radio_checked(self):
        if self.qx_radio.isChecked():
            self.rmmpl()
            self.print_plot(qx_plate, 'Qx Transverse Shear Force', 'inferno')

    def qy_radio_checked(self):
        if self.qy_radio.isChecked():
            self.rmmpl()
            self.print_plot(qy_plate, 'Qy Transverse Shear Force', 'inferno')

    def print_plot(self, array_to_be_plotted, plot_title, colormap):
        a = array_to_be_plotted
        self.rmmpl()
        fig = Figure()
        self.addmpl(fig)
        ax = fig.add_subplot(111)
        cax = ax.imshow(a, cmap=colormap)
        fig.colorbar(cax, shrink=0.6, aspect=5)
        fig.tight_layout()
        ax.set_title(plot_title, fontsize=20, y=1.01)
        ax.axes.get_xaxis().set_ticks([])
        ax.axes.get_yaxis().set_ticks([])
        ax.format_coord = lambda x, y: ''
        ax.set_xlabel('300 mm', fontsize=20, rotation=0)
        ax.set_ylabel('200 mm', fontsize=20, rotation=90)
        ax.autoscale(False)
        plt.show()

    def print_info(self, grid_size):
        grid_string = 'Grid size: {:d} x {:d}'.format(grid_size,
                                                      grid_size * 2 // 3)
        deflection_string = 'Maximum deflection of the plate: {0:.4f} mm'.format(
            np.max(w_plate))
        moment_string = 'Max. Mx: {:.4f} Nmm/mm \t Max. My: {:.4f} Nmm/mm'.format(
            np.max(mx_plate), np.max(my_plate))
        shear_string = 'Max. Qx:   {:.4f} N/mm \t Max. Qy:   {:.4f} N/mm'.format(
            np.max(qx_plate), np.max(qy_plate))

        self.textEdit.setText(grid_string + '\n' + deflection_string + '\n' +
                              moment_string + '\n' + shear_string)

    def fdm(self):

        # Let the function fdm() know that the plate arrays are global variables and can be used outside its scope.
        global w_plate
        global mx_plate
        global my_plate
        global qx_plate
        global qy_plate

        # Enabling initially disabled plot options area which was disabled to prevent
        # plot attempts without array creations.
        self.plot_options_group.setEnabled(True)

        # Deselecting the deflections radio button to make sure new results always get plotted.
        self.group.setExclusive(False)
        self.deflections_radio.setChecked(False)
        self.group.setExclusive(True)

        dim_x = 300  # Plate length in x-direction [mm]
        # dim_y = 200  # Plate length in y-direction [mm]

        # Use Python tuple to get the number of elements in the x-direction and corresponding convergence criterion.
        (m, conv) = self.get_grid_size()
        n = m * 2 // 3  # Number of elements in the y-direction.

        # Element size
        delta = dim_x / m

        # Initialize matrices for iterative solution.
        w_old = np.zeros(
            (m + 3, n + 3))  # Initialize plate deflections to zero.
        w = np.copy(w_old)
        m1 = np.zeros((m + 3, n + 3))
        m2 = np.zeros((m + 3, n + 3))
        qx = np.zeros((m + 3, n + 3))
        qy = np.zeros((m + 3, n + 3))

        # Material properties, loading, and other properties
        e = 70000  # Modulus of elasticity [N/mm2]
        nu = 0.3  # Poisson's ratio
        h = 2  # Plate thickness [mm]
        po = 0.01  # Distributed load [N/mm2]

        # Plate stiffness
        d = (e * (h**3)) / (12 * (1.0 - (nu**2)))

        # Distributed load
        p = (po * (delta**4)) / d

        # Set logical condition to check if convergence criterion is met.
        cond = False  # Set to false to initiate iteration loop.

        # Loop to iterate plate deflections using Finite Difference Method

        iteration_number = 0  # Keep an eye on the iteration number.
        while not cond:
            cond = True  # set to true to check if criterion is met for all nodes.

            # Apply boundary conditions. Simply supported on all edges.
            w[:, 0] = -w_old[:, 2]
            w[:, n + 2] = -w_old[:, n]
            w[0, :] = -w_old[2, :]
            w[m + 2, :] = -w_old[m, :]

            # Calculate deflection of each node using neighbouring nodes
            # (i.e., using FDM)
            # Python range() statement is seemingly upper-bound exclusive. We need to add 1 to cover all range.
            for i in range(2, m + 1):

                # Check if the current index point has distributed load acting on it. If so apply the load, if not let it be zero.
                if i <= (m / 2 + 1):
                    k = p
                else:
                    k = 0

                for j in range(2, n + 1):

                    # Finite Difference Method Formula: v4 = p/d
                    w[i, j] = (1 / 20) * (
                        k + 8 *
                        (w[i + 1, j] + w[i - 1, j] + w[i, j + 1] + w[i, j - 1])
                        - 2 * (w[i + 1, j + 1] + w[i - 1, j + 1] +
                               w[i + 1, j - 1] + w[i - 1, j - 1]) -
                        w[i + 2, j] - w[i - 2, j] - w[i, j + 2] - w[i, j - 2])
                    # Check if convergence criterion is met for each node. Set logical condition
                    # to false even if a single node violates the the condition so that the
                    # iteration can continue until all nodes meet the criterion.
                    if abs(w[i, j] - w_old[i, j]) > conv:
                        cond = False
            # Reset deflection matrices for next iteration.
            w_old = np.copy(w)

            # Keep an eye on the iteration number.
            iteration_number += 1

        # Calculate the bending moments and transverse shear forces based on the deflections.
        for i in range(2, m + 1):
            for j in range(2, n + 1):
                # Common terms in bending moment equations.
                m1[i, j] = -(w[i + 1, j] - 2 * w[i, j] +
                             w[i - 1, j]) * d / delta**2
                m2[i, j] = -(w[i, j + 1] - 2 * w[i, j] +
                             w[i, j - 1]) * d / delta**2

                # Transverse shear forces.
                qx[i, j] = -(
                    (w[i + 2, j] - 2 * w[i + 1, j] + 2 * w[i - 1, j] -
                     w[i - 2, j]) +
                    (w[i + 1, j + 1] - 2 * w[i + 1, j] + w[i + 1, j - 1] -
                     w[i - 1, j + 1] + 2 * w[i - 1, j] -
                     w[i - 1, j - 1])) * d / (2 * delta**3)
                qy[i, j] = -(
                    (w[i + 1, j + 1] - 2 * w[i, j + 1] + w[i - 1, j + 1] -
                     w[i + 1, j - 1] + 2 * w[i, j - 1] - w[i - 1, j - 1]) +
                    (w[i, j + 2] - 2 * w[i, j + 1] + 2 * w[i, j - 1] -
                     w[i, j - 2])) * d / (2 * delta**3)

        # Assemble bending moment arrays.
        mx = m1 + nu * m2
        my = m2 + nu * m1

        # Exclude the ghost nodes that were necessary to apply boundary conditions,
        # and obtain deflections for plate nodes only. Plate deflections will be plotted correcting the orientation.
        w_plate = w[1:m + 2, 1:n + 2].transpose()
        mx_plate = mx[1:m + 2, 1:n + 2].transpose()
        my_plate = my[1:m + 2, 1:n + 2].transpose()
        qx_plate = qx[1:m + 2, 1:n + 2].transpose()
        qy_plate = qy[1:m + 2, 1:n + 2].transpose()

        # Set deflections radio button to checked to display the new run's results.
        self.deflections_radio.setChecked(True)

        # Print information summarizing the  solution
        # Maximum deflection, maximum bending moments, and maximum shear forces
        self.print_info(m)
예제 #21
0
class CoLocation(QMainWindow, Ui_MainWindow):
    flag = True
    categories = {}
    valid_images = ["jpg","png","tga", "pgm", "jpeg"]
    valid_videos = ["mp4", "avi"]
    edge_threshold = 100
    to_disp = [] 
    
    def __init__(self, ):
        super(CoLocation, self).__init__()        #initialise from the ui designed by Designer App
        self.setupUi(self)
        self.setupUi_custom()
        
    def update_categories(self):
        #update selected categories
        for radiobox in self.findChildren(QtGui.QRadioButton):
            self.categories[radiobox.text()] = radiobox.isChecked()
    
    def setupUi_custom(self,):    
        
        self.scene = QGraphicsScene()
        self.scene2 = QGraphicsScene()
        #TODO [WEIRD PROBLEM] QPixmap needs to be called at least once with JPG image before tensorFlow, otherwise program crashes
        self.scene.addPixmap(QPixmap(os.getcwd()+"/demo.jpg").scaled(self.graphicsView.size(), QtCore.Qt.KeepAspectRatio))
        self.graphicsView.setScene(self.scene)  
        
        import Yolo_module as yolo
        self.classifier = yolo.YOLO_TF()
        #Create thread for heavy processing and tensorflow, pass the instance of itself to modify GUI
        self.image_thread = ImageThread(self, self.classifier)
        #add connect SIGNAL here 
                
        self.pushButton.clicked.connect(self.selectFile)        
        self.horizontalSlider.valueChanged.connect(self.updateLCD)
        self.pushButton_2.clicked.connect(self.image_thread.disp_graph)
        self.pushButton_3.clicked.connect(self.selectFile_from_folder)
        
        #Add blank canvas initially
        fig1 = Figure()            
        self.addmpl(fig1)

    def updateLCD(self):
        #update edge_threshold variable based on slider
        self.edge_threshold = self.horizontalSlider.value()
        self.lcdNumber.display(self.edge_threshold)        
        
    def selectFile(self):  
        #Clear previous image displays        
        self.scene.clear()
        self.scene2.clear()
        self.update_categories()
             
        filename = QFileDialog.getOpenFileName(directory = '/home/yash/Downloads/Pascal VOC 2012/samples')
        self.lineEdit.setText(filename)
        
        if filename.split('.')[1] in self.valid_videos:
            self.image_thread.temp = filename #disp_video(filename)
            self.image_thread.start()
        
        elif filename.split('.')[1] in self.valid_images:
            self.image_thread.disp_img(filename = filename)
            self.image_thread.disp_graph()
            
        else:
            print("Invalid file format")
        
    def selectFile_from_folder(self):
        #Read all the images in the folder
        path = QFileDialog.getExistingDirectory(None, 'Select a folder:', '/home/yash/Downloads/Pascal VOC 2012', QtGui.QFileDialog.ShowDirsOnly)
        self.lineEdit_2.setText(path)
        
        for f in os.listdir(path):              #list all the files in the folder
            ext = f.split('.')[1]        #get the file extension
            if ext.lower() not in self.valid_images: #check if the extension is valid for the image
                continue
            filename = path+'/'+f               #create the path of the image
            print(filename)
            
            self.image_thread.tag_image(filename, batch = True)
        
        #clear the image regions during batch upload
        self.scene.clear()
        self.scene2.clear()    
        
        self.image_thread.disp_graph(batch = True)
        
    def addmpl(self, fig):
        #Add figure to canvas and widget
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
 
    def rmmpl(self,):
        #remove the canvas and widget
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
예제 #22
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        self.fig_dict = {}
        self.fg_dict  = {}
        
        self.mplfigs.itemClicked.connect(self.changefig)
        self.datacube.clicked.connect(self.selectFile)
        self.polarization.clicked.connect(self.selectPol)
        self.fetch.clicked.connect(self._fetch)
        self.res.clicked.connect(self._res)
        self.calc.clicked.connect(self._calc)
        self.reset.clicked.connect(self._reset)

        self.xst.valueChanged[str].connect(self.xchg)
        self.yst.valueChanged[str].connect(self.ychg)
        self.x_st, self.y_st = 0,0

        fig = Figure()
        self.fig = fig
        self.addmpl(fig, np.ones((100,100)))

        self.previous_point = []
        self.tempxpt,self.tempypt = [],[]
        self.allxpoints = []
        self.allypoints = []
        self.start_point = []
        self.end_point = []
        self.line = None
        self.roicolor = 'r'
        self.ax = plt.gca()
        self.dcube_path = '/Users/Mipanox/Desktop/coding_temp/SF/wzError/L1455_rgd.fits'
        self.poldt_path = '/Users/Mipanox/Desktop/coding_temp/SF/wzError/scupollegacy_l1455_cube.fits'
        self.dc_nm.setText(self.dcube_path)
        self.po_nm.setText(self.poldt_path)

        self.dn = None
        self.ds = None
        
        self.__ID2 = self.fig.canvas.mpl_connect(
            'button_press_event', self.__button_press_callback)

    def selectFile(self):
        self.dc_nm.setText(QFileDialog.getOpenFileName())
        self.dcube_path = unicode(self.dc_nm.text())
        
    def selectPol(self):
        self.po_nm.setText(QFileDialog.getOpenFileName())
        self.poldt_path = unicode(self.po_nm.text())

    def xchg(self):
        self.x_st = self.xst.value()
    def ychg(self):
        self.y_st = self.yst.value()

    def _fetch(self):
        if self.checkBox.isChecked() == True:
            self.__fet()
        else:
            self.dn = sfn(ds=self.dcube_path,name='foo',od=2.,bn=1.,
                          pol=self.poldt_path,du=1.5e-5)
            self.ds = sf(ds=self.dcube_path,name='foo',od=2.,bn=1.,
                         pol=self.poldt_path,du=1.5e-5)
            m0 = self.dn.m0
            m1 = self.dn.m1
        
            i = 0
            for n in [m0,m1]:
                fig_ = Figure()
                axf_ = fig_.add_subplot(111)
                cax = axf_.imshow(n,origin='lower')
                fig_.colorbar(cax)
                name = 'moment %s' %i
                self.fig_dict[name] = fig_
                self.fg_dict[name] = n
                self.mplfigs.addItem(name)
                i += 1
            
    def __fet(self):
        from astropy.utils.data import get_readable_fileobj
        from astropy.io import fits

        with get_readable_fileobj(self.dcube_path, cache=True) as f:
            fitsfile = fits.open(f)
            gd       = fitsfile[0].data[0][0]
            dshd     = fitsfile[0].header

        with get_readable_fileobj(self.poldt_path, cache=True) as e:
            fitsfile = fits.open(e)
            po       = fitsfile[0].data[0][0] + 90. # to B-field
            pshd     = fitsfile[0].header

        tx = 'gd-pol'
        fig = Figure()
        self.fig_dict[tx] = fig
        self.fg_dict[tx] = [gd,po]
        self.mplfigs.addItem(tx)
        axf = fig.add_subplot(111)
        self.__quiver(gd,po,axf,tx)

    def __quiver(self,gd,po,plt,tx):
        lx,ly = gd.shape
        y,x = np.mgrid[0:(lx-1):(lx)*1j, 0:(ly-1):(ly)*1j]

        gx,gy = -np.sin(np.radians(gd)),np.cos(np.radians(gd))
        px,py = -np.sin(np.radians(po)+90.),np.cos(np.radians(po)+90.)

        quiveropts = dict(headlength=0, pivot='middle',
                          scale=5e1, headaxislength=0)
        plt.axis('equal');
        plt.quiver(x,y,gx,gy,color='r',**quiveropts)
        plt.quiver(x,y,px,py,color='b',alpha=0.5,**quiveropts)
    
    def _calc(self):
        def avg_adj(ar,n): # reshaping even-indexed arrays
            (M,N) = ar.shape
            tt = np.zeros((M-n+1,N-n+1))
            for (x,y),i in np.ndenumerate(ar):
                if x > ar.shape[0]-n or y > ar.shape[1]-n: continue
                else:
                    ap = ar[slice(x,x+n),slice(y,y+n)]
                    tt[x,y] = ap.mean()
            return tt

        pol = self.dn._grad(pol=1)[0]
        grd = self.ds._grad()

        for i in range(1,len(grd)):
            if i % 2:
                pt = avg_adj(pol,i+1)
            else:
                pt = pol[i/2:-i/2,i/2:-i/2]
            gt = grd[i]
            tx = '%s x %s' %(i+1,i+1)
            fig = Figure()
            self.fig_dict[tx] = fig
            self.fg_dict[tx] = [gt,pt]
            self.mplfigs.addItem(tx)
            axf = fig.add_subplot(111)
            self.__quiver(gt,pt,axf,tx)

    def _res(self, item):
        cg,cp = self.fg[0],self.fg[1]
        
        if self.x_st >= 0 and self.y_st >= 0:
            gd = np.pad(cg,((0,2*self.x_st),(0,2*self.y_st)),
                        mode='constant', constant_values=(np.nan))
            po = np.pad(cp,((self.x_st,self.x_st),(self.y_st,self.y_st)),
                        mode='constant', constant_values=(np.nan))
        elif self.x_st < 0 and self.y_st >= 0:
            gd = np.pad(cg,((-self.x_st,-self.x_st),(0,2*self.y_st)),
                        mode='constant', constant_values=(np.nan))
            po = np.pad(cp,((0,-2*self.x_st),(self.y_st,self.y_st)),
                        mode='constant', constant_values=(np.nan))
        elif self.x_st >=0 and self.y_st < 0:
            gd = np.pad(cg,((0,2*self.x_st),(-self.y_st,-self.y_st)),
                        mode='constant', constant_values=(np.nan))
            po = np.pad(cp,((self.x_st,self.x_st),(0,-2*self.y_st)),
                        mode='constant', constant_values=(np.nan))
        else:
            gd = np.pad(cg,((-self.x_st,-self.x_st),(-self.y_st,-self.y_st)),
                        mode='constant', constant_values=(np.nan))
            po = np.pad(cp,((0,-2*self.x_st),(0,-2*self.y_st)),
                        mode='constant', constant_values=(np.nan))

        if self.x_st == 0 and self.y_st == 0: pass
        else:
            tx = '%s - (%s x %s) shifted' %(str(self.mplfigs.currentItem().text()),
                                            self.x_st,self.y_st)
            fig = Figure()
            self.fig_dict[tx] = fig
            self.fg_dict[tx] = [gd,po]
            self.mplfigs.addItem(tx)
            axf = fig.add_subplot(111)
            self.__quiver(gd,po,axf,tx)
            
        
        if len(self.allxpoints) > 0: # if roi selected
            if self.checkBox.isChecked() == True:
                tp = self.getMask(gd)
            else:
                self.tempxpt,self.tempypt = self.allxpoints,self.allypoints
                old_xd,old_yd = self.dn.m0.shape
                new_xd,new_yd = gd.shape
            
                for i in range(len(self.allxpoints)):
                    self.allxpoints[i] *= float(new_xd) / float(old_xd)
                    self.allypoints[i] *= float(new_yd) / float(old_yd)
        
                    tp = self.getMask(gd)
        
            gd[tp==False] = np.nan
            po[tp==False] = np.nan
        
        gx,gy = -np.sin(np.radians(gd)),np.cos(np.radians(gd))
        px,py = -np.sin(np.radians(po)),np.cos(np.radians(po))
        # +/- 90 doesn't matter

        overlay = np.sum(~np.isnan(gd) * ~np.isnan(po) * 1.)
        self.spsize.setText('%d' %(overlay))
        
        v_c = vc(v1=np.array([gx,gy]),v2=np.array([px,py]))
        self.rho_c.setText('%3e' %(v_c.corr_c()) )
        self.rho_h.setText('%3e' %(v_c.corr_h()) )
        
        self.allxpoints = self.tempxpt
        self.allypoints = self.tempypt

    def _reset(self):
        self.previous_point = []
        self.tempxpt,self.tempypt = [],[]
        self.allxpoints = []
        self.allypoints = []
        self.start_point = []
        self.end_point = []
        self.line = None

        ## remember to right-click before reset if changed frame
        self.ax.lines = []
        self.changefig(self.mplfigs.currentItem())

        self.xst.setValue(0)
        self.yst.setValue(0)
            
    def changefig(self, item):
        text = str(item.text())
        self.rmmpl()
        self.addmpl(self.fig_dict[text], self.fg_dict[text])

    def addmpl(self, fig, fg):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.mplwindow, coordinates=True)
        self.mplvl.addWidget(self.toolbar)
        self.fg = fg
        
        self.ax = self.fig.add_subplot(111)
        self.canvas.draw()
        self.canvas.setFocusPolicy( Qt.ClickFocus )
        self.canvas.setFocus()
        self.canvas.mpl_connect('button_press_event', self.__button_press_callback)
        
    def rmmpl(self,):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def __button_press_callback(self, event):
        if event.inaxes:
            x, y = event.xdata, event.ydata
            self.ax = event.inaxes
            if event.button == 1 and event.dblclick == False:  # If you press the left button, single click
                if self.line == None: # if there is no line, create a line
                    self.line = plt.Line2D([x, x],
                                           [y, y],
                                           marker='o',
                                           color=self.roicolor)
                    self.start_point = [x,y]
                    self.previous_point =  self.start_point
                    self.allxpoints=[x]
                    self.allypoints=[y]
                                                
                    self.ax.add_line(self.line)
                    self.canvas.draw()
                    # add a segment
                else: # if there is a line, create a segment
                    self.line = plt.Line2D([self.previous_point[0], x],
                                           [self.previous_point[1], y],
                                           marker = 'o',color=self.roicolor)
                    self.previous_point = [x,y]
                    self.allxpoints.append(x)
                    self.allypoints.append(y)
                                                                                
                    event.inaxes.add_line(self.line)
                    self.canvas.draw()
            elif ((event.button == 1 and event.dblclick==True) or
                  (event.button == 3 and event.dblclick==False)) and self.line != None: # close the loop and disconnect
                self.canvas.mpl_disconnect(self.__ID2) #joerg
                        
                self.line.set_data([self.previous_point[0],
                                    self.start_point[0]],
                                   [self.previous_point[1],
                                    self.start_point[1]])
                self.ax.add_line(self.line)
                self.canvas.draw()
                self.line = None
                                    
    def getMask(self, ci):
        ny, nx = ci.shape        
        poly_verts = [(self.allxpoints[0], self.allypoints[0])]
        for i in range(len(self.allxpoints)-1, -1, -1):
            poly_verts.append((self.allxpoints[i], self.allypoints[i]))
        
        x, y = np.meshgrid(np.arange(nx), np.arange(ny))
        x, y = x.flatten(), y.flatten()
        points = np.vstack((x,y)).T

        ROIpath = mplPath.Path(poly_verts)
        grid = ROIpath.contains_points(points).reshape((ny,nx))
        
        return grid
예제 #23
0
class WD(QMainWindow,Ui_MainWindow):
    def __init__(self,parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.setupUi(self)
        self.file=open('output.txt','a')
        self.ButtonBack.clicked.connect(self.back1)
        self.radioButton.setChecked(True)
        self.sim=0
        self.true1=0
        
        self.ButtonOn.hide()
        self.ButtonBack.hide()
        self.ButtonPause.hide()
        self.label_5.hide()
        self.interact_game.hide()
        self.game.hide()
        
        self.start.clicked.connect(self.start1)
        self.back.clicked.connect(self.close)
        self.ButtonOn.clicked.connect(self.on)
        
        self.ButtonPause.clicked.connect(self.pause)        
        self.fig_dict={}
        
        self.slider_simulation.hide()
#        self.horizontalSlider.valueChanged.connect(self.initial)
        self.slider_simulation.valueChanged.connect(self.simulation)
        self.fig_dict={}
        self.mplfigs.itemClicked.connect(self.changefig)
        self.fig=plt.figure()
        self.addmpl(self.fig)
        
        self.ButtonDemo_1.clicked.connect(self.demo1)
        self.ButtonDemo_2.clicked.connect(self.demo2)
        self.demo=0
        self.horizontalSlider.valueChanged.connect(self.initial)
        self.pushButton_game.clicked.connect(self.game_call)
        self.pushButton_try.clicked.connect(self.graph_try)
        self.pushButton_return.clicked.connect(self.game_return)
        self.ButtonDiffu.clicked.connect(self.diffusion)
        self.ButtonBackDiffu.clicked.connect(self.backdiffu)
        self.mplwindow_2.hide()
        self.mplwindow_3.hide()
        self.textDiffu.hide()
        self.ButtonBackDiffu.hide()
        self.ButtonDiffu.hide()
        
        showAction=QtGui.QAction('&Authors', self)
        showAction.triggered.connect(self.showAuthors)
        mainMenu=self.menuBar()
        fileMenu=mainMenu.addMenu('&About')
        fileMenu.addAction(showAction)  
        
        self.timer1=QtCore.QTimer(self)
        self.timer2=QtCore.QTimer(self)
        
        self.ani_co=0
        
        file=open('position_02.txt','r')
        lines=file.readlines()
        file.close()
        x=[]
        x1=[]
        x2=[]
        for line in lines:
            p=line.split()
            x.append(float(p[0]))
            x1.append(float(p[1]))
            x2.append(float(p[5]))
        xv=np.array(x)
        xv1=np.array(x1)
        xv2=np.array(x2)
        
        self.rmmpl()
        self.fig=plt.figure()
        axf=self.fig.add_subplot(111)
        axf.set_xlabel('$x/a_{ho}$',fontsize=17)
        axf.set_ylabel('density $|\psi|^2 a_{ho}$',fontsize=14)
        axf.fill_between(xv,0,xv1,label='$R-Space$',facecolor='blue',alpha=0.5)
        axf.fill_between(xv,0,xv2,label='$K-Space$',facecolor='yellow',alpha=0.5)
        axf.set_xlim([-20,20])
        axf.set_title('Wave Packet')
        axf.legend()
        self.addmpl(self.fig) 
        
    def initial(self):
        file=open('initial2.txt','r')
        lines=file.readlines()
        file.close()
        for i in range(0,16):
            globals()['x%s' %i]=[]
        for line in lines:
            p=line.split()
            for i in range(0,16):
                globals()['x%s' %i].append(float(p[i-1]))
        for i in range(0,16):
                globals()['xv%s' %i]=np.array(globals()['x%s' %i])       
        value=self.horizontalSlider.value()
        
        for i in range(3,16):
            if value==i-9:
                if self.fig==None:
                    self.rmmpl()
                    self.fig=Figure()
                    self.addmpl(self.fig)
                    
                
                self.fig.clear()
                ax1f2=self.fig.add_subplot(111)
                ax1f2.set_xlabel('$x/a_{ho}$',fontsize=17)
                ax1f2.set_ylabel('density $|\psi|^2 a_{ho}$',fontsize=14)
                ax1f2.fill_between(xv1,0,globals()['xv%s' %i],label='$R-Space$',facecolor='blue',alpha=0.5)
                ax1f2.fill_between(xv1,0,xv2,label='$K-Space$',facecolor='yellow',alpha=0.5)
                ax1f2.set_ylim(0.,0.6)
                ax1f2.set_xlim(-20.,20.)
                ax1f2.set_title('initial state')
                ax1f2.legend()
                self.canvas.draw()
    
    def start1(self):
        self.demo=0  
        self.start2()          
                
    def start2(self):
        self.rmmpl()
        self.fig.clear()
        self.timer1.stop()
        self.timer2.stop()
        dialog = QtGui.QDialog()    
        progressBar = Ui_porcessProgress()
        progressBar.setupUi(dialog)
        dialog.show()
        self.file.write('...Nuevo proceso...\n')
        diff = 0
        self.sim=0
        self.true1=0
        prevdir = os.getcwd()
        self.spinBox_value=self.spinBox.value()
        self.slider_simulation.setValue(0)
        try:
            if self.demo==0:
                os.chdir(os.path.expanduser('./Wavepackdisper'))
            else:
                os.chdir(os.path.expanduser('./Wavepackdisper/Demo%s' %(self.demo)))
                if (not os.path.exists('./WfWd-end')):
                    zip_ref = zipfile.ZipFile('./Demo%s.zip' %(self.demo), 'r')
                    zip_ref.extractall('.')
                    zip_ref.close()
                else:
                    pass
            file=open('input.txt','w')  
            if (self.radioButton.isChecked()==True):
                self.true1=1
            if (self.radioButton_2.isChecked()==True):
                self.true1=0
            file.write ('%s\t%s\t%s\t%s' %(self.horizontalSlider.value(),self.true1,self.spinBox.value(),self.spinBox_2.value()))
            file.close()
            
            time1=int(self.spinBox_value*(10*np.pi*2.0))
            start_sub=time.time()
            
            if self.demo==0:
                exclude=set(['Demo1','Demo2'])
                for root, dirs, files in os.walk(os.getcwd(), topdown=True):
                        dirs[:] = [d for d in dirs if d not in exclude]
                        for file in files:
                            if file.startswith("WfWd"):
                                 os.remove((os.path.join(root, file)))
                subprocess.Popen('python gpe_fft_ts_WP_v1.py',shell=True)                 
                progressBar.porcessProgressBar.setMaximum(time1+1)
                diff=0
                while diff<time1+2:
                    diff=0
                    for root, dirs, files in os.walk(os.getcwd()):
                        dirs[:] = [d for d in dirs if d not in exclude]
                        for file in files:
                            if file.startswith("WfWd"):
                                diff +=1
                        
                        if (diff<10):
                            progressBar.label.setText('Initiation of the progress...')
                        if (diff<time1-10) and (diff>10):
                            progressBar.label.setText(u'Solving Schrödinger equation...')
                        if (diff<time1+1) and (diff>time1-10):
                            progressBar.label.setText('Writing results ...')
                                                
                        progressBar.porcessProgressBar.setValue(diff)                     
                        QApplication.processEvents()
                        
            if (self.true1==1):
                self.file.write('Posición inicial del paquete de ondas=%s\nPotential armónico: YES\nExcitación del estado=%s\nNúmero de oscilaciones=%s\n\n' %(self.horizontalSlider.value(),self.spinBox_2.value(),self.spinBox.value()))
            if (self.true1==0):
                self.file.write('Posición inicial del paquete de ondas=%s\nPotential armónico: NO\nExcitación del estado=%s\nNúmero de oscilaciones=%s\n\n' %(self.horizontalSlider.value(),self.spinBox_2.value(),self.spinBox.value()))
            end_sub=time.time()            
            print (os.getcwd())
            print ("READY")
            self.label_5.show()
            self.ButtonOn.show()
            self.ButtonBack.show()
            self.ButtonPause.show()
            self.label_5.show()
            self.slider_simulation.show()
            self.slider_simulation.setMinimum(0)
            self.slider_simulation.setMaximum(self.spinBox_value*int((10*np.pi*2.0)))
            self.slider_simulation.setSingleStep(1)
            if (self.radioButton.isChecked()==True):
                self.interact_game.show()
                self.ButtonDiffu.hide()
                self.radioButton_oscil.setChecked(True)
            if (self.radioButton_2.isChecked()==True):
                self.interact_game.hide()
                self.ButtonDiffu.show()
#            time.sleep(2)
            
            file=open('output_sp.txt','r')
            self.file.write('%s\n\n' %file.read())
            self.file.write('Durada de la computación=%s\n\n' %(end_sub-start_sub))
            
            file = open('energies.txt', 'r')
            lines = file.readlines()
            file.close()
            
            file2 = open('mean_value.txt','r')
            lines2 = file2.readlines()
            file2.close()
            
            file4=open('WfWd-%08d.txt'%(0),'r')
            lines4=file4.readlines()
            file4.close()

        finally:
            os.chdir(prevdir)
            
        x1=[]
        x2=[]
        x3=[]
        for line in lines4:
            p=line.split()
            x1.append(float(p[0]))
            x2.append(float(p[1]))
            x3.append(float(p[5]))
        xv1=np.array(x1)
        xv2=np.array(x2)
        xv3=np.array(x3)
        
        
        self.rmmpl()
        self.fig=plt.figure()
        axf=self.fig.add_subplot(111)
        axf.set_xlabel('$x/a_{ho}$',fontsize=17)
        axf.set_ylabel('density $|\psi|^2 a_{ho}$',fontsize=14)
        axf.fill_between(xv1,0,xv2,label='$R-Space$',facecolor='blue',alpha=0.5)
        axf.fill_between(xv1,0,xv3,label='$K-Space$',facecolor='yellow',alpha=0.5)
        axf.set_xlim([-self.horizontalSlider.value()-8,self.horizontalSlider.value()+8])
        if (self.true1==0):
            axf.set_ylim(0,0.6)
        axf.set_title('state at t=%s $T/t_{ho}$' %(0))
        axf.legend()
        self.addmpl(self.fig)
        
 
        x1 = []
        y1 = []
        z1 = []
        j1 = []
        for line in lines:
            p = line.split()
            x1.append(float(p[0]))
            y1.append(float(p[1]))
            z1.append(float(p[3]))
            j1.append(float(p[4]))                            
        xv = np.array(x1)
        yv = np.array(y1)
        zv = np.array(z1)
        jv=np.array(j1)
        
        fig=Figure()
        ax1f1=fig.add_subplot(111)
        ax1f1.set_xlabel('$T/t_{ho}$',fontsize=17)        
        ax1f1.set_ylabel('$E/\hbar \omega$',fontsize=17)
        ax1f1.plot(xv,yv,'r.-',label='$E_{tot}$')
        ax1f1.plot(xv,zv,'y.-',label='Kinetic Energy')
        ax1f1.plot(xv,jv,'b.-',label='Potential Energy')
        ax1f1.legend()
        ax1f1.set_title('Energies')
        
        
    
        x1 = []
        y1 = []
        z1 = []
        i1 = []
        j1 = []
        for line in lines2:
            p = line.split()
            x1.append(float(p[0]))
            y1.append(float(p[1]))
            z1.append(float(p[2]))  
            i1.append(float(p[3]))
            j1.append(float(p[4]))                          
        xv = np.array(x1)
        yv = np.array(y1)
        zv = np.array(z1)
        iv = np.array(i1)
        jv = np.array(j1)
        
        self.fig2=Figure()
        ax1f2=self.fig2.add_subplot(111)
        ax1f2.set_xlabel('$T/t_{ho}$',fontsize=17)        
        ax1f2.set_ylabel('$x/a_{ho}$',fontsize=17)
        ax1f2.plot(xv,yv, 'b.',label='$R-Space:<x> $')
        ax1f2.plot(xv,iv, 'y--',label='$k-Space:<k>$')
        ax1f2.plot(xv,zv, 'b--',label='$R-Space:dispersion$')
        ax1f2.plot(xv,jv, 'y.',label='$k-Space:dispersion$')

        ax1f2.legend(loc='best')
        
        self.delfig()        
        self.delfig()
        self.delfig()
        self.addfig('ENERGY',fig)
        self.addfig('MEAN VALUE X',self.fig2)
        self.slider_simulation.setValue(0)
        
    def simulation(self):
        time1=int(self.spinBox_value*(10*np.pi*2.0))
        value=self.slider_simulation.value()
        self.sim=value
        prevdir = os.getcwd()
        try:
            if self.demo==0:
                os.chdir(os.path.expanduser('./Wavepackdisper'))
            else:
                os.chdir(os.path.expanduser('./Wavepackdisper/Demo%s' %(self.demo)))
            for i in range(0,time1+1):
                file=open('WfWd-%08d.txt'%(i),'r')
                globals()['lines%s' %i]=file.readlines()
                file.close()
#            
#            
                if value==i:                    
                    x1=[]
                    x2=[]
                    x3=[]
                    for line in (globals()['lines%s' %i]):
                        p=line.split()
                        x1.append(float(p[0]))
                        x2.append(float(p[1]))
                        x3.append(float(p[5]))
                    xv1=np.array(x1)
                    xv2=np.array(x2)
                    xv3=np.array(x3)
                    
                    
                    if self.fig==None:
                        self.rmmpl()
                        self.fig=plt.figure()
                        self.addmpl(self.fig)
                    self.fig.clear()
                    axf=self.fig.add_subplot(111)
                    axf.set_xlabel('$x/a_{ho}$',fontsize=17)
                    axf.set_ylabel('density $|\psi|^2 a_{ho}$',fontsize=14)
                    axf.fill_between(xv1,0,xv2,label='$R-Space$',facecolor='blue',alpha=0.5)
                    axf.fill_between(xv1,0,xv3,label='$K-Space$',facecolor='yellow',alpha=0.5)
                    axf.set_xlim([-self.horizontalSlider.value()-8,self.horizontalSlider.value()+8])
                    if (self.true1==0):
                        axf.set_ylim(0,0.6)
                    axf.set_title('state at t=%s $T/t_{ho}$' %(i))
                    axf.legend()
                    self.canvas.draw()
        finally:
            os.chdir(prevdir)
    
    def game_call(self):
        self.timer1.stop()
        self.timer2.stop()
        if (self.radioButton.isChecked()==True):
            
            if (self.radioButton_oscil.isChecked()==True):
                self.rmmpl()
                self.textBrowser.show()
                self.rmmpl2()
                self.mplwindow.hide()
                self.textDiffu.hide()
                self.mplwindow_3.hide()
                self.widget_osci.show()
                self.start.hide()
                self.ButtonDemo_1.hide()
                self.ButtonDemo_2.hide()
                self.interact.setEnabled(False)
                self.mplfigs.hide()
                self.spin_amplitude.setValue(3.)
                self.spin_frequency.setValue(0.5)
                prevdir = os.getcwd()
                try:
                    if self.demo==0:
                        os.chdir(os.path.expanduser('./Wavepackdisper'))
                    else:
                        os.chdir(os.path.expanduser('./Wavepackdisper/Demo%s' %(self.demo)))
                    file2 = open('mean_value.txt','r')
                    lines2 = file2.readlines()
                    file2.close()
                    x1 = []
                    y1 = []
                    for line in lines2:
                        p = line.split()
                        x1.append(float(p[0]))
                        y1.append(float(p[1]))                        
                    xv = np.array(x1)
                    yv = np.array(y1)
                finally:
                    os.chdir(prevdir)
                fig3=Figure()
                ax1f3=fig3.add_subplot(111)
                ax1f3.set_xlabel('$T/t_{ho}$',fontsize=17)        
                ax1f3.set_ylabel('$x/a_{ho}$',fontsize=17)
                ax1f3.plot(xv,yv, 'r.-',label='$R-Space$')                
                ax1f3.set_title('Wave packet trajectory')
                ax1f3.legend()
                self.addmpl2(fig3)

        self.game.show()
        self.mplwindow_2.show()
        
    def graph_try(self):
        if (self.radioButton.isChecked()==True):
            if (self.radioButton_oscil.isChecked()==True):
                self.amplitude=self.spin_amplitude.value()
                self.frequency=self.spin_frequency.value()
                self.ani_co += 1
                if self.ani_co>1:
                    self.ani.event_source.stop()
                time1=int(self.spinBox_value*(10*np.pi*2.0))
                self.rmmpl2()
                prevdir = os.getcwd()
                try:
                    if self.demo==0:
                        os.chdir(os.path.expanduser('./Wavepackdisper'))
                    else:
                        os.chdir(os.path.expanduser('./Wavepackdisper/Demo%s' %(self.demo)))
                    file2 = open('mean_value.txt','r')
                    lines2 = file2.readlines()
                    file2.close()
                    x1 = []
                    y1 = []
                    for line in lines2:
                        p = line.split()
                        x1.append(float(p[0]))
                        y1.append(float(p[1]))                        
                    xv = np.array(x1)
                    yv = np.array(y1)
                finally:
                    os.chdir(prevdir)
                
#                fig3=Figure()
#                self.addmpl2(fig3)
#                ax1f3=fig3.add_subplot(111)
#                ax1f3.set_xlabel('$T/t_{ho}$',fontsize=17)        
#                ax1f3.set_ylabel('$x/a_{ho}$',fontsize=17)
#                
#                x=np.arange(0,time1+1)/10.
#                y=self.spin_amplitude.value()*np.cos(self.spin_frequency.value()*x)
#                
#                ax1f3.plot(xv,yv, 'r.-',label='$R-Space$')                
#                ax1f3.plot(x,y)            
#                ax1f3.set_title('Mean value x')
#                ax1f3.legend()
#                self.canvas.draw()
                
                tf_sim =  time1/10.
                def simData():
                    L=self.amplitude
                    t_max =  time1/10.
                    dt = 0.05
                    w = self.frequency
                    y = 0.0
                    t = 0.0
                    while t <= t_max:
                        if on_spr and not back_spr and not pause_spr:
                            y = L*np.sin(w*t+np.pi/2.)
                            t = t + dt
                        if t<0:
                                y = L*np.sin(w*t+np.pi/2.)
                                t = t + dt
                        if back_spr and not on_spr and not pause_spr:
                            y = L*np.sin(w*t+np.pi/2.)
                            t = t - dt
                        yield y, t
                        
                def onClick(event):
                    global pause_spr, on_spr, back_spr
                    back_spr ^= True
                    on_spr ^= True
                    
                def init():
                    line.set_data([], [])
                    line2.set_data([], [])
                    line3.set_data([], [])
                    line4.set_data([], [])
                    for j in range (0,11):
                        globals() ['line_%s' %(j)].set_data([], [])
                    time_text.set_text('')
                    return line, time_text
                
                def simPoints(simData):
                    y, t = simData[0], simData[1]
                    if self.amplitude>=0:
                        ori = -self.amplitude-1.
                    if self.amplitude<=0:
                        ori = self.amplitude-1.
                    time_text.set_text(time_template%(t))
                    thisy = [ori, y]
                
                    line.set_data(0,thisy)
                    for j in range (3,9):
                        globals() ['line_%s' %(j)].set_data([((-1)**(j-1))*0.5,((-1)**j)*0.5],[(j-1.)*((y-ori)/10.)+ori,((y-ori)/10.)*j+ori])
                    line_0.set_data([0.,0.5],[((((y-ori)/10.)*1.+ori)+(((y-ori)/10.)*2.+ori))/2.,((y-ori)/10.)*2.+ori])
                    line_1.set_data([0.5,0.],[((y-ori)/10.)*8.+ori,((((y-ori)/10.)*8.+ori)+(((y-ori)/10.)*9.+ori))/2.])
                    line2.set_data([1.,-1.],[ori,ori])  
                    line3.set_data([t,y])
                    tf = np.arange(0.0, t, 0.05)
                    line4.set_data([tf,self.amplitude*np.cos(tf*self.frequency)])
                    time_text.set_text(time_template % (t))
                    return line, line2, line3, line_0, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8, line_9, line4
#                gs=0
                ax=0
                ax2=0
#                import matplotlib.gridspec as gridspec 
                fig3 = plt.figure()
#                rcParams.update({'figure.autolayout': True})
#                gs = gridspec.GridSpec(10, 10)
#                ax = fig3.add_subplot(gs[:,03], xlim=(-0.5, 0.5), ylim=(-self.spin_amplitude.value()-2., +self.spin_amplitude.value()+2.))
#                ax2 = fig3.add_subplot(gs[:,4:])
                ax = plt.subplot2grid((10,10), (0,0), rowspan=10, colspan=2, autoscale_on=False, xlim=(-0.5, 0.5), ylim=(-self.amplitude-2., +self.amplitude+2.))
                ax2 = plt.subplot2grid((10,10), (0,3), rowspan=10, colspan=7, autoscale_on=False, xlim=(0., tf_sim), ylim=(-self.amplitude-2., +self.amplitude+2.))
#                ax = fig3.add_subplot(121)   
#                ax2 = fig3.add_subplot(122)
                ax.set_title('Spring')
                ax.set_xticks(np.arange(-2., 3., 5.))
                ax.set_xlim(-1,1)
                ax.set_ylabel('x(m)',fontsize=13)
                if self.amplitude>=0:
                    ax.set_ylim(-self.amplitude-2.,self.amplitude+2.)
                if self.amplitude<=0:
                    ax.set_ylim(self.amplitude-2.,-self.amplitude+2.)
                
                
                ax2.set_xlabel('t(s)',fontsize=13)        
                ax2.set_ylabel('x(m)',fontsize=13)
                ax2.plot(xv,yv, 'r.-')                
                ax2.set_title('Wave packet trajectory')
                self.addmpl2(fig3)
                
                line, = ax.plot([], [], 'o-', lw=2)
                line2, = ax.plot([], [], 'g-', lw=2)
                line3, = ax2.plot([], [], 'o-', lw=2)
                line4, = ax2.plot([], [], 'b-', lw=2)
                for j in range (0,11):
                    globals() ['line_%s' %(j)], = ax.plot([], [], 'b-', lw=2)
                time_template = 'time = %.1fs'
                time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)
                
                fig3.canvas.mpl_connect('button_press_event', onClick)
                self.ani = animation.FuncAnimation(fig3, simPoints, simData,
                                              interval=25, blit=True, init_func=init, repeat=False)
                
                #ani.save('muelle.mp4', fps=15)
                self.canvas.draw()
    def game_return(self):
        self.rmmpl2()
        self.rmmpl2()
        self.mplwindow_2.hide()
        self.textDiffu.hide()
        self.mplwindow_3.hide()
        self.game.hide()
        self.fig=plt.figure()
        self.addmpl(self.fig)
        self.mplwindow.show()
        self.start.show()
        self.ButtonDemo_1.show()
        self.ButtonDemo_2.show()
        self.interact.setEnabled(True)
        self.mplfigs.show()
        self.slider_simulation.setValue(self.sim+1)
        self.slider_simulation.setValue(self.sim-1)
        
    def plot(self):
        self.sim +=1
        self.slider_simulation.setValue(self.sim)
        
        if (self.sim==self.spinBox_value*int((10*np.pi*(2.)))):
            self.timer1.stop()
                
                
            
    def plot2(self):
        self.sim -=1
        self.slider_simulation.setValue(self.sim)

        
        if (self.sim==0):
            self.timer2.stop()
            
    def on(self):
        self.timer1.stop()
        self.timer2.stop()
        if self.timer2==None:
            self.timer1=QtCore.QTimer(self)
            self.timer1.timeout.connect(self.plot)
            self.timer1.start(75)
        else:
            self.timer1=QtCore.QTimer(self)
            self.timer1.timeout.connect(self.plot)
            self.timer2.stop()
            self.timer1.start(75)
    
    def pause(self):
        self.timer1.stop()
        self.timer2.stop()
        
    def back1(self):
        self.timer1.stop()
        self.timer2.stop()
        if self.timer1==None:
            self.timer2=QtCore.QTimer(self)
            self.timer2.timeout.connect(self.plot2)
            self.timer2.start(75)
        else:
            self.timer2=QtCore.QTimer(self)
            self.timer2.timeout.connect(self.plot2)
            self.timer1.stop()
            self.timer2.start(75)
            
    def diffusion(self):
        self.timer1.stop()
        self.timer2.stop()
        self.mplwindow.hide()
        self.mplwindow_2.hide()
        self.mplwindow_3.show()
        self.game.hide()
        self.ButtonDiffu.hide()
        self.textDiffu.show()
        self.start.hide()
        self.ButtonDemo_1.hide()
        self.ButtonDemo_2.hide()
        self.interact.setEnabled(False)
        self.mplfigs.hide()
        self.ButtonBackDiffu.show()
        
        
        
        self.movie = QMovie("dispersion.gif", QByteArray(), self)
        self.movie_scr = QLabel()
        self.mplvl_3.addWidget(self.movie_scr)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie.setSpeed(100)
        self.movie_scr.setMovie(self.movie)
        self.movie.start()
        
    def backdiffu(self):
        self.movie.stop()
        self.mplvl_3.removeWidget(self.movie_scr)
        self.mplwindow_3.hide()
        self.ButtonBackDiffu.hide()
        self.textDiffu.hide()
        self.ButtonDiffu.show()
        self.mplwindow.show()
        self.start.show()
        self.ButtonDemo_1.show()
        self.ButtonDemo_2.show()
        self.interact.setEnabled(True)
        self.mplfigs.show()
        self.slider_simulation.setValue(self.sim+1)
        self.slider_simulation.setValue(self.sim-1)
        
    def demo1(self):
        self.radioButton_2.setChecked(True)
        self.horizontalSlider.setValue(0)
        self.spinBox_2.setValue(0)
        self.spinBox.setValue(2)
        self.demo=1
        self.start2()
        
    def demo2(self):
        self.radioButton.setChecked(True)
        self.horizontalSlider.setValue(3)
        self.spinBox_2.setValue(0)
        self.spinBox.setValue(2)
        self.demo=2
        self.start2()
        
            
    def changefig(self,item):
        text=item.text()
        self.rmmpl()
        self.addmpl(self.fig_dict[str(text)])
        self.fig=None
        self.timer1.stop()
        self.timer2.stop()
        
    def addfig(self,name,fig):
        self.fig_dict[name]=fig
        self.mplfigs.addItem(name)
        
    def delfig(self):
        listItems=self.mplfigs.selectedItems()
        if not listItems: return
        for item in listItems:
            self.mplfigs.takeItem(self.mplfigs.row(item))
            
    def addmpl(self,fig):
        self.canvas=FigureCanvas(fig)
        self.toolbar=NavigationToolbar(self.canvas,self,coordinates=True)
        self.mplvl.addWidget(self.toolbar)        
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
    
    def rmmpl(self):
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()        
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        
    def addmpl2(self,fig):
        self.canvas=FigureCanvas(fig)
        self.toolbar=NavigationToolbar(self.canvas,self,coordinates=True)
        self.mplvl_2.addWidget(self.toolbar)        
        self.mplvl_2.addWidget(self.canvas)
        self.canvas.draw()
        
    def rmmpl2(self):
        self.mplvl_2.removeWidget(self.toolbar)
        self.toolbar.close()        
        self.mplvl_2.removeWidget(self.canvas)
        self.canvas.close()
        
    def close(self):
        self.timer1.stop()
        self.timer2.stop()
        self.hide()
        self.file.close()
        self.parent().show()
        
    def showAuthors(self):
        QtGui.QMessageBox.question(self, 'Authors',
            "ULTRACOLDUB\n\nUniversitat de Barcelona")
        
    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(self, 'EXIT',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
            self.file.close()
        else:
            event.ignore()
예제 #24
0
class MatplotlibWidget(QtGui.QWidget):
    '''Base class for matplotlib widgets
    '''
    def __init__(self, parent):
        '''Inits matplotlib widget.
        
        Args:
            parent: A Parent class object.
        '''
        super().__init__()
        self.main_frame = parent
        self.dpi = 75
        self.show_axis_ticks = True
        self.__create_frame()


    def __create_frame(self):
        self.fig = Figure((5.0, 3.0), dpi=self.dpi)
        self.fig.patch.set_facecolor("white")
        self.canvas = FigureCanvas(self.fig)
        self.canvas.manager = MockManager(self.main_frame)
        self.canvas.setParent(self.main_frame)
        self.axes = self.fig.add_subplot(111)
        
        self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
        hbox = QtGui.QHBoxLayout()
        
        self.main_frame.ui.matplotlib_layout.addWidget(self.canvas)
        self.main_frame.ui.matplotlib_layout.addWidget(self.mpl_toolbar)
        self.main_frame.ui.matplotlib_layout.addLayout(hbox)


    def fork_toolbar_buttons(self):
        '''Remove figure options & subplot config that might not work properly.
        '''
        try:
            self.mpl_toolbar.removeAction(self.mpl_toolbar.children()[21]) 
            self.mpl_toolbar.removeAction(self.mpl_toolbar.children()[17])
        except:
            pass  # Already removed
    
    
    def remove_axes_ticks(self):
        '''Remove ticks from axes.
        '''
        if not self.show_axis_ticks:
            for tick in self.axes.yaxis.get_major_ticks():
                tick.label1On = False
                tick.label2On = False
            for tick in self.axes.xaxis.get_major_ticks():
                tick.label1On = False
                tick.label2On = False
                
                
    def delete(self):
        '''Delete matplotlib objects.
        '''
        self.axes.clear()  # Might be useless with fig.clf()
        self.canvas.close()
        self.fig.clf()
        self.close()
        
        del self.fig
        del self.canvas
        del self.axes
        
        import gc
        gc.collect()
예제 #25
0
파일: mainwindow.py 프로젝트: Unidata/Wave
class Window(QtGui.QMainWindow):
    r""" A mainwindow object for the GUI display. Inherits from QMainWindow."""

    def __init__(self):
        super(Window, self).__init__()
        self.interface()

    def interface(self):
        r""" Contains the main window interface generation functionality. Commented where needed."""

        # Get the screen width and height and set the main window to that size
        screen = QtGui.QDesktopWidget().screenGeometry()
        self.setGeometry(0, 0, 800, screen.height())
        self.setMaximumSize(QtCore.QSize(800, 2000))

        # Set the window title and icon
        self.setWindowTitle("WAVE: Weather Analysis and Visualization Environment")
        self.setWindowIcon(QtGui.QIcon('./img/wave_64px.png'))

        # Import the stylesheet for this window and set it to the window
        stylesheet = "css/MainWindow.css"
        with open(stylesheet, "r") as ssh:
            self.setStyleSheet(ssh.read())
        self.setAutoFillBackground(True)
        self.setBackgroundRole(QtGui.QPalette.Highlight)

        # Create actions for menus and toolbar
        exit_action = QtGui.QAction(QtGui.QIcon('./img/exit_64px.png'), 'Exit', self)
        exit_action.setShortcut('Ctrl+Q')
        exit_action.setStatusTip('Exit application')
        exit_action.triggered.connect(self.close)
        clear_action = QtGui.QAction(QtGui.QIcon('./img/clear_64px.png'), 'Clear the display', self)
        clear_action.setShortcut('Ctrl+C')
        clear_action.setStatusTip('Clear the display')
        clear_action.triggered.connect(self.clear_canvas)
        skewt_action = QtGui.QAction(QtGui.QIcon('./img/skewt_64px.png'), 'Open the skew-T dialog', self)
        skewt_action.setShortcut('Ctrl+S')
        skewt_action.setStatusTip('Open the skew-T dialog')
        skewt_action.triggered.connect(self.skewt_dialog)
        radar_action = QtGui.QAction(QtGui.QIcon('./img/radar_64px.png'), 'Radar', self)
        radar_action.setShortcut('Ctrl+R')
        radar_action.setStatusTip('Open Radar Dialog Box')
        radar_action.triggered.connect(self.radar_dialog)

        # Create the top menubar, setting native to false (for OS) and add actions to the menus
        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)
        filemenu = menubar.addMenu('&File')
        editmenu = menubar.addMenu('&Edit')
        helpmenu = menubar.addMenu('&Help')
        filemenu.addAction(exit_action)

        # Create the toolbar, place it on the left of the GUI and add actions to toolbar
        left_tb = QtGui.QToolBar()
        self.addToolBar(QtCore.Qt.LeftToolBarArea, left_tb)
        left_tb.setMovable(False)
        left_tb.addAction(clear_action)
        left_tb.addAction(skewt_action)
        left_tb.addAction(radar_action)
        self.setIconSize(QtCore.QSize(30, 30))

        # Create the toolbar, place it on the left of the GUI and add actions to toolbar
        right_tb = QtGui.QToolBar()
        self.addToolBar(QtCore.Qt.RightToolBarArea, right_tb)
        right_tb.setMovable(False)
        right_tb.addAction(clear_action)
        right_tb.addAction(skewt_action)
        right_tb.addAction(radar_action)

        # Create the status bar with a default display
        self.statusBar().showMessage('Ready')

        # Figure and canvas widgets that display the figure in the GUI
        self.figure = plt.figure(facecolor='#2B2B2B')
        self.canvas = FigureCanvas(self.figure)

        # Add subclassed matplotlib navbar to GUI
        # spacer widgets for left and right of buttons
        left_spacer = QtGui.QWidget()
        left_spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        right_spacer = QtGui.QWidget()
        right_spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        self.mpltb = QtGui.QToolBar()
        self.mpltb.addWidget(left_spacer)
        self.mpltb.addWidget(MplToolbar(self.canvas, self))
        self.mpltb.addWidget(right_spacer)
        self.mpltb.setMovable(False)
        self.addToolBar(QtCore.Qt.TopToolBarArea, self.mpltb)

        # Set the figure as the central widget and show the GUI
        self.setCentralWidget(self.canvas)
        self.show()

    def skewt_dialog(self):
        r""" When the toolbar icon for the Skew-T dialog is clicked, this function is executed. Creates an instance of
        the SkewTDialog object which is the dialog box. If the submit button on the dialog is clicked, get the user
        inputted values and pass them into the sounding retrieval call (DataAccessor.get_sounding) to fetch the data.
        Finally, plot the returned data via self.plot.

        Args:
            None.
        Returns:
            None.
        Raises:
            None.

        """

        dialog = SkewTDialog()
        if dialog.exec_():
            source, lat, long = dialog.get_values()
            t, td, p, u, v, lat, long, time = DataAccessor.get_sounding(source, lat, long)
            self.plot(t, td, p, u, v, lat, long, time)

    def plot(self, t, td, p, u, v, lat, long, time):
        r"""Displays the Skew-T data on a matplotlib figure.

        Args:
            t (array-like): A list of temperature values.
            td (array-like): A list of dewpoint values.
            p (array-like): A list of pressure values.
            u (array-like): A list of u-wind component values.
            v (array-like): A list of v-wind component values.
            lat (string): A string containing the requested latitude value.
            long (string): A string containing the requested longitude value.
            time (string): A string containing the UTC time requested with seconds truncated.
        Returns:
            None.
        Raises:
            None.

        """

        # Create a new figure. The dimensions here give a good aspect ratio
        self.skew = SkewT(self.figure, rotation=40)

        # Plot the data using normal plotting functions, in this case using
        # log scaling in Y, as dictated by the typical meteorological plot
        self.skew.plot(p, t, 'r')
        self.skew.plot(p, td, 'g')
        self.skew.plot_barbs(p, u, v, barbcolor='#FF0000', flagcolor='#FF0000')
        self.skew.ax.set_ylim(1000, 100)
        self.skew.ax.set_xlim(-40, 60)

        # Axis colors
        self.skew.ax.tick_params(axis='x', colors='#A3A3A4')
        self.skew.ax.tick_params(axis='y', colors='#A3A3A4')

        # Calculate LCL height and plot as black dot
        l = lcl(p[0], t[0], td[0])
        lcl_temp = dry_lapse(concatenate((p[0], l)), t[0])[-1].to('degC')
        self.skew.plot(l, lcl_temp, 'ko', markerfacecolor='black')

        # Calculate full parcel profile and add to plot as black line
        prof = parcel_profile(p, t[0], td[0]).to('degC')
        self.skew.plot(p, prof, 'k', linewidth=2)

        # Color shade areas between profiles
        self.skew.ax.fill_betweenx(p, t, prof, where=t >= prof, facecolor='#5D8C53', alpha=0.7)
        self.skew.ax.fill_betweenx(p, t, prof, where=t < prof, facecolor='#CD6659', alpha=0.7)

        # Add the relevant special lines
        self.skew.plot_dry_adiabats()
        self.skew.plot_moist_adiabats()
        self.skew.plot_mixing_lines()

        # Set title
        deg = u'\N{DEGREE SIGN}'
        self.skew.ax.set_title('Sounding for ' + lat + deg + ', ' + long + deg + ' at ' + time + 'z', y=1.02,
                               color='#A3A3A4')

        # Discards old graph, works poorly though
        # skew.ax.hold(False)
        # Figure and canvas widgets that display the figure in the GUI

        # set canvas size to display Skew-T appropriately
        self.canvas.setMaximumSize(QtCore.QSize(800, 2000))
        # refresh canvas
        self.canvas.draw()

    def radar_dialog(self):
        r""" When the toolbar icon for the Skew-T dialog is clicked, this function is executed. Creates an instance of
        the SkewTDialog object which is the dialog box. If the submit button on the dialog is clicked, get the user
        inputted values and pass them into the sounding retrieval call (DataAccessor.get_sounding) to fetch the data.
        Finally, plot the returned data via self.plot.

        Args:
            None.
        Returns:
            None.
        Raises:
            None.

        """

        radar_dialog = RadarDialog()

        if radar_dialog.exec_():
            station, product = radar_dialog.get_radarvals()
            x, y, ref = DataAccessor.get_radar(station, product)
            self.plot_radar(x, y, ref)

    def plot_radar(self, x, y, ref):
        r"""Displays the Skew-T data on a matplotlib figure.

        Args:
            t (array-like): A list of temperature values.
            td (array-like): A list of dewpoint values.
            p (array-like): A list of pressure values.
            u (array-like): A list of u-wind component values.
            v (array-like): A list of v-wind component values.
            lat (string): A string containing the requested latitude value.
            long (string): A string containing the requested longitude value.
            time (string): A string containing the UTC time requested with seconds truncated.
        Returns:
            None.
        Raises:
            None.

        """

        self.ax = self.figure.add_subplot(111)
        self.ax.pcolormesh(x, y, ref)
        self.ax.set_aspect('equal', 'datalim')
        self.ax.set_xlim(-460, 460)
        self.ax.set_ylim(-460, 460)
        self.ax.tick_params(axis='x', colors='#A3A3A4')
        self.ax.tick_params(axis='y', colors='#A3A3A4')

        # set canvas size to display Skew-T appropriately
        self.canvas.setMaximumSize(QtCore.QSize(800, 2000))
        # refresh canvas
        self.canvas.draw()

    def clear_canvas(self):
        self.canvas.close()
        self.figure = plt.figure(facecolor='#2B2B2B')
        self.canvas = FigureCanvas(self.figure)
        self.setCentralWidget(self.canvas)
예제 #26
0
class Main(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        self.PlotButton.clicked.connect(self.plot)
        self.ClearButton.clicked.connect(self.clear)
        self.SaveButton.clicked.connect(self.save)
        self.QuitButton.clicked.connect(self.quit)
        self.subjectNo = 0;
        self.filter = 0;
        self.param =0;
        self.fig = plt.figure();
        self.a1 = self.fig.add_subplot(121)
        self.a2 = self.fig.add_subplot(122)
        self.cnx = mysql.connector.connect(user='******',password='******',database='mohand');
        self.cursor = self.cnx.cursor();

    def addplot(self):
        self.canvas = FigureCanvas(self.fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, self, coordinates=True)
        self.addToolBar(self.toolbar)

    def rmplot(self):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def filterstr(self,x):
        return{
            0: '_fil_',
            1: '_raw_'
            }.get(x)

    def paramstr(self,x):
        return{
            0: 'indexVal',
            1: 'meanReactionTime',
            2: 'meanMovementTime',
            3: 'meanResponseTime',
            4: 'meanMaxVel',
            5: 'meanMaxAcc',
            6: 'meanEPD',
            7: 'meanRealDist',
            8: 'meanTraversedDist',
            9: 'meanPerDev',
            10: 'ovMaxReactionTime',
            11: 'ovMaxMovementTime',
            12: 'ovMaxEPD',
            13: 'ovMaxSpeed',
            14: 'ovMaxAcc'
        }.get(x)

    def daystr(self,x):
        return{
            0: 'baseline',
            1: 'day1',
            2: 'day2',
            3: 'day3',
            4: 'day4',
            5: 'day5'
            }.get(x,'performance')
    
    def plot(self):
        print "plotting graph";
        self.subjectNo = int(self.text_subNo.text());
        self.filter = self.combo_filter.currentIndex();
        self.param = self.combo_param.currentIndex();
        fstr = self.filterstr(self.filter);
        pstr = self.paramstr(self.param);
        rep_data = np.zeros(7);
        ran_data = np.zeros(7);
        for i in range(7):
            s = "select count("+pstr+fstr+"rep) from "+self.daystr(i)+" where subNo="+str(self.subjectNo);
            res=self.cursor.execute(s);
            if(int(self.cursor.fetchone()[0])==1):
                s = "select "+pstr+fstr+"rep from "+self.daystr(i)+" where subNo="+str(self.subjectNo);
                res2 = self.cursor.execute(s);
                rep_data[i] = float(self.cursor.fetchone()[0]);
            s = "select count("+pstr+fstr+"ran) from "+self.daystr(i)+" where subNo="+str(self.subjectNo);
            res=self.cursor.execute(s);
            if(int(self.cursor.fetchone()[0])==1):
                s = "select "+pstr+fstr+"ran from "+self.daystr(i)+" where subNo="+str(self.subjectNo);
                res2 = self.cursor.execute(s);
                ran_data[i] = float(self.cursor.fetchone()[0]);
        self.rmplot();
        
        labels = ['Baseline', 'Day 1', 'Day 2','Day 3','Day 4','Day 5','Performance'];
        self.a1.set_xticklabels(labels);
        self.a2.set_xticklabels(labels);
        self.a1.set_title('Repeated Sequence');
        self.a2.set_title('Random Sequence');
        label_ax = 'Subject '+str(self.subjectNo)+' '+pstr;
        self.a1.plot(rep_data, label=label_ax);
        self.a2.plot(ran_data, label =label_ax);
        leg1 = self.a1.legend(loc='best');
        leg2 = self.a2.legend(loc='best');
        leg1.draggable(state=True);
        leg2.draggable(state=True);
        self.addplot();
        self.sub_info.setText("(Subject Number "+str(self.subjectNo)+")");
        rep_d1_val = int((rep_data[1]-rep_data[0])*100/rep_data[0]);
        self.rep_d1.setText(str(rep_d1_val));
        ran_d1_val = int((ran_data[1]-ran_data[0])*100/ran_data[0]);
        self.ran_d1.setText(str(ran_d1_val));
        rep_d2_val = int((rep_data[2]-rep_data[0])*100/rep_data[0]);
        self.rep_d2.setText(str(rep_d2_val));
        ran_d2_val = int((ran_data[2]-ran_data[0])*100/ran_data[0]);
        self.ran_d2.setText(str(ran_d2_val));
        rep_d3_val = int((rep_data[3]-rep_data[0])*100/rep_data[0]);
        self.rep_d3.setText(str(rep_d3_val));
        ran_d3_val = int((ran_data[3]-ran_data[0])*100/ran_data[0]);
        self.ran_d3.setText(str(ran_d3_val));
        rep_d4_val = int((rep_data[4]-rep_data[0])*100/rep_data[0]);
        self.rep_d4.setText(str(rep_d4_val));
        ran_d4_val = int((ran_data[4]-ran_data[0])*100/ran_data[0]);
        self.ran_d4.setText(str(ran_d4_val));
        rep_d5_val = int((rep_data[5]-rep_data[0])*100/rep_data[0]);
        self.rep_d5.setText(str(rep_d5_val));
        ran_d5_val = int((ran_data[5]-ran_data[0])*100/ran_data[0]);
        self.ran_d5.setText(str(ran_d5_val));
        rep_p_val = int((rep_data[6]-rep_data[0])*100/rep_data[0]);
        self.rep_p.setText(str(rep_p_val));
        ran_p_val = int((ran_data[6]-ran_data[0])*100/ran_data[0]);
        self.ran_p.setText(str(ran_p_val));


    def clear(self):
        self.a1.cla();
        self.a2.cla();
        self.rmplot();
        self.addplot();
        self.text_subNo.setText("");
        self.combo_filter.setCurrentIndex(0);
        self.combo_param.setCurrentIndex(0);
        print "clear";

    def save(self):
        print "save"
        #open a dialog box and input name of figure and then save.
        #plt.savefig('common_labels_text.png', dpi=300)
    
    def quit(self):
        #self.cnx.commit();
        #self.cnx.close();
        exit()
예제 #27
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
#data_dict stores all loaded data sets
        self.data_dict = {}
        self.mplfigs.itemSelectionChanged.connect(self.changefig)
        self.folderSelect.clicked.connect(self.onSelectFolder)
        self.saveFit.clicked.connect(self.onSaveFit)
        self.cancelFit.clicked.connect(self.onCancelFit)
        self.fitSelectedData.clicked.connect(self.onFit)
        self.fitSelectedData.setEnabled(False)
        self.selectPandasDB.clicked.connect(self.onSelectPandasDB)
        self.QEntry.setValidator(QtGui.QIntValidator(1,1000000)) 
        self.widthEdit.setValidator(QtGui.QIntValidator(1,10000))
        self.widthEdit.setText(str(0))
        self.powerType.setText(str(0))
        self.powerValue.setText(str(0))
        self.QEntry.setText(str(100))
        self.fNumber.setValue(1)
        self.degeneracySelect.setCurrentIndex(0)
        fig = Figure()
        self.addmpl(fig)
        self.activefig=None
        self.activeDataSet=None
        self.fittingWindow = None
        self.df=pd.DataFrame()
        self.testdf=pd.DataFrame()
        self.onSelectPandasDB()
    
    def onSelectPandasDB(self,):
        """Select a folder, the selected folder will be parsed for sub-folders.
        Each of these subfolders will be turned into a xyData class which is 
        then stored in main with the adddata command"""
        fileDialog=QtGui.QFileDialog(self)
        fileName=fileDialog.getSaveFileName(self,
        "Choose a pandasDB", homedir, filter ="csv (*.csv)")
        self.pathtopandas=fileName
        self.chipEdit.setText(self.pathtopandas)
        print self.pathtopandas
    def onSelectFolder(self,):
        """Select a folder, the selected folder will be parsed for sub-folders.
        Each of these subfolders will be turned into a xyData class which is 
        then stored in main with the adddata command"""
        self.fileDialog=QtGui.QFileDialog(self)
        folderName=self.fileDialog.getExistingDirectory(self,
        "Choose a folder", homedir, QtGui.QFileDialog.ShowDirsOnly)
        for i in os.listdir(folderName):
            for ii in os.listdir(os.path.join(folderName,i)):
                if ii[-4:] == ".csv":            
                    self.adddata(i, xyData(os.path.join(folderName,i)))        
                                    
    def changefig(self, ):
        item=self.mplfigs.currentItem()
        
        if self.activefig==None:
            pass
        else:
            self.activefig.canvas.mpl_disconnect(self.cid)
        if self.fitSelectedData.isEnabled()==True:
            pass
        else:
            self.fitSelectedData.setEnabled(True)        
        
        text = item.text()
        self.rmmpl()
        fig=self.data_dict[text].fig
        self.addmpl(fig)
        self.cid = fig.canvas.mpl_connect('button_press_event', self.onclick)
        try:
            self.widthEdit.setText(str(self.data_dict[text].deviceWid))           
        except ValueError:
            pass
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
        try:
            self.rowEdit.setValue(int(self.data_dict[text].deviceRow))          
        except ValueError:
            pass
        try:
            self.powerType.setText(str(self.data_dict[text].laserPowerType))          
        except ValueError:
            pass
        try:
            self.powerValue.setText(str(self.data_dict[text].laserPower))          
        except ValueError:
            pass
        try:
            self.columnEdit.setValue(int(self.data_dict[text].deviceCol))          
        except ValueError:
            pass
        try:
            ind = self.deviceType.findText(str(self.data_dict[text].deviceType).strip())        
            self.deviceType.setCurrentIndex(ind)          
        except ValueError:
            pass           
        self.activefig=fig
        self.activeDataSet=self.data_dict[text]

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, self.mplwindow, coordinates=True)
        self.mplvl.addWidget(self.toolbar)
    
    def rmmpl(self,):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
#        self.activefig.canvas.mpl_disconnect(self.cid)
    
#This has to be modified for data types other than a ZI data input
    def adddata(self, name, xyDataClass):
        self.data_dict[name] = xyDataClass
        self.mplfigs.addItem(name)
    
#Clcik on active MPL window    
    def onclick(self, event):
#        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(event.button, event.x, event.y, event.xdata, event.ydata)
        print self.activeDataSet.find_nearestx(event.xdata)
#gca can get limits of zoomed widow
    def onFit(self,):
        self.disableForFit()
    
    def fitClick(self, event):
        self.cancelFit.setEnabled(True)
        print 'clicked'
        self.activefig.canvas.mpl_disconnect(self.cid)
        xi,xf = self.activeDataSet.fig.gca().get_xlim()
        xi, xvi = self.activeDataSet.find_nearestx(xi)
        xf, xvf = self.activeDataSet.find_nearestx(xf)
# General to this point, actual fit can vary below        
        x0 = event.xdata
        y0 = event.ydata        
        Q = float(self.QEntry.text())
        sigma=1/(2*Q)
        print xi,xf, [x0,y0,sigma]
        ip=[x0,y0,sigma]
        print self.activeDataSet
        out, params, outp, self.paramsp, dout = self.activeDataSet.fitDataSelection(xi,xf,ip)
        self.outfit=out
        self.currpars=params
        self.fitfig=Figure()
        ax=self.fitfig.add_subplot(1,1,1)
        axt=ax.twinx()
        ax.plot(self.activeDataSet.data.f[xi:xf+1], out.best_fit)
        axt.plot(dout[0], outp.best_fit, 'g')
        ax.plot(self.activeDataSet.data.f[xi:xf+1], self.activeDataSet.data.r[xi:xf+1], 'ro')
        axt.plot(dout[0], dout[1], 'go')
        idx=min(range(len(self.activeDataSet.data.f)), key=lambda x: abs(self.activeDataSet.data.f[x]-params[0]))
        ax.annotate('Q = '+ str(params[3]) + '\n' + 'w_0 = '+ str(params[0]), xy=(params[0],self.activeDataSet.data.r[idx]), textcoords = 'data', xycoords='data')
        self.rmmpl()
        self.addmpl(self.fitfig)
        self.activeFitParams = params
        self.saveFit.setEnabled(True)

#        plt.text(2, 0.65,'Q = '+ str(params[3]), fontdict=font)

    def disableForFit(self,):
        self.mplfigs.setEnabled(False)
        self.fitSelectedData.setEnabled(False)
        self.folderSelect.setEnabled(False)
        self.activefig.canvas.mpl_disconnect(self.cid)
        self.cid =self.activefig.canvas.mpl_connect('button_press_event', self.fitClick)

    def enableAfterFit(self,):
        self.toolbar.setEnabled(True)
        self.mplfigs.setEnabled(True)
        self.fitSelectedData.setEnabled(True)
        self.folderSelect.setEnabled(True)
        self.activefig.canvas.mpl_disconnect(self.cid)
        self.rmmpl()
        self.addmpl(self.activefig)
        self.cid =self.activefig.canvas.mpl_connect('button_press_event', self.onclick)
    def onSaveFit(self,):
        self.w0=self.activeFitParams[0]
        self.A=self.activeFitParams[1]
        self.Q=self.activeFitParams[3]
        self.lineInt=self.activeFitParams[4]
        self.lineSlope=self.activeFitParams[5]
        self.saveFit.setEnabled(False)
        self.cancelFit.setEnabled(False)
        curridx=self.mplfigs.currentItem().text()+'_'+str(self.fNumber.value())+'_' + self.degeneracySelect.currentText()        
        newrow=self.prepareDFRow(curridx)
        try:        
            master=pd.read_csv(self.pathtopandas, index_col=0)
            if curridx not in self.testdf.index:
                newmaster=master.append(newrow)
                print newmaster                
                newmaster.to_csv(self.pathtopandas[:-4]+'temp.csv')
                os.remove(self.pathtopandas)
                os.rename(self.pathtopandas[:-4]+'temp.csv',self.pathtopandas)
                
            else:
                print 'repeated fit'
        except IOError:
            newrow.to_csv(self.pathtopandas)
        self.enableAfterFit()
    def prepareDFRow(self, idx):
        df = pd.DataFrame({'Run Name' : self.mplfigs.currentItem().text(), 'Device Name' : self.chipEdit.text(), 'Row Number' : \
            self.rowEdit.value(), 'Column Number' : self.columnEdit.value(),\
            'Device Type' : self.deviceType.currentText(), 'Device Width' : \
                self.widthEdit.text(), 'Mode Order' : self.fNumber.value(), \
                'Mode Type': self.degeneracySelect.currentText(), 'Frequency' : self.w0, 'Amplitude' : self.A, \
                'Q' : self.Q, 'Bad Fit' : self.selectBadFit.checkState(), 'Power Measurement Type' : self.powerType.text(), 'Power (uW)' : self.powerValue.text(),\
                'Fit Notes' : self.fitNotes.text(), 'Date' : self.activeDataSet.date, 'Intercept': self.lineInt, 'Slope':self.lineSlope, 'w0p': self.paramsp[0],'Qp': self.paramsp[1],'pm': self.paramsp[2],'pb': self.paramsp[3]}, index=[idx] )
        return df
    def onCancelFit(self,):
        self.saveFit.setEnabled(False)
        self.cancelFit.setEnabled(False)
        self.enableAfterFit()
예제 #28
0
class Main(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        
        icon = QtGui.QIcon(':/Icon.png')
        self.setWindowIcon(icon)
        
        self.coeffWH = CAPTUREHEIGHT/CAPTUREWIDTH
        
        self.objectLine.setText(OBJECTNAME)
        self.objectName = self.objectLine.text()
        
        self.path = PATH
        self.directoryLine.setText(self.path)        
        
        self.pathCleaner(True)
        self.videoStream()
        
        self.posSlider.valueChanged.connect(self.posChange)
        self.posSlider.setMinimum(0)
        self.posSlider.setMaximum(CAPTUREHEIGHT)
        self.posSlider.setValue(POS)        
        
        self.sizeSlider.valueChanged.connect(self.sizeChange)
        self.sizeSlider.setMinimum(0)
        self.sizeSlider.setMaximum(POS)
        self.sizeSlider.setValue(SIZE)        
        
        self.brightnessSlider.valueChanged.connect(self.brightnessChange)        
        self.contrastSlider.valueChanged.connect(self.contrastChange)
        self.saturationSlider.valueChanged.connect(self.saturationChange)
        self.hueSlider.valueChanged.connect(self.hueChange)        
        self.gainSlider.valueChanged.connect(self.gainChange)
        self.exposureSlider.valueChanged.connect(self.exposureChange)
        
        self.captureButton.clicked.connect(self.captureData)
        self.cleanButton.clicked.connect(self.cleanPlot)
        self.resetButton.clicked.connect(self.resetSettings)
        
        self.comboBox_2.addItem("680 x 480")
        self.comboBox_2.addItem("1280 x 720")
#        self.comboBox_2.addItem("1920 x 1080")
         
        self.comboBox_2.activated[str].connect(self.resolutionBox)
        
        self.canvas = None
        
    def videoStream(self):
        self.cam = specpy.GuiWindow("Stream", CAMARA, self.objectName, STREAMWIDTH, STREAMHEIGHT, PATH, 
                                   POS, SIZE, BRIGHTNESS, CONTRAST, SATURATION, HUE,
                                   GAIN, EXPOSURE, "canvas")
        self.updateImage()
        self.fig_num = 0              
        
    def qImage(self, width, height, bytesPerLine):
        qImg = QtGui.QImage(self.cam.frame.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888)
        pix = QtGui.QPixmap(qImg)
        return pix
        
    def keyPressEvent(self, event):
        keyPressed = event.key()
        if keyPressed == QtCore.Qt.Key_Alt + QtCore.Qt.Key_F4: 
            self.cam.closeInput()
            self.close()
        elif keyPressed == QtCore.Qt.Key_Enter - 1:
            self.captureData()
        elif keyPressed == QtCore.Qt.Key_C:
            self.cleanPlot()
        elif keyPressed == QtCore.Qt.Key_R:
            self.resetSettings()
            
    def updateImage(self):
        width = self.CamaraStream.frameGeometry().width()
        height = int(self.coeffWH*width)
        realHeight = self.CamaraStream.frameGeometry().height()
        if height > realHeight:
            width = int(realHeight/self.coeffWH)
            height = realHeight
        self.cam.changeHeight(height)
        self.cam.changeWidth(width)
        bytesPerLine = 3*width
        answer = self.cam.eachPhotogram()
        if answer:
            pix = self.qImage(width, height, bytesPerLine)
            self.CamaraStream.setPixmap(pix)
        
    def update(self):
        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.updateImage)
        timer.start(33)

        # Creates first plot
        self.updatePlot()
        
    def updatePlot(self):
        def create():
            figure = self.cam.figure
            if figure != None:
                self.canvas = FigureCanvas(figure)
                self.figureFrame.addWidget(self.canvas)
                self.canvas.draw()
            else:
                self.canvas == None
                
        def removePlot():
            self.figureFrame.removeWidget(self.canvas)
            self.canvas.close()
            
        if self.canvas == None:
            create()
        else:
            removePlot()
            create()
            
    def posSliderLimits(self):
        self.posSlider.setMinimum(0)
        temp = self.cam.analysisHeight
        self.posSlider.setMaximum(temp)#CAPTUREHEIGHT)
        self.posSlider.setValue(int(temp/2))
        
    def sizeSliderLimits(self):
        self.sizeSlider.setMinimum(0)
        temp = self.cam.analysisHeight
        self.sizeSlider.setMaximum(int(temp/2))
        self.sizeSlider.setValue(int(temp/4))
    
    def posChange(self):
        size = self.posSlider.value()
        self.cam.posTrackBar(size)
        
    def sizeChange(self):
        size = self.sizeSlider.value()
        self.cam.rangeTrackBar(size)
        
    def brightnessChange(self):
        size = self.brightnessSlider.value()
        self.cam.brightnessTrackBar(size)
        
    def contrastChange(self):
        size = self.contrastSlider.value()
        self.cam.contrastTrackBar(size)

    def saturationChange(self):
        size = self.saturationSlider.value()
        self.cam.saturationTrackBar(size)
        
    def hueChange(self):
        size = self.hueSlider.value()
        self.cam.hueTrackBar(size)
        
    def gainChange(self):
        size = self.gainSlider.value()
        self.cam.gainTrackBar(size)

    def exposureChange(self):
        size = self.exposureSlider.value()
        self.cam.exposureTrackBar(size)      
    
    def captureData(self):
        self.objectNameChanger()
        self.pathChanger()
        self.fig_num = self.cam.captureData(self.cam.notSquaredAnalysisFrame, self.fig_num)
        self.updatePlot()
        
    def resetSettings(self):
        self.cam.resetSettings(POS, SIZE, BRIGHTNESS, CONTRAST, SATURATION, HUE, GAIN, EXPOSURE)
        self.posSlider.setValue(POS)
        self.sizeSlider.setValue(SIZE)        
        self.brightnessSlider.setValue(BRIGHTNESS)
        self.contrastSlider.setValue(CONTRAST)
        self.saturationSlider.setValue(SATURATION)
        self.hueSlider.setValue(HUE)
        self.gainSlider.setValue(GAIN)
        self.exposureSlider.setValue(EXPOSURE)
        self.path = PATH
        self.directoryLine.setText(self.path)
        self.objectName = OBJECTNAME
        self.objectLine.setText(self.objectName)
        self.comboBox_2.setCurrentIndex(0)
        self.resolutionBox(self.comboBox_2.currentText())
        
    def closeEvent(self, event):
        self.cam.closeInput()
        self.close()
        
    def resolutionBox(self, text):
        parted_line = text.rpartition('x')
        width, _, height = parted_line
        width = int(width)
        height = int(height)
        self.coeffWH = height/width
        self.cam.setCaptureHeight(height)
        self.cam.setCaptureWidth(width)
        self.posSliderLimits()
        self.sizeSliderLimits()
        
    def objectNameChanger(self):
        self.objectName = self.objectLine.text()
        self.cam.objectName = self.objectName
#        print(text)
        
    def pathChanger(self):
        self.path = self.directoryLine.text()
        self.cam.path = self.path
        self.pathCleaner(False)
        
    def pathCleaner(self, delete):
        import os, glob
        if not os.path.exists(self.path):
            os.makedirs(self.path)
        if delete:
            temp = glob.glob(self.path+'/*.jpg')
            temp2 = glob.glob(self.path+'/*.csv')
            temp += temp2
            for item in temp:
                os.remove(item)
                
    def cleanPlot(self):
        self.cam.cleanData()
        self.updatePlot()
class Main(QMainWindow,Ui_MainWindow):
    def __init__(self,parent=None):
        super(Main,self).__init__(parent)
        self.setupUi(self)
        self.connect(self.pushButton_9,SIGNAL("clicked()"),self,SLOT("start()"))
        self.connect(self.pushButton,SIGNAL("clicked()"),self,SLOT("one()"))
        self.connect(self.pushButton_2,SIGNAL("clicked()"),self,SLOT("two()"))
        self.connect(self.pushButton_3,SIGNAL("clicked()"),self,SLOT("three()"))
        self.connect(self.pushButton_4,SIGNAL("clicked()"),self,SLOT("four()"))
        self.connect(self.pushButton_5,SIGNAL("clicked()"),self,SLOT("five()"))
        self.connect(self.pushButton_6,SIGNAL("clicked()"),self,SLOT("six()"))
        self.connect(self.pushButton_7,SIGNAL("clicked()"),self,SLOT("seven()"))
        self.connect(self.pushButton_8,SIGNAL("clicked()"),self,SLOT("eight()"))
        self.connect(self.pushButton_10,SIGNAL("clicked()"),self,SLOT("confirm_size()"))
        self.textEdit.append("push getsure")
        self.df=[]
        self.sensor=[]
    def addmpl(self,fig):
        self.canvas=FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
    def rmmpl(self):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()

#--------------------button-------
    @pyqtSlot()
    def start(self):
        self.listen_for_gestures()
    @pyqtSlot()
    def confirm_size(self):
        list=[]
        list.append(file1)
        list.append(file2)
        list.append(file3)
        list.append(file4)
        list.append(file5)
        list.append(file6)
        list.append(file7)
        list.append(file8)
        for i in range(len(list)):
            ans=[]
            try:
                df=pd.read_csv(list[i],header=None)
                ans.append(str(list[i]))
                ans.append(df.shape)
                self.textEdit.append(str(ans))
            except:
                print "file none.."

    def listen_for_gestures(self):
        print"start"
        ser=serial.Serial("COM5",9600,timeout=time_out)#optional COM port
        for n in range(0,samples):
            total=[]
            try:
                print "Listening for gesture"
               # self.textEdit.append("Listening for gesture for "+str(time_out)+"seconds...")
                for line in ser:
                    line=line.decode()
                    line=line.split(" ")
                    del line[-1]
                    values=list(map(int,line))
                    total=total+values
            except serial.SerialException:
                print"caught serial exception"
            self.textEdit.append("measurement end ...")
            print "end.."
            sensor1=[]
            sensor2=[]
            sensor3=[]
            sensor4=[]
            for j in range(0,len(total),4):
                sensor1.append(total[j+0])
                sensor2.append(total[j+1])
                sensor3.append(total[j+2])
                sensor4.append(total[j+3])
            time.sleep(2)
            sensor3.extend(sensor4)
            sensor2.extend(sensor3)
            sensor1.extend(sensor2)
          #  print total
            if len(sensor1)>0:
                sensor1=map(float,sensor1)
                sensor1=self.trim_data(sensor1)
            print sensor1
            #self.textEdit.append("wait......")
            time.sleep(2)
            self.sensor=sensor1
           # self.df=pd.DataFrame(sensor1)
            self.plot_four(sensor1)
            ser.close()
    def trim_data(self,d,n=128,m=255):
        l=len(d)
        histogram=[0]*n
        s=int(l/n)
        if s==0:
            s=int(1./(float(l)/float(n)))
            for i,x in enumerate(d):
                histogram[i*s]=x/m
        else:
            for i in range(0,n):
                histogram[i]=sum(d[i*s:(i+1)*s])/(m*s)
        return histogram
#---------------------------------------            
    @pyqtSlot()
    def one(self):
        self.textEdit.append("one")
        self.save_csv(file1)
        self.textEdit.append("saved....["+str(file1)+"]")
    @pyqtSlot()
    def two(self):
        self.textEdit.append("two")
        self.save_csv(file2)
        self.textEdit.append("saved....["+str(file2)+"]")
    @pyqtSlot()
    def three(self):
        self.textEdit.append("three")
        self.save_csv(file3)
        self.textEdit.append("saved...["+str(file3)+"]")
    @pyqtSlot()
    def four(self):
        self.textEdit.append("four")
        self.save_csv(file4)
        self.textEdit.append("saved....["+str(file4)+"]")
    @pyqtSlot()
    def five(self):
        self.textEdit.append("five")
        self.save_csv(file5)
        self.textEdit.append("saved....[5]")
    @pyqtSlot()
    def six(self):
        self.textEdit.append("six")
        self.save_csv(file6)
        self.textEdit.append("saved....[6]")
    @pyqtSlot()
    def seven(self):
        self.textEdit.append("seven")
        self.save_csv(file7)
        self.textEdit.append("saved....[7]")
    @pyqtSlot()
    def eight(self):
        self.textEdit.append("eight")
        self.save_csv(file8)
        self.textEdit.append("saved....[8]")

    def save_csv(self,file_name):
        f=open(file_name,"ab")
        csvwriter=csv.writer(f)
        csvwriter.writerow(self.sensor)
        f.close()
    def plot_four(self,sensor1):
        fig1=Figure()
        sensor1=np.array(sensor1)
        print sensor1
        sensor1=sensor1.reshape(4,32)
        print sensor1.T
        ax1=fig1.add_subplot(411)
        ax1.set_title("UP")
        ax1.plot(np.arange(32),sensor1[0,:])
        ax2=fig1.add_subplot(412)
        ax2.set_title("DOWN")
        ax2.plot(np.arange(32),sensor1[1,:])
        ax3=fig1.add_subplot(413)
        ax3.set_title("LEFT")
        ax3.plot(np.arange(32),sensor1[2,:])        
        ax4=fig1.add_subplot(414)
        ax4.set_title("RIGHT")
        ax4.plot(np.arange(32),sensor1[3,:])
        self.rmmpl()
        self.addmpl(fig1)
예제 #30
0
파일: qaz.py 프로젝트: hb4837/talib_tool
class Main(QMainWindow, Ui_MainWindow):

    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        self.toolbar = None

        # Fill the indicators table
        n_rows = 0

#       self.indicator_classes = {}

#       for s in Indicator.get_subclasses():
#           n = s.get_name()
#           if (n != None):
#               self.indicator_classes[n] = s
#               n_rows += 1
#               self.indicators.setRowCount(n_rows)
#               item = QtGui.QTableWidgetItem()
#               item.setCheckState(QtCore.Qt.Unchecked)
#               item.setText(n)
#               self.indicators.setItem(n_rows-1, 0, item)

        # GUI event handlers
        self.symbolsList.itemSelectionChanged.connect(self.changeSymbolHandler)
        self.marketsCombo.currentIndexChanged.connect(self.changeMarketHandler)
        self.actionSma30.triggered.connect(self.actionSma30Handler)
        self.actionSma90.triggered.connect(self.actionSma90Handler)
        self.actionSma200.triggered.connect(self.actionSma200Handler)
        self.actionBollinger.triggered.connect(self.actionBollingerHandler)
#       self.indicators.itemPressed.connect(self.changeIndicatorHandler)
        # TODO: use new notation
        # QtCore.QObject.connect(self.symbolsList, QtCore.SIGNAL('itemSelectionChanged()'), self.changeSymbolHandler)

        self.figure = Figure()
        self.addFig(self.figure)

        pythonshell = internalshell.InternalShell(self.shellWidget, namespace=globals(), \
            commands=[], multithreaded=False)
        pythonshell.resize(self.shellWidget.size())

        #pythonshell.resize(800, 300)
        #shell.setWidget(pythonshell)
        #shell.show()

        self.chart = None


    def on_button_press_event(self, event):
        print "on_button_press_event: [" + str(event.x) + ", " + str(event.y) + "]"


    def on_motion_notify_event(self, event):
        if (self.chart != None):
            self.chart.cursor(event)


    def on_scroll_event(self, event):
        if (event.button == 'up'):
            mode = +1
        elif (event.button == 'down'):
            mode = -1
        self.chart.zoom(mode)
        self.canvas.draw()


    def changeSymbolHandler(self):
        s = str(self.symbolsList.currentItem().text())
        self.quote = Quote(s).load("2015-01-01")

        # Delete figure
        self.plotLayout.removeWidget(self.canvas)
        self.canvas.close()

        # Add new figure
        self.canvas = FigureCanvas(self.figure)
        self.plotLayout.addWidget(self.canvas)

        self.chart = Chart(self.quote, figure=self.figure)
        self.chart.add_item(self.quote)

        self.canvas.draw()

        self.cid = self.figure.canvas.mpl_connect('scroll_event', self.on_scroll_event)
        self.cid = self.figure.canvas.mpl_connect('button_press_event', self.on_button_press_event)
        # self.cid = self.figure.canvas.mpl_connect('motion_notify_event', self.on_motion_notify_event)
        self.chart.plot()
        self.canvas.draw()


    def changeIndicatorHandler(self):
        item = self.indicators.currentItem()
        indicator_name = str(item.text())

        if (item.checkState() == QtCore.Qt.Unchecked):
            item.setCheckState(QtCore.Qt.Checked)
            indicator = self.indicator_classes[indicator_name](self.quote)
            self.chart.add_item(indicator)
        elif (item.checkState() == QtCore.Qt.Checked):
            item.setCheckState(QtCore.Qt.Unchecked)
            self.chart.remove_item(indicator_name)
        else:
            print "???????????????"

        #self.chart.add_item(self.quote)
        # Replace figure
        self.figure = self.chart.get_fig()
        self.delFig()
        self.addFig(self.figure)
        self.chart.zoom()
#       # Replace figure
#       self.figure = self.chart.get_fig()
#       self.delFig()
#       self.addFig(self.figure)
#       self.chart.plot()


    def changeMarketHandler(self, index):
        market = MARKET_REFS[index]
        # Replace symbols
        self.symbolsList.clear()
        for s in sorted(market.iterkeys()):
            self.symbolsList.addItem(s)


    def actionSma30Handler(self):
        s = SMA(self.chart.quote, 30)
        self.chart.add_item(s)
        self.chart.plot()
        self.canvas.draw()


    def actionSma90Handler(self):
        s = SMA(self.chart.quote, 90)
        self.chart.add_item(s)
        self.chart.plot()
        self.canvas.draw()


    def actionSma200Handler(self):
        s = SMA(self.chart.quote, 200)
        self.chart.add_item(s)
        self.chart.plot()
        self.canvas.draw()


    def actionBollingerHandler(self):
        s = Bollinger(self.chart.quote)
        self.chart.add_item(s)
        self.chart.plot()
        self.canvas.draw()


    def initMarkets(self):
        for market in MARKET_NAMES:
            self.marketsCombo.addItem(market)


    def addFig(self, fig):
        self.canvas = FigureCanvas(fig)
        self.plotLayout.addWidget(self.canvas)
        #self.canvas.draw()
        self.cid = self.figure.canvas.mpl_connect('scroll_event', self.on_scroll_event)
        self.cid = self.figure.canvas.mpl_connect('button_press_event', self.on_button_press_event)
        # self.cid = self.figure.canvas.mpl_connect('motion_notify_event', self.on_motion_notify_event)


    def delFig(self,):
        self.plotLayout.removeWidget(self.canvas)
        self.canvas.close()
예제 #31
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)

        self.thisDir = os.path.dirname(os.path.abspath(__file__))
        self.btOpenImage.clicked.connect(self.openImage)

        fig = Figure()

        self.canvas = FigureCanvas(fig)
        self.canvasGraph.addWidget(self.canvas)
        self.canvas.draw()

        self.message.setText('Escolha uma imagem')
        self.status.setText('Sem imagem')
        self.Xax.setText('Esperando calibracao')
        self.Xay.setText('Esperando calibracao')

        self.calibrateX.clicked.connect(partial(self.action, 'calX'))

        self.XaxisX = []
        self.XaxisY = []

        return

    def openImage(self):
        texto = 'Escolha uma imagem'
        path = QtGui.QFileDialog.getOpenFileNameAndFilter(
            self, texto, self.thisDir, "Images (*.png *.jpg)")

        datafile = cbook.get_sample_data(str(path[0]))
        img = imread(datafile)

        self.updateCanvas(self.initializeCanvas(img))

        self.message.setText('Esperando a calibracao dos eixos')
        self.status.setText('Em espera')

        return

    def initializeCanvas(self, img):

        fig = Figure()
        fig.clear()
        Graph = fig.add_subplot(111)
        Graph.imshow(img, zorder=0, extent=[0.0, 1.0, 0.0, 1.0])

        return fig

    def updateCanvas(self, fig):
        self.canvasGraph.removeWidget(self.canvas)
        self.canvas.close()

        self.canvas = FigureCanvas(fig)
        self.canvasGraph.addWidget(self.canvas)
        self.canvas.draw()

        def onclick(event):
            x, y = event.xdata, event.ydata
            if x != None and y != None:
                if self.currentAction == 'calX':
                    if len(self.XaxisX) == 0:
                        self.XaxisX.append(x)
                        self.XaxisY.append(y)
                        self.Xax.setText(str(x))
                        self.Xay.setText(str(y))
                        self.message.setText('Clique e marque onde esta Xb')

            return

        self.canvas.mpl_connect('button_press_event', onclick)

        return

    def action(self, what):
        self.currentAction = what
        if what == 'calX':
            self.message.setText('Clique e marque onde esta Xa')
            self.status.setText('Calibrando Eixo X')

        return
예제 #32
0
class MainWindow(QtGui.QMainWindow, form_class):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.cellpoints = np.array([])
        self.FindCells.clicked.connect(self.Id_cells)
        self.Classify.clicked.connect(self.start_clicked)
        self.AddClassified.clicked.connect(self.create_csv)
        self.validatebutton.clicked.connect(self.validateAutoClass)
        self.imageviewbutton.clicked.connect(self.openMainFig)
        self.autoClassButton.clicked.connect(self.AutoClassification)
        self.Boxsize.setText("101")
        self.fig = Figure()
        self.THEimage = np.array([])
        self.BLUEimage = 0
        self.THEblobs = np.array([])
        self.DatabaseSize.setText(str(len(glob.glob('singleCells/*.png'))))
        self.table.setColumnCount(3)
        self.layout.addWidget(self.table, 1, 0)
        self.table.setHorizontalHeaderLabels(
            ['index', 'auto class', 'gold class'])
        self.dirButton.clicked.connect(self.chooseDirectory)
        self.directory = 'singleCells/'
        self.saveDir.setText('singleCells/')
        self.dirWindow.clicked.connect(self.openDIRwindow)

    def openDIRwindow(self):
        dirwindow = allDirectoriesWindow(self)
        dirwindow.exec_()

    def removeCell(self, cellnumber):
        self.THEblobs[cellnumber:-1] = self.THEblobs[cellnumber + 1:]
        self.THEblobs = self.THEblobs[:-1]
        self.nMarkedCells.setText(str(int(self.nMarkedCells.text()) - 1))
        self.table.removeRow(cellnumber)
        for i in range(len(self.THEblobs)):
            self.table.setItem(i, 0, QtGui.QTableWidgetItem(str(i)))
        self.ImgAddPatches()

    def chooseDirectory(self):
        directory = QtGui.QFileDialog.getExistingDirectory(self)
        self.saveDir.setText(str(directory) + '/')
        self.DatabaseSize.setText(
            str(len(glob.glob(str(self.saveDir.text()) + '*.png'))))

    def create_csv(self):
        savename = str(self.saveNames.text())
        filenames = np.array([
            savename + str(self.table.item(i, 0).text()) + '.png'
            for i in range(int(self.nMarkedCells.text()))
        ])
        #filenamesList = filenames.tolist()
        classnames = np.array([
            str(self.table.item(i, 2).text())
            for i in range(int(self.nMarkedCells.text()))
        ])
        classtable = pd.DataFrame(
            np.transpose(np.vstack(
                (filenames,
                 classnames))))  #, index=dates, columns=[nome , classe])
        print(classtable)
        saveclassification = classtable.to_csv(str(self.saveDir.text()) +
                                               savename + 'class.csv',
                                               index=False,
                                               header=['file', 'class'])
        self.DatabaseSize.setText(
            str(len(glob.glob(str(self.saveDir.text()) + '*.png'))))

    def save_crops(self):
        squaresize = int(str(self.Boxsize.text()))
        savename = str(self.saveNames.text())
        blobs = self.THEblobs
        for number, blob in enumerate(blobs):
            y, x, r = blob
            y = y + squaresize  #adjusting centers
            x = x + squaresize  #DONT ASK ME WHY

            crop = self.THEimage[int(y) - int(squaresize / 2):int(y) +
                                 int(squaresize / 2),
                                 int(x) - int(squaresize / 2):int(x) +
                                 int(squaresize / 2)]
            io.imsave(
                str(self.saveDir.text()) + savename + str(number) + '.png',
                crop)

    def onclick(self, event):
        print('button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %
              (event.button, event.x, event.y, event.xdata, event.ydata))
        if event.button == 3:
            squaresize = int(str(self.Boxsize.text()))
            self.THEblobs = np.array(self.THEblobs.tolist() + [[
                int(event.ydata - squaresize),
                int(event.xdata - squaresize),
                int(str(self.Boxsize.text()))
            ]])
            print(self.THEblobs)
            self.table.setHorizontalHeaderLabels(
                ['index', 'auto class', 'gold class'])
            rowPosition = self.table.rowCount()
            self.table.insertRow(rowPosition)
            self.table.setItem(rowPosition, 0,
                               QtGui.QTableWidgetItem(str(rowPosition)))
            self.table.setItem(rowPosition, 1, QtGui.QTableWidgetItem("-"))
            self.table.setItem(rowPosition, 2, QtGui.QTableWidgetItem("-"))
            self.nMarkedCells.setText(str(int(self.nMarkedCells.text()) + 1))
            self.ImgAddPatches()
        elif event.button == 2:
            print(self.THEblobs[:, 0:2])
            dist = np.sum(
                (self.THEblobs[:, 0:2] + 101 - [event.ydata, event.xdata])**2,
                1)
            if min(dist) < 800:
                line = dist.tolist().index(min(dist))
                print(line)
                self.removeCell(line)

    def Id_cells(self):
        squaresize = int(str(self.Boxsize.text()))
        image_gray = self.BLUEimage
        blobs = blob_dog(image_gray[squaresize:-squaresize,
                                    squaresize:-squaresize],
                         min_sigma=10,
                         max_sigma=30,
                         threshold=.8)
        self.THEblobs = blobs
        self.nMarkedCells.setText(str(len(blobs)))
        self.table.setRowCount(len(blobs))
        self.table.setColumnCount(3)
        self.layout.addWidget(self.table, 1, 0)
        self.table.setHorizontalHeaderLabels(
            ['index', 'auto class', 'gold class'])
        self.ImgAddPatches()

    def ImgAddPatches(self):
        squaresize = int(str(self.Boxsize.text()))
        self.fig, ax = subplots(1, 1)
        ax.imshow(self.THEimage)
        ax.grid(False)
        ax.axis('off')
        for number, blob in enumerate(self.THEblobs):
            y, x, r = blob
            c = Rectangle((x + int(squaresize / 2), y + int(squaresize / 2)),
                          squaresize,
                          squaresize,
                          color='r',
                          linewidth=2,
                          alpha=0.3)
            ax.add_patch(c)
            ax.text(x + squaresize - 25,
                    y + squaresize + 25,
                    str(number),
                    color='white')
            self.table.setItem(number, 0, QtGui.QTableWidgetItem(str(number)))
            self.table.setItem(number, 1, QtGui.QTableWidgetItem('-'))
            self.table.setItem(number, 2, QtGui.QTableWidgetItem('-'))
        self.changeFIGURE(self.fig)

    def openMainFig(self):
        if self.THEimage.any() == True:
            self.rmmpl()
            self.THEimage = np.array([])
            self.BLUEimage = 0
            for i in range(len(self.THEblobs)):
                self.table.removeRow(0)
            self.nMarkedCells.setText(str(0))
            self.THEblobs = np.array([])

        name = QtGui.QFileDialog.getOpenFileName(
            self, 'Single File', '~/Desktop/',
            "Image files (*.jpg *.png *.tif)")
        image = misc.imread(str(name))
        self.saveNames.setText(str(name).split("/")[-1][:-4] + 'i')
        self.THEimage = image
        self.BLUEimage = image[:, :, 2]
        baseimage = self.fig.add_subplot(111)
        baseimage.axis('off')
        baseimage.grid(False)
        baseimage.imshow(image)
        self.canvas = FigureCanvas(self.fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.widget,
                                         coordinates=True)
        self.mplvl.addWidget(self.toolbar)
        cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)

    def changeFIGURE(self, newFIG):
        self.rmmpl()
        self.canvas = FigureCanvas(newFIG)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.widget,
                                         coordinates=True)
        self.mplvl.addWidget(self.toolbar)
        cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)

    def rmmpl(self, ):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def start_clicked(self):
        self.save_crops()
        with open('bytemp', 'w') as f:
            f.write(
                str(self.saveNames.text()) + ',' +
                str(self.nMarkedCells.text()) + ',' + str(self.saveDir.text()))

        classwindow = ManualClassifyWindow(self)
        classwindow.exec_()
        with open('bytemp', 'r') as f:
            classifiedCells = f.readline().split(',')[:-1]
            self.MitoticIndex.setText(
                str(classifiedCells.count('mitose')) + '/' + str(
                    classifiedCells.count('mitose') +
                    classifiedCells.count('interfase')))
            for i, clasf in enumerate(classifiedCells):
                self.table.setItem(i, 2, QtGui.QTableWidgetItem(clasf))
        self.coloring_types(classifiedCells)

    def coloring_types(self, cellClassList):
        colors = ['b', 'g', 'r', 'c', 'm', 'y', 'w']
        color_dict = dict(
            zip([x[0] for x in Counter(cellClassList).most_common()], colors))
        self.fig, ax = subplots(1, 1)
        squaresize = int(str(self.Boxsize.text()))
        ax.imshow(self.THEimage)
        ax.grid(False)
        ax.axis('off')
        self.layout.addWidget(self.table, 1, 0)
        for number, blob in enumerate(self.THEblobs):
            y, x, r = blob
            c = Rectangle((x + int(squaresize / 2), y + int(squaresize / 2)),
                          squaresize,
                          squaresize,
                          color=color_dict[cellClassList[number]],
                          linewidth=2,
                          alpha=0.3)
            ax.add_patch(c)
            ax.text(x + squaresize - 25,
                    y + squaresize + 25,
                    str(number),
                    color='white')
        self.changeFIGURE(self.fig)

    def validateAutoClass(self):
        conta = 0
        if str(
                self.table.item(int(int(self.nMarkedCells.text()) / 2),
                                1).text()) != '-':
            for i in range(int(self.nMarkedCells.text())):
                if str(self.table.item(i, 1).text()) == str(
                        self.table.item(i, 2).text()):
                    conta += 1
            print(conta / int(self.nMarkedCells.text()))
            self.SucessRate.setText(
                str(int(float(conta) / int(self.nMarkedCells.text()) * 100)) +
                '%')

        if str(
                self.table.item(int(int(self.nMarkedCells.text()) / 2),
                                2).text()) == '-':
            mitose = 0
            interfase = 0
            for i in range(int(self.nMarkedCells.text())):
                self.table.setItem(
                    i, 2,
                    QtGui.QTableWidgetItem(str(self.table.item(i, 1).text())))
                if str(self.table.item(i, 1).text()) == 'mitose': mitose += 1
                elif str(self.table.item(i, 1).text()) == 'interfase':
                    interfase += 1
            self.MitoticIndex.setText(
                str(mitose) + '/' + str(mitose + interfase))

    def AutoClassification(self):
        self.save_crops()
        #open images
        training = pd.DataFrame()
        testImg = pd.DataFrame()
        list_ = []
        allFiles = glob.glob(str(self.saveDir.text()) + "*.csv")
        for file_ in allFiles:
            df = pd.read_csv(file_, index_col=None, header=0)
            list_.append(df)
        training = pd.concat(list_)
        training["photo"] = training.file.apply(
            lambda x: misc.imread(str(self.saveDir.text()) + x))
        training["photo"] = training.photo.apply(rgb2gray)
        training["photo"] = training.photo.apply(exposure.equalize_adapthist)
        testImg["files"] = glob.glob(
            str(self.saveDir.text()) + str(self.saveNames.text()) + "*.png")
        testImg["photo"] = [
            misc.imread(x) for x in glob.glob(
                str(self.saveDir.text()) + str(self.saveNames.text()) +
                "*.png")
        ]
        testImg["photo"] = testImg.photo.apply(rgb2gray)
        testImg["photo"] = testImg.photo.apply(exposure.equalize_adapthist)

        # Rotate training images
        def rotate(df, degrees):
            result = df.copy()
            result.photo = result.photo.apply(
                lambda x: transform.rotate(x, degrees))
            return result

        number_of_rotations = 20
        orig_training = training.copy()
        for i in [(360. / number_of_rotations) * (i + 1)
                  for i in range(number_of_rotations)]:
            training = pd.concat((training, rotate(orig_training, i)))

        # Initialize features with texture values
        train_feats = np.array(
            [x for x in training.photo.apply(texture).values])
        print(train_feats)
        Y_training = training["class"].values
        testImg_feats = np.array(
            [x for x in testImg.photo.apply(texture).values])

        # Add dispersion ratios to features
        training["dispersion"] = training.photo.apply(dispersionratio)
        train_feats = np.hstack(
            (train_feats, np.array([x for x in training["dispersion"].values
                                    ]).reshape(-1, 1)))
        testImg["dispersion"] = testImg.photo.apply(dispersionratio)
        testImg_feats = np.hstack(
            (testImg_feats, np.array([x for x in testImg["dispersion"].values
                                      ]).reshape(-1, 1)))

        # Apply FFT to photos (does NOT add to features yet)
        training["FFT"] = training.photo.apply(fft.fft2)
        training["FFT"] = training.FFT.apply(abs)
        training["Phase"] = training.FFT.apply(np.angle)
        testImg["FFT"] = testImg.photo.apply(fft.fft2)
        testImg["FFT"] = testImg.FFT.apply(abs)
        testImg["Phase"] = testImg.FFT.apply(np.angle)

        # Dimensionality reduction on the FFTs
        pca = PCA(n_components=15)
        pcb = PCA(n_components=15)
        fabsPCA = pca.fit(vectorize(training["FFT"]))
        fphiPCA = pcb.fit(vectorize(training["Phase"]))

        #Adding ffts to feature set
        train_feats_final = np.hstack(
            (train_feats, fphiPCA.transform(vectorize(training["Phase"])),
             fabsPCA.transform(vectorize(training["FFT"]))))
        testImg_feats_final = np.hstack(
            (testImg_feats, fphiPCA.transform(vectorize(testImg["Phase"])),
             fabsPCA.transform(vectorize(testImg["FFT"]))))

        train_feats_final = normalize_columns(train_feats_final)
        testImg_feats_final = normalize_columns(testImg_feats_final)
        clf = RandomForestClassifier(n_estimators=9)
        print(len(train_feats_final), len(Y_training))
        clf.fit(np.nan_to_num(train_feats_final), np.nan_to_num(Y_training))
        Y_predict = clf.predict(np.nan_to_num(testImg_feats_final))
        for number, cellclass in enumerate(Y_predict):
            self.table.setItem(number, 1,
                               QtGui.QTableWidgetItem(str(cellclass)))

        self.coloring_types(Y_predict)
class Main(QMainWindow, Ui_MainWindow):

    # Define plate arrays as global variables to be able use them elsewhere in the program.
    global w_plate
    global mx_plate
    global my_plate
    global qx_plate
    global qy_plate

    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)

        self.btnPlot.setStyleSheet('color: red')
        self.textEdit.setTextColor(QtGui.QColor("magenta"))

        # Check deflections radio button by default
        self.deflections_radio.setChecked(False)

        # Creating a QButtonGroup and adding the plot options ratio buttons.
        # This will be used to make sure new results are plotted every time the solve button is pressed.
        # Otherwise, if the deflections radio button is already selected, new run won't plot results.
        self.group = QtGui.QButtonGroup()
        self.group.addButton(self.deflections_radio)
        self.group.addButton(self.mx_radio)
        self.group.addButton(self.my_radio)
        self.group.addButton(self.qx_radio)
        self.group.addButton(self.qy_radio)
        self.plot_options_group.setEnabled(False)

        self.infoLabel.setStyleSheet('color: blue')
        self.infoLabel.setText('  Theory of Plates and Shells\n' +
                               '  Süleyman Muti\n' +
                               '  Spring 2016')

        self.btnPlot.clicked.connect(lambda: self.fdm())
        self.deflections_radio.toggled.connect(lambda: self.deflections_radio_checked())
        self.mx_radio.toggled.connect(lambda: self.mx_radio_checked())
        self.my_radio.toggled.connect(lambda: self.my_radio_checked())
        self.qx_radio.toggled.connect(lambda: self.qx_radio_checked())
        self.qy_radio.toggled.connect(lambda: self.qy_radio_checked())

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.mplwindow, coordinates=True)
        self.mplvl.addWidget(self.toolbar)

    def rmmpl(self, ):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def get_grid_size(self):
        if self.rBtn15x10.isChecked():
            return 15, 1e-6
        if self.rBtn30x20.isChecked():
            return 30, 1e-6
        elif self.rBtn180x120.isChecked():
            return 180, 1e-7
        elif self.rBtn540x360.isChecked():
            return 540, 1e-9

    def deflections_radio_checked(self):
        if self.deflections_radio.isChecked():
            self.rmmpl()
            self.print_plot(w_plate, 'Plate Deflections', 'viridis')

    def mx_radio_checked(self):
        if self.mx_radio.isChecked():
            self.rmmpl()
            self.print_plot(mx_plate, 'Mx Bending Moment', 'plasma')

    def my_radio_checked(self):
        if self.my_radio.isChecked():
            self.rmmpl()
            self.print_plot(my_plate, 'My Bending Moment', 'plasma')

    def qx_radio_checked(self):
        if self.qx_radio.isChecked():
            self.rmmpl()
            self.print_plot(qx_plate, 'Qx Transverse Shear Force', 'inferno')

    def qy_radio_checked(self):
        if self.qy_radio.isChecked():
            self.rmmpl()
            self.print_plot(qy_plate, 'Qy Transverse Shear Force', 'inferno')

    def print_plot(self, array_to_be_plotted, plot_title, colormap):
        a = array_to_be_plotted
        self.rmmpl()
        fig = Figure()
        self.addmpl(fig)
        ax = fig.add_subplot(111)
        cax = ax.imshow(a, cmap=colormap)
        fig.colorbar(cax, shrink=0.6, aspect=5)
        fig.tight_layout()
        ax.set_title(plot_title, fontsize=20, y=1.01)
        ax.axes.get_xaxis().set_ticks([])
        ax.axes.get_yaxis().set_ticks([])
        ax.format_coord = lambda x, y: ''
        ax.set_xlabel('300 mm', fontsize=20, rotation=0)
        ax.set_ylabel('200 mm', fontsize=20, rotation=90)
        ax.autoscale(False)
        plt.show()

    def print_info(self, grid_size):
        grid_string = 'Grid size: {:d} x {:d}'.format(grid_size, grid_size*2//3)
        deflection_string = 'Maximum deflection of the plate: {0:.4f} mm'.format(np.max(w_plate))
        moment_string = 'Max. Mx: {:.4f} Nmm/mm \t Max. My: {:.4f} Nmm/mm'.format(np.max(mx_plate), np.max(my_plate))
        shear_string = 'Max. Qx:   {:.4f} N/mm \t Max. Qy:   {:.4f} N/mm'.format(np.max(qx_plate),
                                                                                        np.max(qy_plate))

        self.textEdit.setText(grid_string + '\n' + deflection_string + '\n' + moment_string + '\n' + shear_string)

    def fdm(self):

        # Let the function fdm() know that the plate arrays are global variables and can be used outside its scope.
        global w_plate
        global mx_plate
        global my_plate
        global qx_plate
        global qy_plate

        # Enabling initially disabled plot options area which was disabled to prevent
        # plot attempts without array creations.
        self.plot_options_group.setEnabled(True)

        # Deselecting the deflections radio button to make sure new results always get plotted.
        self.group.setExclusive(False)
        self.deflections_radio.setChecked(False)
        self.group.setExclusive(True)

        dim_x = 300  # Plate length in x-direction [mm]
        # dim_y = 200  # Plate length in y-direction [mm]

        # Use Python tuple to get the number of elements in the x-direction and corresponding convergence criterion.
        (m, conv) = self.get_grid_size()
        n = m * 2 // 3  # Number of elements in the y-direction.

        # Element size
        delta = dim_x / m

        # Initialize matrices for iterative solution.
        w_old = np.zeros((m + 3, n + 3))  # Initialize plate deflections to zero.
        w = np.copy(w_old)
        m1 = np.zeros((m + 3, n + 3))
        m2 = np.zeros((m + 3, n + 3))
        qx = np.zeros((m + 3, n + 3))
        qy = np.zeros((m + 3, n + 3))

        # Material properties, loading, and other properties
        e = 70000  # Modulus of elasticity [N/mm2]
        nu = 0.3  # Poisson's ratio
        h = 2  # Plate thickness [mm]
        po = 0.01  # Distributed load [N/mm2]

        # Plate stiffness
        d = (e * (h ** 3)) / (12 * (1.0 - (nu ** 2)))

        # Distributed load
        p = (po * (delta ** 4)) / d

        # Set logical condition to check if convergence criterion is met.
        cond = False  # Set to false to initiate iteration loop.

        # Loop to iterate plate deflections using Finite Difference Method

        iteration_number = 0  # Keep an eye on the iteration number.
        while not cond:
            cond = True  # set to true to check if criterion is met for all nodes.

            # Apply boundary conditions. Simply supported on all edges.
            w[:, 0] = -w_old[:, 2]
            w[:, n + 2] = -w_old[:, n]
            w[0, :] = -w_old[2, :]
            w[m + 2, :] = -w_old[m, :]

            # Calculate deflection of each node using neighbouring nodes
            # (i.e., using FDM)
            # Python range() statement is seemingly upper-bound exclusive. We need to add 1 to cover all range.
            for i in range(2, m + 1):

                # Check if the current index point has distributed load acting on it. If so apply the load, if not let it be zero.
                if i <= (m / 2 + 1):
                    k = p
                else:
                    k = 0

                for j in range(2, n + 1):

                    # Finite Difference Method Formula: v4 = p/d
                    w[i, j] = (1 / 20) * (k + 8 * (w[i + 1, j] + w[i - 1, j] + w[i, j + 1] + w[i, j - 1]) - 2 * (
                        w[i + 1, j + 1] + w[i - 1, j + 1] + w[i + 1, j - 1] + w[i - 1, j - 1]) - w[i + 2, j] - w[
                                              i - 2, j] - w[
                                              i, j + 2] - w[i, j - 2])
                    # Check if convergence criterion is met for each node. Set logical condition
                    # to false even if a single node violates the the condition so that the
                    # iteration can continue until all nodes meet the criterion.
                    if abs(w[i, j] - w_old[i, j]) > conv:
                        cond = False
            # Reset deflection matrices for next iteration.
            w_old = np.copy(w)

            # Keep an eye on the iteration number.
            iteration_number += 1

        # Calculate the bending moments and transverse shear forces based on the deflections.
        for i in range(2, m + 1):
            for j in range(2, n + 1):
                # Common terms in bending moment equations.
                m1[i, j] = -(w[i+1, j] - 2*w[i, j] + w[i-1, j])*d/delta**2
                m2[i, j] = -(w[i, j+1] - 2*w[i, j] + w[i, j-1])*d/delta**2

                # Transverse shear forces.
                qx[i, j] = -((w[i+2, j] - 2*w[i+1, j] + 2*w[i-1, j] - w[i-2, j]) +
                             (w[i+1, j+1] - 2*w[i+1, j] + w[i+1, j-1] - w[i-1, j+1] +
                              2*w[i-1, j] - w[i-1, j-1])) * d / (2*delta ** 3)
                qy[i, j] = -((w[i+1, j+1] - 2*w[i, j+1] + w[i-1, j+1] - w[i+1, j-1] + 2*w[i, j-1] - w[i-1, j-1]) +
                             (w[i, j+2] - 2*w[i, j+1] + 2*w[i, j-1] - w[i, j-2])) * d / (2*delta ** 3)

        # Assemble bending moment arrays.
        mx = m1 + nu*m2
        my = m2 + nu*m1

        # Exclude the ghost nodes that were necessary to apply boundary conditions,
        # and obtain deflections for plate nodes only. Plate deflections will be plotted correcting the orientation.
        w_plate = w[1:m + 2, 1:n + 2].transpose()
        mx_plate = mx[1:m + 2, 1:n + 2].transpose()
        my_plate = my[1:m + 2, 1:n + 2].transpose()
        qx_plate = qx[1:m + 2, 1:n + 2].transpose()
        qy_plate = qy[1:m + 2, 1:n + 2].transpose()

        # Set deflections radio button to checked to display the new run's results.
        self.deflections_radio.setChecked(True)

        # Print information summarizing the  solution
        # Maximum deflection, maximum bending moments, and maximum shear forces
        self.print_info(m)
예제 #34
0
class SWATGraph(QObject):
    """Display SWAT result data as line graphs or bar chart."""
    def __init__(self, csvFile):
        """Initialise class variables."""
        QObject.__init__(self)
        self._dlg = GraphDialog()
        self._dlg.setWindowFlags(self._dlg.windowFlags()
                                 & ~Qt.WindowContextHelpButtonHint)
        ## csv file of results
        self.csvFile = csvFile
        ## canvas for displaying matplotlib figure
        self.canvas = None
        ## matplotlib tool bar
        self.toolbar = None
        ## matplotlib axes
        self.ax1 = None

    def run(self):
        """Initialise form and run on initial csv file."""
        self._dlg.lineOrBar.addItem('Line graph')
        self._dlg.lineOrBar.addItem('Bar chart')
        self._dlg.lineOrBar.setCurrentIndex(0)
        self._dlg.newFile.clicked.connect(self.getCsv)
        self._dlg.updateButton.clicked.connect(self.updateGraph)
        self._dlg.closeForm.clicked.connect(self.closeFun)
        self.setUbuntuFont()
        self.readCsv()
        self._dlg.exec_()

    def addmpl(self, fig):
        """Add graph defined in fig."""
        self.canvas = FigureCanvas(fig)
        # graphvl is the QVBoxLayout instance added to the graph widget.
        # Needed to make fig expand to fill graph widget.
        self._dlg.graphvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self._dlg.graph,
                                         coordinates=True)
        self._dlg.graphvl.addWidget(self.toolbar)

    def rmmpl(self):
        """Remove current graph if any."""
        try:
            self._dlg.graphvl.removeWidget(self.canvas)
            self.canvas.close()
            self._dlg.graphvl.removeWidget(self.toolbar)
            self.toolbar.close()
            self.ax1 = None
            return
        except Exception:
            # no problem = may not have been a graph
            return

    @staticmethod
    def trans(msg):
        """Translate message."""
        return QApplication.translate("QSWATPlus", msg, None)

    @staticmethod
    def error(msg):
        """Report msg as an error."""
        msgbox = QMessageBox()
        msgbox.setWindowTitle('SWATGraph')
        msgbox.setIcon(QMessageBox.Critical)
        msgbox.setText(SWATGraph.trans(msg))
        msgbox.exec_()
        return

    def getCsv(self):
        """Ask user for csv file."""
        settings = QSettings()
        if settings.contains('/QSWATPlus/LastInputPath'):
            path = str(settings.value('/QSWATPlus/LastInputPath'))
        else:
            path = ''
        filtr = self.trans('CSV files (*.csv)')
        csvFile, _ = QFileDialog.getOpenFileName(None, 'Open csv file', path,
                                                 filtr)
        if csvFile is not None and csvFile != '':
            settings.setValue('/QSWATPlus/LastInputPath',
                              os.path.dirname(str(csvFile)))
            self.csvFile = csvFile
            self.readCsv()

    def readCsv(self):
        """Read current csv file (if any)."""
        # csvFile may be none if run from command line
        if not self.csvFile or self.csvFile == '':
            return
        if not os.path.exists(self.csvFile):
            self.error('Error: Cannot find csv file {0}'.format(self.csvFile))
            return
        """Read csv file into table; create statistics (coefficients); draw graph."""
        # clear graph
        self.rmmpl()
        # clear table
        self._dlg.table.clear()
        for i in range(self._dlg.table.columnCount() - 1, -1, -1):
            self._dlg.table.removeColumn(i)
        self._dlg.table.setColumnCount(0)
        self._dlg.table.setRowCount(0)
        row = 0
        numCols = 0
        with open(self.csvFile, 'r', newline='') as csvFil:
            reader = csv.reader(csvFil)
            for line in reader:
                try:
                    # use headers in first line
                    if row == 0:
                        numCols = len(line)
                        for i in range(numCols):
                            self._dlg.table.insertColumn(i)
                        self._dlg.table.setHorizontalHeaderLabels(line)
                    else:
                        self._dlg.table.insertRow(row - 1)
                        for i in range(numCols):
                            try:
                                val = line[i].strip()
                            except Exception as e:
                                self.error(
                                    'Error: could not read file {0} at line {1} column {2}: {3}'
                                    .format(self.csvFile, row + 1, i + 1,
                                            repr(e)))
                                return
                            item = QTableWidgetItem(val)
                            self._dlg.table.setItem(row - 1, i, item)
                    row = row + 1
                except Exception as e:
                    self.error(
                        'Error: could not read file {0} at line {1}: {2}'.
                        format(self.csvFile, row + 1, repr(e)))
                    return
        # columns are too narrow for headings
        self._dlg.table.resizeColumnsToContents()
        # rows are too widely spaced vertically
        self._dlg.table.resizeRowsToContents()
        self.writeStats()
        self.updateGraph()

    @staticmethod
    def makeFloat(s):
        """Parse string s as float and return; return nan on failure."""
        try:
            return float(s)
        except Exception:
            return float('nan')

    def updateGraph(self):
        """Redraw graph as line or bar chart according to lineOrBar setting."""
        style = 'bar' if self._dlg.lineOrBar.currentText(
        ) == 'Bar chart' else 'line'
        self.drawGraph(style)

    @staticmethod
    def shiftDates(dates, shift):
        """Add shift (number of days) to each date in dates."""
        delta = timedelta(days=shift)
        return [x + delta for x in dates]

    @staticmethod
    def getDateFormat(date):
        """
        Return date strptime format string from example date, plus basic width for drawing bar charts.
    
        Basic width is how matplotlib divides the date axis: number of days in the time unit
        Assumes date has one of 3 formats:
        yyyy: annual: return %Y and 12
        yyyy/m or yyyy/mm: monthly: return %Y/%m and 30
        yyyyddd: daily: return %Y%j and 24
        """
        if date.find('/') > 0:
            return '%Y/%m', 30
        length = len(date)
        if length == 4:
            return '%Y', 365
        if length == 7:
            return '%Y%j', 1
        SWATGraph.error('Cannot parse date {0}'.format(date))
        return '', 1

    def drawGraph(self, style):
        """Draw graph as line or bar chart according to style."""
        # preserve title, labels and yscale if they exist
        # in order to replace them when updating graph
        try:
            title = self.ax1.get_title()
        except Exception:
            title = ''
        try:
            xlbl = self.ax1.get_xlabel()
        except Exception:
            xlbl = ''
        try:
            ylbl = self.ax1.get_ylabel()
        except Exception:
            ylbl = ''
        try:
            yscl = self.ax1.get_yscale()
        except Exception:
            yscl = ''
        self.rmmpl()
        fig = Figure()
        # left, bottom, width, height adjusted to leave space for legend below
        self.ax1 = fig.add_axes([0.05, 0.22, 0.92, 0.68])
        numPlots = self._dlg.table.columnCount() - 1
        rng = range(self._dlg.table.rowCount())
        fmt, widthBase = self.getDateFormat(
            str(self._dlg.table.item(0, 0).text()).strip())
        if fmt == '':
            # could not parse
            return
        xVals = [
            datetime.strptime(
                str(self._dlg.table.item(i, 0).text()).strip(), fmt)
            for i in rng
        ]
        for col in range(1, numPlots + 1):
            yVals = [
                self.makeFloat(self._dlg.table.item(i, col).text())
                for i in rng
            ]
            h = self._dlg.table.horizontalHeaderItem(col).text()
            if style == 'line':
                self.ax1.plot(xVals, yVals, label=h)
                # reinstate yscale (only relevant for line graphs)
                if yscl == 'log':
                    self.ax1.set_yscale(yscl, nonposy='mask')
                elif yscl != '':
                    self.ax1.set_yscale(yscl)
            else:
                # width of bars in days.
                # adding 1 to divisor gives space of size width between each date's group
                width = float(widthBase) / (numPlots + 1)
                # can't imagine anyone wanting more than 7 colours
                # but just in case we'll use shades of grey for 8 upwards
                colours = ['b', 'g', 'r', 'c', 'm', 'y', 'k']
                colour = colours[col - 1] if col <= 7 else str(
                    float((col - 7) / (numPlots - 6)))
                mid = numPlots / 2
                shift = width * (col - 1 - mid)
                xValsShifted = xVals if shift == 0 else self.shiftDates(
                    xVals, shift)
                self.ax1.bar(xValsShifted,
                             yVals,
                             width,
                             color=colour,
                             linewidth=0,
                             label=h)
        # reinstate title and labels
        if title != '':
            self.ax1.set_title(title)
        if xlbl != '':
            self.ax1.set_xlabel(xlbl)
        else:
            self.ax1.set_xlabel('Date')
        if ylbl != '':
            self.ax1.set_ylabel(ylbl)
        self.ax1.grid(True)
        legendCols = min(4, self._dlg.table.columnCount())
        fontSize = 'x-small' if legendCols > 4 else 'small'
        self.ax1.legend(bbox_to_anchor=(1.0, -0.15),
                        ncol=legendCols,
                        fontsize=fontSize)
        self.addmpl(fig)

    def closeFun(self):
        """Close dialog."""
        self._dlg.close()

    def writeStats(self):
        """Write Pearson and Nash coefficients."""
        numCols = self._dlg.table.columnCount()
        numRows = self._dlg.table.rowCount()
        self._dlg.coeffs.clear()
        for i in range(1, numCols):
            for j in range(i + 1, numCols):
                self.pearson(i, j, numRows)
        for i in range(1, numCols):
            for j in range(i + 1, numCols):
                # only compute Nash-Sutcliffe Efficiency
                # if one plot is observed,
                # and use that as the first plot
                if str(self._dlg.table.horizontalHeaderItem(i).text()).find(
                        'observed') == 0:
                    if not str(self._dlg.table.horizontalHeaderItem(
                            j).text()).find('observed') == 0:
                        self.nash(i, j, numRows)
                elif str(self._dlg.table.horizontalHeaderItem(j).text()).find(
                        'observed') == 0:
                    self.nash(j, i, numRows)

    def multiSums(self, idx1, idx2, N):
        """Return various sums for two series, only including points where both are numbers, plus count of such values."""
        s1 = 0
        s2 = 0
        s11 = 0
        s22 = 0
        s12 = 0
        count = 0
        for i in range(N):
            val1 = self.makeFloat(self._dlg.table.item(i, idx1).text())
            val2 = self.makeFloat(self._dlg.table.item(i, idx2).text())
            # ignore missing values
            if not (math.isnan(val1) or math.isnan(val2)):
                s1 += val1
                s2 += val2
                s11 += val1 * val1
                s22 += val2 * val2
                s12 += val1 * val2
                count = count + 1
        return (s1, s2, s11, s22, s12, count)

    def sum1(self, idx1, idx2, N):
        """Return sum for series1, only including points where both are numbers, plus count of such values."""
        s1 = 0
        count = 0
        for i in range(N):
            val1 = self.makeFloat(self._dlg.table.item(i, idx1).text())
            val2 = self.makeFloat(self._dlg.table.item(i, idx2).text())
            # ignore missing values
            if not (math.isnan(val1) or math.isnan(val2)):
                s1 += val1
                count = count + 1
        return (s1, count)

    def pearson(self, idx1, idx2, N):
        """Calculate and display Pearson correlation coefficients for each pair of plots."""
        s1, s2, s11, s22, s12, count = self.multiSums(idx1, idx2, N)
        if count == 0: return
        sqx = (count * s11) - (s1 * s1)
        sqy = (count * s22) - (s2 * s2)
        sxy = (count * s12) - (s1 * s2)
        deno = math.sqrt(sqx * sqy)
        if deno == 0: return
        rho = sxy / deno
        if count < N:
            extra = ' (using {0!s} of {1!s} values)'.format(count, N)
        else:
            extra = ''
        msg = 'Series1: ' + self._dlg.table.horizontalHeaderItem(idx1).text() + \
            '  Series2: ' + self._dlg.table.horizontalHeaderItem(idx2).text() + '  Pearson Correlation Coefficient = {0:.2f}{1}'.format(rho, extra)
        self._dlg.coeffs.append(SWATGraph.trans(msg))

    def nash(self, idx1, idx2, N):
        """Calculate and display Nash-Sutcliffe efficiency coefficients for each pair of plots where one is observed."""
        s1, count = self.sum1(idx1, idx2, N)
        if count == 0: return
        mean = s1 / count
        num = 0
        deno = 0
        for i in range(N):
            val1 = self.makeFloat(self._dlg.table.item(i, idx1).text())
            val2 = self.makeFloat(self._dlg.table.item(i, idx2).text())
            # ignore missing values
            if not (math.isnan(val1) or math.isnan(val2)):
                diff12 = val1 - val2
                diff1m = val1 - mean
                num += diff12 * diff12
                deno += diff1m * diff1m
        if deno == 0: return
        result = 1 - (num / deno)
        if count < N:
            extra = ' (using {0!s} of {1!s} values)'.format(count, N)
        else:
            extra = ''
        msg = 'Series1: ' + self._dlg.table.horizontalHeaderItem(idx1).text() + \
            '  Series2: ' + self._dlg.table.horizontalHeaderItem(idx2).text() + '   Nash-Sutcliffe Efficiency Coefficient = {0:.2f}{1}'.format(result, extra)
        self._dlg.coeffs.append(SWATGraph.trans(msg))

    def setUbuntuFont(self):
        """Set Ubuntu font size 10 as default."""
        QFontDatabase.addApplicationFont(":/fonts/Ubuntu-R.ttf")
        ufont = QFont("Ubuntu", 10, 1)
        QApplication.setFont(ufont)
예제 #35
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        fig = Figure()
        self.addmpl(fig)
        self.rdBtn.clicked.connect(self.read)
        self.df = {}
        self.dfList.itemDoubleClicked.connect(self.df_selected)
        self.colList.itemDoubleClicked.connect(self.addcol)
        self.stgList.itemDoubleClicked.connect(self.rmvcol)

    def read(self):
        try:
            self.df[str(self.inp.text()).split('.')[0]] = pd.read_csv(
                str(self.inp.text()))
            self.dfList.addItem(str(self.inp.text()).split('.')[0])
            print('File read')
        except IOError:
            print('No such file')

    def df_selected(self):
        if self.colList.count() == 0:
            self.colList.addItems(self.df[str(
                self.dfList.currentItem().text())].columns)
        else:
            self.colList.clear()
            self.stgList.clear()
            self.colList.addItems(self.df[str(
                self.dfList.currentItem().text())].columns)

    def addcol(self):

        items = [
            self.stgList.item(i).text() for i in xrange(self.stgList.count())
        ]
        print items
        if str(self.colList.currentItem().text()) not in items:
            self.stgList.addItem(str(self.colList.currentItem().text()))

    def rmvcol(self):
        self.stgList.takeItem(self.stgList.row(self.stgList.currentItem()))

    def clear(self):
        self.mplfigs.clear()
        self.rmmpl()

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(
            self.canvas,
            self.mplwindow,
            coordinates=True,
        )
        self.mplvl.addWidget(self.toolbar)

    def rmmpl(self, ):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
예제 #36
0
class MainWindow(QtGui.QMainWindow, OnClick, OnMotion):
    def __init__(self):
        super(MainWindow, self).__init__()
        uic.loadUi("PeakInspector_layout.ui", self)
        self.setWindowTitle("PeakInspector (beta) (c) A.Salykin - Masaryk University - CC-BY-SA 4.0")

        # main variable:
        self.multiple_data_sets = pd.DataFrame()  # Initialise the final dataframe to export to Excel

        self.coordinates = []
        self.area = []
        self.amplitudes = []
        self.amplitude_line_coordinates = []
        self.left_peak_border = []
        self.right_peak_border = []
        self.pickable_artists_pts_AX2 = []
        self.pickable_artists_pts_AX3 = []
        self.pickable_artists_lns_AX3 = []
        self.pickable_artists_fill_AX3 = []
        self.pickable_artists_plb_AX3 = []
        self.pickable_artists_prb_AX3 = []
        self.pickable_artists_lnsP_AX3 = []

        self.left_border = []
        self.right_border = []

        # Connect buttons to class methods:
        self.BtnLoadFile.clicked.connect(self.load_file)
        self.BtnReplot.clicked.connect(self.replot_graph)
        self.chbxDotPickEnable.stateChanged.connect(self.dot_pick_enable)
        self.BtnSaveCurrent.clicked.connect(self.coordinates_analysis)
        self.BtnSaveFullDataset.clicked.connect(self.save_data)
        self.BoxMplPlotStyle.currentIndexChanged.connect(self.mpl_style_change)

        style.use(self.BoxMplPlotStyle.currentText())

        self.BtnLoadFile.setStyleSheet("background-color: #7CF2BD")
        self.BtnReplot.setStyleSheet("background-color: #FAF6F2")
        self.BtnSaveCurrent.setStyleSheet("background-color: #FAF6F2")
        self.BtnSaveFullDataset.setStyleSheet("background-color: #FAF6F2")

        # Initialise figure instance
        self.fig = plt.figure()
        self.show()

    def addmpl(self, ):
        self.canvas = FigureCanvas(self.fig)
        self.toolbar = NavigationToolbar(self.canvas, self.CanvasWidget, coordinates=True)
        self.CanvasLayout.addWidget(self.toolbar)
        self.CanvasLayout.addWidget(self.canvas)
        if self.chbxDotPickEnable.isChecked():
            self.cid_click = self.canvas.mpl_connect('button_press_event', self.on_click)
            self.cid_motion = self.canvas.mpl_connect('motion_notify_event', self.on_motion)
        self.canvas.draw()

    def rmmpl(self, ):  #
        self.canvas.mpl_disconnect(self.cid_click)
        self.canvas.mpl_disconnect(self.cid_motion)
        self.CanvasLayout.removeWidget(self.canvas)
        self.canvas.close()
        self.CanvasLayout.removeWidget(self.toolbar)
        self.toolbar.close()

    def dot_pick_enable(self, ):  # if checked, user can choose peaks
        try:  # if figure and canvas is initiated
            if self.chbxDotPickEnable.isChecked():
                self.cid_click = self.canvas.mpl_connect('button_press_event', self.on_click)
                self.cid_motion = self.canvas.mpl_connect('motion_notify_event', self.on_motion)
            else:
                self.canvas.mpl_disconnect(self.cid_click)
                self.canvas.mpl_disconnect(self.cid_motion)
        except:
            message = MessageBox()
            message.about(self, 'Warning!', "File was not loaded! \n Please be sure that your file has \
                \n 1) 1 or 2 columns; \n 2) check headers, footers and delimeter \n and try again.")

    def load_file(self, ):
        self.BtnLoadFile.setStyleSheet("background-color: #FAF6F2")
        # Check if we already have some file loaded - then remove canvas
        if hasattr(self, 'cid_click'):
            self.rmmpl()

        # Make sure that np data arrays and lists from previous dataset are empty
        self.x = np.empty([])
        self.y = np.empty([])
        self.clear_data()

        name = QtGui.QFileDialog.getOpenFileName(self, 'Open File')
        if not name:
            return self.import_error()

        # get more readable file name for graph title
        try:
            slash_index = self.find_character(name, '/')
            dot_index = self.find_character(name, '.')
            self.graph_name = name[slash_index[-1] + 1:dot_index[-1]]
        except:
            self.graph_name = name[-10:]

        skip_header_rows = self.BoxSkipHeader.value()
        skip_footer_rows = self.BoxSkipFooter.value()

        if self.BoxDelimeterChoice.currentText() == 'Tab':
            delimiter = "\t"
        elif self.BoxDelimeterChoice.currentText() == 'Space':
            delimiter = " "
        elif self.BoxDelimeterChoice.currentText() == 'Comma':
            delimiter = ","
        elif self.BoxDelimeterChoice.currentText() == 'Dot':
            delimiter = "."

        # unpack file
        try:  # if data file has 2 columns
            self.x, self.y = np.genfromtxt(name,
                                 delimiter = delimiter,
                                 skip_header = skip_header_rows,
                                 skip_footer = skip_footer_rows,
                                 unpack = True)
            if len(self.y) < 100:
                return self.import_error()
            return self.process_opened_file()

        except:  # if data file has 1 column
            self.y = np.genfromtxt(name,
                              skip_header=skip_header_rows,
                              skip_footer=skip_footer_rows, unpack=True)
            if len(self.y) < 100:
                return self.import_error()
            self.x = np.arange(0, len(self.y), 1)
            return self.process_opened_file()

    def import_error(self,):
        message = MessageBox()
        message.about(self, 'Warning!', "Data were not loaded. \n Please, be sure that:\n "
                                                "1. Data have 1 or 2 columns.\n"
                                                "2. Data are longer than 100 points.\n"
                                                "3. Delimiter is correctly specified.\n"
                                                "4. Rows in data contain only numeric values\n")

    def process_opened_file(self, ):
        self.x = tuple(self.x)
        self.data_preprocessing(self.y)
        self.baseline_calculation()
        self.plot_data()

    def data_preprocessing(self, data_to_preprocess):
        try:
            # Detrend dataset
            if self.chbxDetrendData.isChecked():
                self.data_detrended = sig.detrend(data_to_preprocess)
            else:
                self.data_detrended = data_to_preprocess

            # Application of Savitzkyi-Golay filter for data smoothing
            sg_window_frame = self.BoxSGwindowFrame.value()
            sg_polynom_degree = self.BoxSGpolynomDegree.value()
            self.data_after_filter = sig.savgol_filter(self.data_detrended, sg_window_frame, sg_polynom_degree)
        except:
            message = MessageBox()
            message.about(self, 'Warning!',
                          "Not possible to detrend and/or smooth data! \n Please check your dataset and try again.")

    def baseline_calculation(self, ):
        '''
        Calculate baseline of detrended data and add it to dataset for baseline to be equal 0
        '''
        databaseline = min(self.data_after_filter)
        if self.chbxDetrendData.isChecked():
            self.data_after_filter = [i + abs(databaseline) for i in self.data_after_filter]
            self.data_detrended = [i + abs(databaseline) for i in self.data_detrended]
        else:
            self.data_after_filter = [i - abs(databaseline) for i in self.data_after_filter]
            self.data_detrended = [i - abs(databaseline) for i in self.data_detrended]

    def interpolation(self, p1, p2, left_index, right_index):
        f = interpolate.interp1d([p1[0], p2[0]], [p1[1], p2[1]])
        num = len(self.x[left_index:right_index])
        xx = np.linspace(self.x[left_index], self.x[right_index], num)
        return f(xx)

    def plot_data(self, ):
        if self.BoxPlotCustomStyle.currentText() == 'Line':
            plot_style_custom = '-'
            marker_size = 1
        elif self.BoxPlotCustomStyle.currentText() == 'Line & small markers':
            plot_style_custom = 'o-'
            marker_size = 3
        elif self.BoxPlotCustomStyle.currentText() == 'Line & big markers':
            plot_style_custom = 'o-'
            marker_size = 6
        elif self.BoxPlotCustomStyle.currentText() == 'Small markers':
            plot_style_custom = 'o'
            marker_size = 3
        elif self.BoxPlotCustomStyle.currentText() == 'Big markers':
            plot_style_custom = 'o'
            marker_size = 6

        font_size = 14

        self.ax1 = plt.subplot2grid((4, 1), (0, 0), rowspan=1, colspan=1)
        plt.title(self.graph_name)
        self.ax1.plot(self.x, self.y, plot_style_custom, ms=marker_size, linewidth=1)  # plot raw data
        plt.ylabel('Original raw data', fontsize=font_size)

        self.ax2 = plt.subplot2grid((4, 1), (1, 0), rowspan=1, colspan=1)
        self.ax2.plot(self.x, self.data_detrended, plot_style_custom, ms=marker_size, linewidth=1)  # plot detrended data
        plt.ylabel('Detrended data', fontsize=font_size)

        self.ax3 = plt.subplot2grid((4, 1), (2, 0), rowspan=2, colspan=1, sharex=self.ax2, sharey=self.ax2)
        self.ax3.plot(self.x, self.data_after_filter, plot_style_custom, ms=marker_size, linewidth=1)  # plot filtered detrended data
        self.baselinePlotArtist = self.ax3.plot([self.x[0], self.x[-1]], [0, 0], 'k', linewidth=1)  # plot baseline
        plt.ylabel('Savitzky-Golay filter \n for detrended data', fontsize=font_size)
        self.ax3.set_xlim(0, self.x[-1])
        plt.xlabel('Time, sec')

        self.addmpl()

    def replot_graph(self, ):
        self.clear_data()
        self.rmmpl()
        self.data_preprocessing(self.y)
        self.baseline_calculation()
        self.plot_data()

    def coordinates_analysis(self, ):
        """
        Main function
        """
        coord_x, coord_y = zip(*self.coordinates)
        leftpb_x, leftpb_y = zip(*self.left_peak_border)
        rightpb_x, rightpb_y= zip(*self.right_peak_border)

        # absolute amplitude % and MAX
        relative_amplitude = []
        ampl_max = max(self.amplitudes)
        relative_amplitude[:] = [(i / ampl_max) for i in self.amplitudes]

        # create temporal Pandas DataFrame for sorting and calculation:
        temp_dataset = list(
            zip(coord_x, self.amplitudes, relative_amplitude, leftpb_x, leftpb_y, rightpb_x, rightpb_y, self.area))
        df = pd.DataFrame(data=temp_dataset,
                          columns=['Peak Time',
                                   'Amplitude',
                                   'Relative Amplitude \n (F/Fmax)',
                                   'Peak Start Time',
                                   'Peak Start Ordinate',
                                   'Peak Stop Time',
                                   'Peak Stop Ordinate',
                                   'Area'])

        # Sort data in DataFrame according to the time of peak appearance
        df_sorted = df.sort_values(['Peak Time'], ascending=True)
        df_sorted.index = range(0, len(df_sorted))  # reset indexing

        # calculate periods
        periods = []
        for i in range(1, len(df_sorted['Peak Time'])):
            periods.append(df_sorted.at[i, 'Peak Time'] - df_sorted.at[i - 1, 'Peak Time'])
        periods.insert(0, np.nan)  # add placeholder because len(periods)=len(peaks)-1

        # calculate frequencies based on calculated periods
        frequencies = []
        frequencies[:] = [(1 / i) for i in periods]

        # Analise peak start - stop time (left and right peak borders)
        peak_full_time = []
        for i in range(0, len(df_sorted['Peak Time']), 1):
            peak_full_time.append(df_sorted.at[i, 'Peak Stop Time'] - df_sorted.at[i, 'Peak Start Time'])
        peak_up_time = []
        for i in range(0, len(df_sorted['Peak Time']), 1):
            peak_up_time.append(df_sorted.at[i, 'Peak Time'] - df_sorted.at[i, 'Peak Start Time'])
        peak_down_time = []
        for i in range(0, len(df_sorted['Peak Time']), 1):
            peak_down_time.append(df_sorted.at[i, 'Peak Stop Time'] - df_sorted.at[i, 'Peak Time'])

        # Compute area under the peak using the composite trapezoidal rule.
        peak_area = []
        for i in range(0, len(df_sorted['Peak Time']), 1):
            peak_area.append(np.trapz(df_sorted.at[i, 'Area']))

        # Analise the peak decay area
        half_decay_time = []
        half_decay_amplitude = []
        for i in range(0, len(df_sorted['Peak Time']), 1):
            half_decay_ampl = df_sorted.at[i, 'Amplitude'] / 2  # calculate the half of the amplitude
            peak_index = self.x.index(df_sorted.at[i, 'Peak Time'])  # find index of the peak time
            stop_idx = self.x.index(df_sorted.at[i, 'Peak Stop Time'])  # find index of the right peak border
            data_decay_region = self.data_after_filter[peak_index:stop_idx]  # determine the amplitude region where to search for halftime decay index
            time_decay_region = self.x[peak_index:stop_idx]
            half_decay_idx = (np.abs(data_decay_region - half_decay_ampl)).argmin()  # find the closet value in data_decay_region that corresponds to the half amplitude

            half_decay_amplitude.append(half_decay_ampl)
            half_decay_time.append(time_decay_region[half_decay_idx] - df_sorted.at[i, 'Peak Time'])

        # Compute amplitude normalised to the baseline
        normalised_amplitude = []
        sg_window_frame = self.BoxSGwindowFrame.value()
        sg_polynom_degree = self.BoxSGpolynomDegree.value()
        orig_data_filtered = sig.savgol_filter(self.y, sg_window_frame, sg_polynom_degree)
        for i in range(0, len(df_sorted['Peak Time']), 1):
            start_idx = self.x.index(df_sorted.at[i, 'Peak Start Time'])
            F0 = orig_data_filtered[start_idx]
            amplitude_normed_computation = df_sorted.at[i, 'Amplitude'] / F0
            normalised_amplitude.append(amplitude_normed_computation)

        # normalised amplitude %
        relative_normalised_amplitude = []
        maxATB = max(normalised_amplitude)
        relative_normalised_amplitude[:] = [(i / maxATB) for i in normalised_amplitude]

        # normalised amplitude MAX
        normalised_amplitude_max = list(range(0, len(df_sorted['Peak Time']) - 1))
        normalised_amplitude_max[:] = [np.nan for _ in normalised_amplitude_max]
        normalised_amplitude_max.insert(0, maxATB)

        # add file name as first column
        file_name = list(range(0, len(df_sorted['Peak Time']) - 1))
        file_name[:] = [np.nan for _ in file_name]
        file_name.insert(0, self.graph_name)

        # add maximum amplitude
        absolute_amplitude_max = list(range(0, len(df_sorted['Peak Time']) - 1))
        absolute_amplitude_max[:] = [np.nan for _ in absolute_amplitude_max]
        absolute_amplitude_max.insert(0, max(df_sorted['Amplitude']))

        # peak sorting
        big_peaks_number = [p for p in self.amplitudes if (p > ampl_max * 0.66)]
        medium_peaks_number = [p for p in self.amplitudes if (p > ampl_max * 0.33 and p <= ampl_max * 0.66)]
        small_peaks_number = [p for p in self.amplitudes if (p > 0 and p <= ampl_max * 0.33)]

        big_peaks_frequency = list(range(0, len(df_sorted['Peak Time']) - 1))
        big_peaks_frequency[:] = [np.nan for _ in big_peaks_frequency]
        big_peaks_frequency.insert(0, len(big_peaks_number) / (self.x[-1] - self.x[0]))

        medium_peaks_frequency = list(range(0, len(df_sorted['Peak Time']) - 1))
        medium_peaks_frequency[:] = [np.nan for _ in medium_peaks_frequency]
        medium_peaks_frequency.insert(0, len(medium_peaks_number) / (self.x[-1] - self.x[0]))

        small_peaks_frequency = list(range(0, len(df_sorted['Peak Time']) - 1))
        small_peaks_frequency[:] = [np.nan for _ in small_peaks_frequency]
        small_peaks_frequency.insert(0, len(small_peaks_number) / (self.x[-1] - self.x[0]))

        final_dataset = list(zip(file_name,
                                df_sorted['Peak Time'],
                                df_sorted['Amplitude'],
                                df_sorted['Relative Amplitude \n (F/Fmax)'],
                                absolute_amplitude_max,
                                normalised_amplitude,
                                relative_normalised_amplitude,
                                normalised_amplitude_max,
                                periods,
                                frequencies,
                                half_decay_time,
                                half_decay_amplitude,
                                df_sorted['Peak Start Time'],
                                df_sorted['Peak Start Ordinate'],
                                df_sorted['Peak Stop Time'],
                                df_sorted['Peak Stop Ordinate'],
                                peak_up_time,
                                peak_down_time,
                                peak_full_time,
                                peak_area,
                                big_peaks_frequency,
                                medium_peaks_frequency,
                                small_peaks_frequency))

        final_dataframe = pd.DataFrame(data=final_dataset,
                                       columns=['File name',
                                                'Peak time',
                                                'Absolute amplitude',
                                                'Absolute amplitude (%)',
                                                'Absolute amplitude MAX',
                                                'Normalised amplitude',
                                                'Normalised amplitude (%)',
                                                'Normalised amplitude MAX',
                                                'Period',
                                                'Frequency',
                                                'Half-decay time',
                                                'Half-decay amplitude',
                                                'Start time',
                                                'Start ordinate',
                                                'Stop time',
                                                'Stop ordinate',
                                                'Ascending time',
                                                'Decay time',
                                                'Full peak time',
                                                'AUC',
                                                'Big peaks, Hz',
                                                'Mid peaks, Hz',
                                                'Small peaks, Hz'])

        # specify data for export acording to the settings tab in GUI
        # and append current analysed dataset to existing ones
        try:
            columns_to_delete_for_export = []
            if not self.chbxFileName.isChecked(): columns_to_delete_for_export.append('File name')
            if not self.chbxPeakTime.isChecked(): columns_to_delete_for_export.append('Peak time')
            if not self.chbxAmplAbs.isChecked(): columns_to_delete_for_export.append('Absolute amplitude')
            if not self.chbxAmplAbsRel.isChecked(): columns_to_delete_for_export.append('Absolute amplitude (%)')
            if not self.chbxAmplAbsMax.isChecked(): columns_to_delete_for_export.append('Absolute amplitude MAX')
            if not self.chbxAmplNorm.isChecked(): columns_to_delete_for_export.append('Normalised amplitude')
            if not self.chbxAmplNormRel.isChecked(): columns_to_delete_for_export.append('Normalised amplitude (%)')
            if not self.chbxAmplNormMax.isChecked(): columns_to_delete_for_export.append('Normalised amplitude MAX')
            if not self.chbxPeriod.isChecked(): columns_to_delete_for_export.append('Period')
            if not self.chbxFreq.isChecked(): columns_to_delete_for_export.append('Frequency')
            if not self.chbxHalfDecayTime.isChecked(): columns_to_delete_for_export.append('Half-decay time')
            if not self.chbxHalfDecayAmpl.isChecked(): columns_to_delete_for_export.append('Half-decay amplitude')
            if not self.chbxLeftBorderTime.isChecked(): columns_to_delete_for_export.append('Start time')
            if not self.chbxLeftBorder.isChecked(): columns_to_delete_for_export.append('Start ordinate')
            if not self.chbxRightBorderTime.isChecked(): columns_to_delete_for_export.append('Stop time')
            if not self.chbxRightBorder.isChecked(): columns_to_delete_for_export.append('Stop ordinate')
            if not self.chbxTimeToPeak.isChecked(): columns_to_delete_for_export.append('Ascending time')
            if not self.chbxDecayTime.isChecked(): columns_to_delete_for_export.append('Decay time')
            if not self.chbxFullPeakTime.isChecked(): columns_to_delete_for_export.append('Full peak time')
            if not self.chbxAUC.isChecked(): columns_to_delete_for_export.append('AUC')
            if not self.chbxSmallPeaks.isChecked(): columns_to_delete_for_export.append('Big peaks, Hz')
            if not self.chbxMidPeaks.isChecked(): columns_to_delete_for_export.append('Mid peaks, Hz')
            if not self.chbxBigPeaks.isChecked(): columns_to_delete_for_export.append('Small peaks, Hz')
            final_dataframe.drop(columns_to_delete_for_export, axis=1, inplace=True)

            self.multiple_data_sets = self.multiple_data_sets.append(final_dataframe)

            if self.chbxSaveFig.isChecked():
                os.makedirs('_Figures', exist_ok=True)
                dpi = self.BoxDPI.value()
                plt.savefig(os.path.join('_Figures', 'Fig_{figName}.png'.format(figName=self.graph_name)), dpi=dpi)

            del df
            del df_sorted
            del final_dataframe

            dialog = MessageBox.question(self, '', "Current dataset was analysed \n and added to previous ones (if exist). \n Would you like to load next file? ",
                                         QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
            if dialog == QtGui.QMessageBox.Yes:
                self.load_file()
            else:
                self.rmmpl()
                self.BtnSaveFullDataset.setStyleSheet("background-color: #7CF2BD")
                self.BtnLoadFile.setStyleSheet("background-color: #7CF2BD")

        except:
            message = MessageBox()
            message.about(self, 'Warning!', "Data were not added to existing dataset. \n Plese be sure that you did not change the output settings.")

    def save_data(self, ):
        try:
            file_name = QtGui.QFileDialog.getSaveFileName(self, 'Save file')
            writer = pd.ExcelWriter('{}.xlsx'.format(file_name))
            self.multiple_data_sets.to_excel(writer, index=True, sheet_name='Results')
            writer.sheets['Results'].set_zoom(80)
            writer.sheets['Results'].set_column('A:A', 5)
            writer.sheets['Results'].set_column('B:X', 23)
            writer.save()

            message = MessageBox()
            message.about(self, 'Data saved', "Data were saved!")
            self.multiple_data_sets = pd.DataFrame()
            self.BtnSaveFullDataset.setStyleSheet("background-color: #FAF6F2")
            self.BtnLoadFile.setStyleSheet("background-color: #7CF2BD")
        except:
            message = MessageBox()
            message.about(self, 'Warning!', "Data were not exported to Excel! \n Please try again.")

    def mpl_style_change(self, ):
        style.use(self.BoxMplPlotStyle.currentText())

    def clear_data(self):
        self.coordinates = []
        self.area = []
        self.amplitudes = []
        self.amplitude_line_coordinates = []
        self.left_peak_border = []
        self.right_peak_border = []
        self.pickable_artists_pts_AX2 = []
        self.pickable_artists_pts_AX3 = []
        self.pickable_artists_lns_AX3 = []
        self.pickable_artists_fill_AX3 = []
        self.pickable_artists_plb_AX3 = []
        self.pickable_artists_prb_AX3 = []
        self.pickable_artists_lnsP_AX3 = []

    def closeEvent(self, event):
        """Exchange default event to add a dialog"""
        if self.multiple_data_sets.empty:
            reply = MessageBox.question(self, 'Warning!',
                                        "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        else:
            reply = MessageBox.question(self, 'Warning!',
                                        "You have unsaved analysed data! \n Are you sure to quit?",
                                        QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    @staticmethod
    def find_character(s, ch):  # for graph title
        return [i for i, ltr in enumerate(s) if ltr == ch]
예제 #37
0
class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        # Load of main window GUI
        # The GUI was developed in QT Designer
        self.ui = uic.loadUi("src/gui/main.ui")

        # Full Screen
        self.ui.showMaximized()
        screen = QtGui.QDesktopWidget().screenGeometry()

        # Screen dimensions
        self.size_x = screen.width()
        self.size_y = screen.height()

        self.ui.setWindowFlags(self.ui.windowFlags()
                               | QtCore.Qt.CustomizeWindowHint)
        self.ui.setWindowFlags(self.ui.windowFlags()
                               & ~QtCore.Qt.WindowMaximizeButtonHint)

        self.ui.ctrlFrame.resize(280, self.size_y - 120)
        self.ui.tabPlots.resize(self.size_x - 600, self.size_y - 150)

        self.ui.plotFrame.resize(self.size_x - 620, self.size_y - 210)
        self.ui.plotFrame.setLayout(self.ui.MainPlot)

        self.ui.plotFrame_2.resize(self.size_x - 620, self.size_y - 210)
        self.ui.plotFrame_2.setLayout(self.ui.MainPlot_2)

        self.ui.Terminal.move(self.size_x - 290, self.size_y / 2 - 100)
        self.ui.Terminal.resize(self.size_x - 1085, self.size_y / 2 - 30)
        self.ui.Terminal.setLayout(self.ui.TermVBox)

        self.ui.loggsFrame.move(self.size_x - 290, 10)
        self.ui.loggsFrame.resize(self.size_x - 1085, self.size_y / 2 - 120)
        self.ui.loggsFrame.setLayout(self.ui.loggsText)

        # Logging
        logTextBox = QTextEditLogger(self)
        # You can format what is printed to text box
        logTextBox.setFormatter(
            logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        logging.getLogger().addHandler(logTextBox)
        # You can control the logging level
        logging.getLogger().setLevel(logging.INFO)
        self.ui.loggsText.addWidget(logTextBox.widget)

        # Initial settings
        # Loading General Configuration file

        # Load general settings
        self.gc = {}
        with open("./config/general_config") as f:
            for line in f:
                if line[0] != "#" and line[0] != "\n":
                    (key, val) = line.split()
                    self.gc[key] = val

        logging.info('Loading configuration parameters ...')

        # Load list of firmware registers (note: must manually update for different versions)
        self.regs = {}
        with open("./config/firmware_registers") as f:
            for line in f:
                if line[0] != "#" and line[0] != "\n":
                    (key, val) = line.split()
                    self.regs[key] = val

        logging.info('Loading firmware registers ...')

        # Paths of firmware and directories to save data
        self.firmware = self.gc['FIRMWARE_FILE']
        self.ui.firmEdit.setText(self.firmware)

        self.vna_savepath = self.gc['VNA_SAVEPATH']
        self.targ_savepath = self.gc['TARG_SAVEPATH']
        self.dirfile_savepath = self.gc['DIRFILE_SAVEPATH']
        self.ui.vnaEdit.setText(self.vna_savepath)
        self.ui.tarEdit.setText(self.targ_savepath)
        self.ui.streamEdit.setText(self.dirfile_savepath)

        # UDP packet
        self.buf_size = int(self.gc['buf_size'])
        self.header_len = int(self.gc['header_len'])

        # Ethernet port
        self.eth_port = self.gc['udp_dest_device']
        self.ui.ethEdit.setText(self.eth_port)
        os.system("sudo ip link set " + self.eth_port + " mtu 9000")

        # Source (V6) Data for V6
        self.udp_src_ip = self.gc['udp_src_ip']
        self.udp_src_mac = self.gc['udp_src_mac']
        self.udp_src_port = self.gc['udp_src_port']

        self.ui.ipSrcEdit.setText(self.udp_src_ip)
        self.ui.macSrcEdit.setText(self.udp_src_mac)
        self.ui.portSrcEdit.setText(self.udp_src_port)

        self.dds_shift = self.gc['dds_shift']

        self.udp_dst_ip = self.gc['udp_dest_ip']
        self.udp_dst_mac = self.gc['udp_dest_mac']
        self.udp_dst_port = self.gc['udp_dst_port']
        self.ui.ipDstEdit.setText(self.udp_dst_ip)
        self.ui.macDstEdit.setText(self.udp_dst_mac)
        self.ui.portDstEdit.setText(self.udp_dst_port)

        # About the ROACH
        self.roach_ip = self.gc['roach_ppc_ip']
        self.ui.roachIPEdit.setText(self.roach_ip)

        # Windfreak Synthesizer params
        self.synthID = self.gc['synthID']
        self.clkFreq = np.float(self.gc['clkFreq'])
        self.clkPow = np.float(self.gc['clkPow'])
        self.LOFreq = np.float(self.gc['LOFreq'])
        self.LOPow = np.float(self.gc['LOPow'])
        self.center_freq = np.float(self.gc['center_freq'])

        self.lo_step = np.float(self.gc['lo_step'])

        self.ui.freqClk.setText(str(self.clkFreq))
        self.ui.powClk.setText(str(self.clkPow))
        self.ui.loFreq.setText(str(self.LOFreq))
        self.ui.loPow.setText(str(self.LOPow))

        # Limits of test comb
        self.min_pos_freq = np.float(self.gc['min_pos_freq'])
        self.max_pos_freq = np.float(self.gc['max_pos_freq'])
        self.min_neg_freq = np.float(self.gc['min_neg_freq'])
        self.max_neg_freq = np.float(self.gc['max_neg_freq'])
        self.symm_offset = np.float(self.gc['symm_offset'])
        self.Nfreq = int(self.gc['Nfreq'])

        self.ui.minPosEdit.setText(str(self.min_pos_freq / 1.0e6))
        self.ui.maxPosEdit.setText(str(self.max_pos_freq / 1.0e6))
        self.ui.minNegEdit.setText(str(self.min_neg_freq / 1.0e6))
        self.ui.maxNegEdit.setText(str(self.max_neg_freq / 1.0e6))
        self.ui.offsetEdit.setText(str(self.symm_offset / 1.0e6))
        self.ui.nFreqsEdit.setText(str(self.Nfreq))

        # Attenuation
        att_ID_1 = int(self.gc['att_ID_1'])
        att_ID_2 = int(self.gc['att_ID_2'])

        self.attenID = [att_ID_1, att_ID_2]

        self.ui.attInIDEdit.setText(str(att_ID_1))
        self.ui.attOutIDEdit.setText(str(att_ID_2))

        self.att_In = int(self.gc['attIn'])
        self.att_Out = int(self.gc['attOut'])
        self.target_rms = np.float(self.gc['target_rms_mv'])

        self.ui.attInEdit.setText(str(self.att_In))
        self.ui.attOutEdit.setText(str(self.att_Out))
        self.ui.tarLevelEdit.setText(str(self.target_rms))

        # Optional test frequencies
        self.test_freq = np.float(self.gc['test_freq'])
        self.test_freq = np.array([self.test_freq])
        self.freq_list = self.gc['freq_list']

        # Parameters for resonator search
        self.smoothing_scale = np.float(self.gc['smoothing_scale'])
        self.peak_threshold = np.float(self.gc['peak_threshold'])
        self.spacing_threshold = np.float(self.gc['spacing_threshold'])

        # VNA Sweep
        self.startVNA = -255.5e6
        self.stopVNA = 255.5e6

        self.ui.centralEdit.setText(str(self.center_freq))
        self.ui.startEdit.setText(str(self.startVNA / 1.0e6))
        self.ui.stopEdit.setText(str(self.stopVNA / 1.0e6))
        self.ui.stepEdit.setText(str(self.lo_step / 1.0e6))
        self.ui.nTonesEdit.setText(str(self.Nfreq))

        # Tool bar
        # ROACH status
        self.ui.actionRoach.triggered.connect(self.roach_connection)
        # ROACH network
        self.ui.actionNetwork.triggered.connect(self.roach_network)
        # Synthesizer
        self.ui.actionSynthesizer.triggered.connect(self.roach_synth)
        # Attenuattors
        self.ui.actionRF_Calibration.triggered.connect(self.roach_atten)
        # QDR Calibration
        self.ui.actionQDR_Calibration.triggered.connect(self.qdr_cal)

        # Buttons
        # Roach
        # Roach Settings
        self.ui.firmDir.mousePressEvent = self.chooseFirmPath
        self.ui.vnaDir.mousePressEvent = self.chooseVNAPath
        self.ui.targDir.mousePressEvent = self.chooseTargPath
        self.ui.streamDir.mousePressEvent = self.chooseStreamPath

        self.ui.upFirmBtn.mousePressEvent = self.upload_firmware
        self.ui.synthBtn.mousePressEvent = self.roach_synth
        self.ui.udpConfBtn.mousePressEvent = self.roach_network
        self.ui.udpTestBtn.mousePressEvent = self.test_udp
        self.ui.attBtn.mousePressEvent = self.roach_atten
        self.ui.writeTestBtn.mousePressEvent = self.write_test_comb

        self.ui.plotSweepBtn.mousePressEvent = self.start_plot_VNA
        self.ui.startSweepBtn.mousePressEvent = self.start_VNA_sweep

        # Iniatialising
        self.statusConn = 0
        self.statusFirm = 0
        self.statusSynth = 0
        self.statusAtt = 0
        self.statusNet = 0

        self.s = None
        self.fpga = None

        try:
            self.fpga = casperfpga.CasperFpga(self.roach_ip, timeout=100.)
            icon.addPixmap(QPixmap('./src/icon/ok_icon.png'))
            self.ui.actionRoach_Status.setIcon(icon)
            logging.info("Connected to: " + self.roach_ip)
        except:
            self.fpga = None
            self.statusConn = 1
            logging.info("Roach link is down")

        # Check firmware
        if self.fpga:
            logging.info('Firmware is uploaded')
            if self.fpga.is_running():
                self.ui.upFirmBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: green
                                        }""")
            else:
                self.statusFirm = 1
        else:
            self.statusFirm = 1

        # UDP socket
        # Run with root permissions
        try:
            self.s = socket(AF_PACKET, SOCK_RAW, htons(3))
            logging.info('Socket is initialised.')
        except:
            logging.error(
                'Socket is not initialised. Permissions are required')

        # Roach interface
        self.ri = roachInterface(self.fpga, self.gc, self.regs, None)

        # GbE interface
        try:
            self.udp = roachDownlink(self.ri, self.fpga, self.gc, self.regs,
                                     self.s, self.ri.accum_freq)
            self.udp.configSocket()
            logging.info('UDP configuration done.')
        except:
            logging.error("UDP connection couldn't be initialised.")

        # Creation of Plot
        self.fig1 = Figure()
        self.addmpl_homodyne(self.fig1)

        # Creation of Plot
        self.fig1 = Figure()
        self.addmpl_vna(self.fig1)

        # To use LATEX in plots
        matplotlib.rc('text', usetex=True)
        matplotlib.rcParams['text.latex.preamble'] = [r"\usepackage{amsmath}"]

        # IPython console
        self.console = EmbedIPython()
        self.console.kernel.shell.run_cell('%pylab qt')

        self.console.execute("cd ./")

        self.ui.TermVBox.addWidget(self.console)

        self.ui.show()

    def choosePath(self, flag):
        w = QWidget()
        w.resize(320, 240)
        w.setWindowTitle("Select directory where KID files are ")

        if flag == "firm":
            self.firmware = QFileDialog.getOpenFileName(
                self, "Select Directory")
            self.ui.firmEdit.setText(self.firmware)
            self.gc['FIRMWARE_FILE'] = self.firmware
        elif flag == "vnaPath":
            self.vna_savepath = QFileDialog.getOpenFileName(
                self, "Select Directory")
            self.ui.vnaEdit.setText(self.vna_savepath)
            self.gc['VNA_SAVEPATH'] = self.vna_savepath
        elif flag == "tarPath":
            self.targ_savepath = QFileDialog.getOpenFileName(
                self, "Select Directory")
            self.ui.tarEdit.setText(self.targ_savepath)
            self.gc['TARG_SAVEPATH'] = self.targ_savepath
        elif flag == "streamPath":
            self.dirfile_savepath = QFileDialog.getOpenFileName(
                self, "Select Directory")
            self.ui.streamEdit.setText(self.dirfile_savepath)
            self.gc['DIRFILE_SAVEPATH'] = self.dirfile_savepath

    def chooseFirmPath(self, event):
        self.choosePath("firm")

    def chooseVNAPath(self, event):
        self.choosePath("vnaPath")

    def chooseTargPath(self, event):
        self.choosePath("tarPath")

    def chooseStreamPath(self, event):
        self.choosePath("streamPath")

    def testConn(self, fpga):
        """Tests the link to Roach2 PPC, using return from getFPGA()
            inputs:
                casperfpga object fpga: The fpga object
            outputs: the fpga object"""
        if not fpga:
            try:
                fpga = casperfpga.CasperFpga(self.roach_ip, timeout=3.)
                # Roach interface
                self.ri = roachInterface(self.fpga, self.gc, self.regs, None)
            except RuntimeError:
                logging.warning(
                    "No connection to ROACH. If booting, wait 30 seconds and retry. Otherwise, check gc config."
                )
        return fpga

    def roach_connection(self, event):
        """Check the connection with ROACH, if it is connected turn green the status icon"""

        self.roach_ip = self.ui.roachIPEdit.toPlainText()

        w = QWidget()

        self.ui.setEnabled(False)
        self.ui.statusbar.showMessage(u'Waiting for roach connection...')
        QMessageBox.information(w, "ROACH Connection",
                                "Starting with ROACH comunication ...")

        try:
            result = self.testConn(self.fpga)
        except:
            result = None
        icon = QIcon()
        if not result:
            icon.addPixmap(QPixmap('./src/icon/wrong_icon.png'))
            self.ui.actionRoach_Status.setIcon(icon)
            self.statusConn = 1
            self.ui.statusbar.showMessage(u'ROACH connection failed!')
            logging.warning('ROACH connection failed.')
            QMessageBox.information(
                w, "ROACH Connection",
                "No connection to ROACH. If booting, wait 30 seconds and retry. Otherwise, check gc config."
            )
        else:
            self.fpga = result
            icon.addPixmap(QPixmap('./src/icon/ok_icon.png'))
            self.ui.actionRoach_Status.setIcon(icon)
            self.statusConn = 0
            self.ui.statusbar.showMessage(u'ROACH connection is successful!')
            logging.info('ROACH connection is successful!')
            QMessageBox.information(w, "ROACH Connection",
                                    "Successful communication!")

        self.ui.setEnabled(True)

    def roach_synth(self, event):
        """Synthesizer connection. Check if the synthesizer is connected and set it
            the initial parameters"""

        self.clkFreq = np.float(self.ui.freqClk.toPlainText())
        self.clkPow = np.float(self.ui.powClk.toPlainText())
        self.LOFreq = np.float(self.ui.loFreq.toPlainText())
        self.LOPow = np.float(self.ui.loPow.toPlainText())

        self.synthID = self.ui.comboBox.currentText().upper()

        w = QMessageBox()
        icon = QIcon()

        self.ui.setEnabled(False)
        self.ui.statusbar.showMessage(
            u'Waiting for synthesizer connection ...')
        QMessageBox.information(w, "Synthesizer Connection",
                                "Starting Synthesizer configuration ...")

        try:
            # Initializing Synthesizer Windfreak
            self.synthRF = synthclass.Synthesizer(self.synthID)
            icon.addPixmap(QPixmap('./src/icon/ok_icon.png'))
            self.ui.actionSynthesizer_status.setIcon(icon)
            self.ui.synthBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: green
                                        }""")
            self.statusSynth = 0
            logging.info('Synthesizer connection is successful')
            self.ui.statusbar.showMessage(
                u'Synthesizer connection is successful')

            # CLK
            self.synthRF.setControlChannel(0)
            self.synthRF.setPower(True)
            self.synthRF.setRFMute(1)
            self.synthRF.setRFAmp(1)
            self.synthRF.setFrequency(self.clkFreq)
            self.synthRF.setPower(self.clkPow)

            # LO
            self.synthRF.setControlChannel(1)
            self.synthRF.setPower(True)
            self.synthRF.setRFMute(1)
            self.synthRF.setRFAmp(1)
            self.synthRF.setFrequency(self.LOFreq)
            self.synthRF.setPower(self.LOPow)

            QMessageBox.information(w, "Synthesizer connection",
                                    "Synthesizer connected and working!")
        except:
            icon.addPixmap(QPixmap('./src/icon/wrong_icon.png'))
            self.ui.actionSynthesizer_status.setIcon(icon)
            self.ui.synthBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
            self.statusSynth = 1
            logging.warning('Synthesizer failed!')
            self.ui.statusbar.showMessage(u'Synthesizer failed!')
            QMessageBox.warning(w, "Synthesizer connection",
                                "Synthesizer connection failed!")

        self.ui.setEnabled(True)

    def qdr_cal(self, event):

        w = QMessageBox()
        icon = QIcon()

        self.ui.setEnabled(False)
        self.ui.statusbar.showMessage(u'Waiting for QDR Calibration ...')
        QMessageBox.information(w, "QDR Calibration",
                                "Starting QDR calibration ...")

        if not self.fpga == None:
            self.fpga.write_int(self.regs['accum_len_reg'],
                                self.ri.accum_len - 1)
            time.sleep(0.1)
            self.fpga.write_int(self.regs['dds_shift_reg'],
                                int(self.gc['dds_shift']))
            time.sleep(0.1)

            # QDR Calibration
            if (self.ri.qdrCal() < 0):
                icon.addPixmap(QPixmap('./src/icon/wrong_icon.png'))
                self.ui.actionQDR_Status.setIcon(icon)
                self.ui.statusbar.showMessage(u'QDR Calibration failed!')
                logging.info('QDR Calibration failed!')
                QMessageBox.information(
                    w, "QDR Calibration",
                    "QDR calibration failed... Check FPGA clock source")
            else:
                icon.addPixmap(QPixmap('./src/icon/ok_icon.png'))
                self.ui.actionQDR_Status.setIcon(icon)
                self.fpga.write_int(self.regs['write_qdr_status_reg'], 1)
                self.ui.statusbar.showMessage(u'QDR Calibration completed!')
                logging.info('QDR Calibration completed!')
                QMessageBox.information(w, "QDR Calibration",
                                        "QDR calibration completed!")
        else:
            icon.addPixmap(QPixmap('./src/icon/wrong_icon.png'))
            self.ui.actionQDR_Status.setIcon(icon)
            logging.info('QDR calibration failed... Check ROACH connection')
            QMessageBox.information(
                w, "QDR Calibration",
                "QDR calibration failed... Check ROACH connection")

        self.ui.setEnabled(True)

    def roach_atten(self, event):
        """Attenuators connection. Check if the attenuators are connected and calibrate them"""

        att_ID_1 = int(self.ui.attInIDEdit.toPlainText())
        att_ID_2 = int(self.ui.attOutIDEdit.toPlainText())

        self.attenID = [att_ID_1, att_ID_2]

        self.att_In = int(self.ui.attInEdit.toPlainText())
        self.att_Out = int(self.ui.attOutEdit.toPlainText())
        self.target_rms = np.float(self.ui.tarLevelEdit.toPlainText())

        w = QMessageBox()
        icon = QIcon()

        self.ui.setEnabled(False)
        self.ui.statusbar.showMessage(
            u'Waiting for attenuators calibration ... ')
        QMessageBox.information(
            w, "Attenuation Connection",
            "Starting input/output attenuators configuration ...")

        try:
            # Attenuation calibration
            att = attCalibration.CalibrationATT(self.attenID)

            if self.fpga:
                att.calibrateADC(self.fpga, self.target_rms, self.att_Out,
                                 self.att_In)  # ADC level calibration

                icon.addPixmap(QPixmap('./src/icon/ok_icon.png'))
                self.ui.actionRF_Status.setIcon(icon)
                self.ui.attBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: green
                                        }""")
                self.statusAtt = 0
                self.ui.statusbar.showMessage(
                    u'Attenuators connection is succesful')
                logging.info('Attenuators connection is succesful')
                QMessageBox.information(w, "Attenuators connection",
                                        "Attenuators connected and working!")
            else:
                icon.addPixmap(QPixmap('./src/icon/wrong_icon.png'))
                self.ui.actionRF_Status.setIcon(icon)
                self.ui.attBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
                self.statusAtt = 0
                self.ui.statusbar.showMessage(
                    u'Attenuators connection failed!')
                logging.warning('Attenuators connection failed!')
                QMessageBox.information(
                    w, "Attenuators connection",
                    "Attenuators calibration failed! Roach is not connected.")

        except:
            icon.addPixmap(QPixmap('./src/icon/wrong_icon.png'))
            self.ui.actionRF_Status.setIcon(icon)
            self.ui.attBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
            self.statusAtt = 1
            self.ui.statusbar.showMessage(u'Attenuators connection failed!')
            logging.warning(
                'Attenuators connection failed! Check attenuators connection.')
            QMessageBox.warning(
                w, "Attenuators connection",
                "Attenuators connection failed! Check attenuators connection.")

        self.ui.setEnabled(True)

    def roach_network(self, event):

        self.gc['udp_dest_ip'] = self.ui.ipDstEdit.toPlainText()
        self.gc['udp_dst_port'] = self.ui.portDstEdit.toPlainText()
        self.gc['udp_dest_mac'] = self.ui.macDstEdit.toPlainText()

        self.gc['udp_src_ip'] = self.ui.ipSrcEdit.toPlainText()
        self.gc['udp_src_port'] = self.ui.portSrcEdit.toPlainText()
        self.gc['udp_src_mac'] = self.ui.macSrcEdit.toPlainText()

        self.gc['udp_dest_device'] = self.ui.ethEdit.toPlainText()

        # Update the UDP parameters
        self.eth_port = self.gc['udp_dest_device']
        os.system("sudo ip link set " + self.eth_port + " mtu 9000")

        self.udp_src_ip = self.gc['udp_src_ip']
        self.udp_src_mac = self.gc['udp_src_mac']
        self.udp_src_port = self.gc['udp_src_port']

        self.udp_dst_ip = self.gc['udp_dest_ip']
        self.udp_dst_mac = self.gc['udp_dest_mac']
        self.udp_dst_port = self.gc['udp_dst_port']

        w = QMessageBox()
        icon = QIcon()

        self.ui.setEnabled(False)
        self.ui.statusbar.showMessage(u'UDP configuration ... ')
        QMessageBox.information(w, "UDP Configuration",
                                "Starting UDP configuration ...")

        try:
            # GbE interface
            self.udp = roachDownlink(self.ri, self.fpga, self.gc, self.regs,
                                     self.s, self.ri.accum_freq)
            self.udp.configSocket()

            # UDP Configuration
            try:
                self.udp.configDownlink()

                # Register set
                self.fpga.write_int(self.regs['accum_len_reg'],
                                    self.ri.accum_len - 1)
                time.sleep(0.1)
                self.fpga.write_int(self.regs['dds_shift_reg'],
                                    int(self.gc['dds_shift']))
                time.sleep(0.1)

                icon.addPixmap(QPixmap('./src/icon/ok_icon.png'))
                self.ui.actionNetwork_status.setIcon(icon)
                self.ui.udpConfBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: green
                                        }""")
                self.statusNet = 0
                self.ui.statusbar.showMessage(u'UDP Downlink configured.')
                logging.info('UDP Downlink configured.')
                QMessageBox.information(w, "UDP Downlink",
                                        "UDP Network configuraton id done.")

            except AttributeError:
                icon.addPixmap(QPixmap('./src/icon/wrong_icon.png'))
                self.ui.actionNetwork_status.setIcon(icon)
                self.ui.udpConfBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
                self.statusNet = 1
                self.ui.statusbar.showMessage(
                    u'UDP Downlink configuration failed!')
                logging.warning(
                    "UDP Downlink could not be configured. Check ROACH connection."
                )
                QMessageBox.information(
                    w, "UDP Downlink",
                    "UDP Downlink could not be configured. Check ROACH connection."
                )

        except:
            icon.addPixmap(QPixmap('./src/icon/wrong_icon.png'))
            self.ui.actionNetwork_status.setIcon(icon)
            self.ui.udpConfBtn.setStyleSheet("""QWidget {
                                    color: white;
                                    background-color: red
                                    }""")
            self.statusNet = 1
            self.ui.statusbar.showMessage(u'UDP Network configuraton failed!')
            logging.warning('UDP Network configuraton failed!')
            QMessageBox.information(
                w, "UDP error",
                "UDP Network configuraton failed! Check ROACH connection.")

        self.ui.setEnabled(True)

    def write_test_comb(self, event):

        self.min_pos_freq = np.float(self.ui.minPosEdit.toPlainText()) * 1.0e6
        self.max_pos_freq = np.float(self.ui.maxPosEdit.toPlainText()) * 1.0e6
        self.min_neg_freq = np.float(self.ui.minNegEdit.toPlainText()) * 1.0e6
        self.max_neg_freq = np.float(self.ui.maxNegEdit.toPlainText()) * 1.0e6
        self.symm_offset = np.float(self.ui.offsetEdit.toPlainText()) * 1.0e6
        self.Nfreq = int(self.ui.nFreqsEdit.toPlainText())

        #w = QMessageBox()

        self.ui.statusbar.showMessage(u'Writting test comb ... ')

        try:
            if self.fpga:
                self.ri.makeFreqComb(self.min_neg_freq, self.max_neg_freq,
                                     self.min_pos_freq, self.max_pos_freq,
                                     self.symm_offset, self.Nfreq)
                if (len(self.ri.freq_comb) > 400):
                    self.fpga.write_int(self.regs['fft_shift_reg'], 2**5 - 1)
                    time.sleep(0.1)
                else:
                    self.fpga.write_int(self.regs['fft_shift_reg'], 2**9 - 1)
                    time.sleep(0.1)

                self.ri.upconvert = np.sort(
                    ((self.ri.freq_comb + (self.center_freq) * 1.0e6)) / 1.0e6)
                logging.info("RF tones =", self.ri.upconvert)
                self.ri.writeQDR(self.ri.freq_comb, transfunc=False)
                np.save("last_freq_comb.npy", self.ri.freq_comb)

                if not (self.fpga.read_int(self.regs['dds_shift_reg'])):
                    if self.regs['DDC_mixerout_bram_reg'] in self.fpga.listdev(
                    ):
                        shift = self.ri.return_shift(0)
                        if (shift < 0):
                            self.ui.writeTestBtn.setStyleSheet("""QWidget {
                                                    color: white;
                                                    background-color: red
                                                    }""")
                            self.statusNet = 1
                            self.ui.statusbar.showMessage(
                                "Error finding dds shift: Try writing full frequency comb (N = 1000), or single test frequency. Then try again"
                            )
                            logging.warning(
                                "Error finding dds shift: Try writing full frequency comb (N = 1000), or single test frequency. Then try again"
                            )
                        else:
                            self.fpga.write_int(self.regs['dds_shift_reg'],
                                                shift)

                            self.ui.writeTestBtn.setStyleSheet("""QWidget {
                                                    color: white;
                                                    background-color: green
                                                    }""")
                            self.statusNet = 0
                            self.ui.statusbar.showMessage("Wrote DDS shift (" +
                                                          str(shift) + ")")
                            logging.info("Wrote DDS shift (" + str(shift) +
                                         ")")
                    else:
                        self.fpga.write_int(self.regs['dds_shift_reg'],
                                            self.ri.dds_shift)
            else:
                self.ui.writeTestBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
                self.statusNet = 1
                self.ui.statusbar.showMessage(u'Error writting test comb')
                logging.warning('Error writting test comb')
        except KeyboardInterrupt:
            self.ui.writeTestBtn.setStyleSheet("""QWidget {
                                    color: white;
                                    background-color: red
                                    }""")
            self.statusNet = 1
            self.ui.statusbar.showMessage(u'Error writting test comb')
            logging.warning('Error writting test comb')

    def test_udp(self, event):

        w = QMessageBox()

        self.ui.setEnabled(False)
        self.ui.statusbar.showMessage(u'Starting UDP test ... ')
        QMessageBox.information(w, "UDP test", "Starting UDP test ...")

        if self.fpga:
            if (self.udp.testDownlink(5) < 0):
                self.ui.udpTestBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
                self.statusNet = 1
                self.ui.statusbar.showMessage(u'Error receiving data.')
                logging.warning(
                    "Error receiving data. Check ethernet configuration.")

            else:
                self.ui.udpTestBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: green
                                        }""")
                self.statusNet = 0
                self.ui.statusbar.showMessage(u'Test successful!')
                logging.warning("Test successful. Connections are working.")

                self.fpga.write_int(self.regs['write_stream_status_reg'], 1)
        else:
            self.ui.udpTestBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
            self.statusNet = 1
            self.ui.statusbar.showMessage(u'Error receiving data.')
            logging.warning("Error receiving data. Check ROACH connection.")

        self.ui.setEnabled(True)

    def start_plot_VNA(self, event):
        self.plotVNASweep(str(np.load("last_vna_dir.npy")))

    def start_VNA_sweep(self, event):
        self.vnaSweep(self.ri, self.udp, None)

    def vna_sweep_dirfile(self,
                          center_freq=None,
                          save_path='./vna_sweeps',
                          write=None,
                          sweep_dir=None,
                          randomiser=0,
                          samples_per_point=10,
                          num_tones=256,
                          sweep_step=2.5e3,
                          adjust_sideband_leakage=True,
                          auto_fullscale=False,
                          remove_cryostat_input_s21=True,
                          remove_electronics_input_response=True,
                          plot=True,
                          gains=None,
                          step_sleep=0.1):

        write = self.ui.writeTones.isChecked()

        startVNA = np.float(self.ui.startEdit.toPlainText()) * 1.0e6
        stopVNA = np.float(self.ui.stopEdit.toPlainText()) * 1.0e6
        center_freq = np.float(self.ui.centralEdit.toPlainText()) * 1.0e6
        sweep_step = np.float(self.ui.stepEdit.toPlainText()) * 1.0e6
        num_tones = int(self.ui.nTonesEdit.toPlainText())

        save_path = os.path.join(save_path, sweep_dir)
        bb_freqs, delta_f = np.linspace(startVNA,
                                        stopVNA,
                                        num_tones,
                                        retstep=True)

        if randomiser is not None:
            bb_freqs += randomiser

        for ch in range(len(bb_freqs) - 1):
            #if np.round(abs(bb_freqs[ch]),-3) in np.around(bb_freqs[ch+1:],-3):

            # AQUI VAMOS *******************************************************************
            if (np.around(abs(bb_freqs[ch]) / self.dac_freq_res)
                ) * self.dac_freq_res in np.around(
                    bb_freqs[ch + 1:] / self.dac_freq_res) * self.dac_freq_res:
                #print '*****FOUND******'
                bb_freqs[ch] += 2 * self.dac_freq_res

        bb_freqs = np.roll(bb_freqs, -np.argmin(np.abs(bb_freqs)) - 1)
        np.save('./last_bb_freqs.npy', bb_freqs)
        rf_freqs = bb_freqs + center_freq
        np.save('./last_rf_freqs.npy', rf_freqs)
        channels = np.arange(len(rf_freqs))
        np.save('./last_channels.npy', channels)
        #self.v.setFrequencyFast(0,center_freq , 0.01) # LO
        #self.vLO.frequency = center_freq
        self.v.setFrequencyFast(center_freq)

        print '\nVNA baseband freqs (MHz) =', bb_freqs / 1.0e6
        print '\nVNA RF freqs (MHz) =', rf_freqs / 1.0e6
        if write == 'y' or write is True:
            self.writeQDR(bb_freqs,
                          adjust_sideband_leakage=adjust_sideband_leakage,
                          auto_fullscale=auto_fullscale,
                          remove_cryostat_input_s21=remove_cryostat_input_s21,
                          remove_electronics_input_response=
                          remove_electronics_input_response,
                          lo_frequency=center_freq,
                          gains=gains)
        self.fpga.write_int('sync_accum_reset', 0)
        self.fpga.write_int('sync_accum_reset', 1)
        f, i, q = self.sweep_lo_dirfile(Npackets_per=samples_per_point,
                                        channels=channels,
                                        center_freq=center_freq,
                                        span=delta_f,
                                        save_path=save_path,
                                        bb_freqs=bb_freqs,
                                        step=sweep_step,
                                        sleep=step_sleep)
        last_vna_dir = save_path
        np.save('./last_vna_dir.npy', np.array([last_vna_dir]))
        np.save('./last_vna_sweep.npy', np.array([f, i, q]))
        #self.plot_kids(save_path = last_vna_dir, bb_freqs = bb_freqs, channels = channels)
        if plot:
            plt.figure('vna-sweep-dirfile')
            for ch in channels:
                plt.plot(f[ch], 10 * np.log10(i[ch]**2 + q[ch]**2))
            plt.show()
        return f, i, q

    def vnaSweep(self, ri, udp, valon):
        """Does a wideband sweep of the RF band, saves data in vna_savepath
           as .npy files
           inputs:
               roachInterface object ri
               gbeConfig object udp
               valon synth object valon
               bool write: Write test comb before sweeping?
               Navg = Number of data points to average at each sweep step"""

        #Navg = np.int(gc[np.where(gc == 'Navg')[0][0]][1])
        Navg = 10

        if not os.path.exists(self.vna_savepath):
            os.makedirs(self.vna_savepath)

        sweep_dir = self.vna_savepath + '/' + \
           str(int(time.time())) + '-' + time.strftime('%b-%d-%Y-%H-%M-%S') + '.dir'

        os.mkdir(sweep_dir)
        np.save("./last_vna_dir.npy", sweep_dir)

        print sweep_dir

        # *** Synthesizer ***
        self.synthRF.setControlChannel(1)
        self.synthRF.setFrequencyFast(self.center_freq)

        span = self.ri.pos_delta

        print "Sweep Span =", 2 * np.round(self.ri.pos_delta, 2), "Hz"

        start = self.center_freq * 1.0e6 - (span)
        stop = self.center_freq * 1.0e6 + (span)
        sweep_freqs = np.arange(start, stop, self.lo_step)
        sweep_freqs = np.round(sweep_freqs / self.lo_step) * self.lo_step

        if not np.size(self.ri.freq_comb):
            self.ri.makeFreqComb()
        np.save(sweep_dir + '/bb_freqs.npy', self.ri.freq_comb)
        np.save(sweep_dir + '/sweep_freqs.npy', sweep_freqs)
        Nchan = len(self.ri.freq_comb)

        if not Nchan:
            Nchan = fpga.read_int(
                self.regs[np.where(self.regs == 'read_comb_len_reg')[0][0]][1])

        for freq in sweep_freqs:
            print 'LO freq =', freq / 1.0e6
            self.synthRF.setFrequencyFast(freq)

            self.udp.saveSweepData(Navg,
                                   sweep_dir,
                                   freq,
                                   Nchan,
                                   skip_packets=10)
            time.sleep(0.001)

        self.synthRF.setFrequencyFast(self.center_freq)

        return

    def openStoredSweep(self, savepath):
        """Opens sweep data
           inputs:
               char savepath: The absolute path where sweep data is saved
           ouputs:
               numpy array Is: The I values
               numpy array Qs: The Q values"""
        files = sorted(os.listdir(savepath))
        I_list, Q_list = [], []
        for filename in files:
            if filename.startswith('I'):
                I_list.append(os.path.join(savepath, filename))
            if filename.startswith('Q'):
                Q_list.append(os.path.join(savepath, filename))
        Is = np.array([np.load(filename) for filename in I_list])
        Qs = np.array([np.load(filename) for filename in Q_list])
        return Is, Qs

    def plotVNASweep(self, path):

        plt.figure()

        Is, Qs = self.openStoredSweep(path)
        sweep_freqs = np.load(path + '/sweep_freqs.npy')
        bb_freqs = np.load(path + '/bb_freqs.npy')
        rf_freqs = np.zeros((len(bb_freqs), len(sweep_freqs)))

        for chan in range(len(bb_freqs)):
            rf_freqs[chan] = (sweep_freqs + bb_freqs[chan]) / 1.0e6

        Q = np.reshape(np.transpose(Qs), (len(Qs[0]) * (len(sweep_freqs))))
        I = np.reshape(np.transpose(Is), (len(Is[0]) * (len(sweep_freqs))))
        mag = np.sqrt(I**2 + Q**2)
        mag = 20 * np.log10(mag / np.max(mag))
        mag = np.concatenate((mag[len(mag) / 2:], mag[:len(mag) / 2]))
        rf_freqs = np.hstack(rf_freqs)
        rf_freqs = np.concatenate(
            (rf_freqs[len(rf_freqs) / 2:], rf_freqs[:len(rf_freqs) / 2]))

        plt.plot(rf_freqs, mag)
        #plt.plot(mag)

        plt.title(path, size=16)
        plt.xlabel('frequency (MHz)', size=16)
        plt.ylabel('dB', size=16)
        plt.grid()
        plt.tight_layout()
        plt.savefig(os.path.join(path, 'vna_sweep.png'),
                    dpi=100,
                    bbox_inches='tight')

        plt.show()

        return

    def upload_firmware(self, event):
        w = QWidget()

        self.ui.setEnabled(False)
        QMessageBox.information(w, "ROACH Connection",
                                "Uploading firmware ...")

        try:
            if (self.ri.uploadfpg() < 0):
                self.ui.upFirmBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
                self.statusFirm = 1
                QMessageBox.information(w, "ROACH Firmware",
                                        "Firmware upload failed! :(")
            else:
                self.ui.upFirmBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: green
                                        }""")
                self.statusFirm = 0
                QMessageBox.information(w, "ROACH Firmware",
                                        "Firmware uploaded successfuly! :)")
        except:
            QMessageBox.information(w, "ROACH Firmware",
                                    "Firmware upload failed! :(")
            self.ui.upFirmBtn.setStyleSheet("""QWidget {
                                        color: white;
                                        background-color: red
                                        }""")
            self.statusFirm = 1

        self.ui.setEnabled(True)

    def addmpl_homodyne(self, fig):
        self.canvas_H = FigureCanvas(fig)
        self.ui.MainPlot_2.addWidget(self.canvas_H)
        self.canvas_H.draw()
        self.toolbar_H = NavigationToolbar(self.canvas_H,
                                           self,
                                           coordinates=True)
        self.ui.MainPlot_2.addWidget(self.toolbar_H)

    def rmmpl_homodyne(self):
        self.ui.MainPlot_2.removeWidget(self.canvas_H)
        self.canvas_H.close()
        self.ui.MainPlot_2.removeWidget(self.toolbar_H)
        self.toolbar_H.close()

    def addmpl_vna(self, fig):
        self.canvas_V = FigureCanvas(fig)
        self.ui.MainPlot.addWidget(self.canvas_V)
        self.canvas_V.draw()
        self.toolbar_V = NavigationToolbar(self.canvas_V,
                                           self,
                                           coordinates=True)
        self.ui.MainPlot.addWidget(self.toolbar_V)

    def rmmpl_vna(self):
        self.ui.MainPlot.removeWidget(self.canvas_V)
        self.canvas_V.close()
        self.ui.MainPlot.removeWidget(self.toolbar_V)
        self.toolbar_V.close()
예제 #38
0
class WD(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)
        self.file = open('output.txt', 'a')
        self.ButtonBack.clicked.connect(self.back1)
        self.radioButton.setChecked(True)
        self.sim = 0
        self.true1 = 0

        self.ButtonOn.hide()
        self.ButtonBack.hide()
        self.ButtonPause.hide()
        self.label_5.hide()
        self.interact_game.hide()
        self.game.hide()

        self.start.clicked.connect(self.start1)
        self.back.clicked.connect(self.close)
        self.ButtonOn.clicked.connect(self.on)

        self.ButtonPause.clicked.connect(self.pause)
        self.fig_dict = {}

        self.slider_simulation.hide()
        #        self.horizontalSlider.valueChanged.connect(self.initial)
        self.slider_simulation.valueChanged.connect(self.simulation)
        self.fig_dict = {}
        self.mplfigs.itemClicked.connect(self.changefig)
        self.fig = plt.figure()
        self.addmpl(self.fig)

        self.ButtonDemo_1.clicked.connect(self.demo1)
        self.ButtonDemo_2.clicked.connect(self.demo2)
        self.demo = 0
        self.horizontalSlider.valueChanged.connect(self.initial)
        self.pushButton_game.clicked.connect(self.game_call)
        self.pushButton_try.clicked.connect(self.graph_try)
        self.pushButton_return.clicked.connect(self.game_return)
        self.ButtonDiffu.clicked.connect(self.diffusion)
        self.ButtonBackDiffu.clicked.connect(self.backdiffu)
        self.mplwindow_2.hide()
        self.mplwindow_3.hide()
        self.textDiffu.hide()
        self.ButtonBackDiffu.hide()
        self.ButtonDiffu.hide()

        showAction = QtGui.QAction('&Authors', self)
        showAction.triggered.connect(self.showAuthors)
        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('&About')
        fileMenu.addAction(showAction)

        self.timer1 = QtCore.QTimer(self)
        self.timer2 = QtCore.QTimer(self)

        self.ani_co = 0

        file = open('position_02.txt', 'r')
        lines = file.readlines()
        file.close()
        x = []
        x1 = []
        x2 = []
        for line in lines:
            p = line.split()
            x.append(float(p[0]))
            x1.append(float(p[1]))
            x2.append(float(p[5]))
        xv = np.array(x)
        xv1 = np.array(x1)
        xv2 = np.array(x2)

        self.rmmpl()
        self.fig = plt.figure()
        axf = self.fig.add_subplot(111)
        axf.set_xlabel('$x/a_{ho}$', fontsize=17)
        axf.set_ylabel('density $|\psi|^2 a_{ho}$', fontsize=14)
        axf.fill_between(xv,
                         0,
                         xv1,
                         label='$R-Space$',
                         facecolor='blue',
                         alpha=0.5)
        axf.fill_between(xv,
                         0,
                         xv2,
                         label='$K-Space$',
                         facecolor='yellow',
                         alpha=0.5)
        axf.set_xlim([-20, 20])
        axf.set_title('Wave Packet')
        axf.legend()
        self.addmpl(self.fig)

    def initial(self):
        file = open('initial2.txt', 'r')
        lines = file.readlines()
        file.close()
        for i in range(0, 16):
            globals()['x%s' % i] = []
        for line in lines:
            p = line.split()
            for i in range(0, 16):
                globals()['x%s' % i].append(float(p[i - 1]))
        for i in range(0, 16):
            globals()['xv%s' % i] = np.array(globals()['x%s' % i])
        value = self.horizontalSlider.value()

        for i in range(3, 16):
            if value == i - 9:
                if self.fig == None:
                    self.rmmpl()
                    self.fig = Figure()
                    self.addmpl(self.fig)

                self.fig.clear()
                ax1f2 = self.fig.add_subplot(111)
                ax1f2.set_xlabel('$x/a_{ho}$', fontsize=17)
                ax1f2.set_ylabel('density $|\psi|^2 a_{ho}$', fontsize=14)
                ax1f2.fill_between(xv1,
                                   0,
                                   globals()['xv%s' % i],
                                   label='$R-Space$',
                                   facecolor='blue',
                                   alpha=0.5)
                ax1f2.fill_between(xv1,
                                   0,
                                   xv2,
                                   label='$K-Space$',
                                   facecolor='yellow',
                                   alpha=0.5)
                ax1f2.set_ylim(0., 0.6)
                ax1f2.set_xlim(-20., 20.)
                ax1f2.set_title('initial state')
                ax1f2.legend()
                self.canvas.draw()

    def start1(self):
        self.demo = 0
        self.start2()

    def start2(self):
        self.timer1.stop()
        self.timer2.stop()
        dialog = QtGui.QDialog()
        progressBar = Ui_porcessProgress()
        progressBar.setupUi(dialog)
        dialog.show()
        self.file.write('...Nuevo proceso...\n')
        diff = 0
        self.sim = 0
        self.true1 = 0
        prevdir = os.getcwd()
        self.spinBox_value = self.spinBox.value()
        self.slider_simulation.setValue(0)
        try:
            if self.demo == 0:
                os.chdir(os.path.expanduser('./Wavepackdisper'))
            else:
                os.chdir(
                    os.path.expanduser('./Wavepackdisper/Demo%s' %
                                       (self.demo)))
                if (not os.path.exists('./WfWd-end')):
                    zip_ref = zipfile.ZipFile('./Demo%s.zip' % (self.demo),
                                              'r')
                    zip_ref.extractall('.')
                    zip_ref.close()
                else:
                    pass
            file = open('input.txt', 'w')
            if (self.radioButton.isChecked() == True):
                self.true1 = 1
            if (self.radioButton_2.isChecked() == True):
                self.true1 = 0
            file.write('%s\t%s\t%s\t%s' %
                       (self.horizontalSlider.value(), self.true1,
                        self.spinBox.value(), self.spinBox_2.value()))
            file.close()

            time1 = int(self.spinBox_value * (10 * np.pi * 2.0))
            start_sub = time.time()

            if self.demo == 0:
                exclude = set(['Demo1', 'Demo2'])
                for root, dirs, files in os.walk(os.getcwd(), topdown=True):
                    dirs[:] = [d for d in dirs if d not in exclude]
                    for file in files:
                        if file.startswith("WfWd"):
                            os.remove((os.path.join(root, file)))
                subprocess.Popen('python gpe_fft_ts_WP_v1.py', shell=True)
                progressBar.porcessProgressBar.setMaximum(time1 + 1)
                diff = 0
                while diff < time1 + 2:
                    diff = 0
                    for root, dirs, files in os.walk(os.getcwd()):
                        dirs[:] = [d for d in dirs if d not in exclude]
                        for file in files:
                            if file.startswith("WfWd"):
                                diff += 1

                        if (diff < 10):
                            progressBar.label.setText(
                                'Initiation of the progress...')
                        if (diff < time1 - 10) and (diff > 10):
                            progressBar.label.setText(
                                u'Solving Schrödinger equation...')
                        if (diff < time1 + 1) and (diff > time1 - 10):
                            progressBar.label.setText('Writing results ...')

                        progressBar.porcessProgressBar.setValue(diff)
                        QApplication.processEvents()

            if (self.true1 == 1):
                self.file.write(
                    'Posición inicial del paquete de ondas=%s\nPotential armónico: YES\nExcitación del estado=%s\nNúmero de oscilaciones=%s\n\n'
                    % (self.horizontalSlider.value(), self.spinBox_2.value(),
                       self.spinBox.value()))
            if (self.true1 == 0):
                self.file.write(
                    'Posición inicial del paquete de ondas=%s\nPotential armónico: NO\nExcitación del estado=%s\nNúmero de oscilaciones=%s\n\n'
                    % (self.horizontalSlider.value(), self.spinBox_2.value(),
                       self.spinBox.value()))
            end_sub = time.time()
            print(os.getcwd())
            print("READY")
            self.label_5.show()
            self.ButtonOn.show()
            self.ButtonBack.show()
            self.ButtonPause.show()
            self.label_5.show()
            self.slider_simulation.show()
            self.slider_simulation.setMinimum(0)
            self.slider_simulation.setMaximum(self.spinBox_value * int(
                (10 * np.pi * 2.0)))
            self.slider_simulation.setSingleStep(1)
            if (self.radioButton.isChecked() == True):
                self.interact_game.show()
                self.ButtonDiffu.hide()
                self.radioButton_oscil.setChecked(True)
            if (self.radioButton_2.isChecked() == True):
                self.interact_game.hide()
                self.ButtonDiffu.show()
#            time.sleep(2)

            file = open('output_sp.txt', 'r')
            self.file.write('%s\n\n' % file.read())
            self.file.write('Durada de la computación=%s\n\n' %
                            (end_sub - start_sub))

            file = open('energies.txt', 'r')
            lines = file.readlines()
            file.close()

            file2 = open('mean_value.txt', 'r')
            lines2 = file2.readlines()
            file2.close()

            file4 = open('WfWd-%08d.txt' % (0), 'r')
            lines4 = file4.readlines()
            file4.close()

        finally:
            os.chdir(prevdir)

        x1 = []
        x2 = []
        x3 = []
        for line in lines4:
            p = line.split()
            x1.append(float(p[0]))
            x2.append(float(p[1]))
            x3.append(float(p[5]))
        xv1 = np.array(x1)
        xv2 = np.array(x2)
        xv3 = np.array(x3)

        self.rmmpl()
        self.fig = plt.figure()
        axf = self.fig.add_subplot(111)
        axf.set_xlabel('$x/a_{ho}$', fontsize=17)
        axf.set_ylabel('density $|\psi|^2 a_{ho}$', fontsize=14)
        axf.fill_between(xv1,
                         0,
                         xv2,
                         label='$R-Space$',
                         facecolor='blue',
                         alpha=0.5)
        axf.fill_between(xv1,
                         0,
                         xv3,
                         label='$K-Space$',
                         facecolor='yellow',
                         alpha=0.5)
        axf.set_xlim([
            -self.horizontalSlider.value() - 8,
            self.horizontalSlider.value() + 8
        ])
        if (self.true1 == 0):
            axf.set_ylim(0, 0.6)
        axf.set_title('state at %s' % (0))
        axf.legend()
        self.addmpl(self.fig)

        x1 = []
        y1 = []
        z1 = []
        j1 = []
        for line in lines:
            p = line.split()
            x1.append(float(p[0]))
            y1.append(float(p[1]))
            z1.append(float(p[3]))
            j1.append(float(p[4]))
        xv = np.array(x1)
        yv = np.array(y1)
        zv = np.array(z1)
        jv = np.array(j1)

        fig = Figure()
        ax1f1 = fig.add_subplot(111)
        ax1f1.set_xlabel('$T/t_{ho}$', fontsize=17)
        ax1f1.set_ylabel('$E/hw$', fontsize=17)
        ax1f1.plot(xv, yv, 'r.-', label='$E_{tot}$')
        ax1f1.plot(xv, zv, 'y.-', label='Kinetic Energy')
        ax1f1.plot(xv, jv, 'b.-', label='Potential Energy')
        ax1f1.legend()
        ax1f1.set_title('Energies')

        x1 = []
        y1 = []
        z1 = []
        i1 = []
        j1 = []
        for line in lines2:
            p = line.split()
            x1.append(float(p[0]))
            y1.append(float(p[1]))
            z1.append(float(p[2]))
            i1.append(float(p[3]))
            j1.append(float(p[4]))
        xv = np.array(x1)
        yv = np.array(y1)
        zv = np.array(z1)
        iv = np.array(i1)
        jv = np.array(j1)

        self.fig2 = Figure()
        ax1f2 = self.fig2.add_subplot(111)
        ax1f2.set_xlabel('$T/t_{ho}$', fontsize=17)
        ax1f2.set_ylabel('$x/a_{ho}$', fontsize=17)
        ax1f2.plot(xv, yv, 'b.', label='$R-Space:<x> $')
        ax1f2.plot(xv, iv, 'y--', label='$k-Space:<k>$')
        ax1f2.plot(xv, zv, 'b--', label='$R-Space:dispersion$')
        ax1f2.plot(xv, jv, 'y.', label='$k-Space:dispersion$')

        ax1f2.legend(loc='best')

        self.delfig()
        self.delfig()
        self.delfig()
        self.addfig('ENERGY', fig)
        self.addfig('MEAN VALUE X', self.fig2)
        self.slider_simulation.setValue(0)

    def simulation(self):
        time1 = int(self.spinBox_value * (10 * np.pi * 2.0))
        value = self.slider_simulation.value()
        self.sim = value
        prevdir = os.getcwd()
        try:
            if self.demo == 0:
                os.chdir(os.path.expanduser('./Wavepackdisper'))
            else:
                os.chdir(
                    os.path.expanduser('./Wavepackdisper/Demo%s' %
                                       (self.demo)))
            for i in range(0, time1 + 1):
                file = open('WfWd-%08d.txt' % (i), 'r')
                globals()['lines%s' % i] = file.readlines()
                file.close()
                #
                #
                if value == i:
                    x1 = []
                    x2 = []
                    x3 = []
                    for line in (globals()['lines%s' % i]):
                        p = line.split()
                        x1.append(float(p[0]))
                        x2.append(float(p[1]))
                        x3.append(float(p[5]))
                    xv1 = np.array(x1)
                    xv2 = np.array(x2)
                    xv3 = np.array(x3)

                    if self.fig == None:
                        self.rmmpl()
                        self.fig = plt.figure()
                        self.addmpl(self.fig)
                    self.fig.clear()
                    axf = self.fig.add_subplot(111)
                    axf.set_xlabel('$x/a_{ho}$', fontsize=17)
                    axf.set_ylabel('density $|\psi|^2 a_{ho}$', fontsize=14)
                    axf.fill_between(xv1,
                                     0,
                                     xv2,
                                     label='$R-Space$',
                                     facecolor='blue',
                                     alpha=0.5)
                    axf.fill_between(xv1,
                                     0,
                                     xv3,
                                     label='$K-Space$',
                                     facecolor='yellow',
                                     alpha=0.5)
                    axf.set_xlim([
                        -self.horizontalSlider.value() - 8,
                        self.horizontalSlider.value() + 8
                    ])
                    if (self.true1 == 0):
                        axf.set_ylim(0, 0.6)
                    axf.set_title('state at %s' % (i))
                    axf.legend()
                    self.canvas.draw()
        finally:
            os.chdir(prevdir)

    def game_call(self):
        self.timer1.stop()
        self.timer2.stop()
        if (self.radioButton.isChecked() == True):

            if (self.radioButton_oscil.isChecked() == True):
                self.rmmpl()
                self.textBrowser.show()
                self.rmmpl2()
                self.mplwindow.hide()
                self.textDiffu.hide()
                self.mplwindow_3.hide()
                self.widget_osci.show()
                self.start.hide()
                self.ButtonDemo_1.hide()
                self.ButtonDemo_2.hide()
                self.interact.setEnabled(False)
                self.mplfigs.hide()
                self.spin_amplitude.setValue(3.)
                self.spin_frequency.setValue(0.5)
                prevdir = os.getcwd()
                try:
                    if self.demo == 0:
                        os.chdir(os.path.expanduser('./Wavepackdisper'))
                    else:
                        os.chdir(
                            os.path.expanduser('./Wavepackdisper/Demo%s' %
                                               (self.demo)))
                    file2 = open('mean_value.txt', 'r')
                    lines2 = file2.readlines()
                    file2.close()
                    x1 = []
                    y1 = []
                    for line in lines2:
                        p = line.split()
                        x1.append(float(p[0]))
                        y1.append(float(p[1]))
                    xv = np.array(x1)
                    yv = np.array(y1)
                finally:
                    os.chdir(prevdir)
                fig3 = Figure()
                ax1f3 = fig3.add_subplot(111)
                ax1f3.set_xlabel('$T/t_{ho}$', fontsize=17)
                ax1f3.set_ylabel('$x/a_{ho}$', fontsize=17)
                ax1f3.plot(xv, yv, 'r.-', label='$R-Space$')
                ax1f3.set_title('Mean value x')
                ax1f3.legend()
                self.addmpl2(fig3)

        self.game.show()
        self.mplwindow_2.show()

    def graph_try(self):
        if (self.radioButton.isChecked() == True):
            if (self.radioButton_oscil.isChecked() == True):
                self.amplitude = self.spin_amplitude.value()
                self.frequency = self.spin_frequency.value()
                self.ani_co += 1
                if self.ani_co > 1:
                    self.ani.event_source.stop()
                time1 = int(self.spinBox_value * (10 * np.pi * 2.0))
                self.rmmpl2()
                prevdir = os.getcwd()
                try:
                    if self.demo == 0:
                        os.chdir(os.path.expanduser('./Wavepackdisper'))
                    else:
                        os.chdir(
                            os.path.expanduser('./Wavepackdisper/Demo%s' %
                                               (self.demo)))
                    file2 = open('mean_value.txt', 'r')
                    lines2 = file2.readlines()
                    file2.close()
                    x1 = []
                    y1 = []
                    for line in lines2:
                        p = line.split()
                        x1.append(float(p[0]))
                        y1.append(float(p[1]))
                    xv = np.array(x1)
                    yv = np.array(y1)
                finally:
                    os.chdir(prevdir)

#                fig3=Figure()
#                self.addmpl2(fig3)
#                ax1f3=fig3.add_subplot(111)
#                ax1f3.set_xlabel('$T/t_{ho}$',fontsize=17)
#                ax1f3.set_ylabel('$x/a_{ho}$',fontsize=17)
#
#                x=np.arange(0,time1+1)/10.
#                y=self.spin_amplitude.value()*np.cos(self.spin_frequency.value()*x)
#
#                ax1f3.plot(xv,yv, 'r.-',label='$R-Space$')
#                ax1f3.plot(x,y)
#                ax1f3.set_title('Mean value x')
#                ax1f3.legend()
#                self.canvas.draw()

                tf_sim = time1 / 10.

                def simData():
                    L = self.amplitude
                    t_max = time1 / 10.
                    dt = 0.05
                    w = self.frequency
                    y = 0.0
                    t = 0.0
                    while t <= t_max:
                        if on_spr and not back_spr and not pause_spr:
                            y = L * np.sin(w * t + np.pi / 2.)
                            t = t + dt
                        if t < 0:
                            y = L * np.sin(w * t + np.pi / 2.)
                            t = t + dt
                        if back_spr and not on_spr and not pause_spr:
                            y = L * np.sin(w * t + np.pi / 2.)
                            t = t - dt
                        yield y, t

                def onClick(event):
                    global pause_spr, on_spr, back_spr
                    back_spr ^= True
                    on_spr ^= True

                def init():
                    line.set_data([], [])
                    line2.set_data([], [])
                    line3.set_data([], [])
                    line4.set_data([], [])
                    for j in range(0, 11):
                        globals()['line_%s' % (j)].set_data([], [])
                    time_text.set_text('')
                    return line, time_text

                def simPoints(simData):
                    y, t = simData[0], simData[1]
                    if self.amplitude >= 0:
                        ori = -self.amplitude - 1.
                    if self.amplitude <= 0:
                        ori = self.amplitude - 1.
                    time_text.set_text(time_template % (t))
                    thisy = [ori, y]

                    line.set_data(0, thisy)
                    for j in range(3, 9):
                        globals()['line_%s' % (j)].set_data(
                            [((-1)**(j - 1)) * 0.5, ((-1)**j) * 0.5],
                            [(j - 1.) * ((y - ori) / 10.) + ori,
                             ((y - ori) / 10.) * j + ori])
                    line_0.set_data([0., 0.5],
                                    [((((y - ori) / 10.) * 1. + ori) +
                                      (((y - ori) / 10.) * 2. + ori)) / 2.,
                                     ((y - ori) / 10.) * 2. + ori])
                    line_1.set_data([0.5, 0.],
                                    [((y - ori) / 10.) * 8. + ori,
                                     ((((y - ori) / 10.) * 8. + ori) +
                                      (((y - ori) / 10.) * 9. + ori)) / 2.])
                    line2.set_data([1., -1.], [ori, ori])
                    line3.set_data([t, y])
                    tf = np.arange(0.0, t, 0.05)
                    line4.set_data(
                        [tf, self.amplitude * np.cos(tf * self.frequency)])
                    time_text.set_text(time_template % (t))
                    return line, line2, line3, line_0, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8, line_9, line4


#                gs=0

                ax = 0
                ax2 = 0
                #                import matplotlib.gridspec as gridspec
                fig3 = plt.figure()
                #                rcParams.update({'figure.autolayout': True})
                #                gs = gridspec.GridSpec(10, 10)
                #                ax = fig3.add_subplot(gs[:,03], xlim=(-0.5, 0.5), ylim=(-self.spin_amplitude.value()-2., +self.spin_amplitude.value()+2.))
                #                ax2 = fig3.add_subplot(gs[:,4:])
                ax = plt.subplot2grid(
                    (10, 10), (0, 0),
                    rowspan=10,
                    colspan=2,
                    autoscale_on=False,
                    xlim=(-0.5, 0.5),
                    ylim=(-self.amplitude - 2., +self.amplitude + 2.))
                ax2 = plt.subplot2grid(
                    (10, 10), (0, 3),
                    rowspan=10,
                    colspan=7,
                    autoscale_on=False,
                    xlim=(0., tf_sim),
                    ylim=(-self.amplitude - 2., +self.amplitude + 2.))
                #                ax = fig3.add_subplot(121)
                #                ax2 = fig3.add_subplot(122)
                ax.set_title('Spring')
                ax.set_xticks(np.arange(-1., 2., 1.))
                ax.set_xlim(-1, 1)
                ax.set_ylabel('x(m)', fontsize=13)
                if self.amplitude >= 0:
                    ax.set_ylim(-self.amplitude - 2., self.amplitude + 2.)
                if self.amplitude <= 0:
                    ax.set_ylim(self.amplitude - 2., -self.amplitude + 2.)

                ax2.set_xlabel('t(s)', fontsize=13)
                ax2.set_ylabel('x(m)', fontsize=13)
                ax2.plot(xv, yv, 'r.-')
                ax2.set_title('Mean value x')
                self.addmpl2(fig3)

                line, = ax.plot([], [], 'o-', lw=2)
                line2, = ax.plot([], [], 'g-', lw=2)
                line3, = ax2.plot([], [], 'o-', lw=2)
                line4, = ax2.plot([], [], 'b-', lw=2)
                for j in range(0, 11):
                    globals()['line_%s' % (j)], = ax.plot([], [], 'b-', lw=2)
                time_template = 'time = %.1fs'
                time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)

                fig3.canvas.mpl_connect('button_press_event', onClick)
                self.ani = animation.FuncAnimation(fig3,
                                                   simPoints,
                                                   simData,
                                                   interval=25,
                                                   blit=True,
                                                   init_func=init,
                                                   repeat=False)

                #ani.save('muelle.mp4', fps=15)
                self.canvas.draw()

    def game_return(self):
        self.rmmpl2()
        self.rmmpl2()
        self.mplwindow_2.hide()
        self.textDiffu.hide()
        self.mplwindow_3.hide()
        self.game.hide()
        self.fig = plt.figure()
        self.addmpl(self.fig)
        self.mplwindow.show()
        self.start.show()
        self.ButtonDemo_1.show()
        self.ButtonDemo_2.show()
        self.interact.setEnabled(True)
        self.mplfigs.show()
        self.slider_simulation.setValue(self.sim + 1)
        self.slider_simulation.setValue(self.sim - 1)

    def plot(self):
        self.sim += 1
        self.slider_simulation.setValue(self.sim)

        if (self.sim == self.spinBox_value * int((10 * np.pi * (2.)))):
            self.timer1.stop()

    def plot2(self):
        self.sim -= 1
        self.slider_simulation.setValue(self.sim)

        if (self.sim == 0):
            self.timer2.stop()

    def on(self):
        self.timer1.stop()
        self.timer2.stop()
        if self.timer2 == None:
            self.timer1 = QtCore.QTimer(self)
            self.timer1.timeout.connect(self.plot)
            self.timer1.start(75)
        else:
            self.timer1 = QtCore.QTimer(self)
            self.timer1.timeout.connect(self.plot)
            self.timer2.stop()
            self.timer1.start(75)

    def pause(self):
        self.timer1.stop()
        self.timer2.stop()

    def back1(self):
        self.timer1.stop()
        self.timer2.stop()
        if self.timer1 == None:
            self.timer2 = QtCore.QTimer(self)
            self.timer2.timeout.connect(self.plot2)
            self.timer2.start(75)
        else:
            self.timer2 = QtCore.QTimer(self)
            self.timer2.timeout.connect(self.plot2)
            self.timer1.stop()
            self.timer2.start(75)

    def diffusion(self):
        self.timer1.stop()
        self.timer2.stop()
        self.mplwindow.hide()
        self.mplwindow_2.hide()
        self.mplwindow_3.show()
        self.game.hide()
        self.ButtonDiffu.hide()
        self.textDiffu.show()
        self.start.hide()
        self.ButtonDemo_1.hide()
        self.ButtonDemo_2.hide()
        self.interact.setEnabled(False)
        self.mplfigs.hide()
        self.ButtonBackDiffu.show()

        self.movie = QMovie("dispersion.gif", QByteArray(), self)
        self.movie_scr = QLabel()
        self.mplvl_3.addWidget(self.movie_scr)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie.setSpeed(100)
        self.movie_scr.setMovie(self.movie)
        self.movie.start()

    def backdiffu(self):
        self.movie.stop()
        self.mplvl_3.removeWidget(self.movie_scr)
        self.mplwindow_3.hide()
        self.ButtonBackDiffu.hide()
        self.textDiffu.hide()
        self.ButtonDiffu.show()
        self.mplwindow.show()
        self.start.show()
        self.ButtonDemo_1.show()
        self.ButtonDemo_2.show()
        self.interact.setEnabled(True)
        self.mplfigs.show()
        self.slider_simulation.setValue(self.sim + 1)
        self.slider_simulation.setValue(self.sim - 1)

    def demo1(self):
        self.radioButton_2.setChecked(True)
        self.horizontalSlider.setValue(0)
        self.spinBox_2.setValue(0)
        self.spinBox.setValue(2)
        self.demo = 1
        self.start2()

    def demo2(self):
        self.radioButton.setChecked(True)
        self.horizontalSlider.setValue(3)
        self.spinBox_2.setValue(0)
        self.spinBox.setValue(2)
        self.demo = 2
        self.start2()

    def changefig(self, item):
        text = item.text()
        self.rmmpl()
        self.addmpl(self.fig_dict[str(text)])
        self.fig = None
        self.timer1.stop()
        self.timer2.stop()

    def addfig(self, name, fig):
        self.fig_dict[name] = fig
        self.mplfigs.addItem(name)

    def delfig(self):
        listItems = self.mplfigs.selectedItems()
        if not listItems: return
        for item in listItems:
            self.mplfigs.takeItem(self.mplfigs.row(item))

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.toolbar = NavigationToolbar(self.canvas, self, coordinates=True)
        self.mplvl.addWidget(self.toolbar)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()

    def rmmpl(self):
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()

    def addmpl2(self, fig):
        self.canvas = FigureCanvas(fig)
        self.toolbar = NavigationToolbar(self.canvas, self, coordinates=True)
        self.mplvl_2.addWidget(self.toolbar)
        self.mplvl_2.addWidget(self.canvas)
        self.canvas.draw()

    def rmmpl2(self):
        self.mplvl_2.removeWidget(self.toolbar)
        self.toolbar.close()
        self.mplvl_2.removeWidget(self.canvas)
        self.canvas.close()

    def close(self):
        self.timer1.stop()
        self.timer2.stop()
        self.hide()
        self.file.close()
        self.parent().show()

    def showAuthors(self):
        QtGui.QMessageBox.question(self, 'Authors',
                                   "ULTRACOLDUB\n\nUniversitat de Barcelona")

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

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
            self.file.close()
        else:
            event.ignore()
예제 #39
0
class Main(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        self.StartButton.clicked.connect(self.loadFile)
        self.NextButton.clicked.connect(self.nextRecord)
        self.DeleteButton.clicked.connect(self.deleteRecord)
        self.GenerateButton.clicked.connect(self.generateRecord)
        self.QuitButton.clicked.connect(self.quit)
        self.horiz = GetSystemMetrics(0)
        self.verti = GetSystemMetrics(1)
        self.subjectNo = 0;
        self.dayNo = 0;
        self.blockNo = 0;
        self.center_no = 0;
        self.tr_no = 0;
        self.old_x = 0
        self.old_y = 0
        self.old_t = 0
        self.start=0;
        self.vel_thresh = 500/4.25; #in pix/s
        self.deleteThisRecord = 0;
        self.generateAll = 0;
        self.fileReadDone = 0;
        self.AllStrings = [];  #raw file.
        self.AllGoodStrings = []; #filtered file
        self.RandomStrings = [];
        self.SequenceStrings = [];
        self.RandomGoodStrings = [];
        self.SequenceGoodStrings = [];
        topics="tr_no Reaction_Time Movement_Time Response_Time Max_Vel Max_Acc End_Point_Dev Real_Distance Actual_Distance_Traversed Distance_Percent\n";
        self.AllStrings.append(topics);
        self.AllGoodStrings.append(topics);
        self.RandomStrings.append(topics);
        self.SequenceStrings.append(topics);
        self.RandomGoodStrings.append(topics);
        self.SequenceGoodStrings.append(topics);
        self.cnx = mysql.connector.connect(user='******',password='******',database='mohand');
        self.cursor = self.cnx.cursor();
        self.smoothLevel = 20;

    def addplot(self, fig):
        #plt.savefig('common_labels_text.png', dpi=300)
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, self, coordinates=True)
        self.addToolBar(self.toolbar)

    def rmplot(self):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def loadFile(self):
        print "load file"
        self.X=[];
        self.Y=[];
        self.D=[];
        self.V=[];
        self.A=[];
        self.T=[];
        self.generateAll = 0;
        self.fileReadDone = 0;
        subNo = self.SubjectText.text()
        d = self.DayCombo.currentIndex()
        self.subjectNo = int(subNo);
        self.dayNo = d+1;
        self.blockNo = self.BlockCombo.currentIndex()+1 
        block = str(self.blockNo);
        day = dayTitle(self.dayNo)
        if self.dayNo<=5:
            s = "C:\\Users\\neuro\\Documents\\Arna\\Tracker\\Data\\Subject "+subNo+"\\Subject" + subNo + day + "Block" + block + "_Data.txt";
        else:
            s = "C:\\Users\\neuro\\Documents\\Arna\\Tracker\\Data\\Subject "+subNo+"\\Subject" + subNo + day + "Data.txt";
        center_file_s = "C:\\Users\\neuro\\Documents\\Visual Studio 2015\\Projects\\MohandTracker\\Mohands(4,6,5).txt";
        print s
        self.file = open(s, 'r');
        self.center_file = open(center_file_s, 'r');
        self.center_array = [[int(x) for x in line.split()] for line in self.center_file];
        #print self.center_array
        self.center_array_size = len(self.center_array[0]);
        self.tr_no = 0;
        self.start = 0;
        self.smoothLevel = int(self.text_smooth.text());
        self.getFig();
        
        
        
    def getFig(self):
        plt.close("all");
        s1 = str(self.tr_no);
        s2 = str(self.tr_no+1);
        self.FromLabel.setText(s1);
        self.ToLabel.setText(s2);
        reac_time = 0;
        react_time_set = 0;
        response_time = 0;
        
        if self.dayNo<=5 :
            self.center_no = (5 * (self.dayNo-1) + self.blockNo-1) % self.center_array_size; 
        else :
            self.center_no = (25 + self.dayNo % 2) % self.center_array_size;
        if int(self.tr_no)<len(self.center_array):
            present_target = (self.center_array[int(self.tr_no)][int(self.center_no)])%9;
        #print self.tr_no, present_target;
        iter_val = 0;
        for line in self.file:
            iter_val = iter_val+1;
            tr_no, x , y , t = [float(i) for i in line.split()];
            if iter_val%self.smoothLevel>0:
                continue;
            if self.start==0:
                self.old_x = x;
                self.old_y = y;
                self.old_t = t;
                self.X=[x];
                self.Y=[y];
                self.T=[t];
                self.start=1;
                continue
                
            if tr_no == self.tr_no:
                
                self.X.append(x);
                self.Y.append(y);
                self.T.append(t);
                dist = math.sqrt((x-self.old_x)*(x-self.old_x) + (y-self.old_y)*(y-self.old_y));
                if len(self.D)!=0:
                    self.D.append(dist+self.D[len(self.D)-1]);
                else:
                    self.D.append(dist);
                    print t,self.old_t
                vel = dist/(t-self.old_t);
                if len(self.V)!=0 :
                    self.old_v = self.V[len(self.V)-1];
                    acc = (vel-self.old_v)/(t-self.old_t);
                    self.A.append(acc);
                self.V.append(vel);
                self.old_x = x
                self.old_y = y
                self.old_t = t
                if (vel>self.vel_thresh) and (react_time_set==0):
                    reac_time = t;
                    react_time_set = 1;
                if (vel>self.vel_thresh):
                    response_time = t;
                movement_time = response_time - reac_time;

            else:
                print "len",len(self.T), len(self.D)
                if self.T[len(self.T)-1]<=0.007 or self.T[len(self.T)-1]>=12:           #filtering records based on the protocol.
                    self.deleteThisRecord = 1;                              
                if self.generateAll==0:
                    fig = plt.figure()
                    a1 = fig.add_subplot(221)
                    a1.plot(self.X,self.Y);
                    a1.set_ylabel('Y');
                    a1.set_xlabel('X');
                    a1.plot(self.X[0],self.Y[0],'g+', mew=1.5, ms=15)
                    a1.plot(center_x(present_target),center_y(present_target),'ro', markerfacecolor='None', mew= 1, ms = 15)
                    a1.plot(center_x(present_target),center_y(present_target),'r.')
                    a1.axis([0,self.horiz/4.25,0,self.verti/4.25])
                
                    a2 = fig.add_subplot(222)
                    a2.plot(self.T[1:len(self.T)],self.D);
                    a2.set_ylabel('Distance from starting point');
                    a2.set_xlabel('Time');
                
                    a3 = fig.add_subplot(223)
                    a3.plot(self.T[1:len(self.T)],self.V);
                    a3.set_ylabel('Speed of cursor');
                    a3.set_xlabel('Time');
                
                    a4 = fig.add_subplot(224)
                    a4.plot(self.T[2:len(self.T)],self.A);
                    a4.set_ylabel('Acceleration of cursor');
                    a4.set_xlabel('Time');
                
                    self.rmplot()
                    self.addplot(fig)

                max_vel = max(self.V);
                max_acc = max(self.A);
                end_point_dev = math.sqrt((self.X[len(self.X)-1]-center_x(present_target))*(self.X[len(self.X)-1]-center_x(present_target)) + (self.Y[len(self.Y)-1]-center_y(present_target))*(self.Y[len(self.Y)-1]-center_y(present_target)));
                real_dist = math.sqrt((self.X[0]-self.X[len(self.X)-1])*(self.X[0]-self.X[len(self.X)-1]) + (self.Y[0]-self.Y[len(self.Y)-1])*(self.Y[0]-self.Y[len(self.Y)-1]));
                actual_dist_traversed = self.D[len(self.D)-1];
                dist_per = (actual_dist_traversed - real_dist)*100.0/real_dist ;
                
                old_tr_no = self.tr_no;
                self.old_x = x
                self.old_y = y
                self.old_t = t
                self.tr_no = tr_no
                self.D=[];
                self.V=[];
                self.A=[];
                self.T=[t];
                self.X=[x];
                self.Y=[y];
                break

        else:
            self.fileReadDone = 1;

        if self.generateAll ==0:
            s3 = "Reaction Time = " + str(reac_time);
            s4 = "Movement Time = " + str(movement_time);
            s5 = "Response Time = " + str(response_time);
            s6 = "Max Velocity = " + str(max_vel);
            s7 = "Max Acc = " + str(max_acc);
            s8 = "End Point Deviation = " + str(end_point_dev);
            s9 = "Real Distance = " + str(real_dist);
            s10 = "Actual Distance Traversed = " + str(actual_dist_traversed);
            s11 = "Distance Percent Deviation = " + str(dist_per);
            self.Reaction_Time.setText(s3)
            self.Movement_Time.setText(s4)
            self.Response_Time.setText(s5)
            self.Max_Velocity.setText(s6)
            self.Max_Acc.setText(s7)
            self.Deviation.setText(s8)
            self.Real_Dist.setText(s9)
            self.Actual_Dist.setText(s10)
            self.Dist_Per.setText(s11)
        if self.fileReadDone==0:
            final_str = str(int(old_tr_no))+" "+str(reac_time)+" "+str(movement_time)+" "+str(response_time)+" "+str(max_vel)+" "+str(max_acc)+" "+str(end_point_dev)+" "+str(real_dist)+" "+str(actual_dist_traversed)+" "+str(dist_per)+"\n";
            self.AllStrings.append(final_str);
            if (old_tr_no%13)>=7 or (old_tr_no%13)==0:
                self.SequenceStrings.append(final_str);
            else:
                self.RandomStrings.append(final_str);

    def nextRecord(self):
        self.writeToFilteredFile();
        print "fetching next record"
        #self.tr_no = self.tr_no+1;
        self.getFig();

    def writeToFilteredFile(self):
        already_written_tr_no = -1;
        if len(self.AllGoodStrings)>1:
            filtered_data_list = [j for j in self.AllGoodStrings[len(self.AllGoodStrings)-1].split()]
            already_written_tr_no = int(filtered_data_list[0]);
        old_tr_no = int(self.AllStrings[len(self.AllStrings)-1].split()[0])
        if (self.deleteThisRecord==0) and (int(old_tr_no)!=already_written_tr_no):
            self.AllGoodStrings.append(self.AllStrings[len(self.AllStrings)-1]);
            if (old_tr_no%13)>=7 or (old_tr_no%13)==0:
                self.SequenceGoodStrings.append(self.AllStrings[len(self.AllStrings)-1]);
            else:
                self.RandomGoodStrings.append(self.AllStrings[len(self.AllStrings)-1]);
        self.deleteThisRecord = 0;

    def typeOfEntry(self,x):
        return{
            1: '_fil_rep',
            2: '_fil_ran',
            3: '_raw_rep',
            4: '_raw_ran'
            }.get(x)

    def dayDatabase(self,x):
        return{
            1: 'day1',
            2: 'day2',
            3: 'day3',
            4: 'day4'
            }.get(x,'day5')

    def deleteFromDatabase(self):
        if self.dayNo==6:
            day_str = "baseline";
        elif self.dayNo<=5:
            day_str = self.dayDatabase(self.dayNo);
        else:
            day_str = "performance";
        s = "delete from "+day_str+" where subNo="+str(self.subjectNo);
        self.cursor.execute(s);

    def createDatabaseRecord(self):
        if self.dayNo==6:
            day_str = "baseline";
        elif self.dayNo<=5:
            day_str = self.dayDatabase(self.dayNo);
        else:
            day_str = "performance";
        init_record = np.zeros(60);
        s="insert into "+day_str+"(subNo) values("+str(self.subjectNo)+")";
        self.cursor.execute(s);
            
    def writeToDatabase(self,entryType,meanReactionTime,meanMovementTime,meanResponseTime,meanMaxVel,meanMaxAcc,meanEPD,meanRealDist,meanTraversedDist,meanPerDev,ovMaxReactionTime,ovMaxMovementTime,ovMaxEPD,ovMaxSpeed,ovMaxAcc,indexVal):
        entry_str = self.typeOfEntry(entryType);
        print entryType,entry_str
        if self.dayNo>5:
            if self.dayNo==6:
                day_str = "baseline";
            else :
                day_str = "performance";
            s ="update "+day_str+" set meanReactionTime"+entry_str+"="+str(meanReactionTime)+",meanMovementTime"+entry_str+"="+str(meanMovementTime)+",meanResponseTime"+entry_str+"="+str(meanResponseTime)+",meanMaxVel"+entry_str+"="+str(meanMaxVel)+",meanMaxAcc"+entry_str+"="+str(meanMaxAcc)+",meanEPD"+entry_str+"="+str(meanEPD)+",meanRealDist"+entry_str+"="+str(meanRealDist)+",meanTraversedDist"+entry_str+"="+str(meanTraversedDist)+",meanPerDev"+entry_str+"="+str(meanPerDev)+",ovMaxReactionTime"+entry_str+"="+str(ovMaxReactionTime)+",ovMaxMovementTime"+entry_str+"="+str(ovMaxMovementTime)+",ovMaxEPD"+entry_str+"="+str(ovMaxEPD)+",ovMaxSpeed"+entry_str+"="+str(ovMaxSpeed)+",ovMaxAcc"+entry_str+"="+str(ovMaxAcc)+",indexVal"+entry_str+"="+str(indexVal)+" where subNo="+str(self.subjectNo);
            self.cursor.execute(s);
        else:
            day_str = self.dayDatabase(self.dayNo);
            if self.blockNo==1:             #query will return empty set or an old junk value. Generating block 1 data clears any old data already stored.
                s ="update "+day_str+" set meanReactionTime"+entry_str+"="+str(meanReactionTime)+",meanMovementTime"+entry_str+"="+str(meanMovementTime)+",meanResponseTime"+entry_str+"="+str(meanResponseTime)+",meanMaxVel"+entry_str+"="+str(meanMaxVel)+",meanMaxAcc"+entry_str+"="+str(meanMaxAcc)+",meanEPD"+entry_str+"="+str(meanEPD)+",meanRealDist"+entry_str+"="+str(meanRealDist)+",meanTraversedDist"+entry_str+"="+str(meanTraversedDist)+",meanPerDev"+entry_str+"="+str(meanPerDev)+",ovMaxReactionTime"+entry_str+"="+str(ovMaxReactionTime)+",ovMaxMovementTime"+entry_str+"="+str(ovMaxMovementTime)+",ovMaxEPD"+entry_str+"="+str(ovMaxEPD)+",ovMaxSpeed"+entry_str+"="+str(ovMaxSpeed)+",ovMaxAcc"+entry_str+"="+str(ovMaxAcc)+",indexVal"+entry_str+"="+str(indexVal)+" where subNo="+str(self.subjectNo);
                self.cursor.execute(s);
            else:
                s = "select meanReactionTime"+entry_str+",meanMovementTime"+entry_str+",meanResponseTime"+entry_str+",meanMaxVel"+entry_str+",meanMaxAcc"+entry_str+",meanEPD"+entry_str+",meanRealDist"+entry_str+",meanTraversedDist"+entry_str+",meanPerDev"+entry_str+",ovMaxReactionTime"+entry_str+",ovMaxMovementTime"+entry_str+",ovMaxEPD"+entry_str+",ovMaxSpeed"+entry_str+",ovMaxAcc"+entry_str+",indexVal"+entry_str+" from "+day_str+" where subNo="+str(self.subjectNo);
                self.cursor.execute(s);
                for (old_meanReactionTime,old_meanMovementTime,old_meanResponseTime,old_meanMaxVel,old_meanMaxAcc,old_meanEPD,old_meanRealDist,old_meanTraversedDist,old_meanPerDev,old_ovMaxReactionTime,old_ovMaxMovementTime,old_ovMaxEPD,old_ovMaxSpeed,old_ovMaxAcc,old_indexVal) in self.cursor:
                    meanReactionTime = (float(old_meanReactionTime)*(self.blockNo-1)+meanReactionTime)/self.blockNo;
                    meanMovementTime = (float(old_meanMovementTime)*(self.blockNo-1)+meanMovementTime)/self.blockNo;
                    meanResponseTime = (float(old_meanResponseTime)*(self.blockNo-1)+meanResponseTime)/self.blockNo;
                    meanMaxVel = (float(old_meanMaxVel)*(self.blockNo-1)+meanMaxVel)/self.blockNo;
                    meanMaxAcc = (float(old_meanMaxAcc)*(self.blockNo-1)+meanMaxAcc)/self.blockNo;
                    meanEPD = (float(old_meanEPD)*(self.blockNo-1)+meanEPD)/self.blockNo;
                    meanRealDist = (float(old_meanRealDist)*(self.blockNo-1)+meanRealDist)/self.blockNo;
                    meanTraversedDist = (float(old_meanTraversedDist)*(self.blockNo-1)+meanTraversedDist)/self.blockNo;
                    meanPerDev = (float(old_meanPerDev)*(self.blockNo-1)+meanPerDev)/self.blockNo;
                    ovMaxReactionTime = (float(old_ovMaxReactionTime)*(self.blockNo-1)+ovMaxReactionTime)/self.blockNo;
                    ovMaxMovementTime = (float(old_ovMaxMovementTime)*(self.blockNo-1)+ovMaxMovementTime)/self.blockNo;
                    ovMaxEPD = (float(old_ovMaxEPD*(self.blockNo-1))+ovMaxEPD)/self.blockNo;
                    ovMaxSpeed = (float(old_ovMaxSpeed*(self.blockNo-1))+ovMaxSpeed)/self.blockNo;
                    ovMaxAcc = (float(old_ovMaxAcc*(self.blockNo-1))+ovMaxAcc)/self.blockNo;
                    indexVal = (float(old_indexVal*(self.blockNo-1))+indexVal)/self.blockNo;
            s ="update "+day_str+" set meanReactionTime"+entry_str+"="+str(meanReactionTime)+",meanMovementTime"+entry_str+"="+str(meanMovementTime)+",meanResponseTime"+entry_str+"="+str(meanResponseTime)+",meanMaxVel"+entry_str+"="+str(meanMaxVel)+",meanMaxAcc"+entry_str+"="+str(meanMaxAcc)+",meanEPD"+entry_str+"="+str(meanEPD)+",meanRealDist"+entry_str+"="+str(meanRealDist)+",meanTraversedDist"+entry_str+"="+str(meanTraversedDist)+",meanPerDev"+entry_str+"="+str(meanPerDev)+",ovMaxReactionTime"+entry_str+"="+str(ovMaxReactionTime)+",ovMaxMovementTime"+entry_str+"="+str(ovMaxMovementTime)+",ovMaxEPD"+entry_str+"="+str(ovMaxEPD)+",ovMaxSpeed"+entry_str+"="+str(ovMaxSpeed)+",ovMaxAcc"+entry_str+"="+str(ovMaxAcc)+",indexVal"+entry_str+"="+str(indexVal)+" where subNo="+str(self.subjectNo);
            self.cursor.execute(s);
            
    def ensure_dir(self,f):
        d = os.path.dirname(f)
        print os.path.exists(d)
        if not os.path.exists(d):
            os.makedirs(d)

    def generateRecord(self):
        self.writeToFilteredFile();
        self.generateAll = 1;
        while self.fileReadDone==0:
            self.getFig();
            self.writeToFilteredFile();
        folder_s = "Data\\Subject "+str(self.subjectNo)+"\\Summary\\";
        self.ensure_dir(folder_s);
        raw_s = "C:\\Users\\neuro\\Documents\\Arna\\Tracker\\Data\\Subject "+str(self.subjectNo)+"\\Summary\\Subject" + str(self.subjectNo) + dayTitle(self.dayNo) + "Block" + str(self.blockNo) + "_RawFileAll.txt";
        filter_s = "C:\\Users\\neuro\\Documents\\Arna\\Tracker\\Data\\Subject "+str(self.subjectNo)+"\\Summary\\Subject" + str(self.subjectNo) + dayTitle(self.dayNo) + "Block" + str(self.blockNo) + "_FilteredFileAll.txt";
        rand_raw_s = "C:\\Users\\neuro\\Documents\\Arna\\Tracker\\Data\\Subject "+str(self.subjectNo)+"\\Summary\\Subject" + str(self.subjectNo) + dayTitle(self.dayNo) + "Block" + str(self.blockNo) + "_RawFileRandom.txt";
        seq_raw_s = "C:\\Users\\neuro\\Documents\\Arna\\Tracker\\Data\\Subject "+str(self.subjectNo)+"\\Summary\\Subject" + str(self.subjectNo) + dayTitle(self.dayNo) + "Block" + str(self.blockNo) + "_RawFileRepeated.txt";
        rand_filter_s = "C:\\Users\\neuro\\Documents\\Arna\\Tracker\\Data\\Subject "+str(self.subjectNo)+"\\Summary\\Subject" + str(self.subjectNo) + dayTitle(self.dayNo) + "Block" + str(self.blockNo) + "_FilteredFileRandom.txt";
        seq_filter_s = "C:\\Users\\neuro\\Documents\\Arna\\Tracker\\Data\\Subject "+str(self.subjectNo)+"\\Summary\\Subject" + str(self.subjectNo) + dayTitle(self.dayNo) + "Block" + str(self.blockNo) + "_FilteredFileRepeated.txt";
        rawFile = open(raw_s,'w');
        rand_rawFile = open(rand_raw_s, 'w');
        seq_rawFile = open(seq_raw_s, 'w');
        filterFile = open(filter_s,'w');
        rand_filterFile = open(rand_filter_s,'w');
        seq_filterFile = open(seq_filter_s,'w');
        s_meanReact = "\nMean Reaction Time = ";
        s_meanMove = "\nMean Movement Time = ";
        s_meanResponse = "\nMean Response Time = ";
        s_meanMaxVel = "\nMean maximum Speed = ";
        s_meanMaxAcc = "\nMean maximum acceleration = ";
        s_meanEPD = "\nMean End Point Deviation = ";
        s_meanRealDist = "\nMean Real Distance = ";
        s_meanDistTraversed = "\nMean Traversed Distance = ";
        s_meanDistPer = "\nMean Percentage deviation = ";
        s_maxReact = "%\nOverall Maximum Reaction Time = ";
        s_maxMove = "\nOverall Maximum Movement Time = ";
        s_maxEPD = "\nOverall Maximum End Point Deviation = ";
        s_maxMaxVel = "\nOverall Maximum Speed = ";
        s_maxMaxAcc= "\nOverall Maximum Acceleration = ";
        s_score = "\nIndex Value = ";

        A = np.zeros(9);
        max_react,max_move,max_epd,max_vel,max_acc = 0,0,0,0,0;
        for i in range(len(self.AllStrings)):
            rawFile.write(self.AllStrings[i])
            if i==0:
                continue;
            temp_data = [float(j) for j in self.AllStrings[i].split()];
            tdnp = np.array(temp_data[1:]);
            if tdnp[0]>max_react:
                max_react = tdnp[0];
            if tdnp[1]>max_move:
                max_move = tdnp[1];
            if tdnp[5]>max_epd:
                max_epd = tdnp[5];
            if tdnp[3]>max_vel:
                max_vel = tdnp[3];
            if tdnp[4]>max_acc:
                max_acc = tdnp[4];
            A = A+tdnp;
        A = A/(len(self.AllStrings));
        ##index_val = (A[3]/2330)+(A[4]/119289)+((2.389-A[1])/2.389)+((1.165-A[0])/1.165)+((100-A[8])/100)+((49.7-A[5])/49.7);
        ##index_val = index_val*10/6;
        index_val = ((100-A[8])/100)+((49.7-A[5])/49.7)+((1.165-A[0])/1.165);
        index_val = index_val*10/3;
        res_str=s_meanReact+str(A[0])+s_meanMove+str(A[1])+s_meanResponse+str(A[2])+s_meanMaxVel+str(A[3])+s_meanMaxAcc+str(A[4])+s_meanEPD+str(A[5])+s_meanRealDist+str(A[6])+s_meanDistTraversed+str(A[7])+s_meanDistPer+str(A[8])+s_maxReact+str(max_react)+s_maxMove+str(max_move)+s_maxEPD+str(max_epd)+s_maxMaxVel+str(max_vel)+s_maxMaxAcc+str(max_acc)+s_score+str(index_val)+"\n";
        rawFile.write(res_str);

        A = np.zeros(9);
        max_react,max_move,max_epd,max_vel,max_acc = 0,0,0,0,0;
        for i in range(len(self.AllGoodStrings)):
            filterFile.write(self.AllGoodStrings[i])
            if i==0:
                continue;
            temp_data = [float(j) for j in self.AllGoodStrings[i].split()];
            tdnp = np.array(temp_data[1:]);
            if tdnp[0]>max_react:
                max_react = tdnp[0];
            if tdnp[1]>max_move:
                max_move = tdnp[1];
            if tdnp[5]>max_epd:
                max_epd = tdnp[5];
            if tdnp[3]>max_vel:
                max_vel = tdnp[3];
            if tdnp[4]>max_acc:
                max_acc = tdnp[4];
            A = A+tdnp;
        A = A/(len(self.AllGoodStrings));
        index_val = ((100-A[8])/100)+((49.7-A[5])/49.7)+((1.165-A[0])/1.165);
        index_val = index_val*10/3;
        res_str=s_meanReact+str(A[0])+s_meanMove+str(A[1])+s_meanResponse+str(A[2])+s_meanMaxVel+str(A[3])+s_meanMaxAcc+str(A[4])+s_meanEPD+str(A[5])+s_meanRealDist+str(A[6])+s_meanDistTraversed+str(A[7])+s_meanDistPer+str(A[8])+s_maxReact+str(max_react)+s_maxMove+str(max_move)+s_maxEPD+str(max_epd)+s_maxMaxVel+str(max_vel)+s_maxMaxAcc+str(max_acc)+s_score+str(index_val)+"\n";
        filterFile.write(res_str);

        if self.blockNo==1:
            self.deleteFromDatabase();
            self.createDatabaseRecord();
        if self.dayNo>5:
            self.deleteFromDatabase();
            self.createDatabaseRecord();
        
        A = np.zeros(9);
        max_react,max_move,max_epd,max_vel,max_acc = 0,0,0,0,0;
        for i in range(len(self.RandomStrings)):
            rand_rawFile.write(self.RandomStrings[i])
            if i==0:
                continue;
            temp_data = [float(j) for j in self.RandomStrings[i].split()];
            tdnp = np.array(temp_data[1:]);
            if tdnp[0]>max_react:
                max_react = tdnp[0];
            if tdnp[1]>max_move:
                max_move = tdnp[1];
            if tdnp[5]>max_epd:
                max_epd = tdnp[5];
            if tdnp[3]>max_vel:
                max_vel = tdnp[3];
            if tdnp[4]>max_acc:
                max_acc = tdnp[4];
            A = A+tdnp;
        A = A/(len(self.RandomStrings));
        index_val = ((100-A[8])/100)+((49.7-A[5])/49.7)+((1.165-A[0])/1.165);
        index_val = index_val*10/3;
        res_str=s_meanReact+str(A[0])+s_meanMove+str(A[1])+s_meanResponse+str(A[2])+s_meanMaxVel+str(A[3])+s_meanMaxAcc+str(A[4])+s_meanEPD+str(A[5])+s_meanRealDist+str(A[6])+s_meanDistTraversed+str(A[7])+s_meanDistPer+str(A[8])+s_maxReact+str(max_react)+s_maxMove+str(max_move)+s_maxEPD+str(max_epd)+s_maxMaxVel+str(max_vel)+s_maxMaxAcc+str(max_acc)+s_score+str(index_val)+"\n";
        rand_rawFile.write(res_str);
        self.writeToDatabase(4,A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],max_react,max_move,max_epd,max_vel,max_acc,index_val);

        A = np.zeros(9);
        max_react,max_move,max_epd,max_vel,max_acc = 0,0,0,0,0;
        for i in range(len(self.SequenceStrings)):
            seq_rawFile.write(self.SequenceStrings[i])
            if i==0:
                continue;
            temp_data = [float(j) for j in self.SequenceStrings[i].split()];
            tdnp = np.array(temp_data[1:]);
            if tdnp[0]>max_react:
                max_react = tdnp[0];
            if tdnp[1]>max_move:
                max_move = tdnp[1];
            if tdnp[5]>max_epd:
                max_epd = tdnp[5];
            if tdnp[3]>max_vel:
                max_vel = tdnp[3];
            if tdnp[4]>max_acc:
                max_acc = tdnp[4];
            A = A+tdnp;
        A = A/(len(self.SequenceStrings));
        index_val = ((100-A[8])/100)+((49.7-A[5])/49.7)+((1.165-A[0])/1.165);
        index_val = index_val*10/3;
        res_str=s_meanReact+str(A[0])+s_meanMove+str(A[1])+s_meanResponse+str(A[2])+s_meanMaxVel+str(A[3])+s_meanMaxAcc+str(A[4])+s_meanEPD+str(A[5])+s_meanRealDist+str(A[6])+s_meanDistTraversed+str(A[7])+s_meanDistPer+str(A[8])+s_maxReact+str(max_react)+s_maxMove+str(max_move)+s_maxEPD+str(max_epd)+s_maxMaxVel+str(max_vel)+s_maxMaxAcc+str(max_acc)+s_score+str(index_val)+"\n";
        seq_rawFile.write(res_str);
        self.writeToDatabase(3,A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],max_react,max_move,max_epd,max_vel,max_acc,index_val);

        A = np.zeros(9);
        max_react,max_move,max_epd,max_vel,max_acc = 0,0,0,0,0;
        for i in range(len(self.RandomGoodStrings)):
            rand_filterFile.write(self.RandomGoodStrings[i])
            if i==0:
                continue;
            temp_data = [float(j) for j in self.RandomGoodStrings[i].split()];
            tdnp = np.array(temp_data[1:]);
            if tdnp[0]>max_react:
                max_react = tdnp[0];
            if tdnp[1]>max_move:
                max_move = tdnp[1];
            if tdnp[5]>max_epd:
                max_epd = tdnp[5];
            if tdnp[3]>max_vel:
                max_vel = tdnp[3];
            if tdnp[4]>max_acc:
                max_acc = tdnp[4];
            A = A+tdnp;
        A = A/(len(self.RandomGoodStrings));
        index_val = ((100-A[8])/100)+((49.7-A[5])/49.7)+((1.165-A[0])/1.165);
        index_val = index_val*10/3;
        res_str=s_meanReact+str(A[0])+s_meanMove+str(A[1])+s_meanResponse+str(A[2])+s_meanMaxVel+str(A[3])+s_meanMaxAcc+str(A[4])+s_meanEPD+str(A[5])+s_meanRealDist+str(A[6])+s_meanDistTraversed+str(A[7])+s_meanDistPer+str(A[8])+s_maxReact+str(max_react)+s_maxMove+str(max_move)+s_maxEPD+str(max_epd)+s_maxMaxVel+str(max_vel)+s_maxMaxAcc+str(max_acc)+s_score+str(index_val)+"\n";
        rand_filterFile.write(res_str);
        self.writeToDatabase(2,A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],max_react,max_move,max_epd,max_vel,max_acc,index_val);

        A = np.zeros(9);
        max_react,max_move,max_epd,max_vel,max_acc = 0,0,0,0,0;
        for i in range(len(self.SequenceGoodStrings)):
            seq_filterFile.write(self.SequenceGoodStrings[i])
            if i==0:
                continue;
            temp_data = [float(j) for j in self.SequenceGoodStrings[i].split()];
            tdnp = np.array(temp_data[1:]);
            if tdnp[0]>max_react:
                max_react = tdnp[0];
            if tdnp[1]>max_move:
                max_move = tdnp[1];
            if tdnp[5]>max_epd:
                max_epd = tdnp[5];
            if tdnp[3]>max_vel:
                max_vel = tdnp[3];
            if tdnp[4]>max_acc:
                max_acc = tdnp[4];
            A = A+tdnp;
        A = A/(len(self.SequenceGoodStrings));
        index_val = ((100-A[8])/100)+((49.7-A[5])/49.7)+((1.165-A[0])/1.165);
        index_val = index_val*10/3;
        res_str=s_meanReact+str(A[0])+s_meanMove+str(A[1])+s_meanResponse+str(A[2])+s_meanMaxVel+str(A[3])+s_meanMaxAcc+str(A[4])+s_meanEPD+str(A[5])+s_meanRealDist+str(A[6])+s_meanDistTraversed+str(A[7])+s_meanDistPer+str(A[8])+s_maxReact+str(max_react)+s_maxMove+str(max_move)+s_maxEPD+str(max_epd)+s_maxMaxVel+str(max_vel)+s_maxMaxAcc+str(max_acc)+s_score+str(index_val)+"\n";
        seq_filterFile.write(res_str);
        self.writeToDatabase(1,A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],max_react,max_move,max_epd,max_vel,max_acc,index_val);
        
        print "written analysis files"

    def deleteRecord(self):
        print "delete this record"
        self.deleteThisRecord = 1;

    def quit(self):
        self.cnx.commit();
        self.cnx.close();
        exit()
class Main(QMainWindow, Ui_MainWindow) :
    def __init__(self, ) :
        super(Main, self).__init__()
        self.setupUi(self)

        self.thisDir = os.path.dirname(os.path.abspath(__file__))
        self.btOpenImage.clicked.connect(self.openImage)

        fig = Figure()

        self.canvas = FigureCanvas(fig)
        self.canvasGraph.addWidget(self.canvas)
        self.canvas.draw()

        self.message.setText('Escolha uma imagem')
        self.status.setText('Sem imagem')
        self.Xax.setText('Esperando calibracao')
        self.Xay.setText('Esperando calibracao')

        self.calibrateX.clicked.connect(partial(self.action, 'calX'))

        self.XaxisX = []
        self.XaxisY = []

        return

    def openImage(self) :
        texto = 'Escolha uma imagem'
        path = QtGui.QFileDialog.getOpenFileNameAndFilter(self,
                                                          texto,
                                                          self.thisDir,
                                                          "Images (*.png *.jpg)")

        datafile = cbook.get_sample_data(str(path[0]))
        img = imread(datafile)

        self.updateCanvas(self.initializeCanvas(img))

        self.message.setText('Esperando a calibracao dos eixos')
        self.status.setText('Em espera')

        return

    def initializeCanvas(self, img) :

        fig = Figure()
        fig.clear()
        Graph = fig.add_subplot(111)
        Graph.imshow(img, zorder=0, extent=[0.0, 1.0, 0.0, 1.0])

        return fig

    def updateCanvas(self, fig) :
        self.canvasGraph.removeWidget(self.canvas)
        self.canvas.close()

        self.canvas = FigureCanvas(fig)
        self.canvasGraph.addWidget(self.canvas)
        self.canvas.draw()

        def onclick(event):
            x, y = event.xdata, event.ydata
            if x != None and y != None :
                if self.currentAction == 'calX' :
                    if len(self.XaxisX) == 0 :
                        self.XaxisX.append(x)
                        self.XaxisY.append(y)
                        self.Xax.setText(str(x))
                        self.Xay.setText(str(y))
                        self.message.setText('Clique e marque onde esta Xb')

            return

        self.canvas.mpl_connect('button_press_event', onclick)

        return

    def action(self, what) :
        self.currentAction = what
        if what == 'calX' :
            self.message.setText('Clique e marque onde esta Xa')
            self.status.setText('Calibrando Eixo X')

        return
예제 #41
0
class Main(QMainWindow,Ui_MainWindow):
    def __init__(self,):
        super(Main,self).__init__()
        self.setupUi(self)
        
        self.actionLoad.triggered.connect(self.loadCfg)
        self.ReadButton.clicked.connect(self.readInData)
        self.UpdateButton.clicked.connect(self.updatePlot)
        self.TimeSlider.valueChanged.connect(self.updatePlot)
        self.TimeSlider.sliderMoved.connect(self.updateSlider)
        self.figs = []
        self.axs = []
        self.updating = False

        self.addmpl(Figure())

    def updateSlider(self):
        self.TimeDisplay.setText(self.strlist[self.TimeSlider.value()])

    def updatePlot(self):
        if not self.updating:
            self.updating = True
            self.rmmpl()
            self.addmpl(self.figs[self.TimeSlider.value()])
            self.updating = False

    def loadCfg(self):
        dlg = QFileDialog()
        dlg.setFilter("Config Files (*.ini)")
        self.inifn = str(dlg.getOpenFileName(self,'Open File','.','Config Files (*.ini)'))
        if(self.inifn):
            text = open(self.inifn,'r')
            self.ConfigBox.setText(text.read())
            text.close()

        #self.settings = QSettings(self.inifn, QSettings.IniFormat) #MAYBE USE QSETTINGS FOR INI READ/WRITE?!?!?

    def addmpl(self,fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()

        self.toolbar = NavigationToolbar(self.canvas,
                                         self.mplwindow,
                                         coordinates=True)
        self.addToolBar(self.toolbar)

    def rmmpl(self,):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def readInData(self):
        f = open(self.inifn,'w')
        f.write(str(self.ConfigBox.toPlainText()))
        f.close()
        
        gpsloc = str(self.GPSBox.text())
        isrloc = str(self.ISRBox.text())
        asloc = str(self.AllSkyBox.text())
        self.PC = PlotClass(self.inifn,GPSloc=gpsloc,ASloc=asloc,ISRloc=isrloc)
        
        self.strlist = [insertinfo( str(j)+' $tmdy $thmsehms',posix=i[0],posixend=i[1]) for j, i in enumerate(self.PC.Regdict['Time'])]
        self.TimeSlider.setMaximum(len(self.strlist)-1)
        self.TimeSlider.setTracking(False)
        self.TimeSlider.setTickPosition(1)

        self.figs=[]
        self.axs=[]
        for t in range(len(self.strlist)):
            print(self.strlist[t])
            self.figs.append(Figure(figsize=(16,10)))
            self.axs.append(self.figs[t].add_subplot(111))
            m=self.PC.plotmap(self.figs[t],self.axs[t])
            (allhands,cbarsax)=self.PC.plotsingle(m,self.axs[t],self.figs[t],timenum=t,icase=0)
        self.rmmpl()
        self.addmpl(self.figs[0])
class Ui_MainWindow(object):
    def Search_String(self, tofind):
        with open(self.path, encoding="utf8") as f:
            data = json.load(f)

        counttofindname1 = 0
        counttofindname2 = 0
        Name1 = self.Name1.text()
        Name2 = self.Name2.text()
        req = [Name1, Name2]
        for item in data:
            if item['participants'] == req:
                for conv in item['conversation']:
                    if 'text' in conv.keys():
                        search = conv['text']
                        if search == None:
                            continue
                        numberfound = search.lower().count(tofind.lower())
                        if conv['sender'] == Name1:
                            counttofindname1 += numberfound
                        elif conv['sender'] == Name2:
                            counttofindname2 += numberfound

        return counttofindname1, counttofindname2

    def count_messages(self):
        with open(self.path, encoding="utf8") as f:
            data = json.load(f)

        countmsgsname1 = 0
        countmsgsname2 = 0
        Name1 = self.Name1.text()
        Name2 = self.Name2.text()
        req = [Name1, Name2]
        for item in data:
            if item['participants'] == req:
                for conv in item['conversation']:
                    if conv['sender'] == Name1:
                        countmsgsname1 += 1
                    elif conv['sender'] == Name2:
                        countmsgsname2 += 1

        return countmsgsname1, countmsgsname2

    def wordcount(self):
        with open(self.path, encoding="utf8") as f:
            data = json.load(f)

        totalwordcount = 0
        wordcount1 = 0
        wordcount2 = 0
        Name1 = self.Name1.text()
        Name2 = self.Name2.text()
        req = [Name1, Name2]

        for item in data:
            if item['participants'] == req:
                for conv in item['conversation']:
                    if 'text' in conv.keys():
                        search = conv['text']
                        if search == None:
                            continue
                        wc = len(search.split())
                        totalwordcount += wc
                        if conv['sender'] == Name1:
                            wordcount1 += wc
                        elif conv['sender'] == Name2:
                            wordcount2 += wc
        return wordcount1, wordcount2, totalwordcount

    def errorboi(self):
        self.msgbox = QMessageBox()
        self.msgbox.setText(
            "Error, The given username doesnt exist, Check it and try again")
        self.msgbox.exec()

    def addmpl2(self, fig):
        self.canvas2 = FigureCanvas(fig)
        self.mplvl2.addWidget(self.canvas2)
        self.canvas2.draw()

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()

    def rmmpl(self):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()

    def rmmpl2(self):
        self.mplvl.removeWidget(self.canvas2)
        self.canvas2.close()

    def check(self):
        with open(self.path, encoding="utf8") as f:
            data = json.load(f)
        Name1 = self.Name1.text()
        Name2 = self.Name2.text()
        req = [Name1, Name2]
        lists = []
        returnval = ""
        for item in data:
            if item['participants'] == req:
                lists.append("yes")

        if len(lists) != 0:
            returnval = True
        else:
            returnval = False

        return returnval

    def gen_search_clicked(self):

        Name1 = self.Name1.text()
        Name2 = self.Name2.text()

        if self.check():
            countmsgsname1, countmsgsname2 = self.count_messages()
            totalcountmsgs = countmsgsname1 + countmsgsname2
            self.disp_msgs_total.setText(str(totalcountmsgs))

            wordcount1, wordcount2, totalwordcount = self.wordcount()
            self.disp_words_total.setText(str(totalwordcount))

            emptystring = ""
            numberofletters1, numberofletters2 = self.Search_String(
                emptystring)
            self.disp_chars_total.setText(
                str(numberofletters1 + numberofletters2))

            self.disp_avgwords.setText(str(totalwordcount / totalcountmsgs))
            self.disp_avgchars.setText(
                str((numberofletters1 + numberofletters2) / totalcountmsgs))

            global timesrun
            if timesrun > 0:
                ui.rmmpl()
            # TOTAL MESSAGES

            fig1 = Figure()
            onef1 = fig1.add_subplot(131)
            fig1.set_facecolor('#172144')
            labels = [Name1, Name2]
            sizes1 = [countmsgsname1, countmsgsname2]
            onef1.set_title("Number of Messages", color='white', fontsize='13')
            patches, texts, autotexts = onef1.pie(sizes1,
                                                  labels=labels,
                                                  autopct='%1.1f%%',
                                                  colors=('#25a1ff',
                                                          '#0eebff'),
                                                  explode=(0.05, 0))

            for text in texts:
                text.set_color('#ff8419')
            for autotext in autotexts:
                autotext.set_color('black')

            # TOTAL WORDS

            twof1 = fig1.add_subplot(132)
            sizes2 = [wordcount1, wordcount2]
            twof1.set_title("Number of Words", color='white', fontsize='13')
            patches2, texts2, autotexts2 = twof1.pie(sizes2,
                                                     labels=labels,
                                                     autopct='%1.1f%%',
                                                     colors=('#25a1ff',
                                                             '#0eebff'),
                                                     explode=(0.05, 0))
            for text in texts2:
                text.set_color('#ff8419')
            for autotext in autotexts2:
                autotext.set_color('black')

            # TOTAL CHARACTERS

            threef1 = fig1.add_subplot(133)
            sizes3 = [numberofletters1, numberofletters2]
            threef1.set_title("Number of Characters",
                              color='white',
                              fontsize='13')
            patches3, texts3, autotexts3 = threef1.pie(sizes3,
                                                       labels=labels,
                                                       autopct='%1.1f%%',
                                                       colors=('#25a1ff',
                                                               '#0eebff'),
                                                       explode=(0.05, 0))
            for text in texts3:
                text.set_color('#ff8419')
            for autotext in autotexts3:
                autotext.set_color('black')

            timesrun += 1
            ui.addmpl(fig1)
        else:
            self.errorboi()

    def search_clicked(self):
        Name1 = self.Name1.text()
        Name2 = self.Name2.text()
        Inputword = self.Inputword.text()
        req = [Name1, Name2]
        numberofwords1, numberofwords2 = self.Search_String(Inputword)

        self.display1.setText(Name1 + " said " + Inputword + " " +
                              str(numberofwords1) + " times")
        self.display2.setText(Name2 + " said " + Inputword + " " +
                              str(numberofwords2) + " times")

        global timesrun2
        if timesrun2 > 0:
            ui.rmmpl2()

        fig2 = Figure()
        onef2 = fig2.add_subplot(111)
        labels = [Name1, Name2]
        height = [numberofwords1, numberofwords2]
        fig2.set_facecolor('#172144')
        onef2.set_facecolor('#172144')
        onef2.spines['bottom'].set_color('white')
        onef2.spines['left'].set_color('white')
        onef2.spines['top'].set_color('#172144')
        onef2.spines['right'].set_color('#172144')
        onef2.xaxis.label.set_color('white')
        onef2.yaxis.label.set_color('white')
        onef2.tick_params(axis='x', colors='white')
        onef2.tick_params(axis='y', colors='white')

        onef2.bar(labels,
                  height,
                  width=0.4,
                  align='center',
                  color=('#25a1ff', '#0eebff'))
        ui.addmpl2(fig2)

        timesrun2 += 1

    def Nextpage_button_clicked(self):
        self.stackedWidget.setCurrentWidget(self.homepage)

    def Browse_button_clicked(self):
        filter = "json Files (*.json)"
        fileName = QFileDialog.getOpenFileName(None, 'Search image Path',
                                               os.getcwd(), filter)
        self.path = fileName[0]
        self.file_path.setText(self.path)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1578, 964)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,
                                           QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setStyleSheet("background-color: rgb(16, 23, 39)")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setGeometry(QtCore.QRect(-10, -50, 1602, 1031))
        self.stackedWidget.setStyleSheet("")
        self.stackedWidget.setObjectName("stackedWidget")
        self.homepage = QtWidgets.QWidget()
        self.homepage.setObjectName("homepage")
        self.label_2 = QtWidgets.QLabel(self.homepage)
        self.label_2.setGeometry(QtCore.QRect(30, 370, 151, 31))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setStyleSheet("color: rgb(255, 255, 255);\n"
                                   "background-color: rgb(23, 33, 68);")
        self.label_2.setObjectName("label_2")
        self.disp_avgchars = QtWidgets.QLabel(self.homepage)
        self.disp_avgchars.setGeometry(QtCore.QRect(250, 640, 181, 31))
        font = QtGui.QFont()
        font.setFamily("Lucida Sans")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.disp_avgchars.setFont(font)
        self.disp_avgchars.setStyleSheet("color: rgb(248, 29, 244);\n"
                                         "background-color: rgb(23, 33, 68);")
        self.disp_avgchars.setText("")
        self.disp_avgchars.setObjectName("disp_avgchars")
        self.disp_words_total = QtWidgets.QLabel(self.homepage)
        self.disp_words_total.setGeometry(QtCore.QRect(130, 400, 181, 31))
        font = QtGui.QFont()
        font.setFamily("Lucida Sans")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.disp_words_total.setFont(font)
        self.disp_words_total.setStyleSheet(
            "color: rgb(248, 29, 244);\n"
            "background-color: rgb(23, 33, 68);")
        self.disp_words_total.setText("")
        self.disp_words_total.setObjectName("disp_words_total")
        self.label_12 = QtWidgets.QLabel(self.homepage)
        self.label_12.setGeometry(QtCore.QRect(30, 730, 161, 21))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.label_12.setFont(font)
        self.label_12.setStyleSheet("color: rgb(255, 255, 255);\n"
                                    "background-color: rgb(23, 33, 68);")
        self.label_12.setObjectName("label_12")
        self.layoutWidget = QtWidgets.QWidget(self.homepage)
        self.layoutWidget.setGeometry(QtCore.QRect(20, 850, 1081, 160))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.display1 = QtWidgets.QLabel(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                           QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.display1.sizePolicy().hasHeightForWidth())
        self.display1.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(32)
        font.setBold(True)
        font.setWeight(75)
        self.display1.setFont(font)
        self.display1.setStyleSheet("color: rgb(37, 161, 255);\n" "")
        self.display1.setLineWidth(1)
        self.display1.setText("")
        self.display1.setScaledContents(False)
        self.display1.setObjectName("display1")
        self.verticalLayout.addWidget(self.display1)
        self.display2 = QtWidgets.QLabel(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                           QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.display2.sizePolicy().hasHeightForWidth())
        self.display2.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(32)
        font.setBold(True)
        font.setWeight(75)
        self.display2.setFont(font)
        self.display2.setStyleSheet("color : rgb(14, 235, 255);\n" "")
        self.display2.setText("")
        self.display2.setObjectName("display2")
        self.verticalLayout.addWidget(self.display2)
        self.label_4 = QtWidgets.QLabel(self.homepage)
        self.label_4.setGeometry(QtCore.QRect(30, 530, 291, 31))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.label_4.setFont(font)
        self.label_4.setStyleSheet("color: rgb(255, 255, 255);\n"
                                   "background-color: rgb(23, 33, 68);")
        self.label_4.setObjectName("label_4")
        self.Search = QtWidgets.QPushButton(self.homepage)
        self.Search.setGeometry(QtCore.QRect(190, 780, 81, 31))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.Search.setFont(font)
        self.Search.setStyleSheet("background-color: rgb(248, 29, 244);\n"
                                  "color: rgb(255, 255, 255);")
        self.Search.setObjectName("Search")
        self.mplwindow2 = QtWidgets.QWidget(self.homepage)
        self.mplwindow2.setGeometry(QtCore.QRect(1120, 560, 381, 441))
        self.mplwindow2.setObjectName("mplwindow2")
        self.mplvl2 = QtWidgets.QVBoxLayout(self.mplwindow2)
        self.mplvl2.setContentsMargins(0, 0, 0, 0)
        self.mplvl2.setObjectName("mplvl2")
        self.label_6 = QtWidgets.QLabel(self.mplwindow2)
        self.label_6.setText("")
        self.label_6.setObjectName("label_6")
        self.mplvl2.addWidget(self.label_6)
        self.label_5 = QtWidgets.QLabel(self.homepage)
        self.label_5.setGeometry(QtCore.QRect(30, 610, 341, 31))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.label_5.setFont(font)
        self.label_5.setStyleSheet("color: rgb(255, 255, 255);\n"
                                   "background-color: rgb(23, 33, 68);")
        self.label_5.setObjectName("label_5")
        self.Inputword = QtWidgets.QLineEdit(self.homepage)
        self.Inputword.setGeometry(QtCore.QRect(190, 730, 261, 24))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Inputword.setFont(font)
        self.Inputword.setStyleSheet("color: rgb(255, 132, 25);\n"
                                     "background-color: rgb(23, 33, 68);\n"
                                     "border-radius: 20px\n"
                                     "")
        self.Inputword.setText("")
        self.Inputword.setFrame(False)
        self.Inputword.setObjectName("Inputword")
        self.label_11 = QtWidgets.QLabel(self.homepage)
        self.label_11.setGeometry(QtCore.QRect(20, 280, 441, 411))
        self.label_11.setStyleSheet("background-color: rgb(23, 33, 68);\n"
                                    "border-radius: 20px")
        self.label_11.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.label_11.setFrameShadow(QtWidgets.QFrame.Plain)
        self.label_11.setText("")
        self.label_11.setObjectName("label_11")
        self.label_7 = QtWidgets.QLabel(self.homepage)
        self.label_7.setGeometry(QtCore.QRect(30, 50, 1531, 71))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(50)
        font.setBold(True)
        font.setWeight(75)
        self.label_7.setFont(font)
        self.label_7.setStyleSheet("color: rgb(234, 187, 13);")
        self.label_7.setAlignment(QtCore.Qt.AlignCenter)
        self.label_7.setObjectName("label_7")
        self.label_3 = QtWidgets.QLabel(self.homepage)
        self.label_3.setGeometry(QtCore.QRect(30, 450, 171, 31))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.label_3.setFont(font)
        self.label_3.setStyleSheet("color: rgb(255, 255, 255);\n"
                                   "background-color : rgb(23, 33, 68)")
        self.label_3.setObjectName("label_3")
        self.disp_avgwords = QtWidgets.QLabel(self.homepage)
        self.disp_avgwords.setGeometry(QtCore.QRect(250, 560, 181, 31))
        font = QtGui.QFont()
        font.setFamily("Lucida Sans")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.disp_avgwords.setFont(font)
        self.disp_avgwords.setStyleSheet("color: rgb(248, 29, 244);\n"
                                         "background-color: rgb(23, 33, 68);")
        self.disp_avgwords.setText("")
        self.disp_avgwords.setObjectName("disp_avgwords")
        self.label_13 = QtWidgets.QLabel(self.homepage)
        self.label_13.setGeometry(QtCore.QRect(20, 720, 441, 111))
        self.label_13.setStyleSheet("background-color: rgb(23, 33, 68);\n"
                                    "border-radius: 20px")
        self.label_13.setText("")
        self.label_13.setObjectName("label_13")
        self.disp_msgs_total = QtWidgets.QLabel(self.homepage)
        self.disp_msgs_total.setGeometry(QtCore.QRect(130, 320, 181, 31))
        font = QtGui.QFont()
        font.setFamily("Lucida Sans")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.disp_msgs_total.setFont(font)
        self.disp_msgs_total.setStyleSheet(
            "color: rgb(248, 29, 244);\n"
            "background-color: rgb(23, 33, 68);")
        self.disp_msgs_total.setText("")
        self.disp_msgs_total.setObjectName("disp_msgs_total")
        self.layoutWidget1 = QtWidgets.QWidget(self.homepage)
        self.layoutWidget1.setGeometry(QtCore.QRect(20, 140, 671, 128))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget1)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.Name1 = QtWidgets.QLineEdit(self.layoutWidget1)
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(22)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.Name1.setFont(font)
        self.Name1.setAccessibleName("")
        self.Name1.setAutoFillBackground(False)
        self.Name1.setStyleSheet("background-color: rgb(16, 23, 39);\n"
                                 "color: rgb(255, 132, 25);")
        self.Name1.setInputMask("")
        self.Name1.setText("")
        self.Name1.setFrame(False)
        self.Name1.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft
                                | QtCore.Qt.AlignVCenter)
        self.Name1.setObjectName("Name1")
        self.verticalLayout_2.addWidget(self.Name1)
        self.Name2 = QtWidgets.QLineEdit(self.layoutWidget1)
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(22)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.Name2.setFont(font)
        self.Name2.setMouseTracking(True)
        self.Name2.setStyleSheet("background-color: rgb(16, 23, 39);\n"
                                 "color: rgb(255, 132, 25);")
        self.Name2.setFrame(False)
        self.Name2.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft
                                | QtCore.Qt.AlignVCenter)
        self.Name2.setObjectName("Name2")
        self.verticalLayout_2.addWidget(self.Name2)
        self.Name2.raise_()
        self.Name1.raise_()
        self.label = QtWidgets.QLabel(self.homepage)
        self.label.setGeometry(QtCore.QRect(30, 290, 151, 31))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setStyleSheet("color: rgb(255, 255, 255);\n"
                                 "background-color: rgb(23, 33, 68);")
        self.label.setObjectName("label")
        self.mplwindow = QtWidgets.QWidget(self.homepage)
        self.mplwindow.setGeometry(QtCore.QRect(490, 280, 1071, 241))
        self.mplwindow.setStyleSheet("border-radius: 20px")
        self.mplwindow.setObjectName("mplwindow")
        self.mplvl = QtWidgets.QVBoxLayout(self.mplwindow)
        self.mplvl.setContentsMargins(0, 0, 0, 0)
        self.mplvl.setObjectName("mplvl")
        self.disp_chars_total = QtWidgets.QLabel(self.homepage)
        self.disp_chars_total.setGeometry(QtCore.QRect(130, 480, 181, 31))
        font = QtGui.QFont()
        font.setFamily("Lucida Sans")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.disp_chars_total.setFont(font)
        self.disp_chars_total.setStyleSheet(
            "color: rgb(248, 29, 244);\n"
            "background-color: rgb(23, 33, 68);")
        self.disp_chars_total.setText("")
        self.disp_chars_total.setObjectName("disp_chars_total")
        self.gen_search = QtWidgets.QPushButton(self.homepage)
        self.gen_search.setGeometry(QtCore.QRect(710, 190, 81, 31))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.gen_search.setFont(font)
        self.gen_search.setStatusTip("")
        self.gen_search.setStyleSheet("background-color: rgb(248, 29, 244);\n"
                                      "color: rgb(255, 255, 255);")
        self.gen_search.setIconSize(QtCore.QSize(120, 60))
        self.gen_search.setFlat(False)
        self.gen_search.setObjectName("gen_search")
        self.label_13.raise_()
        self.label_11.raise_()
        self.label_2.raise_()
        self.disp_avgchars.raise_()
        self.disp_words_total.raise_()
        self.label_12.raise_()
        self.layoutWidget.raise_()
        self.label_4.raise_()
        self.Search.raise_()
        self.mplwindow2.raise_()
        self.label_5.raise_()
        self.Inputword.raise_()
        self.label_7.raise_()
        self.label_3.raise_()
        self.disp_avgwords.raise_()
        self.disp_msgs_total.raise_()
        self.layoutWidget.raise_()
        self.label.raise_()
        self.disp_chars_total.raise_()
        self.gen_search.raise_()
        self.mplwindow.raise_()
        self.stackedWidget.addWidget(self.homepage)
        self.pathpage = QtWidgets.QWidget()
        self.pathpage.setObjectName("pathpage")
        self.label_9 = QtWidgets.QLabel(self.pathpage)
        self.label_9.setGeometry(QtCore.QRect(360, 820, 901, 61))
        self.label_9.setStyleSheet("background-color: rgb(23, 33, 68);\n"
                                   "border-radius: 20px")
        self.label_9.setText("")
        self.label_9.setObjectName("label_9")
        self.Nextpage = QtWidgets.QPushButton(self.pathpage)
        self.Nextpage.setGeometry(QtCore.QRect(750, 930, 121, 41))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.Nextpage.setFont(font)
        self.Nextpage.setStyleSheet("background-color: rgb(248, 29, 244);\n"
                                    "color: rgb(255, 255, 255);")
        self.Nextpage.setObjectName("Nextpage")
        self.label_10 = QtWidgets.QLabel(self.pathpage)
        self.label_10.setGeometry(QtCore.QRect(240, 70, 1091, 111))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(40)
        font.setBold(True)
        font.setWeight(75)
        self.label_10.setFont(font)
        self.label_10.setStyleSheet("color: rgb(234, 187, 13);")
        self.label_10.setObjectName("label_10")
        self.label_14 = QtWidgets.QLabel(self.pathpage)
        self.label_14.setGeometry(QtCore.QRect(690, 230, 871, 561))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.label_14.setFont(font)
        self.label_14.setStyleSheet("color: rgb(255, 255, 255);\n"
                                    "background-color: rgb(23, 33, 68);\n"
                                    "border-radius: 20px")
        self.label_14.setTextFormat(QtCore.Qt.RichText)
        self.label_14.setObjectName("label_14")
        self.label_15 = QtWidgets.QLabel(self.pathpage)
        self.label_15.setGeometry(QtCore.QRect(30, 230, 631, 351))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(14)
        self.label_15.setFont(font)
        self.label_15.setStyleSheet("background-color: rgb(23, 33, 68);\n"
                                    "color: rgb(255, 255, 255);\n"
                                    "border-radius : 20px\n"
                                    "")
        self.label_15.setTextFormat(QtCore.Qt.RichText)
        self.label_15.setObjectName("label_15")
        self.label_17 = QtWidgets.QLabel(self.pathpage)
        self.label_17.setGeometry(QtCore.QRect(1230, 190, 251, 20))
        font = QtGui.QFont()
        font.setFamily("Lucida Console")
        font.setPointSize(9)
        self.label_17.setFont(font)
        self.label_17.setStyleSheet("color: rgb(255, 255, 255);")
        self.label_17.setObjectName("label_17")
        self.label_16 = QtWidgets.QLabel(self.pathpage)
        self.label_16.setGeometry(QtCore.QRect(1330, 150, 55, 16))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(10)
        self.label_16.setFont(font)
        self.label_16.setStyleSheet("color: rgb(234, 187, 13);")
        self.label_16.setObjectName("label_16")
        self.label_8 = QtWidgets.QLabel(self.pathpage)
        self.label_8.setGeometry(QtCore.QRect(370, 830, 111, 41))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.label_8.sizePolicy().hasHeightForWidth())
        self.label_8.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.label_8.setFont(font)
        self.label_8.setStyleSheet("color: rgb(255, 255, 255);\n"
                                   "background-color: rgb(23, 33, 68)")
        self.label_8.setObjectName("label_8")
        self.file_path = QtWidgets.QLineEdit(self.pathpage)
        self.file_path.setGeometry(QtCore.QRect(495, 830, 641, 31))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum,
                                           QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.file_path.sizePolicy().hasHeightForWidth())
        self.file_path.setSizePolicy(sizePolicy)
        self.file_path.setStyleSheet("color: rgb(255, 255, 255);\n"
                                     "background-color: rgb(23, 33, 68)")
        self.file_path.setFrame(False)
        self.file_path.setObjectName("file_path")
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.file_path.setFont(font)
        self.Browse_button = QtWidgets.QPushButton(self.pathpage)
        self.Browse_button.setGeometry(QtCore.QRect(1150, 830, 101, 41))
        font = QtGui.QFont()
        font.setFamily("Century Gothic")
        font.setPointSize(12)
        self.Browse_button.setFont(font)
        self.Browse_button.setStyleSheet(
            "background-color: rgb(248, 29, 244);\n"
            "color: rgb(255, 255, 255);")
        self.Browse_button.setObjectName("Browse_button")
        self.label_9.raise_()
        self.Nextpage.raise_()
        self.label_10.raise_()
        self.label_14.raise_()
        self.label_15.raise_()
        self.label_17.raise_()
        self.label_16.raise_()
        self.label_8.raise_()
        self.file_path.raise_()
        self.Browse_button.raise_()
        self.stackedWidget.addWidget(self.pathpage)
        MainWindow.setCentralWidget(self.centralwidget)
        #
        self.stackedWidget.setCurrentWidget(self.pathpage)
        self.Nextpage.clicked.connect(self.Nextpage_button_clicked)
        self.Browse_button.clicked.connect(self.Browse_button_clicked)
        self.Search.clicked.connect(self.search_clicked)
        self.gen_search.clicked.connect(self.gen_search_clicked)
        #
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(
            _translate("MainWindow", "InstaChat Analyser--beta"))
        self.label_2.setText(_translate("MainWindow", "Words Total"))
        self.label_12.setText(_translate("MainWindow", "Custom Search:"))
        self.label_4.setText(
            _translate("MainWindow", "Average words per message"))
        self.Search.setText(_translate("MainWindow", "Find!"))
        self.label_5.setText(
            _translate("MainWindow", "Average Characters per message"))
        self.Inputword.setPlaceholderText(
            _translate("MainWindow", "Enter Word here"))
        self.label_7.setText(_translate("MainWindow", "Your Insta Banter"))
        self.label_3.setText(_translate("MainWindow", "Characters Total"))
        self.Name1.setToolTip(_translate("MainWindow", "Enter name here:"))
        self.Name1.setPlaceholderText(
            _translate("MainWindow", "Enter your insta username here:"))
        self.Name2.setPlaceholderText(
            _translate("MainWindow", "Enter the other person\'s username:"******"MainWindow", "Messages Total"))
        self.gen_search.setToolTip(_translate("MainWindow",
                                              "click to proceed"))
        self.gen_search.setText(_translate("MainWindow", "GO!"))
        self.Nextpage.setText(_translate("MainWindow", "Next >>"))
        self.label_10.setText(
            _translate("MainWindow", "Instagram Conversation Analyser"))
        self.label_14.setText(
            _translate(
                "MainWindow",
                "<html><head/><body><p>Following are the steps to get "
                "started:</p><p>1) Download the Data:</p><p>On the instagam "
                "app, go to Settings &gt;&gt; Security &gt;&gt; Download "
                "Data.</p><p>Enter your email address and request download. "
                "You will receive</p><p>the link to download the data on "
                "</p><p>your email within 48 hours. (Generally it takes less "
                "than 20 mins)</p><p><br/>2) Once u get the link, download the "
                "<span style=\" color:#eabb0d;\">&quot;Part 1&quot;</span> "
                "data.</p><p><br/>3) Unzip the data :</p><p>Do this using any "
                "Unzipping tool like RAR, 7zip, WinZip etc.<br/></p><p>4) "
                "Voila! </p><p>You will get a file named <span style=\" "
                "color:#eabb0d;\">&quot;messages&quot;</span> with a .json "
                "extension. </p><p>Now select that file through the Browse "
                "Button and Click Next to proceed.</p></body></html>"))
        self.label_15.setText(
            _translate(
                "MainWindow",
                "<html><head/><body><p>Hi there!</p><p>This is the Instagram "
                "Conversation Analyser, </p><p>You can visualise your "
                "conversation with</p><p>someone in terms of ratio of "
                "messages, words</p><p>and more.<br/></p><p>You can search how "
                "many emotes you used and </p><p>visualise it with a graph as "
                "well!</p></body></html>"))
        self.label_17.setText(
            _translate("MainWindow", "Developed by: Soham Kulkarni"))
        self.label_16.setText(_translate("MainWindow", "beta"))
        self.label_8.setText(_translate("MainWindow", "Select File :"))
        self.Browse_button.setText(_translate("MainWindow", "Browse"))
예제 #43
0
class dApp(QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(dApp, self).__init__(parent)
        self.setupUi(self)
        self.init_defValues()
        self.update_table()
        self.update_data_disp()
        self.init_UI()
        self.update_data_disp()
        self.widgetStyle = ("QWidget {background-color: #ffffff}," +
                            "QWidget::item {background: transparent," +
                            "QWidget::item:selected {background: #ffffff}}")

    def init_defValues(self):
        self.canvas_1 = False
        self.canvas_2 = False
        self.canvas_3 = False
        self.canvas_4 = False
        self.canvas_5 = False
        self.canvas_6 = False
        self.canvas_7 = False
        self.dic_canvas = {}
        self.dispData = {}
        self.dicData = {}
        self.dicData['res'] = empty_class()  # class to store results
        dD = self.dispData
        dD['drift'] = False
        dD['f1'] = 4.8e9
        dD['f2'] = 4.1e9
        dD['g1'] = 1.299e9  # 1.3051e9
        dD['g2'] = 1.49e9  # 1486120350.0  # 1.4906e9
        dD['cgain11 start'] = 1.8166e7
        dD['cgain22 start'] = 1.0478e7
        dD['cgain11 stop'] = 1.7251e7
        dD['cgain22 stop'] = 1.4240e7
        dD['B'] = 5e5
        dD['select'] = 0
        dD['mapdim'] = [200, 200]
        dD['lags'] = 1000
        dD['Phase correction'] = True
        dD['Trigger correction'] = True
        dD['FFT-Filter'] = False
        dD['Power Averages'] = 1
        dD['Averages'] = 1
        dD['Low Pass'] = 0
        dD['dim1 pt'] = 201
        dD['dim1 start'] = 2.03
        dD['dim1 stop'] = 0.03
        dD['dim1 name'] = 'RF power'
        dD['dim2 pt'] = 11
        dD['dim2 start'] = 0
        dD['dim2 stop'] = 1
        dD['dim2 name'] = 'Magnet'
        dD['dim3 pt'] = 1
        dD['dim3 start'] = 0
        dD['dim3 stop'] = 1
        dD['dim3 name'] = 'Nothing'
        dD['Process Num'] = 1
        dD['Settings file'] = 'density_matrix.set'
        self.dicData['dim1 lin'] = np.linspace(dD['dim1 start'], dD['dim1 stop'], dD['dim1 pt'])
        self.dicData['dim2 lin'] = np.linspace(dD['dim2 start'], dD['dim2 stop'], dD['dim2 pt'])
        self.dicData['dim3 lin'] = np.linspace(dD['dim3 start'], dD['dim3 stop'], dD['dim3 pt'])

    def init_UI(self):
        ''' connect buttons to programs '''
        self.open_hdf5_on.triggered.connect(lambda: self.add_hdf5data('hdf5_on'))
        self.open_hdf5_off.triggered.connect(lambda: self.add_hdf5data('hdf5_off'))
        self.action_Quit.triggered.connect(qApp.quit)
        self.save_mtx_as.triggered.connect(self.browse_saveMtx)
        self.save_mtx.triggered.connect(self.saveMtx)
        self.makeHistogram.clicked.connect(self.make_Histogram)
        self.Process_all.clicked.connect(self.process_all)
        self.calc_hyb_digitizer_drift.clicked.connect(self.process_digitizer_drift)
        self.calc_hyb_button.clicked.connect(self.process_hybrid)
        self.calc_hyb_button2.clicked.connect(self.process_hybrid2)
        self.calc_hyb_button_all.clicked.connect(self.process_hybrid_all)
        # self.tableWidget.itemChanged.connect(self.read_table)
        self.Update_table.clicked.connect(self.read_table)
        self.actionLoadPrev.triggered.connect(self.load_settings)
        self.actionSavePrev.triggered.connect(self.save_settings)
        self.actionMtx_files.triggered.connect(self.open_mtx_spyview)
        self.action11.triggered.connect(lambda: self.add_hdf5data('on11'))
        self.action22.triggered.connect(lambda: self.add_hdf5data('on22'))
        self.action12.triggered.connect(lambda: self.add_hdf5data('on12'))
        self.action21.triggered.connect(lambda: self.add_hdf5data('on21'))
        self.action12_OFF.triggered.connect(lambda: self.add_hdf5data('off12'))
        self.action21_OFF.triggered.connect(lambda: self.add_hdf5data('off21'))
        self.checkBox_drift.toggled.connect(self.checkbox_drift)

    def checkbox_drift(self):
        self.dispData['drift'] = not self.dispData['drift']
        self.update_data_disp()

    def save_settings(self):
        savename = QFileDialog.getSaveFileName(self, "Save settingsfile as..")
        if savename:
            self.dispData['Settings file'] = str(savename)
            json.dump(self.dispData, codecs.open(savename, 'w+', encoding='utf-8'),
                      separators=(',', ':'), sort_keys=True, indent=4)
            # with open(savename, "w+") as myFile:
            #     cPickle.dump(self.dispData, myFile)
            logging.debug('settings and files saved')

    def load_settings(self):
        openname = QFileDialog.getOpenFileName(self, "Open settingsfile")
        if openname:
            obj_text = codecs.open(openname, 'r', encoding='utf-8').read()
            self.dispData = json.loads(obj_text)
            # with open(openname, "r") as myFile:
            #     self.dispData = cPickle.load(myFile)

            self.dispData['Settings file'] = str(openname)
            if 'hdf5_on' in self.dispData:
                functions.load_dataset(self.dispData, self.dicData, 'hdf5_on')
                functions.load_dataset(self.dispData, self.dicData, 'hdf5_off')
                logging.debug('Single Amp settings and files loaded')
            elif 'on11' in self.dispData:
                functions.load_dataset(self.dispData, self.dicData, 'on11')
                functions.load_dataset(self.dispData, self.dicData, 'on22')
                functions.load_dataset(self.dispData, self.dicData, 'on12')
                functions.load_dataset(self.dispData, self.dicData, 'on21')
                functions.load_dataset(self.dispData, self.dicData, 'off12')
                functions.load_dataset(self.dispData, self.dicData, 'off21')
                logging.debug('Double Amp settings and files loaded')
            self.update_table()
            self.update_data_disp()

    def add_hdf5data(self, frequency_configuration):
        dialog_txt = 'Pick a file for :' + str(frequency_configuration)
        openname = QFileDialog.getOpenFileName(self, dialog_txt)
        if openname:
            logging.debug(str(frequency_configuration) + ':' + str(openname))
            self.dispData[str(frequency_configuration)] = str(openname)
            functions.load_dataset(self.dispData, self.dicData, frequency_configuration)
            self.update_data_disp()

    def browse_saveMtx(self):
        savename = QFileDialog.getSaveFileName(self, "Select for 'base-name'+cII.mtx .. files")
        if savename:
            self.dispData['mtx '] = str(savename)
            logging.debug('Save .mtx:' + str(savename))
            self.saveMtx()

    def saveMtx(self):
        if self.dispData['mtx ']:
            savename = self.dispData['mtx ']
            res = self.dicData['res']  # this contains the calculation results
            logging.debug('Save .mtx:' + str(savename))
            on = self.dicData['hdf5_on']
            savemtx(savename + 'cII.mtx', np.expand_dims(res.IQmapM_avg[0], axis=0), on.headerII)
            savemtx(savename + 'cQQ.mtx', np.expand_dims(res.IQmapM_avg[1], axis=0), on.headerQQ)
            savemtx(savename + 'cIQ.mtx', np.expand_dims(res.IQmapM_avg[2], axis=0), on.headerIQ)
            savemtx(savename + 'cQI.mtx', np.expand_dims(res.IQmapM_avg[3], axis=0), on.headerQI)
            self.update_data_disp()

    def open_mtx_spyview(self):
        if self.dispData['mtx ']:
            d = threading.Thread(name='spyview', target=self._spyview)
            d.setDaemon(True)
            d.start()

    def _spyview(self):
        logging.debug('Spyview started')
        basen = self.dispData['mtx ']
        subprocess.call(['spyview', basen + 'cII.mtx', basen + 'cQQ.mtx',
                         basen + 'cIQ.mtx', basen + 'cQI.mtx'])
        logging.debug('Spyview closed')

    def read_table(self):
        table = self.tableWidget
        dD = self.dispData
        dD['f1'] = float(table.item(0, 0).text())
        dD['f2'] = float(table.item(1, 0).text())
        dD['g1'] = float(table.item(2, 0).text())
        dD['g2'] = float(table.item(3, 0).text())
        dD['B'] = float(table.item(4, 0).text())
        dD['select'] = int(eval(str(table.item(5, 0).text())))
        dD['lags'] = int(eval(str(table.item(6, 0).text())))
        dD['mapdim'][0] = int(table.item(7, 0).text())
        dD['mapdim'][1] = int(table.item(8, 0).text())
        dD['Phase correction'] = bool(eval(str(table.item(9, 0).text())))
        dD['Trigger correction'] = bool(eval(str(table.item(10, 0).text())))
        dD['FFT-Filter'] = bool(eval(str(table.item(11, 0).text())))
        dD['Power Averages'] = int(eval(str(table.item(12, 0).text())))
        dD['Low Pass'] = float(table.item(13, 0).text())
        dD['Averages'] = int(table.item(14, 0).text())
        dD['dim1 pt'] = int(table.item(15, 0).text())
        dD['dim1 start'] = float(table.item(16, 0).text())
        dD['dim1 stop'] = float(table.item(17, 0).text())
        dD['dim1 name'] = str(table.item(18, 0).text())
        dD['dim2 pt'] =  int(table.item(19, 0).text())
        dD['dim2 start'] = float(table.item(20, 0).text())
        dD['dim2 stop'] = float(table.item(21, 0).text())
        dD['dim2 name'] = str(table.item(22, 0).text())
        dD['dim3 pt'] = int(table.item(23, 0).text())
        dD['dim3 start'] = float(table.item(24, 0).text())
        dD['dim3 stop'] = float(table.item(25, 0).text())
        dD['dim3 name'] = str(table.item(26, 0).text())
        dD['Process Num'] = int(table.item(27, 0).text())
        dD['cgain11 start'] = float(table.item(28, 0).text())
        dD['cgain22 start'] = float(table.item(29, 0).text())
        dD['cgain11 stop'] = float(table.item(30, 0).text())
        dD['cgain22 stop'] = float(table.item(31, 0).text())
        aD = self.dicData
        aD['dim1 lin'] = np.linspace(dD['dim1 start'], dD['dim1 stop'], dD['dim1 pt'])
        aD['dim2 lin'] = np.linspace(dD['dim2 start'], dD['dim2 stop'], dD['dim2 pt'])
        aD['dim3 lin'] = np.linspace(dD['dim3 start'], dD['dim3 stop'], dD['dim3 pt'])
        table.resizeColumnsToContents()
        table.resizeRowsToContents()
        self.update_data_disp()

    def update_table(self):
        logging.debug('Update Table Widget')
        table = self.tableWidget
        d = self.dispData
        table.setItem(0, 0, QTableWidgetItem(str(d['f1'])))
        table.setItem(1, 0, QTableWidgetItem(str(d['f2'])))
        table.setItem(2, 0, QTableWidgetItem(str(d['g1'])))
        table.setItem(3, 0, QTableWidgetItem(str(d['g2'])))
        table.setItem(4, 0, QTableWidgetItem(str(d['B'])))
        table.setItem(5, 0, QTableWidgetItem(str(d['select'])))
        table.setItem(6, 0, QTableWidgetItem(str(d['lags'])))
        table.setItem(7, 0, QTableWidgetItem(str(d['mapdim'][0])))
        table.setItem(8, 0, QTableWidgetItem(str(d['mapdim'][1])))
        table.setItem(9, 0, QTableWidgetItem(str(d['Phase correction'])))
        table.setItem(10, 0, QTableWidgetItem(str(d['Trigger correction'])))
        table.setItem(11, 0, QTableWidgetItem(str(d['FFT-Filter'])))
        table.setItem(12, 0, QTableWidgetItem(str(d['Power Averages'])))
        table.setItem(13, 0, QTableWidgetItem(str(d['Low Pass'])))
        table.setItem(14, 0, QTableWidgetItem(str(d['Averages'])))
        table.setItem(15, 0, QTableWidgetItem(str(d['dim1 pt'])))
        table.setItem(16, 0, QTableWidgetItem(str(d['dim1 start'])))
        table.setItem(17, 0, QTableWidgetItem(str(d['dim1 stop'])))
        table.setItem(18, 0, QTableWidgetItem(str(d['dim1 name'])))
        table.setItem(19, 0, QTableWidgetItem(str(d['dim2 pt'])))
        table.setItem(20, 0, QTableWidgetItem(str(d['dim2 start'])))
        table.setItem(21, 0, QTableWidgetItem(str(d['dim2 stop'])))
        table.setItem(22, 0, QTableWidgetItem(str(d['dim2 name'])))
        table.setItem(23, 0, QTableWidgetItem(str(d['dim3 pt'])))
        table.setItem(24, 0, QTableWidgetItem(str(d['dim3 start'])))
        table.setItem(25, 0, QTableWidgetItem(str(d['dim3 stop'])))
        table.setItem(26, 0, QTableWidgetItem(str(d['dim3 name'])))
        table.setItem(27, 0, QTableWidgetItem(str(d['Process Num'])))
        table.setItem(28, 0, QTableWidgetItem(str(d['cgain11 start'])))
        table.setItem(29, 0, QTableWidgetItem(str(d['cgain22 start'])))
        table.setItem(30, 0, QTableWidgetItem(str(d['cgain11 stop'])))
        table.setItem(31, 0, QTableWidgetItem(str(d['cgain22 stop'])))
        table.resizeColumnsToContents()
        table.resizeRowsToContents()
        table.show()

    def update_data_disp(self):
        xr = (np.array([-self.dispData['lags'], self.dispData['lags']]) / self.dispData['B'])
        self.dicData['minmax lags (s)'] = xr
        self.dicData['xaxis'] = np.linspace(xr[0], xr[1], self.dispData['lags'] * 2 + 1)
        self.selectDat.clear()
        for key in self.dispData:
            newItem = key + ': ' + str(self.dispData[key])
            self.selectDat.addItem(newItem)

    def tab2array(self, table):
        nT = np.zeros([table.rowCount(), table.columnCount()])
        for i in range(table.rowCount()):
            for j in range(table.columnCount()):
                val = table.item(i, j)
                if val:
                    nT[i, j] = np.float(val.text())
        return nT

    def update_page_1(self, fig):
        self.clear_page_1()
        logging.debug('Update Histogram Figures')
        self.canvas_1 = FigureCanvas(fig)
        self.HistLayout.addWidget(self.canvas_1)
        self.canvas_1.draw()
        self.toolbar_1 = NavigationToolbar(self.canvas_1, self.tab_2, coordinates=True)
        self.HistLayout.addWidget(self.toolbar_1)

    def update_page_2(self, fig):
        self.clear_page_2()
        logging.debug('Update Correlation Figures')
        self.canvas_2 = FigureCanvas(fig)
        self.CorrLayout.addWidget(self.canvas_2)
        self.canvas_2.draw()
        self.toolbar_2 = NavigationToolbar(self.canvas_2, self.cc_page, coordinates=True)
        self.CorrLayout.addWidget(self.toolbar_2)

    def update_page_3(self, fig):
        self.clear_page_3()
        logging.debug('Update TMS Figures')
        self.canvas_3 = FigureCanvas(fig)
        self.TMSLayout.addWidget(self.canvas_3)
        self.canvas_3.draw()
        self.toolbar_3 = NavigationToolbar(self.canvas_3, self.TMS_page, coordinates=True)
        self.TMSLayout.addWidget(self.toolbar_3)

    def update_page_5(self, fig):
        self.clear_page_5()
        logging.debug('Update page 5: phn1')
        self.canvas_5 = FigureCanvas(fig)
        self.phn1.addWidget(self.canvas_5)
        self.canvas_5.draw()
        self.toolbar_5 = NavigationToolbar(self.canvas_5, self.phn1_page, coordinates=True)
        self.phn1.addWidget(self.toolbar_5)

    def update_page_6(self, fig):
        self.clear_page_6()
        logging.debug('Update page 6: phn2')
        self.canvas_6 = FigureCanvas(fig)
        self.phn2.addWidget(self.canvas_6)
        self.canvas_6.draw()
        self.toolbar_6 = NavigationToolbar(self.canvas_6, self.phn2_page, coordinates=True)
        self.phn2.addWidget(self.toolbar_6)

    def update_page_7(self, fig):
        self.clear_page_7()
        logging.debug('Clear page 7: 3d-covmat')
        self.canvas_7 = FigureCanvas(fig)
        self.covmat_field.addWidget(self.canvas_7)
        self.canvas_7.draw()
        self.toolbar_7 = NavigationToolbar(self.canvas_7, self.tab_covmat, coordinates=True)
        self.covmat_field.addWidget(self.toolbar_7)

    def clear_page_1(self):
        if self.canvas_1:
            logging.debug('Clear Histogram Figures')
            self.HistLayout.removeWidget(self.canvas_1)
            self.canvas_1.close()
            self.HistLayout.removeWidget(self.toolbar_1)
            self.toolbar_1.close()

    def clear_page_2(self):
        if self.canvas_2:
            logging.debug('Clear Correlation Figures')
            self.CorrLayout.removeWidget(self.canvas_2)
            self.canvas_2.close()
            self.CorrLayout.removeWidget(self.toolbar_2)
            self.toolbar_2.close()

    def clear_page_3(self):
        if self.canvas_3:
            logging.debug('Clear TMS Figures')
            self.TMSLayout.removeWidget(self.canvas_3)
            self.canvas_3.close()
            self.TMSLayout.removeWidget(self.toolbar_3)
            self.toolbar_3.close()

    def clear_page_5(self):
        if self.canvas_5:
            logging.debug('Clear page 5: phn1')
            self.phn1.removeWidget(self.canvas_5)
            self.canvas_5.close()
            self.phn1.removeWidget(self.toolbar_5)
            self.toolbar_5.close()

    def clear_page_6(self):
        if self.canvas_6:
            logging.debug('Clear page 6: phn2')
            self.phn2.removeWidget(self.canvas_6)
            self.canvas_6.close()
            self.phn2.removeWidget(self.toolbar_6)
            self.toolbar_6.close()

    def clear_page_7(self):
        if self.canvas_7:
            logging.debug('Clear page 7: 3d-covmat')
            self.covmat_field.removeWidget(self.canvas_7)
            self.canvas_7.close()
            self.covmat_field.removeWidget(self.toolbar_7)
            self.toolbar_7.close()

    def process_all(self):
        self.read_table()
        logging.debug('start processing')
        functions.process_all_points(self.dispData, self.dicData)
        res = self.dicData['res']
        fig1 = Figure(facecolor='white', edgecolor='white')
        pl1 = fig1.add_subplot(1, 1, 1)
        pl1.plot(res.ns[:, 0], label='f1')
        pl1.plot(res.ns[:, 1], label='f2')
        pl1.set_title('Photon numbers')
        fig2 = Figure(facecolor='white', edgecolor='white')
        pl3 = fig2.add_subplot(2, 1, 1)
        pl4 = fig2.add_subplot(2, 1, 2)
        pl3.plot(res.sqs, label='Sq Mag')
        pl3.plot(res.ineqs, label='Ineq_req')
        pl3.set_title('Squeezing Mag')
        pl4.plot(res.sqphs)
        pl4.set_title('Squeezing Phase')
        self.update_page_5(fig1)
        self.update_page_6(fig2)
        self.read_table()
        self.save_processed()

    def save_processed(self):
        if self.dispData['mtx ']:
            savename = self.dispData['mtx ']
            logging.debug('Save data as mtx files: ' + str(savename))
            on = self.dicData['hdf5_on']
            res = self.dicData['res']  # this contains the calculation results
            savemtx(savename + 'IImaps.mtx', res.IQmapMs_avg[:, 0, :, :], on.headerII)
            savemtx(savename + 'QQmaps.mtx', res.IQmapMs_avg[:, 1, :, :], on.headerQQ)
            savemtx(savename + 'IQmaps.mtx', res.IQmapMs_avg[:, 2, :, :], on.headerIQ)
            savemtx(savename + 'QImaps.mtx', res.IQmapMs_avg[:, 3, :, :], on.headerQI)
            savemtx(savename + 'cs_avg_QI.mtx', res.cs_avg, on.headerQI)
            savemtx(savename + 'cs_avg_QI_off.mtx', res.cs_avg_off, on.headerQI)
            filename = savename + 'n1n2rawSq1InNoi1Sq2dn1offn2offphs.mtx'
            dataset = np.array([res.ns[:, 0], res.ns[:, 1], res.sqs, res.ineqs, res.noises, res.sqs2-res.sqsn2, res.ns_off[:, 0], res.ns_off[:, 1], res.sqphs])
            mtxdataset = np.expand_dims(dataset, 0)
            savemtx(filename, mtxdataset)
            # gp.s([res.ns[:, 0], res.ns[:, 1], res.sqs, res.ineqs, res.noises, res.sqs2-res.sqsn2, res.ns_off[:, 0], res.ns_off[:, 1]], filename=filename)
            # gp.c('plot "' + filename + '" u 3 w lp t "Squeezing"')
            # gp.c('replot "' + filename + '" u 4 w lp t "Ineq"')
            self.update_data_disp()

    def make_Histogram(self):
        self.read_table()
        functions.process(self.dispData, self.dicData)
        self.make_CorrFigs()
        self.make_TMSFig()
        on = self.dicData['hdf5_on']  # this one contains all the histogram axis
        res = self.dicData['res']  # this contains the calculation results
        fig1 = Figure(facecolor='white', edgecolor='white')
        ax1 = fig1.add_subplot(2, 2, 1)
        ax2 = fig1.add_subplot(2, 2, 2)
        ax3 = fig1.add_subplot(2, 2, 3)
        ax4 = fig1.add_subplot(2, 2, 4)
        ax1.imshow(res.IQmapM_avg[0], interpolation='nearest', origin='low',
                   extent=[on.xII[0], on.xII[-1], on.yII[0], on.yII[-1]], aspect='auto')
        ax2.imshow(res.IQmapM_avg[1], interpolation='nearest', origin='low',
                   extent=[on.xQQ[0], on.xQQ[-1], on.yQQ[0], on.yQQ[-1]], aspect='auto')
        ax3.imshow(res.IQmapM_avg[2], interpolation='nearest', origin='low',
                   extent=[on.xIQ[0], on.xIQ[-1], on.yIQ[0], on.yIQ[-1]], aspect='auto')
        ax4.imshow(res.IQmapM_avg[3], interpolation='nearest', origin='low',
                   extent=[on.xQI[0], on.xQI[-1], on.yQI[0], on.yQI[-1]], aspect='auto')
        fig1.tight_layout()
        ax1.set_title('IIc')
        ax2.set_title('QQc')
        ax3.set_title('IQc')
        ax4.set_title('QIc')
        self.update_page_1(fig1)  # send figure to the show_figure terminal
        self.read_table()

    def make_CorrFigs(self):
        fig2 = Figure(facecolor='white', edgecolor='black')
        res = self.dicData['res']
        xCorr1 = fig2.add_subplot(2, 2, 1)
        xCorr2 = fig2.add_subplot(2, 2, 2)
        xCorr3 = fig2.add_subplot(2, 2, 3)
        xCorr4 = fig2.add_subplot(2, 2, 4)
        xCorr1.set_title('<IIc>')
        xCorr2.set_title('<QQc>')
        xCorr3.set_title('<IQc>')
        xCorr4.set_title('<QIc>')
        xCorr1.plot(self.dicData['xaxis'], res.c_avg[0])
        xCorr2.plot(self.dicData['xaxis'], res.c_avg[1])
        xCorr3.plot(self.dicData['xaxis'], res.c_avg[2])
        xCorr4.plot(self.dicData['xaxis'], res.c_avg[3])
        xCorr1.axis('tight')
        xCorr2.axis('tight')
        xCorr3.axis('tight')
        xCorr4.axis('tight')
        # fig2.tight_layout()
        self.update_page_2(fig2)

    def make_TMSFig(self):
        fig3 = Figure(facecolor='white', edgecolor='black')
        res = self.dicData['res']
        xTMS1 = fig3.add_subplot(1, 2, 1)
        xTMS2 = fig3.add_subplot(1, 2, 2)
        xTMS1.set_title('Magnitude')
        xTMS2.set_title('Phase')
        xTMS1.plot(self.dicData['xaxis'], np.abs(res.psi_avg[0]))
        xTMS2.plot(self.dicData['xaxis'], np.angle(res.psi_avg[0]))
        xTMS1.axis('tight')
        xTMS2.axis('tight')
        # xTMS1.tight_layout(fig3)
        # xTMS2.tight_layout(fig3)
        self.update_page_3(fig3)

    def process_hybrid(self):
        self.read_table()
        res = self.dicData['res']
        lags = self.dispData['lags']
        functions_hybrid.process_hyb(self.dispData, self.dicData)
        fig7, ax = plot3dHist(res.cov_mat)
        self.update_page_7(fig7)
        ax.mouse_init()

    def process_hybrid2(self):
        self.read_table()
        res = self.dicData['res']
        lags = self.dispData['lags']
        functions_hybrid.process_hyb2(self.dispData, self.dicData)
        fig7, ax = plot3dHist2(res.cov_mat)
        self.update_page_7(fig7)
        ax.mouse_init()

    def process_hybrid_all(self):
        self.read_table()
        res = self.dicData['res']
        lags = self.dispData['lags']
        functions_hybrid.process_hyb_all(self.dispData, self.dicData)
        # fig7, ax = plot3dHist2(res.cov_mat)
        fig6 = Figure(facecolor='white', edgecolor='black')
        xpl1 = fig6.add_subplot(1, 2, 1)
        xpl2 = fig6.add_subplot(1, 2, 2)
        xpl1.set_title('N1')
        xpl1.set_title('N2')
        xpl1.plot(res.n1)
        xpl2.plot(res.n2)
        self.update_page_5(fig6)
        # self.update_page_7(fig7)
        # ax.mouse_init()

    def process_digitizer_drift(self):
        self.read_table()
        functions_digitizer_drift.generate_drift_map(self.dispData, self.dicData)
예제 #44
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, data):
        super(Main, self).__init__()
        self.setupUi(self)
        self.fig_dict = {}
        self.perguntas_dict = {}
        self.data = data
        self.question_id = -1

        # click Perguntas
        self.mplfigs.itemClicked.connect(
            self.update_pessoa)  # when clicked, change plot
        # click Pessoa
        # on click function
        self.mplfigs_2.cellClicked.connect(self.update_correlacao)

        fig = Figure()
        self.add_plot(fig)

    # ----------------------
    # PERGUNTA TABLE METHODS
    def addpergunta(self, id, name):  # add perguntas
        name = name.decode('utf-8')
        self.perguntas_dict[
            name] = id  # add item to perguntas dict, name as key and id as value
        self.mplfigs.addItem(name)  # add item to mplfigs

    # ----------------------
    # ----------------------
    # PESSOA TABLE METHODS
    def init_pessoa(self):

        # set table
        row_count = len(self.data.index)
        self.mplfigs_2.setRowCount(row_count)
        self.mplfigs_2.setColumnCount(2)

        # set header
        self.mplfigs_2.setHorizontalHeaderLabels(
            QString("id;resposta;").split(";"))

    def update_pessoa(self, question):

        # access perguntas dict and get question_id based on click
        try:
            question = question.text()
            question = unicode(question)  # to text
        except AttributeError:
            question = question
        question_id = str(self.perguntas_dict[question])
        self.question_id = question_id

        # add data inside table
        data_column = self.data[question_id]
        votos_dict = {'sim': [], 'nao': [], 'nulo': []}
        for i, d in enumerate(data_column):
            self.mplfigs_2.setItem(i, 0, QTableWidgetItem("{}".format(i)))
            self.mplfigs_2.setItem(i, 1, QTableWidgetItem("{}".format(d)))

            if d == 1:
                votos_dict['sim'].append(i)
            elif d == -1:
                votos_dict['nao'].append(i)
            elif d == 0:
                votos_dict['nulo'].append(i)

        self.changefig(self.data, votos_dict)

    # ----------------------
    # CORRELACAO TABLE
    def init_correlacao(self, data):

        # set table
        row_count = len(data.index) - 1
        self.mplfigs_3.setRowCount(row_count)
        self.mplfigs_3.setColumnCount(3)

        # set header
        self.mplfigs_3.setHorizontalHeaderLabels(
            QString("id; conc; disc;").split(";"))

    def update_correlacao(self, row, col):
        person_id = row
        data_plot = PCA.get_oposition(self.data, self.question_id, person_id)
        self.init_correlacao(data_plot)
        self.changefig(data_plot, person_id)

        self.person = self.data.loc[self.data['participant'] ==
                                    person_id].drop('participant', axis=1)
        self.person = map(list, self.person.values)  # to list

        ordered_data, name = self.treat_data(data_plot)

        print ordered_data

        self.others = data_plot['participant'].tolist()
        self.size = len(self.data.index)
        for i, o in enumerate(self.others):

            other = self.data.loc[self.data['participant'] == o]
            id = other['participant'].values
            print id
            other = other.drop('participant', axis=1)
            other = map(list, other.values)

            both_sim, both_nao, both_nulo = 0, 0, 0
            for pair in itertools.izip(self.person[0], other[0]):
                if pair == (1.0, 1.0):
                    both_sim += 1
                elif pair == (0.0, 0.0):
                    both_nulo += 1
                if pair == (-1.0, -1.0):
                    both_nao += 1

            self.sim = both_sim + both_nao + both_nulo

            self.nao = self.size - self.sim

            print self.sim, self.nao

            self.mplfigs_3.setItem(i, 0, QTableWidgetItem("{}".format(id[0])))
            self.mplfigs_3.setItem(i, 1,
                                   QTableWidgetItem("{}".format(self.sim)))
            self.mplfigs_3.setItem(i, 2,
                                   QTableWidgetItem("{}".format(self.nao)))

        # ----------------------

    # PLOT METHODS
    def changefig(self, data_plot, person_id=-1):  # change plot func

        self.remove_plot()  # clear plot
        fig = self.PCA_plot(data_plot, person_id)  # get plot info
        self.add_plot(fig)  # add plot

    def add_plot(self, fig):  # add plot
        self.canvas = FigureCanvas(fig)  # put matplot fig
        self.mplvl.addWidget(self.canvas)  # create widget mplvl space
        self.canvas.draw()  # draw canvas
        self.toolbar = NavigationToolbar(
            self.canvas,  # create toolbar
            self.mplwindow,
            coordinates=True)
        self.mplvl.addWidget(self.toolbar)  # add toolbar

    def remove_plot(self, ):  # clear cnavas
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def treat_data(self, data):

        data, name = data.drop(
            ['participant'], axis=1).as_matrix(), data['participant'].tolist()
        data = PCA.PCA(data)  # PCA it

        return data, name

    def PCA_plot(self, data_plot, evidence=-1):

        # treat data
        data, name = self.treat_data(data_plot)

        # Plot init
        self.fig = Figure()
        self.ax1 = self.fig.add_subplot(111)

        # data
        blue, = self.ax1.plot(data[:, 0],
                              data[:, 1],
                              'o',
                              markersize=7,
                              color='blue',
                              alpha=0.5)
        if evidence != -1:  # evidence data
            if isinstance(evidence, dict):
                for e in evidence['nao']:
                    index = name.index(e)
                    red, = self.ax1.plot(data[index, 0],
                                         data[index, 1],
                                         'o',
                                         markersize=7,
                                         color='red',
                                         alpha=0.5)
                for e in evidence['nulo']:
                    index = name.index(e)
                    yellow, = self.ax1.plot(data[index, 0],
                                            data[index, 1],
                                            'o',
                                            markersize=7,
                                            color='y',
                                            alpha=0.5)
                if not (len(evidence['nao']) == 0
                        or len(evidence['nulo']) == 0):
                    self.ax1.legend([blue, red, yellow],
                                    ['sim', 'nao', 'nulo'])  # legenda

            else:
                index = name.index(evidence)
                self.ax1.plot(data[index, 0],
                              data[index, 1],
                              'o',
                              markersize=7,
                              color='red',
                              alpha=0.5)

        # annotations
        for i, txt in enumerate(name):
            self.ax1.annotate(txt, (data[i, 0], data[i, 1]))
        self.extra = Rectangle((0, 0),
                               1,
                               1,
                               fc="w",
                               fill=False,
                               edgecolor='none',
                               linewidth=0)
        if evidence == -1 or isinstance(evidence, dict):
            self.ax1.annotate("PCA Geral",
                              xy=(0.05, 0.95),
                              xycoords='axes fraction',
                              fontsize=14)
        else:
            self.ax1.annotate("Sujeito {}".format(evidence),
                              xy=(0.05, 0.95),
                              xycoords='axes fraction',
                              fontsize=14)

        return self.fig
예제 #45
0
class Main(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setWindowTitle('Data Chest Image Browser')
        # Add in Rabi plot.
        self.setWindowIcon(QtGui.QIcon('rabi.jpg'))

        self.root = os.environ["DATA_ROOT"]
        if "\\" in self.root:
            self.root = self.root.replace("\\", '/')
        self.pathRoot = QtCore.QString(self.root)

        self.filters = QtCore.QStringList()
        self.filters.append("*.hdf5")

        self.dataChest = dataChest("", self.root)

        self.local_tz = tz.tzlocal()
        self.utc = tz.gettz('UTC')

        # Directory browser configuration.
        self.model = QtGui.QFileSystemModel(self)
        self.model.setRootPath(QtCore.QString(self.root))
        self.model.setNameFilterDisables(False)
        self.model.nameFilterDisables()
        self.model.setNameFilters(self.filters)

        self.indexRoot = self.model.index(self.model.rootPath())

        self.directoryBrowserLabel = QtGui.QLabel(self)
        self.directoryBrowserLabel.setText("Directory Browser:")

        self.directoryTree = QtGui.QTreeView(self)
        self.directoryTree.setModel(self.model)
        self.directoryTree.setRootIndex(self.indexRoot)
        self.directoryTree.header().setResizeMode(
            QtGui.QHeaderView.ResizeToContents)
        self.directoryTree.header().setStretchLastSection(False)
        self.directoryTree.clicked.connect(self.dirTreeSelectionMade)

        # Plot types drop down list configuration.
        self.plotTypesComboBoxLabel = QtGui.QLabel(self)
        self.plotTypesComboBoxLabel.setText("Available Plot Types:")

        self.plotTypesComboBox = QtGui.QComboBox(self)
        self.plotTypesComboBox.activated[str].connect(self.plotTypeSelected)

        # Configure scrolling widget.
        self.scrollWidget = QtGui.QWidget(self)
        self.scrollLayout = QtGui.QHBoxLayout(self)
        self.scrollWidget.setLayout(self.scrollLayout)
        self.scrollArea = QtGui.QScrollArea(self)
        self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        self.scrollArea.setHorizontalScrollBarPolicy(
            QtCore.Qt.ScrollBarAsNeeded)
        self.scrollArea.setWidget(self.scrollWidget)
        self.scrollArea.setWidgetResizable(True)  # What happens without?

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.directoryBrowserLabel)
        vbox.addWidget(self.directoryTree)
        vbox.addWidget(self.plotTypesComboBoxLabel)
        vbox.addWidget(self.plotTypesComboBox)
        vbox.addWidget(self.scrollArea)

        self.mplwindow = QtGui.QWidget(self)
        self.mplvl = QtGui.QVBoxLayout(self.mplwindow)

        hbox = QtGui.QHBoxLayout()
        hbox.addLayout(vbox)
        hbox.addWidget(self.mplwindow)
        self.setLayout(hbox)

        self.currentFig = Figure()
        self.addFigureToCanvas(self.currentFig)

        self.filePath = None  # redundant
        self.fileName = None  # redundant
        self.plotType = None  # redundant
        self.varsToIgnore = []

    def plotTypeSelected(self, plotType):
        # Called when a plotType selection is made from drop down.
        # self.plotTypesComboBox.adjustSize()
        if plotType != self.plotType:
            self.removeFigFromCanvas()
            self.currentFig = self.figFromFileInfo(self.filePath,
                                                   self.fileName,
                                                   selectedPlotType=plotType)
            self.addFigureToCanvas(self.currentFig)
            self.updatePlotTypeOptions(plotType)
            self.plotType = plotType
            # When is best time to do this?
            self.varsToIgnore = []

    def updatePlotTypeOptions(self, plotType, depVarName=None):
        # Update area below plotType, selection drop down (add/remove variables)
        self.clearLayout(self.scrollLayout)
        if plotType == "1D" or plotType == "Histogram":
            headerList = ["Dep Var:", "Status:"]
            widgetTypeList = ["QLabel", "QCheckBox"]
            depVarList = [row[0] for row in self.dataChest.getVariables()[1]]
            for ii in range(0, len(headerList)):
                optionsSlice = QtGui.QVBoxLayout()
                label = QtGui.QLabel(self)  # widget to log
                label.setText(headerList[ii])
                optionsSlice.addWidget(label)
                for depVar in depVarList:
                    if widgetTypeList[ii] == "QLabel":
                        label = QtGui.QLabel(self)  # widget to log
                        label.setText(depVar)
                        optionsSlice.addWidget(label)
                    elif widgetTypeList[ii] == "QCheckBox":
                        checkBox = QtGui.QCheckBox('', self)  # widget to log
                        checkBox.setCheckState(QtCore.Qt.Checked)
                        checkBox.stateChanged.connect(
                            partial(self.varStateChanged, depVar))
                        optionsSlice.addWidget(checkBox)
                optionsSlice.addStretch(1)
                self.scrollLayout.addLayout(optionsSlice)
            self.scrollLayout.addStretch(1)
        elif plotType == '2D Image':
            headerList = ["Dep Var:", "Status:"]
            widgetTypeList = ["QLabel", "QCheckBox"]
            depVarList = [row[0] for row in self.dataChest.getVariables()[1]]
            if depVarName is None:
                depVarName = depVarList[0]
            for ii in range(0, len(headerList)):
                optionsSlice = QtGui.QVBoxLayout()
                label = QtGui.QLabel(self)  # widget to log
                label.setText(headerList[ii])
                optionsSlice.addWidget(label)
                for depVar in depVarList:
                    if widgetTypeList[ii] == "QLabel":
                        label = QtGui.QLabel(self)  # widget to log
                        label.setText(depVar)
                        optionsSlice.addWidget(label)
                    elif widgetTypeList[ii] == "QCheckBox":
                        checkBox = QtGui.QCheckBox('', self)  # widget to log
                        print "depVarName=", depVarName
                        if depVar == depVarName:
                            checkBox.setCheckState(QtCore.Qt.Checked)
                        checkBox.stateChanged.connect(
                            partial(self.varStateChanged, depVar))
                        optionsSlice.addWidget(checkBox)
                optionsSlice.addStretch(1)
                self.scrollLayout.addLayout(optionsSlice)
            self.scrollLayout.addStretch(1)

    def clearLayout(self, layout):
        # Clear the plotType options layout and all widgets therein.
        for i in reversed(range(layout.count())):
            item = layout.itemAt(i)

            if isinstance(item, QtGui.QWidgetItem):
                item.widget().close()
            elif not isinstance(item, QtGui.QSpacerItem):
                self.clearLayout(item.layout())
            # remove the item from layout
            layout.removeItem(item)

    def varStateChanged(self, name, state):
        # Add/remove variables from current displayed plot.
        if state == QtCore.Qt.Checked:
            self.varsToIgnore.remove(name)
            # Remove old figure, needs garbage collection too.
            self.removeFigFromCanvas()
            self.currentFig = self.figFromFileInfo(
                self.filePath,
                self.fileName,
                selectedPlotType=self.plotType,
                varsToIgnore=self.varsToIgnore)
            self.addFigureToCanvas(self.currentFig)
        else:  # unchecked
            if name not in self.varsToIgnore:
                self.varsToIgnore.append(name)
            # Remove old figure, needs garbage collection too.
            self.removeFigFromCanvas()
            self.currentFig = self.figFromFileInfo(
                self.filePath,
                self.fileName,
                selectedPlotType=self.plotType,
                varsToIgnore=self.varsToIgnore)
            self.updatePlotTypeOptions(self.plotType, '')
            self.addFigureToCanvas(self.currentFig)

    def convertPathToArray(self, path):
        if self.root + "/" in path:
            path = path.replace(self.root + "/", '')
        elif self.root in path:
            path = path.replace(self.root, '')
        return path.split('/')

    def addFigureToCanvas(self, fig):
        # Addsmpl fig to the canvas.
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.mplwindow,
                                         coordinates=True)
        self.mplvl.addWidget(self.toolbar)

    def removeFigFromCanvas(self):
        # Remove fig from the canvas.
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
        self.currentFig.clf()

    @QtCore.pyqtSlot(QtCore.QModelIndex)  # logical flow could be improved
    def dirTreeSelectionMade(self, index):
        # Called when a directory tree selection is made.
        indexItem = self.model.index(index.row(), 0, index.parent())
        fileName = str(self.model.fileName(indexItem))
        filePath = str(self.model.filePath(indexItem))

        if ".hdf5" in filePath:
            # Removes fileName from path if file is chosen.
            filePath = filePath[:-(len(fileName) + 1)]

        if self.fileName != fileName or self.filePath != filePath:
            # If an actual change occurs update check what happens for
            # just a folder.
            self.filePath = filePath  # Is there a point in storing this?
            self.fileName = fileName

            if ".hdf5" in fileName:
                # fileName is not a directory, otherwise leave as is
                # till a file is selected.
                self.removeFigFromCanvas()
                # Remove old figure, needs garbage collection too.
                self.currentFig = self.figFromFileInfo(self.filePath,
                                                       self.fileName)
                self.addFigureToCanvas(self.currentFig)
                variables = self.dataChest.getVariables()  # fine
                dataCategory = self.categorizeDataset(variables)  # fine
                self.updatePlotTypesList(self.supportedPlotTypes(
                    dataCategory))  # fine: updates list
                self.updatePlotTypeOptions(
                    self.supportedPlotTypes(dataCategory)[0])
                self.plotType = self.supportedPlotTypes(dataCategory)[0]
                self.varsToIgnore = []  # When is best time to do this?
            else:
                self.fileName = None

    def updatePlotTypesList(self, plotTypes):
        # Update plotTypes list based on selected dataset.
        self.plotTypesComboBox.clear()
        for element in plotTypes:
            if ".dir" not in str(element) and ".ini" not in str(element):
                self.plotTypesComboBox.addItem(str(element))

    def categorizeDataset(self, variables):
        # Categorizes dataset, this is now redundant.
        indepVarsList = variables[0]
        numIndepVars = len(indepVarsList)
        if numIndepVars == 1:
            return "1D"
        elif numIndepVars == 2:
            return "2D"
        else:
            return (str(numIndepVars) + "D")

    def supportedPlotTypes(self, dimensionality):
        # Provide list of plotTypes based on datasetType.
        if dimensionality == "1D":
            plotTypes = ["1D", "Histogram"]
        elif dimensionality == "2D":
            plotTypes = ["2D Image"]
        else:
            plotTypes = []
        return plotTypes

    # Some shape checking needs to go into this function to ensure
    # 1D array inputs.
    def plot1D(self, dataset, variables, plotType, dataClass, varsToIgnore=[]):
        # Shorten this monstrosity!
        # print "varsToIgnore=", varsToIgnore
        if plotType == None:
            plotType = self.supportedPlotTypes("1D")[0]  # defaults
        elif plotType not in self.supportedPlotTypes("1D"):
            print "Unrecognized plot type was provided"
            # Return bum fig with something cool, maybe a gif.
        if plotType == "1D":
            fig = self.basic1DPlot(dataset, variables, varsToIgnore)
        elif plotType == "Histogram":
            # Adjust bin size.
            fig = self.basic1DHistogram(dataset, variables, varsToIgnore)
        return fig

    # Some shape checking needs to go into this function to ensure
    # 2D array inputs.
    def plot2D(self, dataset, variables, plotType, dataClass, varsToIgnore=[]):
        # Shorten this monstrosity!
        # print "varsToIgnore=", varsToIgnore
        if plotType == None:
            plotType = self.supportedPlotTypes("2D")[0]  #defaults
        elif plotType not in self.supportedPlotTypes("2D"):
            print "Unrecognized plot type was provided"
            # Return bum fig with something cool, maybe a gif.
        if plotType == "2D Image":
            fig = self.basic2DImage(dataset, variables, varsToIgnore)
        #elif plotType == "Histogram": #adjust bin size
        #    fig = self.basic1DHistogram(dataset, variables, varsToIgnore)
        return fig

    def basic2DImage(self, dataset, variables, varsToIgnore):
        fig = Figure(dpi=100)
        ax = fig.add_subplot(111)
        indepVars = variables[0]
        depVars = variables[1]
        if varsToIgnore == [depVars[ii][0] for ii in range(0, len(depVars))]:
            return fig

#       dataset = np.asarray(dataset)
        xlabel = self.dataChest.getParameter("X Label", True)
        if xlabel is None:
            xlabel = indepVars[0][0]
        ylabel = self.dataChest.getParameter("Y Label", True)
        if ylabel is None:
            # For data with more than one dep, recommend ylabel.
            ylabel = depVars[0][0]
        plotTitle = self.dataChest.getParameter("Plot Title", True)
        if plotTitle is None:
            plotTitle = self.dataChest.getDatasetName()
        ax.set_title(plotTitle)
        ax.set_xlabel(xlabel + " " + "(" + indepVars[0][3] + ")")
        ax.set_ylabel(ylabel + " " + "(" + depVars[0][3] + ")")
        # For multiple deps with different units this is ambiguous.
        imageType = self.dataChest.getParameter("Image Type", True)
        if imageType is None and self.dataChest.getDataCategory() == '2D Scan':
            imageType = '2D Scan'
        print "imageType=", imageType

        if imageType is None:
            dataset = np.asarray(dataset)
            # Add or "scatter"
            imageType = "Scatter"
            print "Scatter"
            for ii in range(0, len(depVars)):
                x = dataset[::, 0]
                y = dataset[::, 1]
                z = dataset[::, 2]
                im = ax.tricontourf(x,
                                    y,
                                    z,
                                    100,
                                    cmap=cm.gist_rainbow,
                                    antialiased=True)
                fig.colorbar(im, fraction=0.15)
                break
        elif imageType == "Pixel":
            xGridRes = self.dataChest.getParameter("X Resolution", True)
            xIncrement = self.dataChest.getParameter("X Increment", True)
            yGridRes = self.dataChest.getParameter("Y Resolution", True)
            yIncrement = self.dataChest.getParameter("Y Increment", True)
            dataset = np.asarray(dataset)
            x = dataset[::, 0].flatten()
            y = dataset[::, 1].flatten()
            z = dataset[::, 2].flatten()
            if len(x) > 1:
                if x[0] == x[1]:
                    sweepType = "Y"
                else:
                    sweepType = "X"
                print "sweepType=", sweepType
                new = self.makeGrid(
                    x, xGridRes, xIncrement, y, yGridRes, yIncrement,
                    sweepType, z
                )  #makeGrid(self, x, xGridRes, dX, y, yGridRes, dY, sweepType, z)
                X = new[0]
                Y = new[1]
                Z = new[2]
                im = ax.imshow(Z,
                               extent=(X.min(), X.max(), Y.min(), Y.max()),
                               interpolation='nearest',
                               cmap=cm.gist_rainbow,
                               origin='lower')
                fig.colorbar(im, fraction=0.15)
        elif imageType == '2D Scan':
            nx = len(dataset)
            ny = len(dataset[0][2])
            z = []
            for ii in range(0, nx):
                z.append(dataset[ii][2])
            x = [dataset[0][0], dataset[-1][0]]
            x = np.asarray(x)
            y = np.linspace(dataset[0][1][0], dataset[0][1][1], ny)
            z = np.asarray(z)
            z = z.flatten()
            z = z.reshape(nx, ny)
            im = ax.imshow(z,
                           extent=(x.min(), x.max(), y.min(), y.max()),
                           aspect='auto',
                           interpolation='nearest',
                           cmap=cm.gist_rainbow,
                           origin='lower')
            fig.colorbar(im, fraction=0.15)
        elif imageType == "Buffered":
            print "Buffered"
        return fig

    def _utc_to_local(self, utcDatetime):
        localDatetime = utcDatetime.replace(tzinfo=self.utc)
        return localDatetime.astimezone(self.local_tz)

    def basic1DPlot(self, dataset, variables, varsToIgnore):
        fig = Figure(dpi=100)
        ax = fig.add_subplot(111)
        indepVars = variables[0]
        depVars = variables[1]
        containsDatetime = False
        for ii in range(0, len(indepVars)):
            if 'utc_datetime' in indepVars[ii]:
                containsDatetime = True

        scanType = self.dataChest.getParameter("Scan Type", True)
        xlabel = self.dataChest.getParameter("X Label", True)
        if xlabel is None:
            xlabel = indepVars[0][0]
        ylabel = self.dataChest.getParameter("Y Label", True)
        if ylabel is None:
            # For data with more than one dep, recommend ylabel.
            ylabel = depVars[0][0]
        plotTitle = self.dataChest.getParameter("Plot Title", True)
        if plotTitle is None:
            plotTitle = self.dataChest.getDatasetName()
        ax.set_title(plotTitle)
        dataset = np.asarray(dataset)
        ax.set_xlabel(xlabel + " " + "(" + indepVars[0][3] + ")")
        ax.set_ylabel(ylabel + " " + "(" + depVars[0][3] + ")")
        # For multiple deps with different units this is ambiguous.
        for ii in range(0, len(depVars)):
            if depVars[ii][0] not in varsToIgnore:
                if scanType is None:
                    x = dataset[::, 0].flatten()
                    # Only works when all dims are same => perform checks.
                    y = dataset[::, 1 + ii].flatten()
                    if containsDatetime:
                        dStamp = dateStamp()
                        dates = []
                        for jj in range(0, len(y)):
                            dates.append(
                                self._utc_to_local(
                                    datetime.strptime(
                                        dStamp.floatToUtcDateStr(x[jj]),
                                        '%Y-%m-%dT%H:%M:%S.%f')))
                        dates = np.asarray(dates)
                        print dates
                        dates = date2num(dates)
                        dateFmt = DateFormatter("%m/%d/%Y %H:%M:%S")
                        auto = AutoDateLocator()
                        ax.xaxis.set_major_locator(auto)
                        ax.xaxis.set_major_formatter(dateFmt)
                        ax.tick_params(axis='x', labelsize=9)
                        ax.grid(True)
                        ax.autoscale_view()
                elif scanType == "Lin":
                    y = np.asarray(dataset[0][1 + ii])
                    # Only one row of data for this and log type supported.
                    x = np.linspace(dataset[0][0][0],
                                    dataset[0][0][1],
                                    num=len(y))
                elif scanType == "Log":
                    y = dataset[0][1 + ii]
                    x = np.logspace(np.log10(dataset[0][0][0]),
                                    np.log10(dataset[0][0][1]),
                                    num=len(y))
                    ax.set_xscale('log')
                #ax.plot(x, y, "o", label = depVars[ii][0])
                if containsDatetime:
                    ax.plot_date(dates,
                                 y,
                                 tz=self.utc,
                                 linestyle='-',
                                 marker=',',
                                 label=depVars[ii][0])
                    fig.autofmt_xdate()
                    fig.tight_layout()
                else:
                    ax.plot(x, y, label=depVars[ii][0])
        ax.legend(fontsize=10, loc="best")
        return fig

    def basic1DHistogram(self, dataset, variables, varsToIgnore):
        fig = Figure(dpi=100)
        ax = fig.add_subplot(111)
        indepVars = variables[0]
        depVars = variables[1]
        scanType = self.dataChest.getParameter("Scan Type", True)
        xlabel = self.dataChest.getParameter("X Label", True)
        ylabel = self.dataChest.getParameter("Y Label", True)
        if ylabel is None:
            ylabel = depVars[0][0]
            # For data with more than one dep, recommend ylabel.
        plotTitle = self.dataChest.getParameter("Plot Title", True)
        if plotTitle is None:
            plotTitle = self.dataChest.getDatasetName()
        ax.set_title(plotTitle)
        dataset = np.asarray(dataset)
        ax.set_xlabel(ylabel + " " + "(" + depVars[0][3] + ")")
        # For multiple deps with different units this is ambiguous.
        ax.set_ylabel("Statistical Frequency")
        for ii in range(0, len(depVars)):
            if depVars[ii][0] not in varsToIgnore:
                if scanType is None:
                    y = dataset[::, 1 + ii].flatten()
                elif scanType == "Lin":
                    y = dataset[0][1 + ii]
                elif scanType == "Log":
                    y = dataset[0][1 + ii]
                weights = np.ones_like(y) / float(len(y))
                ax.hist(y,
                        100,
                        weights=weights,
                        alpha=0.5,
                        label=depVars[ii][0])
                #ax.hist(y, 50, normed=1,weights =weights, alpha=0.5, label = depVars[ii][0])
        ax.legend()
        return fig

    def figFromFileInfo(self,
                        filePath,
                        fileName,
                        selectedPlotType=None,
                        varsToIgnore=[]):
        relPath = self.convertPathToArray(filePath)
        self.dataChest.cd(relPath)
        self.dataChest.openDataset(fileName)
        variables = self.dataChest.getVariables()
        dataCategory = self.categorizeDataset(variables)
        #otherwise refer to dataset name needs to be implemented
        dataset = self.dataChest.getData()
        if dataCategory == "1D":
            fig = self.plot1D(dataset,
                              variables,
                              selectedPlotType,
                              None,
                              varsToIgnore=varsToIgnore)
            # plot1D(self, dataset, variables, plotType, dataClass, varsToIgnore = [])
        elif dataCategory == "2D":  #was "2D Sweep"
            fig = self.plot2D(dataset,
                              variables,
                              selectedPlotType,
                              None,
                              varsToIgnore=varsToIgnore)
        else:
            print("1D data is the only type currently \r\n" +
                  "supported by this grapher.")
            print("Attempted to plot " + dataCategory + " data.")
            fig = Figure(dpi=100)
        self.dataChest.cd("")
        # yield self.cxn.data_vault.dump_existing_sessions()
        return fig

    def makeGrid(self, x, xGridRes, dX, y, yGridRes, dY, sweepType, z):

        totalNumPts = len(x)

        if sweepType == "Y":
            # Y sweep type ==> fix x, sweep y, then go to x+dx and
            # sweep y again...
            divNmod = divmod(len(x), yGridRes)
            numFullYslices = divNmod[0]
            numPartiallyComplete = divNmod[1]
            if numFullYslices < xGridRes:
                npxRemainder = np.array([])
                npyRemainder = np.array([])
                # What kind of beast is the line below?
                nanArray = np.zeros(shape=(yGridRes * xGridRes -
                                           yGridRes * numFullYslices -
                                           numPartiallyComplete, ))
                nanArray[:] = np.NAN
                # Is this pseudo-23 dimensional space definition?
                npzRemainder = np.concatenate([
                    z[yGridRes * numFullYslices:yGridRes * numFullYslices +
                      numPartiallyComplete], nanArray
                ])
                for ii in range(numFullYslices, xGridRes):
                    npxRemainder = np.concatenate([
                        npxRemainder,
                        np.linspace(dX * ii + x[0],
                                    dX * ii + x[0],
                                    num=yGridRes)
                    ])
                    npyRemainder = np.concatenate([
                        npyRemainder,
                        np.linspace(y[0],
                                    y[0] + (yGridRes - 1) * dY,
                                    num=yGridRes)
                    ])
            else:
                npxRemainder = np.array([])
                npyRemainder = np.array([])
                npzRemainder = np.array([])

            npx = np.concatenate(
                [x[0:yGridRes * numFullYslices], npxRemainder])
            npy = np.concatenate(
                [y[0:yGridRes * numFullYslices], npyRemainder])
            npz = np.concatenate(
                [z[0:yGridRes * numFullYslices], npzRemainder])

            npx = npx.reshape(xGridRes, yGridRes).T
            npy = npy.reshape(xGridRes, yGridRes).T
            npz = npz.reshape(xGridRes, yGridRes).T
        elif sweepType == "X":
            # X sweep type ==> fix y, sweep x, then go to x+dy and
            # sweep y again...
            divNmod = divmod(len(x), xGridRes)
            numFullXslices = divNmod[0]
            numPartiallyComplete = divNmod[1]
            if numFullXslices < yGridRes:
                npxRemainder = np.array([])
                npyRemainder = np.array([])
                nanArray = np.zeros(shape=(yGridRes * xGridRes -
                                           xGridRes * numFullXslices -
                                           numPartiallyComplete, ))
                nanArray[:] = np.NAN
                npzRemainder = np.concatenate([
                    z[xGridRes * numFullXslices:xGridRes * numFullXslices +
                      numPartiallyComplete], nanArray
                ])
                for ii in range(numFullXslices, yGridRes):
                    npyRemainder = np.concatenate([
                        npyRemainder,
                        np.linspace(dY * ii + y[0],
                                    dY * ii + y[0],
                                    num=xGridRes)
                    ])
                    npxRemainder = np.concatenate([
                        npxRemainder,
                        np.linspace(x[0],
                                    x[0] + (xGridRes - 1) * dX,
                                    num=xGridRes)
                    ])
            else:
                npxRemainder = np.array([])
                npyRemainder = np.array([])
                npzRemainder = np.array([])
            npx = np.concatenate(
                [x[0:xGridRes * numFullXslices], npxRemainder])
            npy = np.concatenate(
                [y[0:xGridRes * numFullXslices], npyRemainder])
            npz = np.concatenate(
                [z[0:xGridRes * numFullXslices], npzRemainder])

            npx = npx.reshape(xGridRes, yGridRes)
            npy = npy.reshape(xGridRes, yGridRes)
            npz = npz.reshape(xGridRes, yGridRes)
        return (npx, npy, npz)
예제 #46
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        ######################### Get database info #########################
        self.engine = ''  # engine variable stores database information
        self.wedit = db.DBInfo(self)
        self.wedit.exec_()
        self.plot2D = True
        self.Echeck = True
        self.Eplot = True
        self.Ccheck = True
        self.Cplot = True
        self.plotall = False

        super(Main, self).__init__()
        self.setupUi(self)

        # TODO: make queries for max year and min year
        self.year = get_minyear(self.engine)
        self.slyear.setMaximum(get_maxyear(self.engine))
        self.slyear.setMinimum(self.year)

        ######################### Initialize text for selected year #########################
        self.txtyear.setText(str(self.slyear.value()))

        ######################### Program events #########################
        self.slyear.valueChanged.connect(self.updTxt)
        self.slyear.sliderReleased.connect(self.updFig)
        self.txtyear.returnPressed.connect(self.updSl)
        self.actionDatabase_info.triggered.connect(self.edit)
        self.btnglobe.clicked.connect(self.globebutton)
        self.chkconflicts.stateChanged.connect(self.conflictCheck)
        self.chkeclipses.stateChanged.connect(self.eclipseCheck)
        self.actionGenerate_Globe.triggered.connect(self.globemovie)
        self.actionPlot_all.triggered.connect(self.plot_all_datapoints)

        fig = plotmap()
        self.addmpl(fig)

        self.chkconflicts.toggle()
        self.chkeclipses.toggle()

    ######################### Plot all data #########################
    def plot_all_datapoints(self):
        self.plotall = True
        self.updFig()

    ######################### Map button #########################
    def globebutton(self):
        if self.plot2D:
            self.plot2D = False
            self.btnglobe.setText('Map view')
            self.slyear.setMaximum(0)
            self.slyear.setMaximum(360)
            self.updFig()

        else:
            self.plot2D = True
            self.btnglobe.setText('Globe view')
            self.year = get_minyear(self.engine)
            self.slyear.setMaximum(get_maxyear(self.engine))
            self.slyear.setMinimum(self.year)
            self.updFig()

    ######################### Checkbox features #########################
    def conflictCheck(self):
        if self.Ccheck:
            self.Cplot = True
            self.Ccheck = False
            self.updFig()
        else:
            self.Cplot = False
            self.Ccheck = True
            self.updFig()

    def eclipseCheck(self):
        if self.Echeck:
            self.Eplot = True
            self.Echeck = False
            self.updFig()
        else:
            self.Eplot = False
            self.Echeck = True
            self.updFig()

    ######################### Edit textbox and slider #########################
    def updTxt(self):
        if self.plot2D:
            self.plotall = False
        self.txtyear.setText(str(self.slyear.value()))

    def updSl(self):
        if self.plot2D:
            self.plotall = False
        self.slyear.setValue(int(self.txtyear.text()))
        self.updFig()

    ######################### Update figure #########################
    def updFig(self):
        try:
            self.rmmpl()
        except:
            pass

        failed = False
        self.updYear()
        try:
            fig1 = get_conflicts(self.engine, self.year, self.Eplot,
                                 self.Cplot, self.plot2D, self.plotall,
                                 int(self.txtyear.text()))
            self.addmpl(fig1)
        except Exception as e:
            print(e)
            info = "Could not connect to database. Are you sure you're connected to one?"
            failed = True
            pass

        if failed:
            QtGui.QMessageBox.information(self, 'Error', info)
        else:
            self.updConflist()
            self.updExplist()

    def updYear(self):
        if self.plot2D:
            self.year = int(self.txtyear.text())

    ######################### Check if event is clicked #########################
    def onpick(self, event):
        ind = event.ind
        artist = event.artist
        xdata = artist.get_xdata()
        ydata = artist.get_ydata()

        if ind[0] in range(len(xdata)):
            self.updTxtinfo(ind, artist)
        return ind[0]

    def updTxtinfo(self, ind, artist):
        lat = artist.get_ydata()[ind[0]]
        lon = artist.get_xdata()[ind[0]]
        year = int(self.txtyear.text())
        conflict = True
        try:
            self.txtconfinfo.setText(get_confinfo(self.engine, lat, lon, year))
        except:
            conflict = False
        if not conflict:
            try:
                self.txteclipse.setText(
                    get_eclipseinfo(self.engine, lat, lon, year))
            except:
                pass

    ######################### Create a movie #########################
    def globemovie(self):
        makethevideo(self.engine, int(self.txtyear.text()), self.Eplot,
                     self.Cplot, self.plotall)

    def updConflist(self):
        self.txtconflist.setText(
            get_conflist(self.engine, int(self.txtyear.text())))

    def updExplist(self):
        self.txtexport.setText(
            get_exportlist(self.engine, int(self.txtyear.text())))

    ######################### Create Database #########################
    def edit(self):
        self.wedit = db.DBInfo(self)
        self.wedit.show()

    ######################### Create figure #########################
    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.canvas.mpl_connect('pick_event', self.onpick)
        self.mplvlayout.addWidget(self.canvas)
        self.canvas.draw()

    ######################### Remove figure #########################
    def rmmpl(self, ):
        self.mplvlayout.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvlayout.removeWidget(self.toolbar)
        self.toolbar.close()
예제 #47
0
class ContourPlot(QtWidgets.QMainWindow, Ui_MainWindow, QtWidgets.QFileDialog,
                  QtWidgets.QMessageBox, QtWidgets.QInputDialog):
    def __init__(self):
        super(ContourPlot, self).__init__()
        #        super().__init__()
        self.setupUi(self)

        #        self.thread=QThread()

        self.loop1 = ''
        self.saving_dir = r''
        self.newdirect = ''
        self.newname = ''
        self.newtitle = 'x y1 y2 y3 y4'
        self.file_list = []
        self.directory = ''
        self.File = []
        self.basename = ''
        self.dlist = []
        self.header = []
        self.dlength = 0
        self.dwidth = 0
        self.xdata = []
        self.ydata = []
        self.zdata = []
        self.get_matrix_data()

        #        self.Clr.clicked.connect(self.get_matrix_data)
        self.startPlot.clicked.connect(self.update)
        self.OpenFile.clicked.connect(self.open_file)

        self.cm = plt.colormaps()
        self.Cmap.addItems(self.cm)
        #        self.baseName.textChanged.connect(self.get_matrix_data)
        #        self.Xlist.textChanged.connect(self.get_matrix_data)

        self.yGain.returnPressed.connect(self.update_graph)
        self.zGain.returnPressed.connect(self.update_graph)
        self.Ycol.valueChanged.connect(self.update_graph)
        self.Zcol.valueChanged.connect(self.update_graph)

        self.skipRow.returnPressed.connect(self.update)
        self.skipFoot.returnPressed.connect(self.update)
        self.Xlabel.returnPressed.connect(self.update_graph)
        self.Ylabel.returnPressed.connect(self.update_graph)
        self.Zlabel.returnPressed.connect(self.update_graph)
        self.Cmap.currentTextChanged.connect(self.update_graph)

        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111)
        self.fig.tight_layout()
        self.canvas = FigureCanvas(self.fig)
        self.canvas.draw()

        self.toolbar = NavigationToolbar(self.canvas,
                                         self.plot_window,
                                         coordinates=True)
        self.mpl.addWidget(self.toolbar)
        self.mpl.addWidget(self.canvas)

        self.tabWidget.currentChanged.connect(self.change_tab)
        ################################################################################
        self.OpenFile_2.clicked.connect(self.load_files)
        self.file_dic = {}
        self.Clr2.clicked.connect(self.FileList.clear)
        self.startPlot_2.clicked.connect(self.lineplot)
        self.FileList.itemDoubleClicked.connect(self.remove_item)

        self.Xlist_2.returnPressed.connect(self.lineplot)
        self.yGain_2.returnPressed.connect(self.lineplot)
        self.zGain_2.returnPressed.connect(self.lineplot)
        self.Ycol_2.valueChanged.connect(self.lineplot)
        self.Zcol_2.valueChanged.connect(self.lineplot)

        self.skipRow_2.returnPressed.connect(self.lineplot)
        self.skipFoot_2.returnPressed.connect(self.lineplot)
        self.Xlabel_2.returnPressed.connect(self.lineplot)
        self.Ylabel_2.returnPressed.connect(self.lineplot)
#        self.
######################################for contour

    def open_file(self):

        f = self.getOpenFileName()[0]
        if os.path.exists(f):
            self.baseName.setText(f)
            df = pd.read_csv(f, sep=' ', header=0, index_col=False)
            self.shape = df.shape
            #            print(df.shape)
            self.dlength = df.shape[0]
            self.dwidth = df.shape[1]
            self.Ycol.setMaximum(int((self.shape[1]) - 1))
            self.Zcol.setMaximum(int((self.shape[1]) - 1))

    def get_dllist(self):

        code = 'global dlist;dlist={}'.format(self.Xlist.text())
        print(code)
        exec(code)
        global dlist
        print(dlist)
        return dlist

    def get_file(self, basename, dlist):

        basename = str(basename)
        self.File = []
        for i in dlist:
            f = basename.format(i)
            if f != basename and os.path.exists(f):
                self.File.append(f)
        return self.File

    def rmmpl(self):
        self.mpl.removeWidget(self.canvas)
        self.mpl.removeWidget(self.toolbar)
        self.canvas.close()

    def admpl(self, fig):

        self.canvas = FigureCanvas(fig)
        self.mpl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, self, coordinates=True)
        #        self.extend_toolbar()
        self.mpl.addWidget(self.toolbar)
        self.mpl.addWidget(self.canvas)

    def newfig(self):
        fignew = plt.figure()
        return fignew

    def get_header(self):
        df = pd.read_csv(self.File[0],
                         sep=' ',
                         header=0,
                         index_col=False,
                         skiprows=int(self.skipRow.text()))
        return list(df.columns)

    def get_matrix_data(self):

        #        fulld=[]
        self.dlength_new = self.dlength - int(self.skipRow.text())

        self.ydata = []
        self.zdata = []
        basename = self.baseName.toPlainText()
        #        dlist_para=self.Xlist.text().split(',')
        dlist = self.get_dllist()
        File = self.get_file(basename, dlist)

        #        if len(File)!=oldFile:

        for j in range(int(self.dwidth)):

            try:
                self.x = np.zeros((len(File), int(self.dlength_new)))
                self.y = np.zeros((len(File), int(self.dlength_new)))
                self.z = np.zeros((len(File), int(self.dlength_new)))
                for i in range(len(File)):
                    df = pd.read_csv(File[i],
                                     sep=' ',
                                     header=0,
                                     index_col=False,
                                     skiprows=int(self.skipRow.text()))
                    I = df.values[:, j]
                    V = df.values[:, j]

                    self.x[i] = (np.repeat(dlist[i], len(I)))
                    self.y[i] = I
                    self.z[i] = V

            except Exception as error:
                print(error)
                self.x = np.zeros((1, 1))
                self.y = np.zeros((1, 1))
                self.z = np.zeros((1, 1))

            self.ydata.append(self.y)
            self.zdata.append(self.z)

    def pcolormesh(self):

        try:
            self.fig = plt.figure()
            self.ax = self.fig.add_subplot(111)
            self.ax.clear()
            self.rmmpl()
            self.admpl(self.fig)

            try:
                #                skiprow=int(self.skipRow.text())
                #                skipfoot=int(self.skipFoot.text())
                ygain = float(self.yGain.text())
                zgain = float(self.zGain.text())

                cols = (int(self.Ycol.value()), int(self.Zcol.value()))

                self.x1 = self.x
                self.y1 = self.ydata[cols[0]] * ygain
                self.z1 = self.zdata[cols[1]] * zgain

            except Exception as error:
                print(error)
                self.x1 = self.x
                self.y1 = self.y
                self.z1 = self.z

#            cm=cont.get_cmap()
            cont = self.ax.pcolormesh(self.x1,
                                      self.y1,
                                      self.z1,
                                      cmap=self.Cmap.currentText())
            #            plt.colorbar(cont,label='').remove()
            plt.colorbar(cont, fraction=0.05, label=self.Zlabel.text())

            self.ax.set_xlabel(self.Xlabel.text())
            self.ax.set_ylabel(self.Ylabel.text())
            self.canvas.draw()
            self.fig.tight_layout()

        except Exception as error:
            print(error)

    def update(self):

        self.get_matrix_data()
        self.pcolormesh()

    def continuous_update(self):

        if self.Cont.isChecked():
            try:
                self.get_matrix_data()
                self.pcolormesh()
            except:
                pass

    def update_graph(self):
        self.pcolormesh()

################################################for lineplots

    def load_files(self):
        f = self.getOpenFileNames()[0]
        print(f)
        for i in range(len(f)):
            print(f[i])
            indx = os.path.split(f[i])[1]
            self.FileList.addItem(str(indx))
            self.file_dic[indx] = f[i]

    def get_color(self):
        num = int(self.FileList.count())
        print(num)
        if num % 2 == 0:
            return num
        else:
            return num + 1

    def lineplot(self):

        colord = self.get_color()

        colorlist = plt.cm.RdBu_r(np.linspace(0, 1, colord))
        leg = self.leglist()
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111)
        self.ax.clear()
        self.rmmpl()
        self.admpl(self.fig)

        try:
            skiprow = int(self.skipRow_2.text())
            skipfoot = int(self.skipFoot_2.text())
            ygain = float(self.yGain_2.text())
            zgain = float(self.zGain_2.text())
            cols = (int(self.Ycol_2.value()), int(self.Zcol_2.value()))

            for i in range(self.FileList.count()):

                df = pd.read_csv(self.file_dic[self.FileList.item(i).text()],
                                 sep=' ',
                                 header=0,
                                 index_col=False,
                                 skiprows=skiprow,
                                 skipfooter=skipfoot)
                I = df.values[:, cols[0]] * ygain
                V = df.values[:, cols[1]] * zgain

                self.ax.plot(I, V, color=colorlist[i], label=leg[i])

            self.ax.set_xlabel(self.Xlabel_2.text())
            self.ax.set_ylabel(self.Ylabel_2.text())
            self.ax.tick_params(direction='in',
                                length=6,
                                width=1,
                                colors='k',
                                grid_color='r',
                                grid_alpha=0.5)
            self.ax.legend(fontsize=15, ncol=1).set_draggable(True)

            self.canvas.draw()
            self.fig.tight_layout()

        except Exception as error:
            print(error)


#    def get_labels(self):
#        l=self.Xlist_2.text()
#        l='global labels;labels={}'.format(self.Xlist_2.text())

    def remove_item(self):
        self.FileList.takeItem(self.FileList.currentRow())
        self.lineplot()

    def change_tab(self):
        indx = self.tabWidget.currentIndex()
        if indx == 0:
            self.pcolormesh()
        elif indx == 1:
            self.lineplot()

    def leglist(self):

        code = 'global dlist;dlist={}'.format(self.Xlist_2.text())
        print(code)
        exec(code)
        global dlist
        print(dlist)
        return dlist
예제 #48
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
#data_dict stores all loaded data sets
        self.data_dict = {}
        self.mplfigs.itemSelectionChanged.connect(self.changefig)
        self.folderSelect.clicked.connect(self.onSelectFolder)
        self.saveFit.clicked.connect(self.onSaveFit)
        self.cancelFit.clicked.connect(self.onCancelFit)
        self.fitSelectedData.clicked.connect(self.onFit)
        self.fitSelectedData.setEnabled(False)
        self.selectPandasDB.clicked.connect(self.onSelectPandasDB)
        self.QEntry.setValidator(QtGui.QIntValidator(1,1000000)) 
        self.widthEdit.setValidator(QtGui.QIntValidator(1,10000))
        self.widthEdit.setText(str(0))
        self.powerType.setText(str(0))
        self.powerValue.setText(str(0))
        self.QEntry.setText(str(20000))
        self.fNumber.setValue(1)
        self.degeneracySelect.setCurrentIndex(0)
        fig = Figure()
        self.addmpl(fig)
        self.activefig=None
        self.activeDataSet=None
        self.fittingWindow = None
        self.df=pd.DataFrame()
        self.testdf=pd.DataFrame()
        self.onSelectPandasDB()
    
    def onSelectPandasDB(self,):
        """Select a folder, the selected folder will be parsed for sub-folders.
        Each of these subfolders will be turned into a xyData class which is 
        then stored in main with the adddata command"""
        fileDialog=QtGui.QFileDialog(self)
        fileName=fileDialog.getSaveFileName(self,
        "Choose a pandasDB", homedir, filter ="csv (*.csv)")
        self.pathtopandas=fileName
        self.chipEdit.setText(self.pathtopandas)
        print self.pathtopandas
    def onSelectFolder(self,):
        """Select a folder, the selected folder will be parsed for sub-folders.
        Each of these subfolders will be turned into a xyData class which is 
        then stored in main with the adddata command"""
        self.fileDialog=QtGui.QFileDialog(self)
        folderName=self.fileDialog.getExistingDirectory(self,
        "Choose a folder", homedir, QtGui.QFileDialog.ShowDirsOnly)
        for i in os.listdir(folderName):
            if i[-4:] == ".txt":            
                self.adddata(i, xyData(os.path.join(folderName,i)))        
                                    
    def changefig(self, ):
        item=self.mplfigs.currentItem()
        
        if self.activefig==None:
            pass
        else:
            self.activefig.canvas.mpl_disconnect(self.cid)
        if self.fitSelectedData.isEnabled()==True:
            pass
        else:
            self.fitSelectedData.setEnabled(True)        
        
        text = item.text()
        self.rmmpl()
        fig=self.data_dict[text].fig
        self.addmpl(fig)
        self.cid = fig.canvas.mpl_connect('button_press_event', self.onclick)
        try:
            self.widthEdit.setText(str(self.data_dict[text].deviceWid))           
        except ValueError:
            pass
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
        try:
            self.rowEdit.setValue(int(self.data_dict[text].deviceRow))          
        except ValueError:
            pass
        try:
            self.powerType.setText(str(self.data_dict[text].laserPowerType))          
        except ValueError:
            pass
        try:
            self.powerValue.setText(str(self.data_dict[text].laserPower))          
        except ValueError:
            pass
        try:
            self.columnEdit.setValue(int(self.data_dict[text].deviceCol))          
        except ValueError:
            pass
        try:
            ind = self.deviceType.findText(str(self.data_dict[text].deviceType).strip())        
            self.deviceType.setCurrentIndex(ind)          
        except ValueError:
            pass           
        self.activefig=fig
        self.activeDataSet=self.data_dict[text]

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, self.mplwindow, coordinates=True)
        self.mplvl.addWidget(self.toolbar)
    
    def rmmpl(self,):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
#        self.activefig.canvas.mpl_disconnect(self.cid)
    
#This has to be modified for data types other than a ZI data input
    def adddata(self, name, xyDataClass):
        self.data_dict[name] = xyDataClass
        self.mplfigs.addItem(name)
    
#Clcik on active MPL window    
    def onclick(self, event):
#        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(event.button, event.x, event.y, event.xdata, event.ydata)
        print self.activeDataSet.find_nearestx(event.xdata)
#gca can get limits of zoomed widow
    def onFit(self,):
        self.disableForFit()
    
    def fitClick(self, event):
        self.cancelFit.setEnabled(True)
        print 'clicked'
        self.activefig.canvas.mpl_disconnect(self.cid)
        xi,xf = self.activeDataSet.fig.gca().get_xlim()
        xi, xvi = self.activeDataSet.find_nearestx(xi)
        xf, xvf = self.activeDataSet.find_nearestx(xf)
# General to this point, actual fit can vary below        
        x0 = event.xdata
        y0 = event.ydata        
        Q = float(self.QEntry.text())
        sigma=1/(2*Q)
        print xi,xf, [x0,y0,sigma]
        ip=[x0,y0,sigma]
        print self.activeDataSet
        out, params, outp, self.paramsp, dout = self.activeDataSet.fitDataSelection(xi,xf,ip)
        self.outfit=out
        self.currpars=params
        self.fitfig=Figure()
        ax=self.fitfig.add_subplot(1,1,1)
        axt=ax.twinx()
        ax.plot(self.activeDataSet.data.f[xi:xf+1], out.best_fit)
        axt.plot(dout[0], outp.best_fit, 'g')
        ax.plot(self.activeDataSet.data.f[xi:xf+1], self.activeDataSet.data.r[xi:xf+1], 'ro')
        axt.plot(dout[0], dout[1], 'go')
        idx=min(range(len(self.activeDataSet.data.f)), key=lambda x: abs(self.activeDataSet.data.f[x]-params[0]))
        ax.annotate('Q = '+ str(params[3]) + '\n' + 'w_0 = '+ str(params[0]), xy=(params[0],self.activeDataSet.data.r[idx]), textcoords = 'data', xycoords='data')
        self.rmmpl()
        self.addmpl(self.fitfig)
        self.activeFitParams = params
        self.saveFit.setEnabled(True)

#        plt.text(2, 0.65,'Q = '+ str(params[3]), fontdict=font)

    def disableForFit(self,):
        self.mplfigs.setEnabled(False)
        self.fitSelectedData.setEnabled(False)
        self.folderSelect.setEnabled(False)
        self.activefig.canvas.mpl_disconnect(self.cid)
        self.cid =self.activefig.canvas.mpl_connect('button_press_event', self.fitClick)

    def enableAfterFit(self,):
        self.toolbar.setEnabled(True)
        self.mplfigs.setEnabled(True)
        self.fitSelectedData.setEnabled(True)
        self.folderSelect.setEnabled(True)
        self.activefig.canvas.mpl_disconnect(self.cid)
        self.rmmpl()
        self.addmpl(self.activefig)
        self.cid =self.activefig.canvas.mpl_connect('button_press_event', self.onclick)
    def onSaveFit(self,):
        self.w0=self.activeFitParams[0]
        self.A=self.activeFitParams[1]
        self.Q=self.activeFitParams[3]
        self.lineInt=self.activeFitParams[4]
        self.lineSlope=self.activeFitParams[5]
        self.saveFit.setEnabled(False)
        self.cancelFit.setEnabled(False)
        curridx=self.mplfigs.currentItem().text()+'_'+str(self.fNumber.value())+'_' + self.degeneracySelect.currentText()        
        newrow=self.prepareDFRow(curridx)
        try:        
            master=pd.read_csv(self.pathtopandas, index_col=0)
            if curridx not in self.testdf.index:
                newmaster=master.append(newrow)
                print newmaster                
                newmaster.to_csv(self.pathtopandas[:-4]+'temp.csv')
                os.remove(self.pathtopandas)
                os.rename(self.pathtopandas[:-4]+'temp.csv',self.pathtopandas)
                
            else:
                print 'repeated fit'
        except IOError:
            newrow.to_csv(self.pathtopandas)
        self.enableAfterFit()
    def prepareDFRow(self, idx):
        df = pd.DataFrame({'Run Name' : self.mplfigs.currentItem().text(), 'Device Name' : self.chipEdit.text(), 'Row Number' : \
            self.rowEdit.value(), 'Column Number' : self.columnEdit.value(),\
            'Device Type' : self.deviceType.currentText(), 'Device Width' : \
                self.widthEdit.text(), 'Mode Order' : self.fNumber.value(), \
                'Mode Type': self.degeneracySelect.currentText(), 'Frequency' : self.w0, 'Amplitude' : self.A, \
                'Q' : self.Q, 'Bad Fit' : self.selectBadFit.checkState(), 'Power Measurement Type' : self.powerType.text(), 'Power (uW)' : self.powerValue.text(),\
                'Fit Notes' : self.fitNotes.text(), 'Date' : self.activeDataSet.date, 'Intercept': self.lineInt, 'Slope':self.lineSlope, 'w0p': self.paramsp[0],'Qp': self.paramsp[1],'pm': self.paramsp[2],'pb': self.paramsp[3]}, index=[idx] )
        return df
    def onCancelFit(self,):
        self.saveFit.setEnabled(False)
        self.cancelFit.setEnabled(False)
        self.enableAfterFit()
예제 #49
0
class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.SetFormInitialValues()

    def AddPlot(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas,
                                         self.mplwindow,
                                         coordinates=True)
        self.mplvl.addWidget(self.toolbar)

    def RemovePlot(self, ):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()

    def SetFormInitialValues(self):
        self.mplwindow.setStyleSheet("border: 1px solid black")
        self.fig = 0
        self.A_text.setText("1")
        self.B_text.setText("0")
        self.C_text.setText("-1")
        self.f_text.setText("x")
        self.from_Box.setValue(0)
        self.to_Box.setValue(1)
        self.phi_0_text.setText("2*x")
        self.StringPolynomial_text.setText("(x**i)*(1-x)")
        self.N_spinBox.setValue(3)
        self.GoButton.clicked.connect(self.ProcessForm)

    def ProcessForm(self):
        StringResult = ""

        # N is the number of partitions
        N = int(self.N_spinBox.value())
        # Define the variables
        x = smp.symbols('x')
        A = smp.sympify(str(self.A_text.toPlainText()))
        B = smp.sympify(str(self.B_text.toPlainText()))
        C = smp.sympify(str(self.C_text.toPlainText()))
        f = smp.sympify(str(self.f_text.toPlainText()))

        from_ = self.from_Box.value()
        to_ = self.to_Box.value()

        Coefficients_ = []
        Equations_ = []

        # Define phi_0
        phi_0 = str(self.phi_0_text.toPlainText())
        # Define function for phi in each partition node
        StringPolynomial = str(self.StringPolynomial_text.toPlainText())

        ExpressionString = []
        CoefficientsString = ""

        for i in xrange(1, N + 1):
            CoefficientsString += "c_" + str(i) + " "
            ExpressionString.append(
                ("c_i * " + StringPolynomial).replace("i", str(i)))

        Coefficients_ = smp.S(CoefficientsString.strip().split())

        # Join the string with a plus character
        ExpressionString = " + ".join(map(str, ExpressionString))

        # Append phi_0 to U(x)
        U = smp.sympify(phi_0) + smp.sympify(ExpressionString)
        U_first_derivative = smp.diff(U, x)
        U_second_derivative = smp.diff(U_first_derivative, x)

        # Define the Residual function R(x)
        R = A * U_second_derivative + B * U_first_derivative + C * U - f

        StringResult += "Residual function:\n" + str(R) + "\n\n"
        self.console_text.setText(StringResult)

        # Integrals
        for i in xrange(1, N + 1):
            # Set the power
            f = StringPolynomial.replace("i", str(i))
            f = smp.sympify(f)

            Integral = smp.integrate(f * R, (x, from_, to_))
            Equations_.append(smp.Eq(Integral, 0))

        # Solve the system of equations
        SolutionVector = smp.solve(Equations_, Coefficients_)

        # Set the coefficients in the U function
        for i in xrange(0, N):
            U = U.subs(Coefficients_[i], SolutionVector[Coefficients_[i]])

        StringResult += "U function:\n" + str(U) + "\n\n"
        self.console_text.setText(StringResult)

        # this converts thye sympy function into a numpy function
        U = smp.lambdify((x), U, "numpy")

        # Frome here the function U is callable as we are used
        X = np.linspace(from_, to_, num=100)
        Y = U(X)

        self.console_text.setText(StringResult)

        # Plot the result
        #plt.plot(X, Y);
        #plt.show();
        if self.fig != 0:
            self.RemovePlot()

        self.fig = Figure()
        ax1f1 = self.fig.add_subplot(111)
        ax1f1.plot(X, Y)
        self.AddPlot(self.fig)
예제 #50
0
class FieldStatsDialog(QtGui.QDialog, FORM_CLASS):

    SETTINGS_ROOT = 'fieldstats/'
    SETTINGS_LAYER = 'layer'
    SETTINGS_FIELD = 'field'
    SETTINGS_NUM_DECIMALS = 'num_decimals'
    SETTINGS_PERCENTILES = 'percentiles'
    SETTINGS_CREATE_UNIQUE = 'create_unique'
    SETTINGS_SELECTED_ONLY = 'selected_only'
    SETTINGS_GRAPH_TYPE = 'graph_type'
    SETTINGS_GRAPH_SORT = 'graph_sort'
    SETTINGS_GRAPH_SCALE = 'graph_scale'
    SETTINGS_GRAPH_COLOR = 'graph_color'
    SETTING_ANTILOG_LABELS = 'antilog_labels'

    MAX_PIE_SLICES = 5

    NO_GRAPH_EMPTY_FIELD = 0
    NO_GRAPH_UNIQUE_LIST_NOT_CHECKED = 1

    TRANSFORM_NONE = 0
    TRANSFORM_LOG10 = 1

    def __init__(self, parent=None):
    #---------------------------------------------------------------------------
        """
        Constructor.
        """
        super(FieldStatsDialog, self).__init__(parent)
        self.setupUi(self)
        self.data = None
        self.reload_layers()
        self.reload_fields()
        self.comboLayer.currentIndexChanged.connect(self.reload_fields)
        self.pushButtonClose.clicked.connect(self.close)
        self.pushButtonRefresh.clicked.connect(self.refresh)

        self.pushButtonNextField.clicked.connect(self.next_field)
        self.pushButtonPreviousField.clicked.connect(self.previous_field)

        self.pushButtonQuartiles.clicked.connect(self.quartiles)
        self.pushButton10Percent.clicked.connect(self.percent10)
        self.pushButton5Percent.clicked.connect(self.percent5)
        self.pushButtonHighEnd.clicked.connect(self.high_end)

        self.comboBoxGraphType.currentIndexChanged.connect(self.refreshPlot)
        self.comboBoxGraphSort.currentIndexChanged.connect(self.refreshPlot)
        self.comboBoxGraphScale.currentIndexChanged.connect(self.refreshPlot)
        self.pushButtonGraphOptions.clicked.connect(self.changeGraphOptions)

        icon_path = ':/plugins/FieldStats/copy16px.png'
        copy_icon = QtGui.QPixmap(icon_path)
        self.toolButtonCopyGraphToClipboard.setIcon(QtGui.QIcon(copy_icon))
        self.toolButtonCopyGraphToClipboard.setToolTip('Copy graph to the clipboard.')
        self.toolButtonCopyGraphToClipboard.clicked.connect(self.copyGraphToClipboard)

        # self.progressBar.hide()
        self.progressBar.reset()

        style = "alternate-background-color:#F6F6F6;background-color:white;selection-background-color:#FFEB7A;selection-color:black;"

        self.tableField.horizontalHeader().setStretchLastSection(True)
        self.tableField.setColumnWidth(0, 200)
        self.tableField.setStyleSheet(style)

        self.tableStatistics.horizontalHeader().setStretchLastSection(True)
        self.tableStatistics.setColumnWidth(0, 250)
        self.tableStatistics.setStyleSheet(style)

        self.tableUnique.horizontalHeader().setStretchLastSection(True)
        self.tableUnique.setColumnWidth(0, 300)
        self.tableUnique.setColumnWidth(1, 100)
        self.tableUnique.setStyleSheet(style)

        self.lineEditNumDecimals.setText('2')
        self.checkUseSelected.setChecked(True)
        self.checkBoxCreateUnique.setChecked(True)
        self.quartiles()
        #
        # ----- graph default labels
        #
        self.title = None
        self.field_label = None
        self.graph_last_field = None
        self.graph_colors = GraphOptionsDialog.COLOR_SET_DEFAULT
        self.antilog_labels = True
        #
        # ----- add matplotlib figure to dialog
        #
        self.figure_area = Figure(facecolor='white')
        self.plot = self.figure_area.add_subplot(111)
        # # self.figure_area.subplots_adjust(left=0.125, right=0.9, bottom=0.1, top=0.9)
        self.figure_area.subplots_adjust(left=0.13, right=0.91, bottom=0.15, top=0.88)
        self.canvas = FigureCanvas(self.figure_area)
        self.graphLayout.addWidget(self.canvas)
        self.canvas.draw()

        self.read_defaults()

    def read_default_combo(self, setting, combo_box):
    #---------------------------------------------------------------------------
        """
        Read saved settings for a comboBox control and properly restore by
        setting the current index and text values.

        :param setting: The setting to restore, typically from a constant string.
        :type setting: str

        :param combo_box: The comboBox control to restore the settings to.
        :type combo_box: QComboBox
        """
        s = QSettings()
        str = s.value(self.SETTINGS_ROOT + setting)
        if str != None:
            index = combo_box.findText(str, Qt.MatchFixedString)
            if index >= 0:
                combo_box.setEditText(str)
                combo_box.setCurrentIndex(index)

    def read_defaults(self):
    #---------------------------------------------------------------------------
        """
        Read and restore saved default settings.
        """
        s = QSettings()
        str = s.value(self.SETTINGS_ROOT + self.SETTINGS_NUM_DECIMALS)
        if str != None: self.lineEditNumDecimals.setText(str)
        str = s.value(self.SETTINGS_ROOT + self.SETTINGS_PERCENTILES)
        if str != None: self.lineEditPercentiles.setText(str)
        str = s.value(self.SETTINGS_ROOT + self.SETTINGS_GRAPH_COLOR)
        if str != None: self.graph_colors = str
        val = s.value(self.SETTINGS_ROOT + self.SETTINGS_CREATE_UNIQUE)
        if val != None: self.checkBoxCreateUnique.setChecked(val)
        val = s.value(self.SETTINGS_ROOT + self.SETTINGS_SELECTED_ONLY)
        if val != None: self.checkUseSelected.setChecked(val)
        val = s.value(self.SETTINGS_ROOT + self.SETTING_ANTILOG_LABELS)
        if val != None: self.antilog_labels = val
        self.read_default_combo(self.SETTINGS_LAYER, self.comboLayer)
        self.read_default_combo(self.SETTINGS_FIELD, self.comboField)
        self.read_default_combo(self.SETTINGS_GRAPH_TYPE, self.comboBoxGraphType)
        self.read_default_combo(self.SETTINGS_GRAPH_SORT, self.comboBoxGraphSort)
        self.read_default_combo(self.SETTINGS_GRAPH_SCALE, self.comboBoxGraphScale)

    def save_defaults(self):
    #---------------------------------------------------------------------------
        """
        Save settings so they can be restored each time the plugin starts.
        """
        s = QSettings()
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_NUM_DECIMALS, self.lineEditNumDecimals.text())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_PERCENTILES, self.lineEditPercentiles.text())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_CREATE_UNIQUE, self.checkBoxCreateUnique.isChecked())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_SELECTED_ONLY, self.checkUseSelected.isChecked())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_LAYER, self.comboLayer.currentText())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_FIELD, self.comboField.currentText())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_GRAPH_TYPE, self.comboBoxGraphType.currentText())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_GRAPH_SORT, self.comboBoxGraphSort.currentText())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_GRAPH_SCALE, self.comboBoxGraphScale.currentText())
        s.setValue(self.SETTINGS_ROOT + self.SETTINGS_GRAPH_COLOR, self.graph_colors)
        s.setValue(self.SETTINGS_ROOT + self.SETTING_ANTILOG_LABELS, self.antilog_labels)

    def percentiles(self, step):
    #---------------------------------------------------------------------------
        """
        Setup a comma delimited list of percentile breakpoints.

        :param step: Incremental step between percentile values.
            For example 10 for values every 10%.
        :type step: integer

        :returns: A string, for example '25, 50, 75' for a step of 25.
        :rtype: str
        """
        delimiter = ''
        str = ''
        for i in range(step, 100, step):
            str += "{}{}".format(delimiter, i)
            delimiter = ', '
        self.lineEditPercentiles.setText(str)
        # self.lineEditPercentiles.setCursorPosition(0)

    def quartiles(self):
    #---------------------------------------------------------------------------
        """
        Setup default quartiles.
        """
        self.percentiles(25)

    def percent10(self):
    #---------------------------------------------------------------------------
        """
        Setup default percentiles every 10%.
        """
        self.percentiles(10)

    def percent5(self):
    #---------------------------------------------------------------------------
        """
        Setup default percentiles every 5%.
        """
        self.percentiles(5)

    def high_end(self):
    #---------------------------------------------------------------------------
        """
        Setup selected high-end percentiles.  These are tailored to create
        four bins of geochemical data.
        """
        self.lineEditPercentiles.setText('50, 80, 95')

    def reload_layers(self):
    #---------------------------------------------------------------------------
        """
        Load the current list of layers into the layers comboBox control.
        """
        self.comboLayer.clear()
        self.comboLayer.addItems(FieldStatsHelper.get_vector_layer_names())

    def reload_fields(self):
    #---------------------------------------------------------------------------
        """
        Load the current list of fields into the fields comboBox control.
        """
        self.comboField.clear()
        layer = FieldStatsHelper.get_vector_layer_by_name(self.comboLayer.currentText())
        if layer != None:
            self.comboField.addItems(FieldStatsHelper.get_field_names(layer, [QVariant.String, QVariant.Int, QVariant.Double]))

    def goto_field(self, field):
    #---------------------------------------------------------------------------
        """
        Goto a specific field and calculate stats.

        :param field: The name of the field to goto.
        :type field: str
        """
        if field != None:
            index = self.comboField.findText(field, Qt.MatchFixedString)
            if index >= 0:
                self.comboField.setEditText(field)
                self.comboField.setCurrentIndex(index)
                self.title = None
                self.refresh()

    def next_field(self):
    #---------------------------------------------------------------------------
        """
        Goto the next field in the table and calculate stats.  This is circular
        so if you advance past the end go back to the beginning.
        """
        field = FieldStatsHelper.get_next_field(FieldStatsHelper.get_vector_layer_by_name(self.comboLayer.currentText()),
                                                    self.comboField.currentText())
        self.goto_field(field)

    def previous_field(self):
    #---------------------------------------------------------------------------
        """
        Goto the previous field in the table and calculate stats.  This is circular
        so if you advance past the beginning go back to the end.
        """
        field = FieldStatsHelper.get_previous_field(FieldStatsHelper.get_vector_layer_by_name(self.comboLayer.currentText()),
                                                    self.comboField.currentText())
        self.goto_field(field)

    def refresh(self):
    #---------------------------------------------------------------------------
        """
        """
        self.save_defaults()
        # self.progressBar.show()
        layer = FieldStatsHelper.get_vector_layer_by_name(self.comboLayer.currentText())
        self.data = FieldStatsData(layer, self.comboField.currentText(), self.checkUseSelected.isChecked())
        self.data.num_decimals = int(self.lineEditNumDecimals.text())
        self.data.createUniqueList = self.checkBoxCreateUnique.isChecked()
        self.data.rangeChanged.connect(self.setProgressRange)
        self.data.updateProgress.connect(self.updateProgress)
        self.data.processFinished.connect(self.processFinished)
        self.data.processInterrupted.connect(self.processInterrupted)

        plist = self.lineEditPercentiles.text().split(',')
        if len(plist) > 0:
            for i in xrange(len(plist)):
                p = float(plist[i])
                if p >= 0.0 and p <= 100.0:
                    self.data.percentilesArray.append(p)

        # self.btnOk.setEnabled(False)
        # self.btnClose.setText(self.tr("Cancel"))
        # self.buttonBox.rejected.disconnect(self.reject)
        # self.btnClose.clicked.connect(self.stopProcessing)

        # self.pushButtonNextField.hide()
        # self.pushButtonPreviousField.hide()

        # QtGui.QMessageBox.information(None, "DEBUG:", 'Process about to start.')
        self.data.start()

    def setProgressRange(self, maxValue):
        self.progressBar.setRange(0, maxValue)

    def updateProgress(self):
        self.progressBar.setValue(self.progressBar.value() + 1)

    def processFinished(self):
    #---------------------------------------------------------------------------
        """

        """
        self.stopProcessing()
        self.tableField.clearContents()
        self.tableStatistics.clearContents()
        self.tableUnique.clearContents()
        self.tableField.setRowCount(0)
        self.tableStatistics.setRowCount(0)
        self.tableUnique.setRowCount(0)
        #
        # ----- put field metadata in the field table
        #
        if self.data != None and len(self.data.fieldArray) > 0:
            rowCount = len(self.data.fieldArray)
            self.tableField.setRowCount(rowCount)
            for i in xrange(rowCount):
                label = self.data.fieldArray[i][0]
                if (i == 1): label += (', ' + FieldStatsHelper.get_field_index_desc(
                        FieldStatsHelper.get_vector_layer_by_name(self.comboLayer.currentText()),
                        self.comboField.currentText()))
                item = QtGui.QTableWidgetItem(label)
                self.tableField.setItem(i, 0, item)
                item = QtGui.QTableWidgetItem(str(self.data.fieldArray[i][1]))
                self.tableField.setItem(i, 1, item)
            self.tableField.resizeRowsToContents()
        #
        # ----- put statistics in the stats table
        #
        if self.data != None and len(self.data.statsArray) > 0:
            rowCount = len(self.data.statsArray)
            self.tableStatistics.setRowCount(rowCount)
            for i in xrange(rowCount):
                label = self.data.statsArray[i][0]
                item = QtGui.QTableWidgetItem(label)
                self.tableStatistics.setItem(i, 0, item)
                item = QtGui.QTableWidgetItem(str(self.data.statsArray[i][1]))
                self.tableStatistics.setItem(i, 1, item)
                # if (i == 0): self.tableStatistics.setSpan(i, 0, 1, 2)
            self.tableStatistics.resizeRowsToContents()
        #
        # ----- header at the top of selected tables
        #
        header = self.comboField.currentText() + ', ' + FieldStatsHelper.get_field_index_desc(
                        FieldStatsHelper.get_vector_layer_by_name(self.comboLayer.currentText()),
                        self.comboField.currentText(), 'Field ')
        self.labelStatisticsHeader.setText(header)
        if self.data != None and len(self.data.uniqueArray) > 0:
            header += ', {} Unique Item(s)'.format(len(self.data.uniqueArray))
        self.labelUniqueHeader.setText(header)
        #
        # ----- put unique items list in the table if applicable
        #
        if self.data != None and len(self.data.uniqueArray) > 0:
            self.tableUnique.setSortingEnabled(False)
            rowCount = len(self.data.uniqueArray)
            self.tableUnique.setRowCount(rowCount)
            for i in xrange(rowCount):

                if self.data.is_text_field:
                    item = QtGui.QTableWidgetItem(self.data.uniqueArray[i][0])
                    self.tableUnique.setItem(i, 0, item)
                else:
                    item = FloatTableWidgetItem(self.data.uniqueArray[i][0])
                    self.tableUnique.setItem(i, 0, item)

                item = QtGui.QTableWidgetItem()
                item.setData(Qt.DisplayRole, self.data.uniqueArray[i][1])
                self.tableUnique.setItem(i, 1, item)

                item = QtGui.QTableWidgetItem()
                item.setData(Qt.DisplayRole, self.data.uniqueArray[i][2])
                self.tableUnique.setItem(i, 2, item)
            self.tableUnique.setSortingEnabled(True)
            self.tableUnique.resizeRowsToContents()

        if self.tabWidget.currentIndex() == 0:
            self.tabWidget.setCurrentIndex(2)

        self.refreshPlot()
        self.progressBar.reset()

        # self.progressBar.hide()
        # self.pushButtonNextField.show()
        # self.pushButtonPreviousField.show()

    def parseColors(self, colors_str):
    #---------------------------------------------------------------------------
        """
        Parse a string of colors into an array of colors.
        """
        color_list = colors_str.split(',')
        if len(color_list) == 0:
            color_list = GraphOptionsDialog.COLOR_SET_DEFAULT.split(',')
        color_array = []
        for color in color_list:
            color_array.append(color.strip(" '").strip('"'))
        return color_array

    @staticmethod
    def log10ScaleFormatter(n, pos):
    #---------------------------------------------------------------------------
        """
        """
        v = pow(10, n)
        # Find the number of decimal places required
        decimalplaces = int(np.maximum(-np.log10(v),0))     # =0 for numbers >=1
        # Insert that number into a format string
        formatstring = '{{:.{:1d}f}}'.format(decimalplaces)
        # Return the formatted tick label
        return formatstring.format(v)

    def setCommonPlotOptions(self, transform):
    #---------------------------------------------------------------------------
        """
        """
        self.plot.set_aspect('auto')
        if transform == self.TRANSFORM_LOG10 and self.antilog_labels:
            self.plot.xaxis.set_major_formatter(ticker.FuncFormatter(self.log10ScaleFormatter))

    def refreshPlot(self):
    #---------------------------------------------------------------------------
        no_graph_reason = self.NO_GRAPH_EMPTY_FIELD
        self.save_defaults()
        #
        # ----- set transform type if applicable
        #
        transform = self.TRANSFORM_NONE
        if self.comboBoxGraphScale.currentText() == 'Log Transform':
            transform = self.TRANSFORM_LOG10
        #
        # ----- completely clear previous plot
        #       seems like overkill, but only way I know to do this right now
        #
        if self.canvas != None:
            self.graphLayout.removeWidget(self.canvas)
            self.canvas.close()
        #
        # ----- setup new plot from scratch
        #
        self.figure_area = Figure(facecolor='white')
        self.plot = self.figure_area.add_subplot(111)
        # self.figure_area.subplots_adjust(left=0.125, right=0.9, bottom=0.1, top=0.9)
        if self.comboBoxGraphType.currentText() == 'Pie Chart':
            self.figure_area.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.8)
        else:
            self.figure_area.subplots_adjust(left=0.13, right=0.91, bottom=0.15, top=0.88)
        self.canvas = FigureCanvas(self.figure_area)
        self.graphLayout.addWidget(self.canvas)
        # self.canvas.draw()

        if not self.data:
            self.plot.axis('off')
            self.canvas.draw()
            return
        data = None

        colorsArray = self.parseColors(self.graph_colors)

        #
        # ----- graph title
        #
        if self.title == None or self.graph_last_field != self.comboField.currentText():
            self.title = self.comboField.currentText() + ' ' + \
                         self.tr("from") + ' ' + self.comboLayer.currentText()
        self.plot.set_title(unicode(self.title))
        title_obj = self.plot.title
        title_obj.set_position([.5, 1.02])
        #
        # ----- field label
        #
        if self.field_label == None or self.graph_last_field != self.comboField.currentText():
            self.field_label = self.comboField.currentText()
            if self.data.is_text_field: self.field_label += ', ' + self.tr('Length')
        self.graph_last_field = self.comboField.currentText()
        #
        # ----- data to graph
        #
        if self.comboBoxGraphType.currentText() == 'Pie Chart':
            if self.checkBoxCreateUnique.isChecked() and len(self.data.uniqueArray) > 0:
                data = []
                labelArray = []
                num_unique_items = len(self.data.uniqueArray)
                for i in range(0, num_unique_items):
                    if i < self.MAX_PIE_SLICES:
                        data.append(self.data.uniqueArray[i][1])
                        labelArray.append(self.data.uniqueArray[i][0])
                    else:
                        if i == self.MAX_PIE_SLICES:
                            data.append(self.data.uniqueArray[i][1])
                            labelArray.append('Other')
                        else:
                            data[self.MAX_PIE_SLICES] += self.data.uniqueArray[i][1]
            else:
                if not self.checkBoxCreateUnique.isChecked():
                    no_graph_reason = self.NO_GRAPH_UNIQUE_LIST_NOT_CHECKED
        else:
            if transform == self.TRANSFORM_LOG10:
                if self.data.min <= 0:
                    t1 = []
                    for i in xrange(len(self.data.dataArray)):
                        t1.append(self.data.dataArray[i] + (abs(self.data.min) + 1))
                    data = np.log10(t1)
                else:
                    data = np.log10(self.data.dataArray)
            else:
                data = np.copy(self.data.dataArray)
        #
        #
        #
        if self.comboBoxGraphType.currentText() == 'Line Graph' or self.comboBoxGraphType.currentText() == 'Scatter Plot':
            if self.comboBoxGraphSort.currentText() == 'Ascending':
                data = sorted(data)
            elif self.comboBoxGraphSort.currentText() == 'Descending':
                data = sorted(data, reverse=True)
        #
        #
        #
        if data != None and len(data) > 0:
            if self.comboBoxGraphType.currentText() == 'Line Graph':
                self.plot.grid(True)
                self.plot.plot(np.arange(1,len(data)+1), data, "-", color=colorsArray[0], alpha=1.0, linewidth=1.5) # alpha=0.70
                self.plot.set_ylabel(unicode(self.field_label))
                self.plot.set_xlabel('')
                self.plot.set_xlim([1,len(data)+1])
                self.plot.grid(b=True, which='major', color='lightgrey', linestyle='-')
                self.plot.set_aspect('auto')
                if transform == self.TRANSFORM_LOG10 and self.antilog_labels:
                    self.plot.yaxis.set_major_formatter(ticker.FuncFormatter(self.log10ScaleFormatter))
            elif self.comboBoxGraphType.currentText() == 'Scatter Plot':
                self.plot.grid(True)
                self.plot.plot(np.arange(1,len(data)+1), data, "o", color=colorsArray[0], alpha=1.0) # alpha=0.70
                self.plot.set_ylabel(unicode(self.field_label))
                self.plot.set_xlabel('')
                self.plot.set_xlim([1,len(data)+1])
                self.plot.grid(b=True, which='major', color='lightgrey', linestyle='-')
                self.plot.set_aspect('auto')
                if transform == self.TRANSFORM_LOG10 and self.antilog_labels:
                    self.plot.yaxis.set_major_formatter(ticker.FuncFormatter(self.log10ScaleFormatter))
            elif self.comboBoxGraphType.currentText() == 'Histogram':
                self.plot.grid(False)
                self.plot.hist(data, 35, facecolor=colorsArray[0], alpha=1.0) # alpha=0.50
                self.plot.set_xlabel(unicode(self.field_label))
                self.plot.set_ylabel(unicode(self.tr("Frequency")))
                self.plot.set_aspect('auto')
                if transform == self.TRANSFORM_LOG10 and self.antilog_labels:
                    self.plot.xaxis.set_major_formatter(ticker.FuncFormatter(self.log10ScaleFormatter))
            elif self.comboBoxGraphType.currentText() == 'Pie Chart':
                _, _, autotexts = self.plot.pie(data, labels=labelArray, colors=colorsArray, autopct='%1.1f%%')

                wedges = [patch for patch in self.plot.patches if isinstance(patch, matplotlib.patches.Wedge)]
                for pie_wedge in wedges:
                    pie_wedge.set_edgecolor('white')

                # for autotext in autotexts:
                #     autotext.set_color('white')

                for t in autotexts:
                    t.set_size('small')

                self.plot.set_aspect('equal')
            # self.plot.set_ylabel(unicode(self.comboField.currentText()))
            # self.plot.set_xlabel(unicode(self.tr("Row")))
            # self.figure_area.autofmt_xdate()
            self.canvas.draw()
        else:
            self.plot.cla()
            self.plot.axis('off')
            if no_graph_reason == self.NO_GRAPH_EMPTY_FIELD:
                message = self.comboField.currentText() + ' is empty.'
            elif no_graph_reason == self.NO_GRAPH_UNIQUE_LIST_NOT_CHECKED:
                message = 'Check option to create a unique list.'
            else:
                message = 'Unable to Create Graph'
            self.plot.text(0.5, 0.5, unicode(message), ha='center', va='center', fontsize=20,
                           transform=self.plot.transAxes)
            self.figure_area.subplots_adjust(left=0.1, right=0.9, bottom=0.25, top=0.75)
            self.canvas.draw()

    def changeGraphOptions(self):
    #---------------------------------------------------------------------------
        """
        Display the dialog to change graph options.
        """
        dlg = GraphOptionsDialog(self)
        dlg.lineEditTitle.setText(self.title)
        dlg.lineEditFieldLabel.setText(self.field_label)
        dlg.lineEditColor.setText(self.graph_colors)
        dlg.checkBoxAntilogLabels.setChecked(self.antilog_labels)
        #
        # ----- show dialog and change graph is accepted
        #
        if dlg.exec_() == QtGui.QDialog.Accepted:
            if dlg.lineEditFieldLabel.text() != self.field_label or \
                            dlg.lineEditColor.text() != self.graph_colors or \
                            dlg.checkBoxAntilogLabels.isChecked() != self.antilog_labels:
                self.field_label = dlg.lineEditFieldLabel.text()
                self.title = dlg.lineEditTitle.text()
                self.graph_colors = dlg.lineEditColor.text()
                self.antilog_labels = dlg.checkBoxAntilogLabels.isChecked()
                self.refreshPlot()
            elif dlg.lineEditTitle.text() != self.title:
                self.title = dlg.lineEditTitle.text()
                self.plot.set_title(unicode(self.title))
                self.canvas.draw()

    def copyGraphToClipboard(self):
    #---------------------------------------------------------------------------
        pixmap = QtGui.QPixmap.grabWidget(self.canvas)
        QtGui.QApplication.instance().clipboard().setPixmap(pixmap)

    def processInterrupted(self):
    #---------------------------------------------------------------------------
        self.restoreGui()

    def stopProcessing(self):
    #---------------------------------------------------------------------------
        if self.data is not None:
            self.data.stop()
            # self.data = None

    def restoreGui(self):
    #---------------------------------------------------------------------------
        #self.progressBar.setFormat("%p%")
        #self.progressBar.setRange(0, 1)
        #self.progressBar.setValue(0)
        self.progressBar.reset()
예제 #51
0
class CoLocation(QMainWindow, Ui_MainWindow):
    flag = True
    categories = {}
    valid_images = ["jpg", "png", "tga", "pgm", "jpeg"]
    valid_videos = ["mp4", "avi"]
    edge_threshold = 100
    to_disp = []
    stop = False
    framerate = 20
    export_name = ''

    def __init__(self, ):
        super(
            CoLocation,
            self).__init__()  #initialise from the ui designed by Designer App
        self.setupUi(self)
        self.setupUi_custom()
        Help = QtGui.QAction(QtGui.QIcon('images/info.png'), 'Help', self)
        Help.triggered.connect(self.show_help)

        Settings = QtGui.QAction(QtGui.QIcon('images/settings.png'),
                                 'Settings', self)
        Settings.triggered.connect(self.show_settings)

        Export = QtGui.QAction(QtGui.QIcon('images/export.png'), 'Export',
                               self)
        Export.triggered.connect(self.show_export)

        ##To set up the toolbar
        self.toolbar = self.addToolBar('Help')
        self.toolbar.addAction(Help)
        self.toolbar = self.addToolBar('Settings')
        self.toolbar.addAction(Settings)
        self.toolbar = self.addToolBar('Export')
        self.toolbar.addAction(Export)

    def show_help(self):
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        msg.setText("Co-Location Visualisation")
        f = open('How-To/how-to-Co-Location.txt', 'r')
        msg.setInformativeText(
            "Developed by Yash Chandak, under supervision of Prof. Babiga Birregah, University of Technology, Troyes"
        )
        msg.setWindowTitle("About Us")
        msg.setDetailedText(f.read())
        msg.setStandardButtons(QMessageBox.Ok)
        msg.exec_()

    def show_settings(self):
        framerate, ok = QtGui.QInputDialog.getInt(
            self, 'Settings', 'Enter Frame Rate for Videos:')
        self.framerate = framerate

    def show_export(self):
        name, ok = QtGui.QInputDialog.getText(self, 'Export to Gephi format',
                                              'Enter file name :')
        self.export_name = name + '.gefx'

    def update_categories(self):
        #update selected categories
        for radiobox in self.findChildren(QtGui.QRadioButton):
            self.categories[radiobox.text()] = radiobox.isChecked()

    def setupUi_custom(self, ):
        self.scene = QGraphicsScene()
        self.scene2 = QGraphicsScene()
        self.pushButton.clicked.connect(self.selectFile)
        self.horizontalSlider.valueChanged.connect(self.updateLCD)
        self.pushButton_2.clicked.connect(self.disp_graph)
        self.pushButton_3.clicked.connect(self.selectFile_from_folder)
        self.stop_button.clicked.connect(self.set_stop)
        #TODO [WEIRD PROBLEM] QPixmap needs to be called at least once with JPG image before tensorFlow, otherwise program crashes
        self.scene.addPixmap(
            QPixmap(os.getcwd() + "/images/demo.jpg").scaled(
                self.graphicsView.size(), QtCore.Qt.KeepAspectRatio))
        self.graphicsView.setScene(self.scene)

        #Add blank canvas initially
        fig1 = Figure()
        self.addmpl(fig1)

    def set_stop(self):
        self.stop = True

    def updateLCD(self):
        #update edge_threshold variable based on slider
        self.edge_threshold = self.horizontalSlider.value()
        self.lcdNumber.display(self.edge_threshold)

    def tag_image(self, filename=None, batch=False, image=None):
        #importing TensorFlow on top causes segmentation fault (official bug #2034)
        #importing here helps in working around the problem
        #Python modules could be con)sidered as singletons... so no matter how many times they are imported, they get initialized only once
        import Yolo_module as yolo

        if (self.flag):
            #initialise the model, only once
            self.classifier = yolo.YOLO_TF()
            self.flag = False

        self.classifier.batch = batch

        if not image == None:
            self.classifier.detect_from_cvmat(image)
        else:
            self.classifier.detect_from_file(
                filename)  #execute Yolo on the image

        return self.classifier.tagged_image

    def disp_img(self, filename=None, img=None):
        if not img == None:
            img_rgb = img.copy()
            cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img_rgb)
            img_rgb = QtGui.QImage(img_rgb, img_rgb.shape[1], img_rgb.shape[0],
                                   img_rgb.shape[1] * 3,
                                   QtGui.QImage.Format_RGB888)
            self.scene.addPixmap(
                QPixmap(img_rgb).scaled(self.graphicsView.size(),
                                        QtCore.Qt.KeepAspectRatio))
            image = self.tag_image(image=img)

        else:
            #DO this step before calling tensorflow
            self.scene.addPixmap(
                QPixmap(filename).scaled(self.graphicsView.size(),
                                         QtCore.Qt.KeepAspectRatio))

            #Dislplay tagged image
            image = self.tag_image(filename=filename)

        image = QtGui.QImage(
            image, image.shape[1], image.shape[0], image.shape[1] * 3,
            QtGui.QImage.Format_RGB888)  #convert to Qt image format
        self.scene2.addPixmap(
            QPixmap(image).scaled(self.graphicsView_3.size(),
                                  QtCore.Qt.KeepAspectRatio))

        self.graphicsView.setScene(self.scene)
        self.graphicsView_3.setScene(self.scene2)

    def disp_graph(self, result=[], graph_name=''):
        import graph_module as gm

        self.update_categories()
        self.rmmpl()  #remove previous graph
        if result != [] and result != False:
            self.to_disp = result

        #Display graph
        fig = Figure()
        fig.set_facecolor('w')
        axf = fig.add_subplot(111)
        axf.set_axis_off()
        gm.co_location(self.to_disp, axf, self.edge_threshold, self.categories,
                       graph_name)  #get updated graph
        self.addmpl(fig)
        print("graph added")

    def disp_video(self, filename, skip=20):

        cap = cv2.VideoCapture(filename)
        count = 0
        self.stop = False
        while True:
            #TODO: Better method - https://nikolak.com/pyqt-threading-tutorial/
            QtCore.QCoreApplication.processEvents()

            ret, img = cap.read()
            if (not ret) or self.stop:
                print("Ending video...")  #+ str(ret) + str(self.stop))
                break
            if count % skip == 0:
                img = cv2.resize(img, (640, 480))
                self.disp_img(img=img)
                self.disp_graph([self.classifier.result
                                 ])  #list of 1 resultant list
                count = 0
            count += 1

    def selectFile(self):
        #Clear previous image displays
        self.scene.clear()
        self.scene2.clear()
        self.update_categories()

        filename = QFileDialog.getOpenFileName(
            directory='/home/yash/Downloads/Pascal VOC 2012/samples')
        self.lineEdit.setText(filename)

        #check if file is valid video
        if filename.split('.')[1] in self.valid_videos:
            self.disp_video(filename, self.framerate)

        #check if the file is valid
        elif filename.split('.')[1] in self.valid_images:
            self.disp_img(filename=filename)
            self.disp_graph([self.classifier.result
                             ])  #list of 1 resultant list

        else:
            print("Invalid file format")

    def selectFile_from_folder(self):
        #Read all the images in the folder
        path = QFileDialog.getExistingDirectory(
            None, 'Select a folder:', '/home/yash/Downloads/Pascal VOC 2012',
            QtGui.QFileDialog.ShowDirsOnly)
        self.lineEdit_2.setText(path)

        self.batch_results = []
        for f in os.listdir(path):  #list all the files in the folder
            ext = f.split('.')[1]  #get the file extension
            if ext.lower(
            ) not in self.valid_images:  #check if the extension is valid for the image
                continue
            filename = path + '/' + f  #create the path of the image
            print(filename)

            self.tag_image(filename, batch=True)
            self.batch_results.append(
                self.classifier.result)  #list of all resultant lists

        #clear the image regions during batch upload
        self.scene.clear()
        self.scene2.clear()

        self.disp_graph(self.batch_results, self.export_name)

    def addmpl(self, fig):
        #Add figure to canvas and widget
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()

    def rmmpl(self, ):
        #remove the canvas and widget
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
예제 #52
0
파일: main.py 프로젝트: HaraldHeitmann/Pybi
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, ):
        super(Main, self).__init__()
        self.setupUi(self)
        fig = Figure()
        self.addmpl(fig)
        self.rdBtn.clicked.connect(self.read)
        self.pltBtn.clicked.connect(self.plot)
        self.df = {}
        self.dfList.itemDoubleClicked.connect(self.df_selected)
        self.colList.itemDoubleClicked.connect(self.addcol)
        self.stgList.itemDoubleClicked.connect(self.rmvcol)
        self.plotList.itemDoubleClicked.connect(self.show_fig)
        self.currentDF = None
        self.current_name = None
        self.plots = {}
        self.plotBox.addItems(['histogram', 'plot', 'scatter'])
        self.selection = "None"
        self.aBtn.clicked.connect(self.spawn_child)

    def spawn_child(self):
        sec = Sec(self)
        sec.show()

    def read(self):
        try:
            lista = [
                str(self.dfList.item(i).text())
                for i in xrange(self.dfList.count())
            ]
            if str(self.inp.text()).split('.')[0] not in lista:
                self.df[str(self.inp.text()).split('.')[0]] = pd.read_csv(
                    str(self.inp.text()))
                self.dfList.addItem(str(self.inp.text()).split('.')[0])
        except IOError:
            print('No such file')

    def df_selected(self):
        self.current_name = str(self.dfList.currentItem().text())
        self.currentDF = self.df[self.current_name]
        self.filterBox.clear()
        self.filterBox.addItem("None")
        self.plotList.clear()
        self.rmmpl()
        if self.current_name in self.plots.keys():
            self.plotList.addItems(self.plots[self.current_name].keys())
        self.filterBox.addItems(self.df[str(
            self.dfList.currentItem().text())].columns)
        if self.colList.count() == 0:
            self.colList.addItems(self.df[str(
                self.dfList.currentItem().text())].columns)
        else:
            self.colList.clear()
            self.stgList.clear()
            self.colList.addItems(self.df[str(
                self.dfList.currentItem().text())].columns)

    def addcol(self):
        items = [
            self.stgList.item(i).text() for i in xrange(self.stgList.count())
        ]
        if str(self.colList.currentItem().text()) not in items:
            self.stgList.addItem(str(self.colList.currentItem().text()))

    def plot(self):
        if self.currentDF is None:
            return
        items = [
            str(self.stgList.item(i).text())
            for i in xrange(self.stgList.count())
        ]
        # here goes some logic to create different plots depending on the
        # selection of plotBox
        self.selection = str(self.filterBox.currentText())
        if self.selection == "None":
            if str(self.plotBox.currentText()) == 'scatter':
                if self.stgList.count() != 2:
                    raise TypeError('Select just two columns')
                else:
                    if self.current_name not in self.plots.keys():
                        generated_plot = {}
                        col1 = str(self.stgList.item(0).text())
                        col2 = str(self.stgList.item(1).text())
                        data1 = self.currentDF[col1].values
                        data2 = self.currentDF[col2].values
                        f, ax = plt.subplots()
                        ax.scatter(data1, data2, alpha=0.5)
                        ax.set(xlabel=col1, ylabel=col2)
                        ax.set_title(col1 + ' vs ' + col2)
                        generated_plot[col1 + ';' + col2 + ' ' +
                                       str(self.plotBox.currentText())] = f
                        self.plots[self.current_name] = generated_plot
                    else:
                        col1 = str(self.stgList.item(0).text())
                        col2 = str(self.stgList.item(1).text())
                        data1 = self.currentDF[col1].values
                        data2 = self.currentDF[col2].values
                        f, ax = plt.subplots()
                        ax.scatter(data1, data2, alpha=0.5)
                        ax.set(xlabel=col1, ylabel=col2)
                        ax.set_title(col1 + ' vs ' + col2)
                        self.plots[self.current_name][
                            col1 + ';' + col2 + ' ' +
                            str(self.plotBox.currentText())] = f
            elif str(self.plotBox.currentText()) == 'plot':
                if self.current_name not in self.plots.keys():
                    generated_plots = {}
                    for col in items:
                        f, ax = plt.subplots()
                        self.currentDF[col].plot(ax=ax)
                        ax.set(ylabel=col, xlabel='index')
                        ax.set_title(col + ' Plot')
                        generated_plots[col + ' ' +
                                        str(self.plotBox.currentText())] = f
                    self.plots[self.current_name] = generated_plots
                else:
                    for col in items:
                        f, ax = plt.subplots()
                        self.currentDF[col].plot(ax=ax)
                        ax.set(ylabel=col, xlabel='index')
                        ax.set_title(col + ' Plot')
                        self.plots[self.current_name][col + ' ' + str(
                            self.plotBox.currentText())] = f
            elif str(self.plotBox.currentText()) == 'histogram':
                if self.current_name not in self.plots.keys():
                    generated_plots = {}
                    for col in items:
                        f, ax = plt.subplots()
                        self.currentDF[col].hist(ax=ax)
                        ax.set(xlabel=col, ylabel='count')
                        ax.set_title('Histogram of ' + col)
                        generated_plots[col + ' ' +
                                        str(self.plotBox.currentText())] = f
                    self.plots[self.current_name] = generated_plots
                else:
                    for col in items:
                        f, ax = plt.subplots()
                        self.currentDF[col].hist(ax=ax)
                        ax.set(xlabel=col, ylabel='count')
                        ax.set_title('Histogram of ' + col)
                        self.plots[self.current_name][col + ' ' + str(
                            self.plotBox.currentText())] = f
        else:
            if str(self.plotBox.currentText()) == 'scatter':
                if self.stgList.count() != 2:
                    raise TypeError('Select just two columns')
                else:
                    if self.current_name not in self.plots.keys():
                        f, ax = plt.subplots()
                        for value in self.currentDF[self.selection].unique():
                            filtered_df = self.currentDF[self.currentDF[
                                self.selection] == value]
                            generated_plot = {}
                            col1 = str(self.stgList.item(0).text())
                            col2 = str(self.stgList.item(1).text())
                            data1 = filtered_df[col1].values
                            data2 = filtered_df[col2].values
                            ax.scatter(data1,
                                       data2,
                                       label=str(value),
                                       alpha=0.5)
                        ax.set(xlabel=col1, ylabel=col2)
                        f.legend()
                        generated_plot[col1 + ';' + col2 + '; fil= ' +
                                       self.selection + ' ' +
                                       str(self.plotBox.currentText())] = f
                        self.plots[self.current_name] = generated_plot
                    else:
                        f, ax = plt.subplots()
                        for value in self.currentDF[self.selection].unique():
                            filtered_DF = self.currentDF[self.currentDF[
                                self.selection] == value]
                            col1 = str(self.stgList.item(0).text())
                            col2 = str(self.stgList.item(1).text())
                            data1 = filtered_DF[col1].values
                            data2 = filtered_DF[col2].values
                            ax.scatter(data1,
                                       data2,
                                       label=str(value),
                                       alpha=0.5)
                        ax.set(xlabel=col1, ylabel=col2)
                        f.legend()
                        self.plots[self.current_name][
                            col1 + ';' + col2 + '; fil= ' + self.selection +
                            ' ' + str(self.plotBox.currentText())] = f
            elif str(self.plotBox.currentText()) == 'histogram':
                if self.current_name not in self.plots.keys():
                    generated_plots = {}
                    for col in items:
                        f, ax = plt.subplots()
                        for value in self.currentDF[self.selection].unique():
                            filtered_df = self.currentDF[self.currentDF[
                                self.selection] == value]
                            filtered_df[col].hist(ax=ax,
                                                  label=str(value),
                                                  alpha=0.5)
                        ax.set(xlabel=col, ylabel='count')
                        f.legend()
                        generated_plots[col + ';fil= ' + self.selection + ' ' +
                                        str(self.plotBox.currentText())] = f
                    self.plots[self.current_name] = generated_plots
                else:
                    for col in items:
                        f, ax = plt.subplots()
                        for value in self.currentDF[self.selection].unique():
                            filtered_df = self.currentDF[self.currentDF[
                                self.selection] == value]
                            filtered_df[col].hist(ax=ax,
                                                  alpha=0.5,
                                                  label=str(value))
                        ax.set(xlabel=col, ylabel='count')
                        f.legend()
                        self.plots[self.current_name][
                            col + ';fil= ' + self.selection + ' ' +
                            str(self.plotBox.currentText())] = f
            else:
                if self.current_name not in self.plots.keys():
                    generated_plots = {}
                    for col in items:
                        f, ax = plt.subplots()
                        for value in self.currentDF[self.selection].unique():
                            # .reset_index() intended to time series, uncomment otherwise
                            filtered_df = self.currentDF[self.currentDF[
                                self.selection] == value]
                            filtered_df[col].plot(ax=ax,
                                                  label=str(value),
                                                  alpha=0.5)
                        ax.set(xlabel='index', ylabel=col)
                        f.legend()
                        generated_plots[col + ';fil= ' + self.selection + ' ' +
                                        str(self.plotBox.currentText())] = f
                    self.plots[self.current_name] = generated_plots
                else:
                    for col in items:
                        f, ax = plt.subplots()
                        for value in self.currentDF[self.selection].unique():
                            # .reset_index() intended to time series uncomment otherwise
                            filtered_df = self.currentDF[self.currentDF[
                                self.selection] == value]
                            filtered_df[col].plot(ax=ax,
                                                  alpha=0.5,
                                                  label=str(value))
                        ax.set(xlabel='index', ylabel=col)
                        f.legend()
                        self.plots[self.current_name][
                            col + ';fil= ' + self.selection + ' ' +
                            str(self.plotBox.currentText())] = f
        self.plotList.clear()
        for plot_dict in self.plots[self.current_name].keys():
            self.plotList.addItem(plot_dict)

    def show_fig(self):
        self.rmmpl()
        fig_name = str(self.plotList.currentItem().text())
        self.addmpl(self.plots[self.current_name][fig_name])

    def rmvcol(self):
        self.stgList.takeItem(self.stgList.row(self.stgList.currentItem()))

    def clear(self):
        self.mplfigs.clear()
        self.rmmpl()

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(
            self.canvas,
            self.mplwindow,
            coordinates=True,
        )
        self.mplvl.addWidget(self.toolbar)

    def rmmpl(self, ):
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()