import ch.psi.pshell.epics.ChannelDouble as ChannelDouble dry_run = False do_elog = True base_name = "SATBD02-DICT499" # SINEG01-DICT009 S10DI01-DICT113 SARMA01-DICT482 SARBD01-DICT599 SATDI01-DICT344 dev_name = "SATBD02-DICT020" # SINEG01-DICT215 S10DI01-DICT025 SARMA01-DICT090 SARBD01-DICT030 SATDI01-DICT020 run("CPython/wrapper") if dry_run: t = ChannelDouble("fine delay (ns)", "SINEG01-DICT215:Pul1-Delay-SP-SIM") q = ChannelDouble("charge (pC)", "SINEG01-DICT215:AL1-ICT-CHARGE-SIM") V = ChannelDouble("DC output (V)", "SINEG01-DICT215:AL1-ICT-VOLTAGE-SIM") else: t = ChannelDouble("fine delay (ns)", base_name + "-EVR0:UnivDlyModule0-Delay1-SP") q = ChannelDouble("charge (pC)", dev_name + ":B2_CHARGE") V = ChannelDouble("DC output (V)", dev_name + ":B2_VOLTAGE") t.initialize() q.initialize() V.initialize() t0 = t.read() start = 2.2 stop = 12 step = 0.1 nb = 5 lat = 0.150 plt = plot(None, title="Output")[0] plt.clear() plt.removeMarker(None) plt.setStyle(plt.Style.ErrorY) plt.addSeries(LinePlotErrorSeries("Charge", Color.red)) plt.addSeries(LinePlotErrorSeries("DC output", Color.yellow, 2)) plt.getAxis(plt.AxisId.X).setLabel("Fine delay (ns)") plt.getAxis(plt.AxisId.Y).setLabel("Charge (pC)") plt.getAxis(plt.AxisId.Y2).setLabel("DC output (V)") plt.setLegendVisible(True) def plot_point(record, scan): global plt q_mean, q_stdev = record.readables[0].mean, record.readables[0].stdev V_mean, V_stdev = record.readables[1].mean, record.readables[1].stdev plt.getSeries(0).appendData(record.positions[0], q_mean, q_stdev) plt.getSeries(1).appendData(record.positions[0], V_mean, V_stdev) try: q_averager = create_averager(q, nb, lat) V_averager = create_averager(V, nb, lat) V_averager.monitored=True r = lscan(t, (q_averager, V_averager), start, stop, step, latency=lat, after_read = plot_point) delay = r.getPositions(0) charge = [val.mean for val in r.getReadable(0)] chargerms = [val.stdev for val in r.getReadable(0)] volt = [val.mean for val in r.getReadable(1)] voltrms = [val.stdev for val in r.getReadable(1)] finally: t.write(t0) t.close() q.close() V.close() try: i_max = charge.index(max(charge)) min_i, max_i = max(i_max-30, 0), min(i_max+31, len(charge)) (delay_max, charge_max, delay_fit, charge_fit, R2) = extremum(delay[min_i:max_i], charge[min_i:max_i]) print delay_max, charge_max except: raise Exception("Fit failure") #update plot plt.addSeries(LinePlotErrorSeries("Charge Fit", plt.getSeries(0).color)) plt.getSeries(2).setData(delay_fit, charge_fit) plt.getSeries(2).setPointsVisible(False) plt.addMarker(delay_max, plt.AxisId.X, "%3.2f" % delay_max, plt.getSeries(0).color) #Elog entry if do_elog: if get_option("Generated data file:\n" + get_exec_pars().path +"\n\n" + "Save to ELOG?", "YesNo") == "Yes": log_msg = "Data file: " + get_exec_pars().path + "\n\n" log_msg = log_msg + "delay_max: %8.3f" % delay_max + " ns \n" log_msg = log_msg + "charge_max: %8.3f" % charge_max + " pC \n" sleep(0.1) #Give some time to plot to be finished - it is not sync with acquisition file_name = os.path.abspath(Setup.getContextPath() + "/ICT_timing_fine_Plot.png") plt.saveSnapshot(file_name , "png") elog("ICT timing scan fine", log_msg, [file_name,])