def char(): print('User %s is allowed to run measurement: %s' % (g.user['username'], session['run_clearance'])) samplename = get_status("MSSN")['sample'] return render_template("blog/msson/char.html", samplename=samplename, people=session['people'])
def InitWithOptions(IdQuery=False, Reset=False, OptionsString='Simulate=false, DriverSetup=DDS=false'): '''[Initialize the connection] status = InitWithOptions(IdQuery, Reset, OptionsString) ''' # rs = address(mdlname, reset=eval(debugger)) # Instrument's Address ad = address() rs = ad.lookup(mdlname, 2) # Instrument's Address Resource = bytes(rs, 'ascii') Option = bytes(OptionsString, 'ascii') # utf-8 Session = c_long() AGM = dll.AgM933x_InitWithOptions # from AgM933x.chm AGM.restype = c_int status = AGM(c_char_p(Resource), c_bool(IdQuery), c_bool(Reset), c_char_p(Option), byref(Session)) msession = Session.value if status == 0: set_status(mdlname, dict(state="Initialized Successfully", session=msession)) else: set_status(mdlname, dict(state="Error: " + str(status))) msession = get_status(mdlname)["session"] print(Fore.GREEN + "%s's connection Initialized at session %s: %s" % (mdlname, msession, status_code(status))) return msession
def allstatus(): dr = bluefors() dr.selectday(-1) # Logging Latest Key-Readings for ALL latestbdr = {} for i in range(6): latestbdr.update({"P%s" % (i + 1): dr.pressurelog(i + 1)[1][-1]}) for i in [1, 2, 5, 6, 7]: latestbdr.update({"T%s" % (i + 1): dr.temperaturelog(i + 1)[1][-1]}) set_status("BDR", latestbdr) status = {} status['PSGV'] = get_status('PSGV')["state"] status['AWG'] = get_status('AWG')["state"] log = pauselog() #disable logging (NOT applicable on Apache) return jsonify(log=str(log), latestbdr=latestbdr, status=status)
def char_fresp_init(): run_status = not get_status("F_Response")['pause'] global M_fresp try: print(Fore.GREEN + "Connected M-USER(s): %s" % M_fresp.keys()) except: M_fresp = {} # set_status("F_Response", dict(repeat=False)) M_fresp[session['user_name']] = F_Response( session['people']) # initializing Law Maker -> Executioner return jsonify(run_status=run_status, daylist=M_fresp[session['user_name']].daylist, run_permission=session['run_clearance'])
def char_cwsweep_init(): global M_cwsweep # check currently-connected users: try: print(Fore.GREEN + "Connected M-USER(s): %s" % M_cwsweep.keys()) except: M_cwsweep = {} # check configuration: run_status = not get_status("CW_Sweep")['pause'] # set_status("CW_Sweep", dict(repeat=False)) # 'user_name' accessing 'people' data: M_cwsweep[session['user_name']] = CW_Sweep(session['people']) print(Fore.BLUE + "User %s is looking at %s's data" % (session['user_name'], session['people'])) return jsonify(run_status=run_status, daylist=M_cwsweep[session['user_name']].daylist, run_permission=session['run_clearance'])
def usersamples_meal(): sname = request.args.get('sname') set_status("MSSN", {session['user_name']: dict(sample=sname)}) return jsonify(sname=get_status("MSSN")[session['user_name']]['sample'])
Multi Processor for fresp 2D-plotting: ''' import sys, struct from numpy import array from multiprocessing import Pool from flask import g, session print("user %s's run clearance is %s" % (g.user['username'], session['run_clearance'])) from pyqum.instrument.logger import get_status, set_status from pyqum.instrument.toolbox import cdatasearch, gotocdata from pyqum.instrument.analyzer import IQAP pqfile = get_status("MPW")["pqfile"] datalocation = get_status("MPW")["datalocation"] writtensize = get_status("MPW")["writtensize"] c_fresp_structure = get_status("MPW")["c_fresp_structure"] ifluxbias = get_status("MPW")["ifluxbias"] isparam = get_status("MPW")["isparam"] iifb = get_status("MPW")["iifb"] ipowa = get_status("MPW")["ipowa"] ifreq = get_status("MPW")["ifreq"] with open(pqfile, 'rb') as datapie: datapie.seek(datalocation + 7) pie = datapie.read(writtensize) selectedata = list(struct.unpack('>' + 'd' * ((writtensize) // 8), pie))
def F_Response(user, tag="", corder={}, comment='', dayindex='', taskentry=0, resumepoint=0, instr=['YOKO', 'ENA'], testeach=False): '''Characterizing Frequency Response: C-Order: Flux-Bias, S-Parameter, IF-Bandwidth, Power, Frequency ''' sample = get_status("MSSN")['sample'] # pushing pre-measurement parameters to settings: yield user, sample, tag, instr, corder, comment, dayindex, taskentry, testeach # User-defined Controlling-PARAMETER(s) ====================================================================================== fluxbias = waveform(corder['Flux-Bias']) Sparam = waveform(corder['S-Parameter']) ifb = waveform(corder['IF-Bandwidth']) powa = waveform(corder['Power']) freq = waveform(corder['Frequency']) # Total data points: datasize = prod([waveform(x).count for x in corder.values() ]) * 2 #data density of 2 due to IQ # Pre-loop settings: # ENA: bench = ENA.Initiate(True) ENA.dataform(bench, action=['Set', 'REAL']) ENA.sweep(bench, action=['Set', 'ON', freq.count]) fstart, fstop = freq.data[0] * 1e9, freq.data[-1] * 1e9 ENA.linfreq(bench, action=['Set', fstart, fstop]) # Linear Freq-sweep-range # YOKO: if "opt" not in fluxbias.data: # check if it is in optional-state yokog = YOKO.Initiate( current=True ) # PENDING option: choose between Voltage / Current output YOKO.output(yokog, 1) # Buffer setting(s) for certain loop(s): buffersize_1 = freq.count * 2 #data density of 2 due to IQ # User-defined Measurement-FLOW ============================================================================================== if testeach: # measure-time contribution from each measure-loop loopcount, loop_dur = [], [] stage, prev = clocker(0) # Marking starting point of time # Registerring parameter(s)-structure cstructure = [fluxbias.count, Sparam.count, ifb.count, powa.count] # set previous parameters based on resumepoint: if resumepoint > 0: caddress = cdatasearch(resumepoint // buffersize_1, cstructure) # Only those involved in virtual for-loop need to be pre-set here: if "opt" not in fluxbias.data: # check if it is in optional-state YOKO.sweep( yokog, str(fluxbias.data[caddress[0]]), pulsewidth=77 * 1e-3, sweeprate=0.0007 ) # A-mode: sweeprate=0.0007 A/s ; V-mode: sweeprate=0.07 V/s ENA.setrace(bench, Mparam=[Sparam.data[caddress[1]]], window='D1') ENA.ifbw(bench, action=['Set', ifb.data[caddress[2]]]) measure_loop_1 = range( resumepoint // buffersize_1, datasize // buffersize_1) # saving chunck by chunck improves speed a lot! while True: for i in measure_loop_1: # Registerring parameter(s) caddress = cdatasearch(i, cstructure) # setting each c-order (From High to Low level of execution): if not i % prod(cstructure[ 1::]): # virtual for-loop using exact-multiples condition if "opt" not in fluxbias.data: # check if it is in optional-state if testeach: # test each measure-loop: loopcount += [fluxbias.count] if fluxbias.count > 1: loop_dur += [ abs(fluxbias.data[0] - fluxbias.data[1]) / 0.2 + 35 * 1e-3 ] else: loop_dur += [0] stage, prev = clocker(stage, prev) # Marking time else: YOKO.sweep( yokog, str(fluxbias.data[caddress[0]]), pulsewidth=77 * 1e-3, sweeprate=0.0007 ) # A-mode: sweeprate=0.0007 A/s ; V-mode: sweeprate=0.07 V/s if not i % prod(cstructure[ 2::]): # virtual for-loop using exact-multiples condition ENA.setrace(bench, Mparam=[Sparam.data[caddress[1]]], window='D1') if not i % prod(cstructure[ 3::]): # virtual for-loop using exact-multiples condition ENA.ifbw(bench, action=['Set', ifb.data[caddress[2]]]) ENA.power(bench, action=['Set', powa.data[caddress[3]] ]) # same as the whole measure-loop # start sweeping: stat = ENA.sweep(bench) #getting the estimated sweeping time print("Time-taken for this loop would be: %s (%spts)" % (stat[1]['TIME'], stat[1]['POINTS'])) print("Operation Complete: %s" % bool(ENA.measure(bench))) # adjusting display on ENA: ENA.autoscal(bench) ENA.selectrace(bench, action=['Set', 'para 1 calc 1']) data = ENA.sdata(bench) # print(Fore.YELLOW + "\rProgress: %.3f%% [%s]" %((i+1)/datasize*100, data), end='\r', flush=True) print(Fore.YELLOW + "\rProgress: %.3f%%" % ((i + 1) / datasize * buffersize_1 * 100), end='\r', flush=True) # test for the last loop if there is if testeach: # test each measure-loop: loopcount += [len(measure_loop_1)] loop_dur += [time() - prev] stage, prev = clocker(stage, prev) # Marking time ENA.close(bench) if "opt" not in fluxbias.data: # check if it is in optional-state YOKO.close(yokog, False) yield loopcount, loop_dur else: if get_status("F_Response")['pause']: break else: yield data if not get_status("F_Response")['repeat']: set_status("F_Response", dict(pause=True)) ENA.close(bench) if "opt" not in fluxbias.data: # check if it is in optional-state YOKO.close(yokog, True) return
def CW_Sweep(user, tag="", corder={}, comment='', dayindex='', taskentry=0, resumepoint=0, instr=['PSG', 'YOKO', 'ENA'], testeach=False): '''Continuous Wave Sweeping: C-Order: Flux-Bias, XY-Frequency, XY-Power, S-Parameter, IF-Bandwidth, Frequency, Power ''' sample = get_status("MSSN")['sample'] # pushing pre-measurement parameters to settings: yield user, sample, tag, instr, corder, comment, dayindex, taskentry, testeach # User-defined Controlling-PARAMETER(s) ====================================================================================== fluxbias = waveform(corder['Flux-Bias']) xyfreq = waveform(corder['XY-Frequency']) xypowa = waveform(corder['XY-Power']) Sparam = waveform(corder['S-Parameter']) ifb = waveform(corder['IF-Bandwidth']) freq = waveform(corder['Frequency']) # special treatment to power in this CW-Mode Sweeping: powa = waveform(corder['Power']) powa_repeat = powa.inner_repeat print("power sequence: %s, length: %s, inner-repeat-counts: %s" % (powa.command, powa.count, powa_repeat)) # input("continue?") # Total data points: datasize = int( prod([ waveform(x).count * waveform(x).inner_repeat for x in corder.values() ], dtype='uint64')) * 2 #data density of 2 due to IQ print("data size: %s" % datasize) # Pre-loop settings: # ENA: bench = ENA.Initiate(True) ENA.dataform(bench, action=['Set', 'REAL']) if powa_repeat == 1: # collect swept power-data every measure-loop ENA.sweep(bench, action=['Set', 'ON', powa.count]) ENA.power(bench, action=['Set', '', powa.data[0], powa.data[-1] ]) # for power sweep (set pstart & pstop) buffersize_1 = powa.count * 2 # (buffer) data density of 2 due to IQ else: # collect repetitive power-data every measure-loop ENA.sweep(bench, action=['Set', 'ON', powa_repeat]) buffersize_1 = powa_repeat * 2 # (buffer) data density of 2 due to IQ # YOKO: if "opt" not in fluxbias.data: # check if it is in optional-state / serious-state yokog = YOKO.Initiate(current=True) # pending option YOKO.output(yokog, 1) # PSG: if "opt" not in xyfreq.data: # check if it is in optional-state / serious-state sogo = PSG0.Initiate() # pending option PSG0.rfoutput(sogo, action=['Set', 1]) # User-defined Measurement-FLOW ============================================================================================== if testeach: # measure-time contribution from each measure-loop loopcount, loop_dur = [], [] stage, prev = clocker(0) # Marking starting point of time # Registerring parameter(s)-structure if powa_repeat == 1: cstructure = [ fluxbias.count, xyfreq.count, xypowa.count, Sparam.count, ifb.count, freq.count, 1 ] # just single CW else: cstructure = [ fluxbias.count, xyfreq.count, xypowa.count, Sparam.count, ifb.count, freq.count, powa.count ] # take CW average by repeating # set previous parameters based on resumepoint: if resumepoint // buffersize_1 > 0: caddress = cdatasearch(resumepoint // buffersize_1, cstructure) # Only those involved in virtual for-loop need to be pre-set here: # Optionals: if "opt" not in fluxbias.data: # check if it is in optional-state / serious-state YOKO.sweep( yokog, str(fluxbias.data[caddress[0]]), pulsewidth=77 * 1e-3, sweeprate=0.0007 ) # A-mode: sweeprate=0.0007 A/s ; V-mode: sweeprate=0.07 V/s if "opt" not in xyfreq.data: # check if it is in optional-state / serious-state PSG0.frequency( sogo, action=['Set', str(xyfreq.data[caddress[1]]) + "GHz"]) PSG0.power(sogo, action=['Set', str(xypowa.data[caddress[2]]) + "dBm"]) # Basics: ENA.setrace(bench, Mparam=[Sparam.data[caddress[3]]], window='D1') ENA.ifbw(bench, action=['Set', ifb.data[caddress[4]]]) ENA.cwfreq(bench, action=['Set', freq.data[caddress[5]] * 1e9]) measure_loop_1 = range( resumepoint // buffersize_1, datasize // buffersize_1) # saving chunck by chunck improves speed a lot! while True: for i in measure_loop_1: # determining the index-locations for each parameters, i.e. the address at any instance caddress = cdatasearch(i, cstructure) # setting each c-order (From High to Low level of execution): # *************************************************************** # Optionals: if not i % prod(cstructure[ 1::]): # virtual for-loop using exact-multiples condition if "opt" not in fluxbias.data: # check if it is in optional-state if testeach: # adding instrument transition-time between set-values: loopcount += [fluxbias.count] if fluxbias.count > 1: loop_dur += [ abs(fluxbias.data[0] - fluxbias.data[1]) / 0.2 + 35 * 1e-3 ] else: loop_dur += [0] stage, prev = clocker(stage, prev) # Marking time else: YOKO.sweep( yokog, str(fluxbias.data[caddress[0]]), pulsewidth=77 * 1e-3, sweeprate=0.0007 ) # A-mode: sweeprate=0.0007 A/s ; V-mode: sweeprate=0.07 V/s if not i % prod(cstructure[ 2::]): # virtual for-loop using exact-multiples condition if "opt" not in xyfreq.data: # check if it is in optional-state PSG0.frequency( sogo, action=['Set', str(xyfreq.data[caddress[1]]) + "GHz"]) if not i % prod(cstructure[ 3::]): # virtual for-loop using exact-multiples condition if "opt" not in xypowa.data: # check if it is in optional-state PSG0.power( sogo, action=['Set', str(xypowa.data[caddress[2]]) + "dBm"]) # Basics: if not i % prod(cstructure[ 4::]): # virtual for-loop using exact-multiples condition ENA.setrace(bench, Mparam=[Sparam.data[caddress[3]]], window='D1') if not i % prod(cstructure[ 5::]): # virtual for-loop using exact-multiples condition ENA.ifbw(bench, action=['Set', ifb.data[caddress[4]]]) if not i % prod(cstructure[ 6::]): # virtual for-loop using exact-multiples condition ENA.cwfreq(bench, action=['Set', freq.data[caddress[5]] * 1e9]) if powa_repeat > 1: ENA.power(bench, action=[ 'Set', '', powa.data[caddress[6]], powa.data[caddress[6]] ]) # same as the whole measure-loop # start sweeping: stat = ENA.sweep(bench) #getting the estimated sweeping time print("Time-taken for this loop would be: %s (%spts)" % (stat[1]['TIME'], stat[1]['POINTS'])) print("Operation Complete: %s" % bool(ENA.measure(bench))) # adjusting display on ENA: ENA.autoscal(bench) ENA.selectrace(bench, action=['Set', 'para 1 calc 1']) data = ENA.sdata(bench) print(Fore.YELLOW + "\rProgress: %.3f%%" % ((i + 1) / datasize * buffersize_1 * 100), end='\r', flush=True) # test for the last loop if there is if testeach: # test each measure-loop: loopcount += [len(measure_loop_1)] loop_dur += [time() - prev] stage, prev = clocker(stage, prev) # Marking time ENA.close(bench) if "opt" not in xyfreq.data: # check if it is in optional-state PSG0.close(sogo, False) if "opt" not in fluxbias.data: # check if it is in optional-state YOKO.close(yokog, False) yield loopcount, loop_dur else: if get_status("CW_Sweep")['pause']: break else: yield data if not get_status("CW_Sweep")['repeat']: set_status("CW_Sweep", dict(pause=True)) ENA.close(bench) if "opt" not in xyfreq.data: # check if it is in optional-state PSG0.rfoutput(sogo, action=['Set', 0]) PSG0.close(sogo, False) if "opt" not in fluxbias.data: # check if it is in optional-state YOKO.output(yokog, 0) YOKO.close(yokog, False) return
def char_cwsweep_pause(): set_status("CW_Sweep", dict(pause=True)) return jsonify(pause=get_status("CW_Sweep")['pause'])
def awglog(): log = get_status('AWG') return jsonify(log=log)
def mxglog(): log = get_status('MXG') return jsonify(log=log)
def usersamples_meal(): sname = request.args.get('sname') set_status("MSSN", dict(sample=sname)) return jsonify(sname=get_status("MSSN")['sample'])
def nalog(): log = get_status(request.args.get('natype')) return jsonify(log=log)
''' Multi Processor for fresp 2D-plotting: ''' import sys, struct from numpy import array from multiprocessing import Pool from pyqum.instrument.logger import get_status, set_status from pyqum.instrument.toolbox import cdatasearch, gotocdata, waveform from pyqum.instrument.analyzer import IQAP pqfile = get_status("MPW")["pqfile"] datalocation = get_status("MPW")["datalocation"] writtensize = get_status("MPW")["writtensize"] c_cwsweep_structure = get_status("MPW")["c_cwsweep_structure"] cselect = get_status("MPW")["cselect"] # Loading DATA: with open(pqfile, 'rb') as datapie: datapie.seek(datalocation+7) pie = datapie.read(writtensize) selectedata = list(struct.unpack('>' + 'd'*((writtensize)//8), pie)) # Assembling 2D mesh: def assembler(args): (y,x) = args selected_caddress = [s for s in cselect.values()]
def char_fresp_setrepeat(): set_status("F_Response", dict(repeat=bool(int(request.args.get('repeat'))))) return jsonify(repeat=get_status("F_Response")['repeat'])
def char_fresp_getrepeat(): return jsonify(repeat=get_status("F_Response")['repeat'])
def char_cwsweep_getrepeat(): return jsonify(repeat=get_status("CW_Sweep")['repeat'])
def char_cwsweep_setrepeat(): set_status("CW_Sweep", dict(repeat=bool(int(request.args.get('repeat'))))) return jsonify(repeat=get_status("CW_Sweep")['repeat'])
def vsalog(): log = get_status('VSA') return jsonify(log=log)
def esglog(): log = get_status('ESG') return jsonify(log=log)
def char_fresp_pause(): set_status("F_Response", dict(pause=True)) return jsonify(pause=get_status("F_Response")['pause'])
def dsolog(): log = get_status('DSO') return jsonify(log=log)
def SQE_Pulse(user, tag="", corder={}, comment='', dayindex='', taskentry=0, resumepoint=0, instr=['YOKO', 'PSGV', 'PSGA', 'AWG', 'VSA'], testeach=False): '''Time-domain Square-wave measurement: C-Structure: ['Flux-Bias', 'Average', 'Pulse-Period', 'ADC-delay', 'LO-Frequency', 'LO-Power', 'RO-Frequency', 'RO-Power', 'RO-ifLevel', 'RO-Pulse-Delay', 'RO-Pulse-Width', 'XY-Frequency', 'XY-Power', 'XY-ifLevel', 'XY-Pulse-Delay', 'XY-Pulse-Width', 'Sampling-Time'] (IQ-Bandwidth (250MHz or its HALFlings) + Acquisition-Time (dt must be multiples of 2ns)) ''' # Loading sample: sample = get_status("MSSN")[session['user_name']]['sample'] # sample = get_status("MSSN")['abc']['sample'] # by-pass HTTP-request before interface is ready # pushing pre-measurement parameters to settings: yield user, sample, tag, instr, corder, comment, dayindex, taskentry, testeach # ***USER_DEFINED*** Controlling-PARAMETER(s) ====================================================================================== structure = corder['C-Structure'] fluxbias = waveform(corder['Flux-Bias']) averaging = waveform(corder['Average']) pperiod = waveform(corder['Pulse-Period']) adcdelay = waveform(corder['ADC-delay']) lofreq = waveform(corder['LO-Frequency']) lopowa = waveform(corder['LO-Power']) rofreq = waveform(corder['RO-Frequency']) ropowa = waveform(corder['RO-Power']) roiflevel = waveform(corder['RO-ifLevel']) ropdelay = waveform(corder['RO-Pulse-Delay']) ropwidth = waveform(corder['RO-Pulse-Width']) xyfreq = waveform(corder['XY-Frequency']) xypowa = waveform(corder['XY-Power']) xyiflevel = waveform(corder['XY-ifLevel']) xypdelay = waveform(corder['XY-Pulse-Delay']) xypwidth = waveform(corder['XY-Pulse-Width']) samptime = waveform(corder['Sampling-Time']) # Total data points: datasize = int( prod([waveform(corder[param]).count for param in structure], dtype='uint64')) * 2 #data density of 2 due to IQ print("data size: %s" % datasize) # Pre-loop settings: # Optionals: # YOKO: if "opt" not in fluxbias.data: # check if it is in optional-state / serious-state yokog = YOKO.Initiate(current=True) # pending option YOKO.output(yokog, 1) # PSGV: if "opt" not in xyfreq.data: # check if it is in optional-state / serious-state sogo = PSG0.Initiate() # pending option PSG0.rfoutput(sogo, action=['Set', 1]) # Basics: # PSGA for LO: saga = PSG1.Initiate() # pending option PSG1.rfoutput(saga, action=['Set', 1]) # AWG for Control: awgsess = AWG.InitWithOptions() AWG.Abort_Gen(awgsess) AWG.ref_clock_source(awgsess, action=['Set', int(1)]) # External 10MHz clock-reference AWG.predistortion_enabled(awgsess, action=['Set', True]) AWG.output_mode_adv(awgsess, action=['Set', int(2)]) # Sequence output mode AWG.arb_sample_rate(awgsess, action=['Set', float(1250000000)]) # maximum sampling rate AWG.active_marker(awgsess, action=['Set', '1']) # master AWG.marker_delay(awgsess, action=['Set', float(0)]) AWG.marker_pulse_width(awgsess, action=['Set', float(1e-7)]) AWG.marker_source(awgsess, action=['Set', int(7)]) # PRESET Output: for ch in range(2): channel = str(ch + 1) AWG.output_config(awgsess, RepCap=channel, action=["Set", 0]) # Single-ended AWG.output_filter_bandwidth(awgsess, RepCap=channel, action=["Set", 0]) AWG.arb_gain(awgsess, RepCap=channel, action=["Set", 0.5]) AWG.output_impedance(awgsess, RepCap=channel, action=["Set", 50]) # output settings: for ch in range(2): channel = str(ch + 1) AWG.output_enabled(awgsess, RepCap=channel, action=["Set", int(1)]) # ON AWG.output_filter_enabled(awgsess, RepCap=channel, action=["Set", True]) AWG.output_config(awgsess, RepCap=channel, action=["Set", int(2)]) # Amplified 1:2 AWG.output_filter_bandwidth(awgsess, RepCap=channel, action=["Set", 0]) AWG.arb_gain(awgsess, RepCap=channel, action=["Set", 0.5]) AWG.output_impedance(awgsess, RepCap=channel, action=["Set", 50]) # VSA for Readout vsasess = VSA.InitWithOptions() # Buffer-size for lowest-bound data-collecting instrument: buffersize_1 = samptime.count * 2 #data density of 2 due to IQ print("Buffer-size: %s" % buffersize_1) # User-defined Measurement-FLOW ============================================================================================== if testeach: # measure-time contribution from each measure-loop loopcount, loop_dur = [], [] stage, prev = clocker(0) # Marking starting point of time # Registerring parameter(s)-structure cstructure = [waveform(corder[param]).count for param in structure ][:-1] # The last one will become a buffer print('cstructure: %s' % cstructure) measure_loop_1 = range( resumepoint // buffersize_1, datasize // buffersize_1) # saving chunck by chunck improves speed a lot! while True: for i in measure_loop_1: print(Back.BLUE + Fore.WHITE + 'measure %s/%s' % (i, datasize // buffersize_1)) # determining the index-locations for each parameters, i.e. the address at any instance caddress = cdatasearch(i, cstructure) # setting each c-order (From High to Low level of execution): # *************************************************************** for j in range( len(cstructure) - 1): # the last one will be run for every i (common sense!) if ( not i % prod(cstructure[j + 1::]) ) or i == resumepoint // buffersize_1: # virtual for-loop using exact-multiples condition # print("entering %s-stage" %j) # Optionals: # YOKO if structure[j] == 'Flux-Bias': if "opt" not in fluxbias.data: # check if it is in optional-state if testeach: # adding instrument transition-time between set-values: loopcount += [fluxbias.count] if fluxbias.count > 1: loop_dur += [ abs(fluxbias.data[0] - fluxbias.data[1]) / 0.2 + 35 * 1e-3 ] # manually calculating time without really setting parameter on the instrument else: loop_dur += [0] stage, prev = clocker(stage, prev) # Marking time else: YOKO.sweep( yokog, str(fluxbias.data[caddress[structure.index( 'Flux-Bias')]]), pulsewidth=77 * 1e-3, sweeprate=0.0007 ) # A-mode: sweeprate=0.0007 A/s ; V-mode: sweeprate=0.07 V/s # PSG if structure[j] == 'XY-Frequency': if "opt" not in xyfreq.data: # check if it is in optional-state PSG0.frequency( sogo, action=[ 'Set', str(xyfreq.data[caddress[structure.index( 'XY-Frequency')]]) + "GHz" ]) if structure[j] == 'XY-Power': if "opt" not in xypowa.data: # check if it is in optional-state PSG0.power(sogo, action=[ 'Set', str(xypowa.data[caddress[ structure.index('XY-Power')]]) + "dBm" ]) if structure[j] == 'RO-Frequency': if "opt" not in rofreq.data: # check if it is in optional-state PSG1.frequency( saga, action=[ 'Set', str(rofreq.data[caddress[structure.index( 'RO-Frequency')]]) + "GHz" ]) if structure[j] == 'RO-Power': if "opt" not in ropowa.data: # check if it is in optional-state PSG1.power(saga, action=[ 'Set', str(ropowa.data[caddress[ structure.index('RO-Power')]]) + "dBm" ]) # AWG (Every-loop) if "opt" not in pperiod.data: # check if it is in optional-state AWG.Clear_ArbMemory(awgsess) WAVE = [] # construct waveform: ifperiod = pperiod.data[caddress[structure.index( 'Pulse-Period')]] ifscale = float( xyiflevel.data[caddress[structure.index('XY-ifLevel')]] ), float( roiflevel.data[caddress[structure.index('RO-ifLevel')]]) if "lockxypwd" in str(ropdelay.data[0]): if '+' in str(ropdelay.data[0]): rooffset = float(ropdelay.data[0].split('+')[1]) else: rooffset = 0 # default value ifdelay = float(xypdelay.data[caddress[structure.index( 'XY-Pulse-Delay')]]), float(xypwidth.data[caddress[ structure.index('XY-Pulse-Width')]]) + rooffset print("RO-Pulse Delays behind XY-Pulse for %sns" % (ifdelay[1] - ifdelay[0])) else: ifdelay = float(xypdelay.data[caddress[structure.index( 'XY-Pulse-Delay')]]), float(ropdelay.data[caddress[ structure.index('RO-Pulse-Delay')]]) ifontime = float( xypwidth.data[caddress[structure.index('XY-Pulse-Width')]] ), float( ropwidth.data[caddress[structure.index('RO-Pulse-Width')]]) for ch in range(2): channel = str(ch + 1) wavefom = squarewave(ifperiod, ifontime[ch], ifdelay[ch], ifscale[ch]) # in ns stat, wave = AWG.CreateArbWaveform(awgsess, wavefom) print('Waveform channel %s: %s <%s>' % (channel, wave, status_code(stat))) WAVE.append(wave) # Building Sequences: for ch in range(2): channel = str(ch + 1) status, seqhandl = AWG.CreateArbSequence( awgsess, [WAVE[ch]], [1] ) # loop# canbe >1 if longer sequence is needed in the future! # print('Sequence channel %s: %s <%s>' %(channel, seqhandl, status_code(status))) # Channel Assignment: stat = AWG.arb_sequence_handle(awgsess, RepCap=channel, action=["Set", seqhandl]) # print('Sequence channel %s embeded: %s <%s>' %(channel, stat[1], status_code(stat[0]))) # Trigger Settings: for ch in range(2): channel = str(ch + 1) AWG.operation_mode(awgsess, RepCap=channel, action=["Set", 0]) AWG.trigger_source_adv(awgsess, RepCap=channel, action=["Set", 0]) AWG.Init_Gen(awgsess) AWG.Send_Pulse(awgsess, 1) # Basic / Buffer: # VSA (Every-loop) VSA.acquisition_time(vsasess, action=['Set', float(samptime.count * 2e-9) ]) # minimum time resolution VSA.preselector_enabled(vsasess, action=[ 'Set', False ]) # disable preselector to allow the highest bandwidth of 250MHz if "lockro" in str(lofreq.data[0]): if '+' in str(lofreq.data[0]): lof_offset = float(lofreq.data[0].split('+')[1]) elif '-' in str(lofreq.data[0]): lof_offset = -float(lofreq.data[0].split('-')[1]) else: lof_offset = 0 # default value VSA.frequency(vsasess, action=[ 'Set', float(rofreq.data[caddress[structure.index( 'RO-Frequency')]]) * 1e9 + lof_offset ]) # freq offset / correction in Hz print("Locking on RO at %sGHz" % (VSA.frequency(vsasess)[1] / 1e9)) else: VSA.frequency(vsasess, action=[ 'Set', float(lofreq.data[caddress[structure.index( 'LO-Frequency')]]) * 1e9 ]) VSA.power( vsasess, action=[ 'Set', float(lopowa.data[caddress[structure.index('LO-Power')]]) ]) VSA.bandwidth( vsasess, action=['Set', 250e6] ) # maximum LO bandwidth of 250MHz (500MHz Sampling-rate gives 2ns of time resolution) VSA.trigger_source(vsasess, action=['Set', int(1)]) # External Trigger (slave) # Delay for Readout if "lockxypwd" in str(ropdelay.data[0]): # trigger-delay sync with xy-pulse-width for Rabi measurement: VSA.trigger_delay(vsasess, action=['Set', float(adcdelay.data[caddress[structure.index('ADC-delay')]]) + \ float(xypwidth.data[caddress[structure.index('XY-Pulse-Width')]])*1e-9 + rooffset*1e-9]) print("ACQ delays with XY-Pulse for %sns" % int(VSA.trigger_delay(vsasess)[1] / 1e-9)) elif "lockropdelay" in str(adcdelay.data[0]): # trigger-delay sync with ro-pulse-delay for T1 measurement: VSA.trigger_delay( vsasess, action=[ 'Set', float(ropdelay.data[caddress[structure.index( 'RO-Pulse-Delay')]]) * 1e-9 ]) print("ACQ delays with RO-Pulse for %sns" % int(VSA.trigger_delay(vsasess)[1] / 1e-9)) else: VSA.trigger_delay(vsasess, action=[ 'Set', float(adcdelay.data[caddress[ structure.index('ADC-delay')]]) ]) VSA.external_trigger_level(vsasess, action=['Set', float(0.3)]) VSA.external_trigger_slope(vsasess, action=['Set', int(1)]) # Positive slope VSA.trigger_timeout(vsasess, action=['Set', int(1000)]) # 1s of timeout stat = VSA.Init_Measure(vsasess) # Initiate Measurement # Start Quantum machine: # Start Averaging Loop: avenum = int(averaging.data[caddress[structure.index('Average')]]) vsasn = VSA.samples_number(vsasess)[1] iqdata = zeros((avenum, 2 * vsasn)) for ave in range(avenum): VSA.Arm_Measure(vsasess) gd = VSA.Get_Data(vsasess, 2 * vsasn) iqdata[ave, :] = array(gd[1]['ComplexData']) iqdata = mean(iqdata, axis=0) print("Operation Complete") print(Fore.YELLOW + "\rProgress: %.3f%%" % ((i + 1) / datasize * buffersize_1 * 100), end='\r', flush=True) # test for the last loop if there is if testeach: # test each measure-loop: loopcount += [len(measure_loop_1)] loop_dur += [time() - prev] stage, prev = clocker(stage, prev) # Marking time VSA.close(vsasess) if "opt" not in pperiod.data: # check if it is in optional-state AWG.close(awgsess) if "opt" not in xyfreq.data: # check if it is in optional-state PSG0.close(sogo, False) if "opt" not in rofreq.data: # check if it is in optional-state PSG1.close(saga, False) if "opt" not in fluxbias.data: # check if it is in optional-state YOKO.close(yokog, False) yield loopcount, loop_dur else: if get_status("SQE_Pulse")['pause']: break else: yield list(iqdata) if not get_status("SQE_Pulse")['repeat']: set_status("SQE_Pulse", dict(pause=True)) VSA.close(vsasess) if "opt" not in pperiod.data: # check if it is in optional-state AWG.Abort_Gen(awgsess) AWG.close(awgsess) if "opt" not in xyfreq.data: # check if it is in optional-state PSG0.rfoutput(sogo, action=['Set', 0]) PSG0.close(sogo, False) if "opt" not in rofreq.data: # check if it is in optional-state PSG1.rfoutput(saga, action=['Set', 0]) PSG1.close(saga, False) if "opt" not in fluxbias.data: # check if it is in optional-state YOKO.output(yokog, 0) YOKO.close(yokog, False) return
def sglog(): log = get_status(request.args.get('sgtype')) return jsonify(log=log)
''' Multi Processor for fresp 2D-plotting: ''' import sys, struct from numpy import array from multiprocessing import Pool from pyqum.instrument.logger import get_status, set_status from pyqum.instrument.toolbox import cdatasearch, gotocdata, waveform from pyqum.instrument.analyzer import IQAP pqfile = get_status("MPW")["pqfile"] datalocation = get_status("MPW")["datalocation"] writtensize = get_status("MPW")["writtensize"] c_cwsweep_structure = get_status("MPW")["c_cwsweep_structure"] irepeat = get_status("MPW")["irepeat"] ifluxbias = get_status("MPW")["ifluxbias"] ixyfreq = get_status("MPW")["ixyfreq"] ixypowa = get_status("MPW")["ixypowa"] isparam = get_status("MPW")["isparam"] iifb = get_status("MPW")["iifb"] ipowa = get_status("MPW")["ipowa"] ifreq = get_status("MPW")["ifreq"] powa_order = get_status("MPW")["powa_order"] powa_wave = waveform(powa_order) powa_repeat = powa_wave.inner_repeat with open(pqfile, 'rb') as datapie: datapie.seek(datalocation + 7) pie = datapie.read(writtensize)