import ch.psi.pshell.epics.Positioner as Positioner import ch.psi.pshell.epics.ChannelDouble as ChannelDouble dry_run = False do_elog = True if get_exec_pars().source == CommandSource.ui: start = -50.0 stop = 150.0 step = 2.0 nb = 2 lat = 0.120 plt = None else: start = args[0] stop = args[1] step = args[2] nb = int(args[3]) lat = args[4] plt = args[5] if plt is not None: plt.clear() plt.addSeries(LinePlotErrorSeries("Values")) plt.getAxis(plt.AxisId.X).setLabel("Gun Beam Phase (deg)") plt.getAxis(plt.AxisId.Y).setLabel("SINEG01-DICT215:B1_CHARGE") if dry_run: bph = Positioner("Beam phase", "SINEG01-RSYS:SET-BEAM-PHASE-SIM", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") rph = ChannelDouble("RF phase", "SINEG01-RSYS:SET-VSUM-PHASE-SIM") q = ChannelDouble("Charge", "SINEG01-DICT215:B1_CHARGE-SIM") q.initialize() q.monitored=True else: bph = Positioner("Beam phase", "SINEG01-RSYS:SET-BEAM-PHASE", "SINEG01-RSYS:GET-BEAM-PHASE") rph = ChannelDouble("RF phase", "SINEG01-RSYS:SET-VSUM-PHASE") st = Stream("ICTstream", dispatcher) q = st.addScalar("Charge", "SINEG01-DICT215:B1_CHARGE", 1, 0) st.initialize() st.start() st.waitValueChange(10000) #q = ChannelDouble("Charge", "SINEG01-DICT215:B1_CHARGE") #q.initialize() #q.monitored=True bph.config.minValue = -360.0 bph.config.maxValue = 360.0 bph.config.precision = 3 bph.config.rotation = False bph.config.resolution = 0.01 bph.config.save() bph.initialize() rph.initialize() rph.monitored=True bph0 = bph.read() rph0 = rph.read() #Record callback: uptate of output plot def after_sample(record, scan): if plt is not None: plt.getSeries(0).appendData(record.positions[0], record.values[1].mean, record.values[1].stdev) try: q_averager = create_averager(q, nb, 0.1) # Set polling time to -1 for BS data to get all messages r = lscan(bph, q_averager, start, stop, step, latency=lat, after_read = after_sample) beamphase = r.getPositions(0) charge = [val.mean for val in r.getReadable(0)] chargerms = [val.stdev for val in r.getReadable(0)] finally: rph.write(rph0) bph.close() rph.close() st.close() #Elog entry if do_elog: if get_option("Generated data file:\n" + get_exec_pars().path +"\n\n" + "Save to ELOG?", "YesNo") == "Yes": Laser = str(caget("SLGTV-LMTO-M055:MOT-KNOWN-POS")) log_msg = "Data file: " + get_exec_pars().path + "\n\n" log_msg = log_msg + "Laser: " + Laser + "\n" if Laser == "Alcor": log_msg = log_msg + "Energy plate: %0.2f" % caget("SLGTH01-LMRM-M074:MOT.RBV") + " deg \n" else: log_msg = log_msg + "Energy plate: %0.2f" % caget("SLGJG-LMRM-M031:MOT.RBV") + " deg \n" if caget("SLGTV-LMTO-M053:MOT-ACT-POS") == "IRIS": log_msg = log_msg + "Collimator: IRIS %0.2f" % caget("SLGTV-LAPP:SIZE-GET") + " mm \n" else: log_msg = log_msg + "Collimator: " + str(caget("SLGTV-LMTO-M053:MOT-ACT-POS")) + "\n" log_msg = log_msg + "Charge: %0.2f" % caget("SINEG01-DICT215:B1_CHARGE-OP") + " pC at %0.2f" % bph0 + " deg beam phase\n" attachments = [] if plt is not None: sleep(0.1) #Give some time to plot to be finished - it is not sync with acquisition file_name = os.path.abspath(get_context().setup.getContextPath() + "/SchottkyScanPlot.png") plt.saveSnapshot(file_name , "png") attachments = [file_name] elog("Schottky scan", log_msg, attachments) #Setting the return value bph_ref_guess = 0.0 set_return([bph_ref_guess])