Esempio n. 1
0
class xaesa_viewer(QtGui.QWidget):
    def __init__(self, parent=None):
        super(xaesa_viewer, self).__init__()

        self.x_data = []  #list with arrays
        self.y_data = []

        self.labels = []  #list with labels for each line

        self.x_caption = ""
        self.y_caption = ""

        # mode = 0 - each line new color
        # mode = 1 - combine 2 lines with the same color (for FT comparison)
        self.mode = 0

        self.plotXRange = []  #two element [min, max] (for XANES)
        self.horizontalLine = []

        self.lines = []

        self.initUI()

    def initUI(self):
        #Figures
        self.fig = plt.figure(1, figsize=(15, 6))
        # self.ax_exafs = self.fig.add_subplot(111)

        self.canv = FigureCanvas(self.fig)
        self.tbar = NavigationToolbar(self.canv, self)

        fnt = self.tbar.font()
        fnt.setPointSize(20)
        self.tbar.setFont(fnt)

        #        plt.tight_layout()

        lfig = QtGui.QVBoxLayout()
        lfig.addWidget(self.tbar)
        lfig.addWidget(self.canv)

        self.setLayout(lfig)

        self.canv.draw()

    def plot(self):

        plt.clf()
        self.ax_exafs = self.fig.add_subplot(111)

        if self.mode == 0:  #compare exafs
            for i in range(len(self.x_data)):
                l, = self.ax_exafs.plot(self.x_data[i],
                                        self.y_data[i],
                                        label=self.labels[i])
                self.ax_exafs.set_xlabel(self.x_caption)
                self.ax_exafs.set_ylabel(self.y_caption)
                #                self.ax_exafs.set_xlabel('Wavevector k, $\AA^{-1}$')
                #                self.ax_exafs.set_ylabel('EXAFS, $\AA^{-2}$')
                if self.horizontalLine != []:
                    self.ax_exafs.axhline(
                        y=1,
                        linewidth=0.5,
                        color='k',
                        linestyle='--',
                    )
                if self.plotXRange != []:
                    self.ax_exafs.set_xlim(self.plotXRange)
                self.lines.append(l)

        if self.mode == 1:  #compare ft
            for i in range(len(self.r) / 2):
                line1, = self.ax_exafs.plot(self.x_data[2 * i],
                                            self.y_data[2 * i],
                                            label=self.labels[i])
                line2, = self.ax_exafs.plot(self.x_data[2 * i + 1],
                                            self.y_data[2 * i + 1])
                line2.set_color(line1.get_color())
                line2.set_linestyle('dotted')
                self.ax_exafs.set_xlabel(self.x_caption)
                self.ax_exafs.set_ylabel(self.y_caption)
                #                self.ax_exafs.set_xlabel('Distance R, $\AA$')
                #                self.ax_exafs.set_ylabel('Fourier transform, $\AA^{-3}$')
                self.lines.append(line1)
                self.lines1.append(line2)

        self.fig.canvas.mpl_connect('pick_event', self.onpick)

        self.fig.tight_layout()

        box = self.ax_exafs.get_position()
        self.ax_exafs.set_position(
            [box.x0, box.y0, box.width * 0.7, box.height])

        leg = self.ax_exafs.legend(loc='center left', bbox_to_anchor=(1, 0.5))

        # we will set up a dict mapping legend line to orig line, and enable
        # picking on the legend line
        self.lined = dict()
        for legline, origline in zip(leg.get_lines(), self.lines):
            legline.set_picker(5)  # 5 pts tolerance
            self.lined[legline] = origline

        if self.mode == 1:
            self.lined1 = dict()
            for legline, origline in zip(leg.get_lines(), self.lines1):
                #                legline.set_picker(5)  # 5 pts tolerance
                self.lined1[legline] = origline

        self.canv.draw()

    def onpick(self, event):
        # on the pick event, find the orig line corresponding to the
        # legend proxy line, and toggle the visibility
        legline = event.artist
        origline = self.lined[legline]
        vis = not origline.get_visible()
        origline.set_visible(vis)
        if self.mode == 1:
            origline = self.lined1[legline]
            origline.set_visible(vis)

        # Change the alpha on the line in the legend so we can see what lines
        # have been toggled
        if vis:
            legline.set_alpha(1.0)
        else:
            legline.set_alpha(0.2)
        self.fig.canvas.draw()
Esempio n. 2
0
class xaesa_rxes(QtGui.QWidget):
    def __init__(self, parent=None):
        super(xaesa_rxes, self).__init__()

        self.fluoEnergy = []
        self.incidentEnergy = []
        self.rxes = []
        self.energyTransfer = False

        self.initUI()

    def initUI(self):
        #Figures
        self.fig = plt.figure(997, figsize=(15, 6))
        self.ax_rxes = plt.subplot2grid((1, 2), (0, 0))
        self.ax_cuts = plt.subplot2grid((1, 2), (0, 1))

        if self.energyTransfer:
            self.ax_rxes.set_xlabel('Incident energy, eV')
            self.ax_rxes.set_ylabel('Energy transfer, eV')
            self.ax_cuts.set_xlabel('Incident energy, eV')
            self.ax_cuts.set_ylabel('Intensity, a.u.')

        else:
            self.ax_rxes.set_xlabel('Incident energy, eV')
            self.ax_rxes.set_ylabel('Emission energy, eV')
            self.ax_cuts.set_xlabel('Incident energy, eV')
            self.ax_cuts.set_ylabel('HERFD XANES, a.u.')

        self.fig.canvas.mpl_connect('button_press_event',
                                    self.imageDoubleClick)

        self.canv = FigureCanvas(self.fig)
        self.tbar = NavigationToolbar(self.canv, self)

        fnt = self.tbar.font()
        fnt.setPointSize(20)
        self.tbar.setFont(fnt)

        #        plt.tight_layout()

        self.sl = QtGui.QSlider(QtCore.Qt.Horizontal)
        self.sl.setMinimum(0)
        self.sl.setMaximum(100)
        self.sl.setValue(100)
        self.sl.setTickPosition(QtGui.QSlider.TicksBelow)
        self.sl.valueChanged.connect(self.valuechange)
        #        self.sl.setTickInterval(5)

        glout = QtGui.QGridLayout()

        glout.addWidget(self.sl, 0, 0, 1, 2)

        glout.addWidget(QtGui.QLabel("Energy for HERFD-XANES"), 1, 0)
        glout.addWidget(QtGui.QLabel("Delta energy for HERFD-XANES"), 2, 0)

        self.edtEnergyHerfd = QtGui.QLineEdit()
        glout.addWidget(self.edtEnergyHerfd, 1, 1)

        self.edtDeltaHerfd = QtGui.QLineEdit()
        glout.addWidget(self.edtDeltaHerfd, 2, 1)

        self.btnCalculateHerfd = QtGui.QPushButton("Show HERFD XANES")
        self.btnCalculateHerfd.clicked.connect(self.showHerfd)
        glout.addWidget(self.btnCalculateHerfd, 3, 0, 1, 2)

        self.btnCalculateHerfd = QtGui.QPushButton("save HERFD XANES")
        self.btnCalculateHerfd.clicked.connect(self.saveHerfd)
        glout.addWidget(self.btnCalculateHerfd, 4, 0, 1, 2)

        glout.addWidget(QtGui.QLabel("Energy transfer min "), 1, 2)
        glout.addWidget(QtGui.QLabel("Energy transfer max"), 2, 2)

        self.edtEnergyTransMin = QtGui.QLineEdit()
        glout.addWidget(self.edtEnergyTransMin, 1, 3)

        self.edtEnergyTransMax = QtGui.QLineEdit()
        glout.addWidget(self.edtEnergyTransMax, 2, 3)

        self.btnCalculateHerfd = QtGui.QPushButton("Show energy transfer")
        self.btnCalculateHerfd.clicked.connect(self.showEnergyTrans)
        glout.addWidget(self.btnCalculateHerfd, 3, 2, 1, 2)

        self.btnCalculateHerfd = QtGui.QPushButton("Save energy transfer")
        self.btnCalculateHerfd.clicked.connect(self.saveEnergyTrans)
        glout.addWidget(self.btnCalculateHerfd, 4, 2, 1, 2)

        self.btnCancel = QtGui.QPushButton('Exit')
        self.btnCancel.clicked.connect(self.cancel)

        lfig = QtGui.QVBoxLayout()
        lfig.addWidget(self.tbar)
        lfig.addWidget(self.canv)

        lfig.addLayout(glout)

        lfig.addWidget(self.btnCancel)

        self.setLayout(lfig)

        self.canv.draw()

    def plot(self):

        savetxt("x.dat", self.incidentEnergy)
        savetxt("y.dat", self.fluoEnergy)
        savetxt("z.dat", self.rxes)

        #        self.image = self.ax_rxes.imshow(self.rxes, vmin = 0, vmax = self.zmax, aspect='auto', interpolation='none',cmap='gist_ncar')
        self.image = self.ax_rxes.pcolormesh(self.incidentEnergy,
                                             self.fluoEnergy, self.rxes)

        #        if  amax(self.rxes) > 1:
        #            self.sl.setMaximum(amax(self.rxes))

        self.fig.tight_layout()

        self.canv.draw()

    def cancel(self):
        #do whatever you need with self.roiGroups
        self.close()

    def onpick(self, event):
        # on the pick event, find the orig line corresponding to the
        # legend proxy line, and toggle the visibility
        legline = event.artist
        origline = self.lined[legline]
        vis = not origline.get_visible()
        origline.set_visible(vis)
        if self.mode == 1:
            origline = self.lined1[legline]
            origline.set_visible(vis)

        # Change the alpha on the line in the legend so we can see what lines
        # have been toggled
        if vis:
            legline.set_alpha(1.0)
        else:
            legline.set_alpha(0.2)
        self.fig.canvas.draw()

    def showHerfd(self):

        emin = float(self.edtEnergyHerfd.text()) - float(
            self.edtDeltaHerfd.text())
        emax = float(self.edtEnergyHerfd.text()) + float(
            self.edtDeltaHerfd.text())

        if self.energyTransfer:  #plot energy transfer intensity versus incident energy
            indexes_where = where(
                logical_and(self.fluoEnergy[:, 0] > emin,
                            self.fluoEnergy[:, 0] < emax))
            tmp_array = []
            for i in range(len(self.incidentEnergy[0])):
                indexes_where = where(
                    logical_and(self.fluoEnergy[:, i] > emin,
                                self.fluoEnergy[:, i] < emax))
                print(self.rxes[indexes_where, i][0])
                number = sum(self.rxes[indexes_where, i][0]) / len(
                    self.rxes[indexes_where, i][0])
                print(number)
                tmp_array.append(number)

#            hsum = sum(tmp_array, axis=0)

            self.ax_cuts.clear()
            self.ax_cuts.set_xlabel('Incident energy, eV')
            self.ax_cuts.set_ylabel('Intensity, a.u.')
            self.ax_cuts.plot(self.incidentEnergy[0], tmp_array)

        else:  # plot normal herfd

            indexes_where = where(
                logical_and(self.fluoEnergy[:, 0] > emin,
                            self.fluoEnergy[:, 0] < emax))

            hsum = sum((self.rxes[indexes_where, :]), axis=1)

            self.ax_cuts.clear()

            self.ax_cuts.set_xlabel('Incident energy, eV')
            self.ax_cuts.set_ylabel('HERFD XANES, a.u.')

            self.ax_cuts.plot(self.incidentEnergy[0], hsum[0])

        self.canv.draw()

    def saveHerfd(self):

        emin = float(self.edtEnergyHerfd.text()) - float(
            self.edtDeltaHerfd.text())
        emax = float(self.edtEnergyHerfd.text()) + float(
            self.edtDeltaHerfd.text())

        if self.energyTransfer:  #plot energy transfer intensity versus incident energy
            indexes_where = where(
                logical_and(self.fluoEnergy[:, 0] > emin,
                            self.fluoEnergy[:, 0] < emax))
            tmp_array = []
            for i in range(len(self.incidentEnergy[0])):
                indexes_where = where(
                    logical_and(self.fluoEnergy[:, i] > emin,
                                self.fluoEnergy[:, i] < emax))
                print(self.rxes[indexes_where, i][0])
                number = sum(self.rxes[indexes_where, i][0]) / len(
                    self.rxes[indexes_where, i][0])
                print(number)
                tmp_array.append(number)


#            hsum = sum(tmp_array, axis=0)

            forSave = concatenate(([self.incidentEnergy[0]], [tmp_array]))

        else:  # plot normal herfd

            indexes_where = where(
                logical_and(self.fluoEnergy[:, 0] > emin,
                            self.fluoEnergy[:, 0] < emax))

            hsum = sum((self.rxes[indexes_where, :]), axis=1)

            forSave = concatenate(([self.incidentEnergy[0]], [hsum[0]]))

        fn = self.savefiledialog_qtgui()
        if fn == "":
            return

        savetxt(fn, transpose(forSave))

    def showEnergyTrans(self):

        emin = float(self.edtEnergyTransMin.text())
        emax = float(self.edtEnergyTransMax.text())

        tmp_array = []
        #vert sum Energy transfer
        indexes_where = where(
            logical_and(self.fluoEnergy[:, 0] > emin,
                        self.fluoEnergy[:, 0] < emax))
        nr_points = len(indexes_where[0])
        for i in range(len(self.incidentEnergy[0])):
            indexes_where = where(
                logical_and(self.fluoEnergy[:, i] > emin,
                            self.fluoEnergy[:, i] < emax))
            first_i = indexes_where[0][0]
            i_to_take = array(range(first_i, first_i + nr_points))
            tmp_array.append(self.rxes[[i_to_take], i][0])

        hsum = sum(tmp_array, axis=0)

        indexes_where = where(
            logical_and(self.fluoEnergy[:, 0] > emin,
                        self.fluoEnergy[:, 0] < emax))

        self.ax_cuts.clear()
        self.ax_cuts.set_xlabel('Incident energy, eV')
        self.ax_cuts.set_ylabel('Intensity, a.u.')
        self.ax_cuts.plot(self.fluoEnergy[:, 0][indexes_where], hsum)
        self.canv.draw()

    def saveEnergyTrans(self):

        emin = float(self.edtEnergyTransMin.text())
        emax = float(self.edtEnergyTransMax.text())

        tmp_array = []
        #vert sum Energy transfer
        indexes_where = where(
            logical_and(self.fluoEnergy[:, 0] > emin,
                        self.fluoEnergy[:, 0] < emax))
        nr_points = len(indexes_where[0])
        for i in range(len(self.incidentEnergy[0])):
            indexes_where = where(
                logical_and(self.fluoEnergy[:, i] > emin,
                            self.fluoEnergy[:, i] < emax))
            first_i = indexes_where[0][0]
            i_to_take = array(range(first_i, first_i + nr_points))
            tmp_array.append(self.rxes[[i_to_take], i][0])
        hsum = sum(tmp_array, axis=0)

        indexes_where = where(
            logical_and(self.fluoEnergy[:, 0] > emin,
                        self.fluoEnergy[:, 0] < emax))

        forSave = concatenate(([self.fluoEnergy[:, 0][indexes_where]], [hsum]))

        fn = self.savefiledialog_qtgui()
        if fn == "":
            return

        savetxt(fn, transpose(forSave))

    def valuechange(self):
        #        size = self.sl.value()
        print(self.sl.value())

        self.image.set_clim(vmin=0,
                            vmax=(self.sl.value() / 100) * amax(self.rxes))
        self.canv.draw()

    def imageDoubleClick(self, event):
        print(event)
        if event.dblclick == True:
            #ask to change scale
            num, ok = QtGui.QInputDialog.getDouble(self,
                                                   "Z scale",
                                                   "Z max",
                                                   value=self.zmax,
                                                   max=20000000,
                                                   min=0,
                                                   decimals=4)
            if ok:
                self.zmax = num
                self.image.set_clim(vmax=self.zmax)
                self.canv.draw()
            else:
                return

    def savefiledialog_qtgui(self):
        dlg = QtGui.QFileDialog()
        dlg.setFileMode(QtGui.QFileDialog.AnyFile)
        dlg.setAcceptMode(1)  # save dialog
        dlg.setNameFilters(["All files (*.*)"])
        #        dlg.setDirectory(self.currentdir)
        if dlg.exec_():
            flist = dlg.selectedFiles()
            return flist[0]
        else:
            return ""
Esempio n. 3
0
class CompareWindow(QtGui.QDialog):

    def __init__(self):
        super(CompareWindow, self).__init__()
        
        self.exafs = []
        self.k = []

        self.r = []
        self.fr = []
        self.fi = []

        self.bftk = []
        self.bftexafs = []

        self.labels = []

        self.energy = []
        self.mju = []
        self.xes = []

        self.E0 = 0
        
        self.lines = []
        self.lines1 = []
        #mode
        #0 - exafs
        #1 - ft
        #2 - bft
        #3 - mju
        #10 - Xes original
        #11 - XES area Normalized
        #12 - XES Max Normalized
        self.mode = 0

        self.initUI()

    def initUI(self):
        
        #Figures 
        self.fig = plt.figure(1, figsize=(15, 6))
        # self.ax_exafs = self.fig.add_subplot(111)

        self.canv = FigureCanvas(self.fig)
        self.tbar = NavigationToolbar(self.canv, self)
        
        fnt = self.tbar.font()
        fnt.setPointSize(20)
        self.tbar.setFont(fnt)
        
        # plt.tight_layout()    
        
        self.btnCancel = QtGui.QPushButton('Exit')
        self.btnCancel.clicked.connect(self.cancel)
        
        lfig = QtGui.QVBoxLayout()
        lfig.addWidget(self.tbar)
        lfig.addWidget(self.canv)
        
        lfig.addWidget(self.btnCancel)
              
        self.setLayout(lfig)
        
        self.canv.draw()
        
        #wid.setLayout(lfig)
        
    def plot(self):
        
        # self.ax_exafs.clear()
        plt.clf()
        self.ax_exafs = self.fig.add_subplot(111)
        
        
        
        if self.mode == 0: #compare exafs        
            for i in range(len(self.k)):
                l, = self.ax_exafs.plot(self.k[i], self.exafs[i], label = self.labels[i], linewidth=1)
                self.ax_exafs.set_xlabel('Wavevector k, $\AA^{-1}$')
                self.ax_exafs.set_ylabel('EXAFS, $\AA^{-2}$')
                self.lines.append(l)
                
        if self.mode == 1: #compare ft       
            for i in range(len(self.r)):
                line1,  = self.ax_exafs.plot(self.r[i], self.fr[i], label = self.labels[i], linewidth=1)
                line2,  = self.ax_exafs.plot(self.r[i], self.fi[i], linewidth=1)
                line2.set_color(line1.get_color())
                line2.set_linestyle('dotted')
                self.ax_exafs.set_xlabel('Distance R, $\AA$')
                self.ax_exafs.set_ylabel('Fourier transform, $\AA^{-3}$')
                self.lines.append(line1)
                self.lines1.append(line2)
                
                
        if self.mode == 2: #compare bft       
            for i in range(len(self.bftk)):
                l, = self.ax_exafs.plot(self.bftk[i], self.bftexafs[i], label = self.labels[i], linewidth=1)
                self.ax_exafs.set_xlabel('Wavevector k, $\AA^{-1}$')
                self.ax_exafs.set_ylabel('EXAFS, $\AA^{-2}$')
                self.lines.append(l)
                
        if self.mode == 3: #compare mju      
            for i in range(len(self.energy)):
                l, = self.ax_exafs.plot(self.energy[i], self.mju[i], label = self.labels[i], linewidth=1)
                self.ax_exafs.set_xlabel('Energy, eV')
                self.ax_exafs.set_ylabel('Absorption, a.u.')
                self.lines.append(l)
                
                
        if self.mode == 4: #compare xanes     
            for i in range(len(self.energy)):
                l, = self.ax_exafs.plot(self.energy[i], self.mju[i], label = self.labels[i], linewidth=1)
                self.ax_exafs.set_xlabel('Energy, eV')
                self.ax_exafs.set_ylabel('Absorption, a.u.')
                self.ax_exafs.axhline(y=1, linewidth=0.5, color = 'k', linestyle='--',)
                self.ax_exafs.set_xlim([self.E0-75,self.E0+200])
                self.lines.append(l)
                
        if self.mode == 10: # XES original     
            for i in range(len(self.energy)):
                l, = self.ax_exafs.plot(self.energy[i], self.xes[i], label = self.labels[i], linewidth=1)
                self.ax_exafs.set_xlabel('Energy, eV')
                self.ax_exafs.set_ylabel('Intensity, a.u.')
                self.lines.append(l)
                
        if self.mode == 11: # XES area normalized
            for i in range(len(self.energy)):
                l, = self.ax_exafs.plot(self.energy[i], self.xes[i], label = self.labels[i], linewidth=1)
                self.ax_exafs.set_xlabel('Energy, eV')
                self.ax_exafs.set_ylabel('Area normalized intensity')
                self.lines.append(l)
                
        self.fig.canvas.mpl_connect('pick_event', self.onpick)
                
        self.fig.tight_layout()
                
        box = self.ax_exafs.get_position()
        self.ax_exafs.set_position([box.x0, box.y0, box.width * 0.7, box.height])
        
        leg = self.ax_exafs.legend(loc='center left', bbox_to_anchor=(1, 0.5))
        
        # we will set up a dict mapping legend line to orig line, and enable
        # picking on the legend line
        self.lined = dict()
        for legline, origline in zip(leg.get_lines(), self.lines):
            legline.set_picker(5)  # 5 pts tolerance
            self.lined[legline] = origline

        if self.mode == 1:
            self.lined1 = dict()
            for legline, origline in zip(leg.get_lines(), self.lines1):
#                legline.set_picker(5)  # 5 pts tolerance
                self.lined1[legline] = origline
        
        self.canv.draw()

        
    def cancel(self):
        #do whatever you need with self.roiGroups  
        self.close()
        
    def onpick(self, event):
        # on the pick event, find the orig line corresponding to the
        # legend proxy line, and toggle the visibility
        legline = event.artist
        origline = self.lined[legline]
        vis = not origline.get_visible()
        origline.set_visible(vis)
        if self.mode == 1:
            origline = self.lined1[legline]
            origline.set_visible(vis)
        
        # Change the alpha on the line in the legend so we can see what lines
        # have been toggled
        if vis:
            legline.set_alpha(1.0)
        else:
            legline.set_alpha(0.2)
        self.fig.canvas.draw()