Пример #1
0
  def measureRabi(self,durations,data=None,rabiParameters=None, dataParameters=None):
    """
    Measure a rabi, will use what is in dictionnary if power/frequency/useCalibration/nLoops are not set
    Fit and save the period in the Qubit dictionnary under piRabiTime
    Return the datacube and rabiPeriod
    """

    if dataParameters==None:
      dataParameters=dict()
      dataParameters['addToDataManager']=True
      dataParameters['save']=True

    if rabiParameters==None:
      if self._params.has_key('rabiParameters'):
        rabiParameters=self._params['rabiParameters']
      else: raise Exception("Unable to find rabi parameters... Exiting... ")

    useCalibration=rabiParameters['useCalibration']
    frequency=rabiParameters['frequency']
    if frequency=="f01":frequency=self.frequency01()

    power=rabiParameters['power']
    nLoops=rabiParameters['nLoops']

    if rabiParameters.has_key('remember'):
      if rabiParameters['remember']: self._params['rabiParameters']=rabiParameters

    if self._params.has_key('offsetDelay'):
      offsetDelay=self._params['offsetDelay']
    else: offsetDelay=20

    if data==None:
      data=Datacube("Rabi %s dBm"%power)
      if dataParameters['addToDataManager']:data.toDataManager()


    if power !="stay":self._pulseGenerator._MWSource.setPower(power)
    self._pulseGenerator._MWSource.turnOn()
    for duration in durations:
      self.clearPulses()
      self.generateRabiPulse(duration=duration, frequency=frequency, offsetDelay=offsetDelay,useCalibration=rabiParameters['useCalibration'])
      result=self._jba.measure(nLoops=nLoops,fast=True)[0]
      data.set(**result)
      data.set(duration=duration)
      data.commit() 

    #Fit
    try:
      columnName="b%i"%self._jba.bit
      period= estimatePeriod(data['duration'],data[columnName])
      [y0,dy,piRabi,t10],yfit=fitRabi(data['duration'],data[columnName],period=period)
      data.createColumn("%sfit"%columnName,yfit)
    except:
      print 'fit error'
      piRabi=0
    if dataParameters['save']:data.savetxt()
    self._params['piRabiTime']=piRabi

    return data,piRabi
Пример #2
0
  def measureT1(self,delays,data=None,t1Parameters=None, dataParameters=None):
    """
    Measure a T1, will use what is in dictionnary if power/frequency/useCalibration/nLoops are not set
    Fit and save the period in the Qubit dictionnary under T1
    Return data and T1
    """
    if dataParameters==None:
      dataParameters=dict()
      dataParameters['addToDataManager']=True
      dataParameters['save']=True
    print t1Parameters
    if t1Parameters==None:
      if self._params.has_key('t1Parameters'):
        t1Parameters=self._params['t1Parameters']
      else: raise Exception("Unable to find rabi parameters... Exiting... ")

    useCalibration=t1Parameters['useCalibration']
    frequency=t1Parameters['frequency']
    if frequency=="f01":frequency=self.frequency01()
    print frequency 

    power=t1Parameters['power']
    nLoops=t1Parameters['nLoops']
    duration=t1Parameters['duration']
    if duration=="rabi":duration=self._params['piRabiTime']


    if t1Parameters.has_key('remember'):
      if t1Parameters['remember']: self._params['t1Parameters']=t1Parameters

    if self._params.has_key('offsetDelay'):
      offsetDelay=self._params['offsetDelay']
    else: offsetDelay=20

    if data==None:
      data=Datacube("T1 Measurement")
      if dataParameters['addToDataManager']:data.toDataManager()

    if power !="stay":self._pulseGenerator._MWSource.setPower(power)
   
    if power !="stay":self._pulseGenerator._MWSource.setPower(power)
  
    for delay in delays:

      self._pulseGenerator.clearPulse()
      self._pulseGenerator.generatePulse(duration=duration, frequency=frequency, DelayFromZero=10000-delay-duration-offsetDelay,useCalibration=False)
      self._pulseGenerator.sendPulse()

      result=self._jba.measure(nLoops=nLoops,fast=True)[0]
      data.set(**result)
      data.set(delay=delay)
      data.commit()
    
    columnName="b%i"%self._jba.bit
    [y0,dy,T1],yfit=fitT1(data['delay'],data[columnName])
    data.createColumn("fit",yfit)
    
    self._params['T1']=T1


    return data,T1
Пример #3
0
  def measureSpectroscopy(self,frequencies, data=None, spectroscopyParameters=None,dataParameters=None):
    """
    Measure a spectroscopy
    Fit
    Return the datacube and centerFrequency
    """

    if spectroscopyParameters==None:
      if self._params.has_key(spectroscopyParameters):
        spectroscopyParameters=self._params['spectroscopyParameters']
      else:
        raise Exception("No spectroscopy parameters found... Exiting...")

    if dataParameters==None:
      dataParameters=dict()
      dataParameters['addToDataManager']=True
      dataParameters['save']=True

    if spectroscopyParameters.has_key('remember'):self._params['spectroscopyParameters']=spectroscopyParameters

    useCalibration=spectroscopyParameters['useCalibration']
    nLoops=spectroscopyParameters['nLoops']
    duration=spectroscopyParameters['duration']
    if spectroscopyParameters.has_key('power'): self._pulseGenerator._MWSource.setPower(spectroscopyParameters['power'])
    amplitude = spectroscopyParameters['amplitude'] if spectroscopyParameters.has_key('amplitude') else 0


    if data==None:
      data=Datacube("Spectroscopy measurement")
      if dataParameters['addToDataManager']:data.toDataManager()



    if self._params.has_key('offsetDelay'):
      offsetDelay=self._params['offsetDelay']
    else: offsetDelay=20


    first=True
    for frequency in frequencies:
      self._pulseGenerator._MWSource.setFrequency(frequency)
      if first: # i.e. generate a rabi pulse on the AWG only the first time (no need to re-generate an AWG pulse every time)
        self._pulseGenerator.pulseList=()
        self.generateRabiPulse(duration=duration,amplitude=amplitude,offsetDelay=offsetDelay,useCalibration=useCalibration,frequency=frequency)
        first=False


      time.sleep(0.2)
      data.set(frequency=frequency)
      data.set(**self._jba.measure(nLoops=nLoops,fast=True)[0])
      data.commit()

    try:
      columnName="b%i"%self._jba.bit
      [dy,f0,df,y0],yfit=fitLorentzian(data['frequency'],data[columnName],1)
      data.createColumn(columnName+"fit",yfit)
    except:
      print "fitting error"
      [dy,f0,df,y0]=[0]*4

    if dataParameters['save']:data.savetxt()
    d0.setParameters(Manager().saveState('currentState'))

    return data, f0
Пример #4
0
  def methods(self,instrument,methodNames):
    return [getattr(instrument,methodName for methodName in methodNames]

  def methodsFromAliases(self,localInstrumentName,methodAliases):
    instr,methodsDict=self._subInstruments[localInstrumentName]
    return self.methods(instr,[methodsDict[methodAlias] for methodAlias in methodAliases])

  def checkAliasedMethodsExist(self,localInstrumentName,methodAliases=None):
    if methodAliases==None: methodAliases=self._subInstruments[localInstrumentName][1].keys()
    methods= self.methodsFromAliases(localInstrumentName,methodAliases)
    indices = [i for i, x in enumerate(methods) if x == None]
      if len(indices)!=O:
        raise NameError('methods '+str([methodAliases[i] for i in indices])+' do not seem to exist')

  def setBiasGen(self,instr,setBiasFuncName='setVoltage',getBiasFuncName='voltage'):
    if instr!=None:
      if isinstance(instr,str):
        inst=getInstrument(instr)
      else:
        inst=instr
      methods={'setBias':setBiasFuncName,'getBias':getBiasFuncName}
      self._subInstruments['biasGen']=(inst,methods)
      self.checkAliasedMethodsExist('biasGen')

  def setPumpGen(self,instr,setFreqFuncName='setFrequency',getFreqFuncName='frequency',setPowFuncName='setPower',getPowFuncName='power'):
    if instr!=None:
      if isinstance(instr,str):
        inst=getInstrument(pumpGen)
      else:
        inst=instr
      methods={'setFreq':setFreqFuncName,'getFreq':getFreqFuncNam,'setPow':setPowFuncName,'getPow':getPowFuncName}
      self._subInstruments['pumpGen']=(inst,methods)
      self.checkAliasedMethodsExist('pumpGen')

  def setTestVna(self,instr,\
    setFreqFuncName='setCenterInGhz',getFreqFuncName='getCenterInGhz',\
    setSpanFuncName='setSpanInGhz',getSpanFuncName='setSpanInGhz',\
    setPowFuncName='setTotalPower',getPowFuncName='getTotalPower',\
    getSpectrumFuncName='getFreqMagPhase',check=True\
    ):
    if instr!=None:
      if isinstance(instr,str):
        inst=getInstrument(pumpGen)
      else:
        inst=instr
      methods={'setFreq':setFreqFuncName,'getFreq':getSpanFuncNam,'setSpan':setSpanFuncName,'getSpan':getSpanFuncName,\
      'setPow':setPowFuncName,'getPow':getPowFuncName,'getSpectrum':getSpectrumFuncName}
      self._subInstruments['testVNA']=(inst,methods)
      self.checkAliasedMethodsExist('testVNA')


  def adaptFunc1(self,adaptiveLoop,deltafMax=span/10.,deltafMin=span/20.,stepMin=0.1,stepMax=1.):
        fbValues=adaptiveLoop.feedBackValues()
        if len(fbValues)>=2:
          step=adaptiveLoop.getStep()
          dir=1.0;
          if step<0:
            dir=-1.0
          deltaF=abs(fbValues[-1]-fbValues[-2])
          newStep=step
          if deltaF > deltafMax:
            newStep=max(abs(step/2.),stepMin)*dir
            adaptiveLoop.setStep(newStep)
          elif deltaF < deltafMin:
            newStep=min(abs(step*2),stepMax)*dir
            adaptiveLoop.setStep(newStep)

  def calibrateFreq(self,biasStart=None,biasStop=None,biasStep=1,centerStart=None,span=None,):
      
    if self._subInstruments['testVNA'].has_Key('biasGen')  
      setBias,getBias=self.methodsFromAliases('biasGen',['setBias','getBias'])     
      [setFreq,getFreq,setSpan,getSpan,setPow,getPow,getSpectrum]=self.methodsFromAliases('testVna',['setFreq','getFreq','setSpan','getSpan','setPow','getPow','getSpectrum'])
      if biasStart!=None : setFreq(biasStart)
      else :biasStart=getFreq()
      if biasStop==None : biasStop=biasStart+10*biasStep
      if centerStart!=None : setFreq(centerStart)
      if span!=None : setSpan(span)

      data=Datacube('parampFreqVsBias')
      data.toDataManager()
      xLoop=AdaptiveLoop(biasStart,step=biasStep,stop=biasStop,name=parampFreqVsBias,adaptFunc=self.adaptFunc1)
      setFreq(fCenter)
      for x in xLoop:
        print "Bias= ", x
        setBias(x,slewRate=0.5)
        child1=getSpectrum(waitFullSweep = True)
        child1.setName('bias'+str(x))
        data.addChild(child1)
        #Fit phase and determine center frequency f here
        xLoop.newFeedbackValue(f)
        data.set(bias=x,freq=f,commit=True,columnOrder=['bias','freq','peakdB'])