diff --git a/script/RFscan/phase_scan_caqtdm.py b/script/RFscan/phase_scan_caqtdm.py new file mode 100755 index 0000000..229fbeb --- /dev/null +++ b/script/RFscan/phase_scan_caqtdm.py @@ -0,0 +1,110 @@ +""" +Parameters: +args = [prefix ] +""" + +import ch.psi.pshell.epics.ControlledVariable as ControlledVariable + +latency = 0.05 +#prefix = args[0] +#start = caget("PSHELL:scanstart") +#stop = caget("PSHELL:scanstop") +#step = caget("PSHELL:scanstep") + +prefix = "MINSB03-RSYS" +start = -179.0 +stop = 180.0 +step = 10.0 + +print "Prefix = ", prefix +print "Start = ", start +print "Stop = ", stop +print "Step = ", step + +#rf_phase_setpoint = Channel(prefix + ":SET-VSUM-PHASE") +#rf_phase_readback = Channel(prefix + ":GET-VSUM-PHASE") +#rf_ampl_readback = Channel(prefix + ":GET-VSUM-AMPLT") +#rf_phase_setpoint = create_channel_device(prefix + ":SET-VSUM-PHASE", type = 'd', deviceName='Phase Setpoint') +#rf_phase_readback = create_channel_device(prefix + ":GET-VSUM-PHASE", type = 'd', deviceName='Phase Readback') + +rf_phase_var = ControlledVariable("Phase", prefix + ":SET-VSUM-PHASE", prefix + ":GET-VSUM-PHASE") +(rf_phase_var.config.minValue, rf_phase_var.config.maxValue)= (-180.0, 180.0) +rf_phase_var.config.resolution = 0.001 +rf_phase_var.initialize() +rf_ampl_readback = create_channel_device(prefix + ":GET-VSUM-AMPLT", type = 'd', deviceName='Amplitude Readback') + +#add_device (rf_phase_var, True) +#add_device (rf_ampl_readback, True) + + +""" +scan_pos.set([]) +scan_val.set([]) +def after(rec): + scan_val.append(rec.values[0]) + scan_pos.append(rec.positions[0]) +""" +#TODO: this is workaround to CAS not supporting dynamic arrays +def after(rec): + global arrpos,arrval + #print rec.index + arrval = scan_val.take().tolist() + arrpos = scan_pos.take().tolist() + arrval[rec.index] = rec.values[0] + arrpos[rec.index] = rec.positions[0] + arrval[rec.index:] = [rec.values[0]] * (len(arrval) -rec.index) + arrpos[rec.index:] = [rec.positions[0]] * (len(arrpos) -rec.index) + scan_val.set(arrval) + scan_pos.set(arrpos) + +try: + #r = lscan(pos, [rf_phase_readback, rf_ampl_readback, sim], start, stop, step , latency=0.2, after_read = after) + #r = lscan(rf_phase_setpoint, [rf_phase_readback, rf_ampl_readback, sim], start, stop, step , latency=0.5, after_read = after) + sim.step = step + r = lscan(rf_phase_var, [rf_ampl_readback, sim], start, stop, step , latency=latency, after_read = after) + #To sample a0 + + f = r.getReadable(1) # r.getReadable(2) + f_ampl = r.getReadable(0) # r.getReadable(1) + xdata = r.getPositions(0) # r.getReadable(0) + + #plot(r.getReadable(1), xdata = r.getPositions(0), title = "data") + phase_fit_max = None + try: + (amplitude, angular_frequency, phase, phase_fit_max) = hfit(f , xdata = xdata) + except: + raise Exception("Fit failure") + + start,end = min(xdata), max(xdata) + if not (start <=phase_fit_max <=end): + raise Exception("Fit maximum outside scan range") + + rf_phase_var.write(phase_fit_max) + time.sleep(latency) + a0 = rf_ampl_readback.read() + power = 1.0 #TODO +finally: + #rf_phase_setpoint.close() + #rf_phase_readback.close() + rf_phase_var.close() + rf_ampl_readback.close() + + + +print ("------------------------------------") +print ("Valid fit") + + + +energy_gain = amplitude +phase_offset = - phase_fit_max +amplitude_scale = energy_gain / a0 +power_scale = power / math.pow(a0,2) + +#caput(prefix + ":SET-VSUM-PHASE-OFFSET", phase_offset) +#caput(prefix + ":SET-VSUM-AMPLT-SCALE", amplitude_scale) +#caput(prefix + ":SET-VOLT-POWER-SCALE", power_scale) + + +#set_return(r.print()) +set_return("Energy Gain: " + str(energy_gain) + "\nPhase Offset: " + str(phase_offset) + "\nAmplitude Scale: " + str(amplitude_scale) + "\nPower Scale: "+ str(power_scale))