# Tool to align the solenoid on the gun. # S. Bettoni, A. Gobbo, D. Voulot # 06/06/2016 #Code ok with the GUI # Procedure: # switch off all the magnets between the gun solenoid and the screen or BPM used for the measurement # cycle the gun solenoid # increase gun phase by 60 deg - RF focussing # look at the centroid position (BPM or screen) downstream of the gun. import datetime do_elog = True dry_run = False is_panel = get_exec_pars().source != CommandSource.ui #Must be checked before callin "run" camera_name = "simulation" if dry_run else "SINEG01-DSCR190" bpm_name = "SINEG01-DBPM340" use_good_region=False magnets = ["SINEG01-MCRX120","SINEG01-MCRY120", "SINEG01-MQUA140","SINEG01-MQSK150", "SINEG01-MCRX160","SINEG01-MCRY160", "SINEG01-MCRX180","SINEG01-MCRY180"] if not is_panel: source = "server" # "server", "camtool", "bpm" or "direct" phi1= 105.0 phi2 = 115.0 dphi = 1.0 settling_time = 0.15 plot_image = False number_images = 2 use_background = True multiple_background = False number_backgrounds = 5 plots = get_plots(title = "Centroid excursion") if len(plots)==0: centroid_plot = plot(None, title = "Centroid excursion")[0] centroid_plot.clear() else: centroid_plot = plots[0] centroid_plot_index = 1 if ((len(centroid_plot.getAllSeries()) == 0) or (not globals().has_key("centroid_plot_index"))) else (centroid_plot_index + 1) print "Plot index: ", centroid_plot_index centroid_plot.setLegendVisible(True) centroid_plot.setStyle(centroid_plot.Style.ErrorXY) centroid_plot.getAxis(centroid_plot.AxisId.Y).setLabel("") centroid_plot.getAxis(centroid_plot.AxisId.X).setLabel("Centroid Excursion") scan_series = LinePlotErrorSeries(str(centroid_plot_index)) centroid_plot.addSeries(scan_series) scan_series.setLinesVisible(False) scan_series.setPointSize(4) positioner = DummyPositioner("positioner") if dry_run else gun_phase original_phase = positioner.read() multiple_background = multiple_background and use_background print "Parameters: ", phi1, phi2, dphi, settling_time, plot_image, number_images, use_background, multiple_background, number_backgrounds setup_camera_scan() if not dry_run: #magnet_values = [] #for magnet in magnets: # magnet_values.append(caget (magnet + ":I-SET")) switch_off_magnets( magnets ) # add here gun phase setting see wiki page def after_sample(record, scan): x = record.values[0] y = record.values[1] stdev_x = record.values[2] stdev_y = record.values[3] if source in ["camtool", "server"]: #x, y, stdev_x, stdev_y = x.mean, y.mean, stdev_x.mean, stdev_y.mean x, y, stdev_x, stdev_y = x.mean, y.mean, x.stdev, y.stdev scan_series.appendData(x, y, abs(stdev_x), abs(stdev_y)); after_sample_camera_scan() r = None try: sensors = get_camera_scan_sensors() r = lscan(positioner, sensors , phi1, phi2, dphi, settling_time, before_read = before_sample_camera_scan, after_read = after_sample) finally: end_camera_scan() positioner.write(original_phase) # take the result of the scan and generate convex hull plot (hx,hy)= convex_hull(x=to_array(r.getReadable(0), 'd'), y=to_array(r.getReadable(1),'d')) hx.append(hx[0]); hy.append(hy[0]) hx = Convert.toDouble(hx) hy = Convert.toDouble(hy) hull = LinePlotErrorSeries(scan_series.name + "H", scan_series.color); centroid_plot.addSeries(hull); hull.setData(hx, hy); #Include metadata do hdf5 path = get_exec_pars().scanPath set_attribute(path, "phi1", phi1) set_attribute(path, "phi2", phi2) set_attribute(path, "dphi", dphi) set_attribute(path, "Settling time", settling_time) set_attribute(path, "Images", number_images) set_attribute(path, "Background enabled", use_background) set_attribute(path, "Background multiple", multiple_background) set_attribute(path, "Background images", number_backgrounds) set_attribute(path, "Plot index", centroid_plot_index) # save the entry in the logbook 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 log_msg = log_msg + "\nphi1: " + str(phi1) log_msg = log_msg + "\nphi2: " + str(phi2) log_msg = log_msg + "\ndphi: " + str(dphi) log_msg = log_msg + "\nSettling time: " + str(settling_time) log_msg = log_msg + "\nImages: " + str(number_images) log_msg = log_msg + "\nBackground: enabled=" + str(use_background) + " multiple=" + str(multiple_background) + " number=" + str(number_backgrounds) log_msg = log_msg + "\nPlot index: " + str(centroid_plot_index) log_msg = log_msg + "\n\n" + r.print() 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() + "/centroid_excursion.png") centroid_plot.saveSnapshot(file_name , "png") elog("Laser alignment with phase scan", log_msg, [file_name,])