Esempio n. 1
0
 def __init__(self,parent=None):
     QWidget.__init__(self, parent)
     self.ui = Ui_MainWindow()
     self.ui.setupUi(self)
 
     self.atten = -1
     self.ui.atten.setValue(self.atten)  
     self.resnum = 0
     self.indx=0
     
     QObject.connect(self.ui.open_browse, SIGNAL("clicked()"), self.open_dialog)
     QObject.connect(self.ui.save_browse, SIGNAL("clicked()"), self.save_dialog)
     QObject.connect(self.ui.atten, SIGNAL("valueChanged(int)"), self.setnewatten)
     QObject.connect(self.ui.savevalues, SIGNAL("clicked()"), self.savevalues)
     QObject.connect(self.ui.jumptores, SIGNAL("clicked()"), self.jumptores)
Esempio n. 2
0
class StartQt4(QMainWindow):
    def __init__(self,parent=None):
        QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
    
        self.atten = -1
        self.ui.atten.setValue(self.atten)  
        self.resnum = 0
        self.indx=0
        
        QObject.connect(self.ui.open_browse, SIGNAL("clicked()"), self.open_dialog)
        QObject.connect(self.ui.save_browse, SIGNAL("clicked()"), self.save_dialog)
        QObject.connect(self.ui.atten, SIGNAL("valueChanged(int)"), self.setnewatten)
        QObject.connect(self.ui.savevalues, SIGNAL("clicked()"), self.savevalues)
        QObject.connect(self.ui.jumptores, SIGNAL("clicked()"), self.jumptores)
        
    def open_dialog(self):
        self.openfile = QFileDialog.getOpenFileName(parent=None, caption=QString(str("Choose PS File")),directory = ".",filter=QString(str("H5 (*.h5)")))
        self.ui.open_filename.setText(str(self.openfile))
        self.loadps()
        
    def save_dialog(self):
        self.savefile = QFileDialog.getOpenFileName(parent=None, caption=QString(str("Choose Save File")),directory = ".")
        self.ui.save_filename.setText(str(self.savefile))
        self.f = open(str(self.savefile), 'a')
        self.f.close()
    
    def loadres(self):
        self.Res1=IQsweep()
        self.Res1.LoadPowers(str(self.openfile), 'r0', self.freq[self.resnum])
        self.ui.res_num.setText(str(self.resnum))
        self.resfreq = self.freq[self.resnum]
        self.ui.frequency.setText(str(self.resfreq))
        self.NAttens = len(self.Res1.atten1s)
        self.res1_iq_vels=numpy.zeros((self.NAttens,self.Res1.fsteps-1))
        self.res1_iq_amps=numpy.zeros((self.NAttens,self.Res1.fsteps))
        for iAtt in range(self.NAttens):
            for i in range(1,self.Res1.fsteps-1):
                self.res1_iq_vels[iAtt,i]=sqrt((self.Res1.Qs[iAtt][i]-self.Res1.Qs[iAtt][i-1])**2+(self.Res1.Is[iAtt][i]-self.Res1.Is[iAtt][i-1])**2)
                self.res1_iq_amps[iAtt,:]=sqrt((self.Res1.Qs[iAtt])**2+(self.Res1.Is[iAtt])**2)
        #Sort the IQ velocities for each attenuation, to pick out the maximums
        sorted_vels = numpy.sort(self.res1_iq_vels,axis=1)
        #Last column is maximum values for each atten (row)
        self.res1_max_vels = sorted_vels[:,-1]
        #Second to last column has second highest value
        self.res1_max2_vels = sorted_vels[:,-2]
        #Also get indices for maximum of each atten, and second highest
        sort_indices = numpy.argsort(self.res1_iq_vels,axis=1)
        max_indices = sort_indices[:,-1]
        max2_indices = sort_indices[:,-2]
        max_neighbor = max_indices.copy()

        #for each attenuation find the ratio of the maximum velocity to the second highest velocity
        self.res1_max_ratio = self.res1_max_vels.copy()
        max_neighbors = zeros(self.NAttens)
        max2_neighbors = zeros(self.NAttens)
        self.res1_max2_ratio = self.res1_max2_vels.copy()
        for iAtt in range(self.NAttens):
            if max_indices[iAtt] == 0:
                max_neighbor = self.res1_iq_vels[iAtt,max_indices[iAtt]+1]
            elif max_indices[iAtt] == len(self.res1_iq_vels[iAtt,:])-1:
                max_neighbor = self.res1_iq_vels[iAtt,max_indices[iAtt]-1]
            else:
                max_neighbor = maximum(self.res1_iq_vels[iAtt,max_indices[iAtt]-1],self.res1_iq_vels[iAtt,max_indices[iAtt]+1])
            max_neighbors[iAtt]=max_neighbor
            self.res1_max_ratio[iAtt] = self.res1_max_vels[iAtt]/max_neighbor
            if max2_indices[iAtt] == 0:
                max2_neighbor = self.res1_iq_vels[iAtt,max2_indices[iAtt]+1]
            elif max2_indices[iAtt] == len(self.res1_iq_vels[iAtt,:])-1:
                max2_neighbor = self.res1_iq_vels[iAtt,max2_indices[iAtt]-1]
            else:
                max2_neighbor = maximum(self.res1_iq_vels[iAtt,max2_indices[iAtt]-1],self.res1_iq_vels[iAtt,max2_indices[iAtt]+1])
            max2_neighbors[iAtt]=max2_neighbor
            self.res1_max2_ratio[iAtt] = self.res1_max2_vels[iAtt]/max2_neighbor
        #normalize the new arrays
        self.res1_max_vels /= numpy.max(self.res1_max_vels)
        self.res1_max_vels *= numpy.max(self.res1_max_ratio)
        self.res1_max2_vels /= numpy.max(self.res1_max2_vels)
        #self.res1_relative_max_vels /= numpy.max(self.res1_relative_max_vels)
        self.ui.plot_1.canvas.ax.clear()
        self.ui.plot_1.canvas.ax.plot(self.Res1.atten1s,self.res1_max_vels,'b.-',label='Max IQ velocity')
        #self.ui.plot_1.canvas.ax.plot(self.Res1.atten1s,max_neighbors,'r.-')
        self.ui.plot_1.canvas.ax.plot(self.Res1.atten1s,self.res1_max_ratio,'k.-',label='Ratio (Max Vel)/(2nd Max Vel)')
        self.ui.plot_1.canvas.ax.legend()
        self.ui.plot_1.canvas.ax.set_xlabel('attenuation')
        
        #self.ui.plot_1.canvas.ax.plot(self.Res1.atten1s,self.res1_max2_vels-1,'b.-')
        #self.ui.plot_1.canvas.ax.plot(self.Res1.atten1s,max2_neighbors-1,'b.-')
        #self.ui.plot_1.canvas.ax.plot(self.Res1.atten1s,self.res1_max2_ratio-1,'g.-')


        # Chris S:  seems that button_press_event causes click_plot_1 to be called more than once sometimes.
        cid=self.ui.plot_1.canvas.mpl_connect('button_press_event', self.click_plot_1)
        #cid=self.ui.plot_1.canvas.mpl_connect('button_release_event', self.click_plot_1)
        #self.ui.plot_1.canvas.format_labels()
        self.ui.plot_1.canvas.draw()

        max_ratio_threshold = 1.5
        rule_of_thumb_offset = 2

        mlFile = ('.').join(str(self.openfile).split('.')[:-1])+"-ml.txt"
        if os.path.isfile(mlFile):             # update: use machine learning peak loacations if they've been made
            print 'loading attenuation predictions from', mlFile
            guess_atten_idx = np.loadtxt(mlFile)[self.resnum]
            #print guess_atten_idx
            guess_atten = self.Res1.atten1s[guess_atten_idx]
            self.select_atten(guess_atten)
            self.ui.atten.setValue(round(guess_atten))
        else:
            # require ROTO adjacent elements to be all below the MRT
            bool_remove = np.ones(len(self.res1_max_ratio))
            for ri in range(len(self.res1_max_ratio)-rule_of_thumb_offset-2):
                bool_remove[ri] = bool((self.res1_max_ratio[ri:ri+rule_of_thumb_offset+1]< max_ratio_threshold).all())
            guess_atten_idx = np.extract(bool_remove,np.arange(len(self.res1_max_ratio)))

            # require the attenuation value to be past the initial peak in MRT
            guess_atten_idx = guess_atten_idx[where(guess_atten_idx > argmax(self.res1_max_ratio) )[0]]

            if size(guess_atten_idx) >= 1:
                if guess_atten_idx[0]+rule_of_thumb_offset < len(self.Res1.atten1s):
                    guess_atten_idx[0] += rule_of_thumb_offset
                guess_atten = self.Res1.atten1s[guess_atten_idx[0]]
                self.select_atten(guess_atten)
                self.ui.atten.setValue(round(guess_atten))
            else:
                self.select_atten(self.Res1.atten1s[self.NAttens/2])
                self.ui.atten.setValue(round(self.Res1.atten1s[self.NAttens/2]))

    def guess_res_freq(self):
        guess_idx = argmax(self.res1_iq_vels[self.iAtten])
        print 'guess idx', guess_idx
        #The longest edge is identified, choose which vertex of the edge
        #is the resonant frequency by checking the neighboring edges            
        #len(IQ_vels[ch]) == len(f_span)-1, so guess_idx is the index
        #of the lower frequency vertex of the longest edge            
        if guess_idx-1 < 0 or self.res1_iq_vel[guess_idx-1] < self.res1_iq_vel[guess_idx+1]:
            iNewResFreq = guess_idx
        else:
            iNewResFreq = guess_idx-1
        guess = self.Res1.freq[iNewResFreq]
        print 'Guessing resonant freq at ',guess,' for self.iAtten=',self.iAtten
        self.select_freq(guess)

    def loadps(self):
        hd5file=openFile(str(self.openfile),mode='r')
        group = hd5file.getNode('/','r0')
        self.freq=empty(0,dtype='float32')
        for sweep in group._f_walkNodes('Leaf'):
            k=sweep.read()
            self.scale = k['scale'][0]
            #print "Scale factor is ", self.scale
            self.freq=append(self.freq,[k['f0'][0]])
        #self.freqList = np.zeros(len(k['f0']))
        #self.attenList = np.zeros(len(self.freqList)) - 1
        self.freqList = np.zeros(2000)
        self.attenList = np.zeros(len(self.freqList)) - 1
        hd5file.close()
        self.loadres()
    
    def on_press(self, event):
        self.select_freq(event.xdata)

    def click_plot_1(self, event):
        #Chris. self.select_atten(event.xdata)
        self.ui.atten.setValue(round(event.xdata))
    def select_freq(self,freq):
        self.resfreq = freq
        self.ui.frequency.setText(str(self.resfreq))
        self.ui.plot_2.canvas.ax.plot(self.Res1.freq[self.indx],self.res1_iq_vel[self.indx],'bo')
        self.ui.plot_3.canvas.ax.plot(self.Res1.I[self.indx],self.Res1.Q[self.indx],'bo')
        self.indx= where(self.Res1.freq >= self.resfreq)[0][0]
        self.ui.plot_2.canvas.ax.plot(self.Res1.freq[self.indx],self.res1_iq_vel[self.indx],'ro')
        self.ui.plot_2.canvas.draw()
        self.ui.plot_3.canvas.ax.plot(self.Res1.I[self.indx],self.Res1.Q[self.indx],'ro')
        self.ui.plot_3.canvas.draw()
       
        
    def select_atten(self,attenuation):
        if self.atten != -1:
            attenIndex = where(self.Res1.atten1s == self.atten)
            if size(attenIndex) >= 1:
                self.iAtten = attenIndex[0][0]
                self.ui.plot_1.canvas.ax.plot(self.atten,self.res1_max_ratio[self.iAtten],'ko')
                self.ui.plot_1.canvas.ax.plot(self.atten,self.res1_max_vels[self.iAtten],'bo')
        self.atten = round(attenuation)
        attenIndex = where(self.Res1.atten1s == self.atten)
        if size(attenIndex) != 1:
            print "Atten value is not in file"
            return
        self.iAtten = attenIndex[0][0]
        self.res1_iq_vel = self.res1_iq_vels[self.iAtten,:]
        self.Res1.I=self.Res1.Is[self.iAtten]
        self.Res1.Q=self.Res1.Qs[self.iAtten]
        self.Res1.Icen=self.Res1.Icens[self.iAtten]
        self.Res1.Qcen=self.Res1.Qcens[self.iAtten]
        self.ui.plot_1.canvas.ax.plot(self.atten,self.res1_max_ratio[self.iAtten],'ro')
        self.ui.plot_1.canvas.ax.plot(self.atten,self.res1_max_vels[self.iAtten],'ro')
        self.ui.plot_1.canvas.draw()
        #Chris S self.ui.atten.setValue(self.atten)
        self.makeplots()
        self.guess_res_freq()


    
    def makeplots(self):
        try:

            #Plot transmission magnitudeds as a function of frequency for this resonator
            #self.ui.plot_1.canvas.ax.clear()
            #self.ui.plot_1.canvas.ax.semilogy(self.Res1.freq,res1_iq_amp,'.-')
            #self.ui.plot_1.canvas.format_labels()
            #self.ui.plot_1.canvas.draw()
            
            self.ui.plot_2.canvas.ax.clear()
            self.ui.plot_2.canvas.ax.set_xlabel('frequency (GHz)')
            self.ui.plot_2.canvas.ax.set_ylabel('IQ velocity')
            self.ui.plot_2.canvas.ax.plot(self.Res1.freq[:-1],self.res1_iq_vel,'b.-')
            if self.iAtten > 0:
                self.ui.plot_2.canvas.ax.plot(self.Res1.freq[:-1],self.res1_iq_vels[self.iAtten-1],'g.-')
                self.ui.plot_2.canvas.ax.lines[-1].set_alpha(.7)
            if self.iAtten > 1:
                self.ui.plot_2.canvas.ax.plot(self.Res1.freq[:-1],self.res1_iq_vels[self.iAtten-2],'g.-')
                self.ui.plot_2.canvas.ax.lines[-1].set_alpha(.3)
            cid=self.ui.plot_2.canvas.mpl_connect('button_press_event', self.on_press)
            self.ui.plot_2.canvas.draw()

            self.ui.plot_3.canvas.ax.clear()
            if self.iAtten >0:
                self.ui.plot_3.canvas.ax.plot(self.Res1.Is[self.iAtten-1],self.Res1.Qs[self.iAtten-1],'g.-')
                #print self.Res1.Is[self.iAtten-1], np.shape(self.Res1.Is[self.iAtten-1])
                self.ui.plot_3.canvas.ax.lines[0].set_alpha(.6)
            if self.iAtten > 1:
                self.ui.plot_3.canvas.ax.plot(self.Res1.Is[self.iAtten-2],self.Res1.Qs[self.iAtten-2],'g.-')
                self.ui.plot_3.canvas.ax.lines[-1].set_alpha(.3)
            self.ui.plot_3.canvas.ax.plot(self.Res1.I,self.Res1.Q,'.-')
            #self.ui.plot_3.canvas.format_labels()
            print 'makeplots'
            self.ui.plot_3.canvas.draw()
        except IndexError:
            self.f.close()
            print "reached end of resonator list, saving file"
            print "closing GUI"
            sys.exit()

    def jumptores(self):
        try:
            self.atten = -1
            self.resnum = self.ui.jumptonum.value()
            self.resfreq = self.resnum
            self.loadres()
        except IndexError:
            print "Res value out of bounds."
            self.ui.plot_1.canvas.ax.clear()
            self.ui.plot_2.canvas.ax.clear()
            self.ui.plot_3.canvas.ax.clear()
            self.ui.plot_1.canvas.draw()
            self.ui.plot_2.canvas.draw()
            self.ui.plot_3.canvas.draw()
            

    def setnewatten(self):
        #Chris S.:  this is the only place that select_atten should be called.
        self.select_atten(self.ui.atten.value())

    def savevalues(self):
        #if self.resnum == 0:
        #    self.f = open(str(self.savefile), 'a')
        #    self.f.write(str(self.scale)+'\t'+str(self.scale)+'\t'+str(self.scale)+'\t'+str(self.scale)+'\n')
        #    self.f.close()
        #Icen=0
        #Qcen=0
        self.freqList[self.resnum] = self.resfreq
        self.attenList[self.resnum] = self.atten
        data = np.transpose([self.freqList[np.where(self.attenList >=0)], self.attenList[np.where(self.attenList >=0)]])
        
        try:
            dataCurrent = np.atleast_2d(np.loadtxt(str(self.savefile)))
            data = np.append(dataCurrent,data,axis=0)
        except:
            pass
        
        numpy.savetxt(str(self.savefile), data, "%10.9e %4i")
        
        #self.f = open(str(self.savefile), 'a')
        #self.f.write(str(self.resfreq)+'\t'+str(Icen)+'\t'+str(Qcen)+'\t'+str(self.atten)+'\n')
        #self.f.write(str(self.resfreq)+'\t'+str(self.atten)+'\n')
        #self.f.close()

        print " ....... Saved to file:  resnum=",self.resnum," resfreq=",self.resfreq," atten=",self.atten
        self.resnum += 1
        self.atten = -1
        self.loadres()