diff --git a/script/jitter_scan.py b/script/jitter_scan.py index c282602..2d8b2b2 100644 --- a/script/jitter_scan.py +++ b/script/jitter_scan.py @@ -16,6 +16,9 @@ Preconditions - RF station is running ################################################################# # Parameter SECTION, change it to your RF station before run SECTION = "SINSB02" + +# for 100 Hz and P2P-count = 100 this can be at least 1.1 seconds +latency = 0.3 ################################################################# @@ -23,22 +26,16 @@ SECTION = "SINSB02" # some other parameters -# for 100 Hz and P2P-count = 100 this can be 1.1 seconds -latency = 1.3 -start = -170.0 -stop = 180.0 -step = 10.0 -print "SECTION = ", SECTION -print "Start = ", start -print "Stop = ", stop -print "Step = ", step + + # re-define filename, such that the SECTION is also in the filename set_context(path = "{data}/{year}_{month}/{date}/{date}_{time}_" + str(SECTION) + "_{name}") +################################################################################# # define all PVs import ch.psi.pshell.epics.ProcessVariable as PV @@ -59,6 +56,9 @@ mv_pre_jit_phase = PV("PRE_phase_jit" ,SECTION + "-RPRE-DCP10:FOR-PHASE-JIT-P2P" mv_kly_jit_amplt = PV("KLY_amplt_jit" ,SECTION + "-RKLY-DCP10:FOR-AMPLT-JIT-P2P-REL") mv_kly_jit_phase = PV("KLY_phase_jit" ,SECTION + "-RKLY-DCP10:FOR-PHASE-JIT-P2P") +# auxiliary measured variables, but not scanned +#mva_hvps = PV("HVPS" ,SECTION + "-RMOD:V-SET") +mva_hvps = PV("HVPS" ,"SINEG01-RMOD:V-SET") # initialize all PVs cv_rf_phase.initialize() @@ -72,6 +72,15 @@ mv_pre_jit_phase.initialize() mv_kly_jit_amplt.initialize() mv_kly_jit_phase.initialize() +mva_hvps.initialize() + + + +################################################################################# +# scan + +hvps = mva.hvps.read() + # define current amplitude as saturation amplitude, then define three scans amplt_sat = cv_rf_amplt.read() amplt_m5 = 0.95 * amplt_stop @@ -93,7 +102,7 @@ scan_result = ascan((cv_rf_amplt, cv_rf_phase), (mv_ref_jit_amplt,mv_ref_jit_pha - +################################################################################# # close all PVs cv_rf_phase.close() cv_rf_amplt.close() @@ -106,52 +115,129 @@ mv_pre_jit_phase.close() mv_kly_jit_amplt.close() mv_kly_jit_phase.close() +mva_hvps.close() - +################################################################################# # analyze -ref_jit_amplt_mean = mean(scan_result.getReadable(0)) -ref_jit_phase_mean = mean(scan_result.getReadable(1)) -iqm_jit_amplt_mean = mean(scan_result.getReadable(2)) -iqm_jit_phase_mean = mean(scan_result.getReadable(3)) +# struct definition to hold all relevant statistics data +class statistics_data (object): + min = 0.0 + mean = 0.0 + max = 0.0 + sigma = 0.0 + +# struct definition for statistics dat aof all three amplitude levels +class all_statistics_data (object): + sat = statistics_data() + m5 = statistics_data() + m10 = statistics_data() + + def return_string(self): + # give results back as formatted string + ret_str = "Statistics:\tmin\tmean\tmax\tstdev" + ret_str = ret_str + "\nSaturation :\t" + str(self.sat.min)[:7] + "\t" + str(self.sat.mean)[:7] + "\t" + str(self.sat.max)[:7] + "\t" + str(self.sat.stdev)[:7] + ret_str = ret_str + "\n5% out of sat :\t" + str(self.m5.min)[:7] + "\t" + str(self.m5.mean)[:7] + "\t" + str(self.m5.max)[:7] + "\t" + str(self.m5.stdev)[:7] + ret_str = ret_str + "\n10% out of sat:\t" + str(self.m10.min)[:7] + "\t" + str(self.m10.mean)[:7] + "\t" + str(self.m10.max)[:7] + "\t" + str(self.m10.stdev)[:7] + return ret_str + + + +def statistics_calc(data_in): + "function calculates the min/max/mean/stdev of an array" + temp = statistics_data(); + temp.mean = mean (data_in) + temp.min = min (data_in) + temp.max = max (data_in) + temp.stdev = stdev(data_in) + return temp + + +def all_statistics_calc(data_in): + "function calculates for all three amplitudes the statistics data." + temp = all_statistics_data(); + temp.m10 = statistics_calc (data_in[0:35]) + temp.m5 = statistics_calc (data_in[36:71]) + temp.sat = statistics_calc (data_in[72:107]) + return temp + + + +# create emtpy structs +ref_jit_amplt = all_statistics_data() +ref_jit_phase = all_statistics_data() + +iqm_jit_amplt = all_statistics_data() +iqm_jit_phase = all_statistics_data() + +pre_jit_amplt = all_statistics_data() +pre_jit_phase = all_statistics_data() + +kly_jit_amplt = all_statistics_data() +kly_jit_phase = all_statistics_data() + + +# calculate statistics +ref_jit_amplt = all_statistics_calc(scan_result.getReadable(0)) +ref_jit_phase = all_statistics_calc(scan_result.getReadable(1)) + +iqm_jit_amplt = all_statistics_calc(scan_result.getReadable(2)) +iqm_jit_phase = all_statistics_calc(scan_result.getReadable(3)) + +pre_jit_amplt = all_statistics_calc(scan_result.getReadable(4)) +pre_jit_phase = all_statistics_calc(scan_result.getReadable(5)) + +kly_jit_amplt = all_statistics_calc(scan_result.getReadable(6)) +kly_jit_phase = all_statistics_calc(scan_result.getReadable(7)) + -pre_jit_amplt_mean = mean(scan_result.getReadable(4)) -pre_jit_phase_mean = mean(scan_result.getReadable(5)) -kly_jit_amplt_mean = mean(scan_result.getReadable(6)) -kly_jit_phase_mean = mean(scan_result.getReadable(7)) #Setting attributes to the scan group path = get_context().group set_attribute(path, "SECTION", SECTION) -set_attribute(path, "ref_jit_amplt_mean", ref_jit_amplt_mean) -set_attribute(path, "ref_jit_phase_mean", ref_jit_phase_mean) +set_attribute(path, "ref_jit_amplt", ref_jit_amplt) +set_attribute(path, "ref_jit_phase", ref_jit_phase) -set_attribute(path, "iqm_jit_amplt_mean", iqm_jit_amplt_mean) -set_attribute(path, "iqm_jit_phase_mean", iqm_jit_phase_mean) +set_attribute(path, "iqm_jit_amplt", iqm_jit_amplt) +set_attribute(path, "iqm_jit_phase", iqm_jit_phase) -set_attribute(path, "pre_jit_amplt_mean", pre_jit_amplt_mean) -set_attribute(path, "pre_jit_phase_mean", pre_jit_phase_mean) +set_attribute(path, "pre_jit_amplt", pre_jit_amplt) +set_attribute(path, "pre_jit_phase", pre_jit_phase) -set_attribute(path, "kly_jit_amplt_mean", kly_jit_amplt_mean) -set_attribute(path, "kly_jit_phase_mean", kly_jit_phase_mean) +set_attribute(path, "kly_jit_amplt", kly_jit_amplt) +set_attribute(path, "kly_jit_phase", kly_jit_phase) + +set_attribute(path, "HVPS", hvps) +################################################################################# # ELOG -#msg = scan_result.print("\t") -msg = "" -msg = msg + "\nMean:\nREF amplt\t" + str(ref_jit_amplt_mean)[:5] + "\nREF phase\t" + str(ref_jit_phase_mean)[:5] + "\n\nIQM amplt\t" + str(iqm_jit_amplt_mean)[:5] + "\nIQM phase\t" + str(iqm_jit_phase_mean)[:5] + "\n\nPRE amplt\t" + str(pre_jit_amplt_mean)[:5] + "\npre phase\t" + str(pre_jit_phase_mean)[:5] + "\n\nKLY amplt\t" + str(kly_jit_amplt_mean)[:5] + "\nkly phase\t" + str(kly_jit_phase_mean)[:5] -msg = msg + "\n\nFile: " + get_context().path + +msg = "HVPS command = " + str(hvps)[:2]" +msg = msg + "\n---------------------------------------------------------" +msg = msg + "\nREF amplt\t" + ref_jit_amplt.return_string()" +msg = msg + "\n\nREF phase\t" + ref_jit_phase.return_string()" +msg = msg + "\n---------------------------------------------------------" +msg = msg + "\nIQM amplt\t" + iqm_jit_amplt.return_string()" +msg = msg + "\n\nIQM phase\t" + iqm_jit_phase.return_string()" +msg = msg + "\n---------------------------------------------------------" +msg = msg + "\nPRE amplt\t" + pre_jit_amplt.return_string()" +msg = msg + "\n\nPRE phase\t" + pre_jit_phase.return_string()" +msg = msg + "\n---------------------------------------------------------" +msg = msg + "\nKLY amplt\t" + kly_jit_amplt.return_string()" +msg = msg + "\n\nKLY phase\t" + kly_jit_phase.return_string()" +msg = msg + "\n---------------------------------------------------------" print msg # save the entry in the logbook -#plot_files = get_plot_snapshots("Jitter Scan") -#time.sleep(1.0) -#elogllrf("Jitter Scan", msg,"Measurement", "RF Stability", SECTION, plot_files) +plot_files = get_plot_snapshots("Jitter Scan") +time.sleep(1.0) +elogllrf("Jitter Scan (HVPS="+str(hvps)[:2]+"V", msg,"Measurement", "RF Stability", SECTION, plot_files)