def phaseError(data,qubit,amplifyingPulses = 0, averaging = 40,phases = list(arange(0,math.pi*2.0,math.pi/10.0)),hot = False,flank = 5,delay = 0,updateNormalization = False,saveData = True): from instruments.qubit import PulseSequence data.setName("XPhi Sequence - %s" % qubit.name()) data.setParameters(instrumentManager.parameters()) data.parameters()["defaultPlot"] = [("phi","psw_normalized"),("phi","psw_normalized_fit")] if "pulses.xy.useDrag" in qubit.parameters() and qubit.parameters()["pulses.xy.useDrag"]: data.setName(data.name()+" - DRAG") f_sb = qubit.parameters()["pulses.xy.f_sb"] qubit.setDriveFrequency(qubit.parameters()["frequencies.f01"]+f_sb) qubit.setDriveAmplitude(I = qubit.parameters()["pulses.xy.drive_amplitude"],Q = qubit.parameters()["pulses.xy.drive_amplitude"]) data.setName(data.name()+" - %d amplifying pulses" % amplifyingPulses) failed = False try: for phi in phases: seq = PulseSequence() seq.addPulse(qubit.generateRabiPulse(phase = math.pi/2.0,angle = 0.0,f_sb = f_sb,sidebandDelay = seq.position())) for i in range(0,amplifyingPulses): seq.addWait(10) seq.addPulse(qubit.generateRabiPulse(phase = math.pi/2.0,angle = 0.0,f_sb = f_sb,sidebandDelay = seq.position())) seq.addWait(10) seq.addPulse(qubit.generateRabiPulse(phase = math.pi/2.0,angle = math.pi,f_sb = f_sb,sidebandDelay = seq.position())) seq.addWait(delay) seq.addPulse(qubit.generateRabiPulse(phase = math.pi/2.0,angle = phi,f_sb = f_sb,sidebandDelay = seq.position())) waveform = seq.getWaveform(endAt = qubit.parameters()["timing.readout"]) if hot: figure("waveform") cla() plot(real(waveform[-seq.position():])) plot(imag(waveform[-seq.position():])) qubit.loadWaveform(waveform,readout = qubit.parameters()["timing.readout"]) data.set(phi = phi*180.0/math.pi) data.set(psw_normalized = qubit.Psw(normalize = True,ntimes = averaging)) data.set(**acqiris.Psw()) data.commit() except StopThread: pass except: failed = True finally: if failed: raise fitfunc = lambda p, x: p[2]+p[0]*(1.0+scipy.cos(-p[1]+x/180.0*math.pi))/2.0 errfunc = lambda p, x, y,ff: numpy.linalg.norm((ff(p,x)-y)) ps = [max(data.column("psw_normalized"))-min(data.column("psw_normalized")),mean(data.column("psw_normalized")),0] p1 = data.column("psw_normalized") p1s = scipy.optimize.fmin(errfunc, ps,args=(data.column("phi"),p1,fitfunc)) rsquare = 1.0-numpy.cov(p1-fitfunc(p1s,data.column("phi")))/numpy.cov(p1) data.createColumn("psw_normalized_fit",fitfunc(p1s,data.column("phi"))) data.setDescription(data.description()+("\nPhase lag:%g deg" % (p1s[1]*180.0/math.pi))) data.setName(data.name() + (" - phi = %g deg" % (p1s[1]*180.0/math.pi))) if saveData: data.savetxt() return (p1s[1]*180.0/math.pi)
f_sb_12 = qubit.parameters()["pulses.xy.f_sb12"] t_pi_12 = qubit.parameters()["pulses.xy.t_pi12"] try: for duration in durations: seq = PulseSequence() l = len(qubit.generateRabiPulse(phase = phase)) zLen = len(qubit.generateZPulse(length = duration)) if amplitude != 0: zSeq = PulseSequence() zSeq.addPulse(baseForm) zSeq.setPosition(0) zSeq.addPulse(qubit.generateZPulse(length = duration,delay = qubit.parameters()["timing.readout"]-zLen-l)*amplitude) qubit.loadFluxlineWaveform(zSeq.getWaveform(),compensateResponse = False) if transition == 01 or 02 == transition: seq.addPulse(qubit.generateRabiPulse(angle = angle,phase = phase,f_sb = f_sb-f_offset,sidebandDelay = seq.position())) seq.addWait(zLen) seq.addPulse(qubit.generateRabiPulse(angle = angle,phase = phase,f_sb = f_sb-f_offset,sidebandDelay = seq.position())) elif transition == 12: seq.addPulse(qubit.generateRabiPulse(angle = angle,phase = math.pi,f_sb = f_sb,sidebandDelay = seq.position())) seq.addPulse(qubit.generateRabiPulse(angle = angle,length = t_pi_12/2.0*phase/math.pi*2.0,f_sb = f_sb_12-f_offset,sidebandDelay = seq.position())) seq.addWait(zLen) seq.addPulse(qubit.generateRabiPulse(angle = angle,length = t_pi_12/2.0*phase/math.pi*2.0,f_sb = f_sb_12-f_offset,sidebandDelay = seq.position())) seq.addPulse(qubit.generateRabiPulse(angle = angle,phase = math.pi,f_sb = f_sb,sidebandDelay = seq.position())) if use12Pulse: seq.addPulse(qubit.generateRabiPulse(angle = angle,phase = t_pi_12,f_sb = f_sb_12,sidebandDelay = seq.position())) qubit.loadWaveform(seq.getWaveform(endAt = qubit.parameters()["timing.readout"]),readout = qubit.parameters()["timing.readout"]) if callback != None: callback(duration)
def rabi(qubit,durations,data = None,variable ="p1x",f_sb = -0.1,amplitude = 1.0,averaging = 20,delay = 0,use12Pulse = False,callback = None,angle = 0,compositePulse = False,gaussian = True,flank = 3,saveData = True): if data == None: data = Datacube() data.setParameters(instrumentManager.parameters()) data.parameters()["defaultPlot"]=[["duration",variable]] data.setName("Rabi Sequence - %s" % qubit.name()) qubit.setDriveFrequency(qubit.parameters()["frequencies.f01"]+f_sb) qubit.setDriveAmplitude(I = amplitude,Q = amplitude) qubit.turnOnDrive() try: for duration in durations: if compositePulse: seq = PulseSequence() seq.addPulse(qubit.generateRabiPulse(angle = angle,length = duration/2.0,f_sb = f_sb,sidebandDelay = seq.position(),gaussian = gaussian)) seq.addWait(0) seq.addPulse(qubit.generateRabiPulse(angle = angle,length = duration/2.0,f_sb = f_sb,sidebandDelay = seq.position(),gaussian = gaussian)) qubit.loadWaveform(seq.getWaveform(endAt = qubit.parameters()["timing.readout"]-delay),readout = qubit.parameters()["timing.readout"]) else: seq = PulseSequence() seq.addPulse(qubit.generateRabiPulse(angle = angle,length = duration,f_sb = f_sb,sidebandDelay = seq.position(),gaussian = gaussian)) if use12Pulse: f_carrier = qubit.parameters()["frequencies.f01"]+f_sb f_sb_12 = -(qubit.parameters()["frequencies.f12"]-f_carrier) t_pi_12 = qubit.parameters()["pulses.xy.t_pi12"] seq.addPulse(qubit.generateRabiPulse(angle = angle,length = t_pi_12,f_sb = f_sb_12,sidebandDelay = seq.position())) qubit.loadWaveform(seq.getWaveform())#endAt = qubit.parameters()["timing.readout"]-delay),readout = qubit.parameters()["timing.readout"]) if callback != None: callback(duration) acqiris.bifurcationMap(ntimes = averaging) data.set(duration = duration) data.set(**acqiris.Psw()) data.commit() except: import traceback traceback.print_exc() finally: (params,rsquare) = fitRabiFrequency(data,variable,withOffset = True) if rsquare > 0.5: qubit.parameters()["pulses.xy.t_pi"] = float(params[1]/2.0) qubit.parameters()["pulses.xy.drive_amplitude"] = float(amplitude) qubit.parameters()["pulses.xy.f_sb"] = float(f_sb) data.parameters()["rabiFit"] = params qubit.loadRabiPulse(flank = flank,angle = angle,phase = math.pi,readout = qubit.parameters()["timing.readout"],f_sb = f_sb) else: print "Rabi fit is not good, resetting parameters..." qubit.parameters()["pulses.xy.t_pi"] = None qubit.parameters()["pulses.xy.drive_amplitude"] = None qubit.parameters()["pulses.xy.f_sb"] = None if saveData: data.savetxt() return data
rhoBeforeSwap = targetRho.copy() driveSequence1.addPulse(qubit1.generateRabiPulse(f_sb=f_sb1, phase=math.pi / 2.0, angle=math.pi / 2.0)) driveSequence2.addPulse(qubit2.generateRabiPulse(f_sb=f_sb2, phase=math.pi / 2.0, angle=math.pi / 2.0)) maxLen = max(len(driveSequence1), len(driveSequence2)) driveSequence1.addWait(maxLen - len(driveSequence1)) driveSequence2.addWait(maxLen - len(driveSequence2)) if step >= 2: # We apply the tag operator... fluxSequence1.addPulse(zPulse * fluxAnticrossing, position=driveSequence1.position()) fluxSequence2.addWait(fluxSequence1.position() - fluxSequence2.position()) fluxSequence1.addPulse(qubit1.generateZPulse(length=6, gaussian=False) * alpha) fluxSequence2.addPulse(qubit2.generateZPulse(length=6, gaussian=False) * beta) fluxSequence1.addWait(3) fluxSequence2.addWait(3) driveSequence1.addWait(fluxSequence1.position() - driveSequence1.position()) driveSequence2.addWait(fluxSequence2.position() - driveSequence2.position()) targetRho = swap * targetRho * adjoint(swap) if step >= 3: