From b6746d317a06d19ab0319ccea98025315aed2dca Mon Sep 17 00:00:00 2001 From: gac-furka Date: Mon, 24 Jul 2023 11:55:55 +0200 Subject: [PATCH] Added ParkableMotor class --- 30] | 0 Run_table_update.py | 70 ++++++++++------------ c | 1 + channels.py | 51 ++++++++++------ cmos_beta.py | 32 ++++++++++ filre.txt | 1 + furka.py | 138 +++++++++++++++++++++++++++++++++----------- t1 | 1 + tt_lib.py | 75 +++++++++++++++++++++++- tth.py | 55 ++++++++++++++++++ undulator.py | 4 +- 11 files changed, 333 insertions(+), 95 deletions(-) create mode 100644 30] create mode 100644 c create mode 100644 cmos_beta.py create mode 100644 filre.txt create mode 100644 t1 diff --git a/30] b/30] new file mode 100644 index 0000000..e69de29 diff --git a/Run_table_update.py b/Run_table_update.py index d386516..96b0e45 100644 --- a/Run_table_update.py +++ b/Run_table_update.py @@ -20,14 +20,16 @@ def PVchs(): "SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG": "FEL_pulse_en (uJ)", "SATES30-ARES:MOT_2TRY.RBV": "diode_otr_tth (deg)", "SATES30-ARES:MOT_DRY.RBV": "diode_inr_tth (deg)", - "SATES30-ARES:MOT_SRZ.RBV": "sample_chi (deg)", + "SATES30-ARES:MOT_SRZ.RBV": "sample_phi (deg)", "SATES30-ARES:MOT_SRY.RBV": "sample_th (deg)", - "SATES30-ARES:MOT_SRX.RBV": "sample_phi (deg)", + "SATES30-ARES:MOT_SRX.RBV": "sample_chi (deg)", "SATES30-ARES:MOT_STX.RBV": "sample_x (mm)", "SATES30-ARES:MOT_STY.RBV": "sample_y (mm)", "SATES30-ARES:MOT_STZ.RBV": "sample_z (mm)", - "SATES30-LS336:C_RBV": "sample_temp (K)", + "SATES30-LS336:D_RBV": "sample_temp (K)", "SATES30-LS336:A_RBV": "cryo_temp (K)", + "SATES30-LS336:C_RBV": "dummy_temp (K)", + "SATES30-LS336:B_RBV": "dummy_temp (K)", "SLAAT-LGEN:DLY_OFFS1": "LXT_off1 (us)", "SLAAT01-LTIM-PDLY:DELAY": "LXT_delay (ps)", "SLAAT01-LTIM-PDLY:DELAY_Z_OFFS": "LXT_off1 (ps)", @@ -36,9 +38,21 @@ def PVchs(): "SLAAT31-LMOT-M803:MOT.RBV": "comp2", "SLAAT31-LMOT-M804:MOT.RBV": "comp3", "SLAAT31-LMOT-M805:MOT.RBV": "comp4", - "SLAAT31-LMOT-M806:MOT.RBV": "EOS_delay (mm)", + "SLAAT31-LMOT-M806:MOT.RBV": "THz_delay (mm)", "SLAAT31-LMOT-M807:MOT.RBV": "WL_delay (mm)", "SLAAT31-LMOT-M808:MOT.RBV": "800_delay (mm)", + "SATOP21-PMOS127-2D:SPECTRUM_X":"PMOS127-2D:X", + "SATOP21-PMOS127-2D:SPECTRUM_Y":"PMOS127-2D:Y", + "SLAAT31-LCAM-C801:FIT-XPOS_EGU":"Cam_801_x", + "SLAAT31-LCAM-C801:FIT-YPOS_EGU":"Cam_801_y", + "SLAAT31-LCAM-C802:FIT-XPOS_EGU":"Cam_802_x", + "SLAAT31-LCAM-C802:FIT-YPOS_EGU":"Cam_802_y", + 'SLAAT31-LCAM-C801:FIT-XEGU-ARRAY':"Cam_801_xy", + 'SLAAT31-LCAM-C802:FIT-XEGU-ARRAY':"Cam_802_xy", + "SIN-LPOSIC1:POS1":"PICO X not sure", + "SIN-LPOSIC1:POS2":"PICO Y not sure", + "SATES30-CAMS182-GIGE2_sp1:x_center_of_mass":"", + "SATES30-CAMS182-GIGE2_sp1:y_center_of_mass":"", } return pv_name_dict @@ -463,17 +477,20 @@ def get_scan_info_dict(dir_raw,run): scan_SFSI=SFScanInfo(get_filename(run,dir_raw)+"/meta/scan.json") scan_SFDF=SFDataFiles(get_filename(run,dir_raw)+"/data/*.PVDATA.h5") pv_name_dict = PVchs() - pv_info_dict = {k+' '+pv_name_dict[k]: np.round(v.data[0],6) if isinstance(v.data[0], float) else v.data[0] for k,v in scan_SFDF.items()} + pv_info_dict = {k+' '+pv_name_dict[k]: np.round(v.data.flat[0],6) if isinstance(v.data[0], float) else v.data.flat[0] for k,v in scan_SFDF.items()} scan_info_dict={'Run':run, - 'date':scan_SFSI.fs.atime.strftime("%d/%m/%Y"), - 'time':scan_SFSI.fs.atime.strftime("%H:%M:%S"), - 'duration':f'{str(scan_SFSI.fs.mtime-scan_SFSI.fs.atime)[:-7:]}', + 'date':scan_SFSI.fs.mtime.strftime("%d/%m/%Y"), + 'time':scan_SFSI.fs.mtime.strftime("%H:%M:%S"), 'scan_name':scan_SFSI.parameters['scan_name'], 'scanned':scan_SFSI.parameters['name'][0], 'start':scan_SFSI.readbacks[0], 'end':scan_SFSI.readbacks[-1]} + print('Updating run',run) if len(scan_SFSI.readbacks)!=1: - scan_info_dict['step']=np.abs(np.diff(scan_SFSI.readbacks)[0]) + try: + scan_info_dict['step']=np.abs(scan_SFSI.readbacks[1]-scan_SFSI.readbacks[0]) + except TypeError: + scan_info_dict['step']=np.nan elif len(scan_SFSI.readbacks)==1: scan_info_dict['step']=0 scan_info_dict['steps']=len(scan_SFSI.readbacks) @@ -497,11 +514,11 @@ def get_scan_info_dict(dir_raw,run): elif scanned_id=='SATES30-ARES:MOT_STX.VAL': scan_info_dict["SATES30-ARES:MOT_STX.RBV sample_x (mm)"]='scanned' elif scanned_id=='SATES30-ARES:MOT_SRX.VAL': - scan_info_dict["SATES30-ARES:MOT_SRX.RBV sample_phi (deg)"]='scanned' + scan_info_dict["SATES30-ARES:MOT_SRX.RBV sample_chi (deg)"]='scanned' elif scanned_id=='SATES30-ARES:MOT_SRY.VAL': scan_info_dict["SATES30-ARES:MOT_SRY.RBV sample_th (deg)"]='scanned' elif scanned_id=='SATES30-ARES:MOT_SRZ.VAL': - scan_info_dict["SATES30-ARES:MOT_SRZ.RBV sample_chi (deg)"]='scanned' + scan_info_dict["SATES30-ARES:MOT_SRZ.RBV sample_phi (deg)"]='scanned' elif scanned_id=='SATES30-ARES:MOT_DRY.VAL': scan_info_dict["SATES30-ARES:MOT_DRY.RBV diode_inr_tth (deg)"]='scanned' elif scanned_id=='SATES30-ARES:MOT_2TRY.VAL': @@ -517,7 +534,7 @@ def get_scan_info_dict(dir_raw,run): # print(matching_keys) return scan_info_dict -def make_run_table(dir_raw,path,runs,htmlfilename='Few_runs_run_table',color_scheme='blue_yellow'): +def make_run_table(dir_raw,path,runs,htmlfilename,color_scheme='blue_yellow'): if os.path.exists(path+htmlfilename+'.html'): info_df = pd.read_html(path+htmlfilename+'.html', header=0, index_col=None)[0] else: @@ -536,35 +553,6 @@ def make_run_table(dir_raw,path,runs,htmlfilename='Few_runs_run_table',color_sch with open(path+htmlfilename+'.html', 'w') as f: f.write(path+html_table) -def make_run_table_live(dir_raw,path,check_interval=5,keep_running_for=4,htmlfilename='updating_run_table',color_scheme='blue_yellow'): - run_last = 0 - time_last_change = time.time() - while True: - if run_last != get_latest_run(dir_raw): - run_last = get_latest_run(dir_raw) - time_last_change = time.time() - if os.path.exists(path+htmlfilename+'.html'): - info_df=pd.read_html(path+htmlfilename+'.html',header=0, index_col=None)[0] - else: - info_df=pd.DataFrame(columns=['Run']) - for run in range(run_last + 1): - if run in info_df['Run'].values: - continue - filename = get_filename(run, dir_raw) - if filename == False: - continue - new_row = pd.DataFrame([get_scan_info_dict(dir_raw,run)]) - info_df = pd.concat([info_df, new_row], ignore_index=True, sort=False) - info_df = info_df.sort_values('Run') -# html_table = build_table(info_df, color_scheme) - html_table = build_table_nocondition(info_df, color_scheme) - with open(path+htmlfilename+'.html', 'w') as f: - f.write(html_table) - if time.time() - time_last_change > keep_running_for*60*60: - print('Not running any more.') - break - print('Waiting to check.') - time.sleep(check_interval*60) diff --git a/c b/c new file mode 100644 index 0000000..a716b29 --- /dev/null +++ b/c @@ -0,0 +1 @@ +SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG 3229 uJ diff --git a/channels.py b/channels.py index c188238..62182c4 100644 --- a/channels.py +++ b/channels.py @@ -1,5 +1,9 @@ #Channels channels = [ + "SATES30-LSCP10:CH0:1", + "SATES30-LSCP10:CH2:1", + "SATES30-LSCP10:CH3:1", + "SLAAT31-LTIM01-EVR0:CALCV", "SATFE10-PEPG046:FCUP-INTENSITY-CAL", "SATFE10-PEPG046-EVR0:CALCI", "SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG", @@ -22,8 +26,16 @@ channels = [ # "SATES31-CAMS187-RIXS1:Spectrum", # "SATES31-CAMS187-RIXS1:evt_list", "SATES30-RIXS-CAM01:FPICTURE", - "SATES30-CAMS182-GIGE2:FPICTURE", - "SATES31-CAMS187-RIXS1:FPICTURE", + "SATES30-RIXS-CAM01:EVENT_NUM", + "SATES30-RIXS-CAM01:EVENT_CHARGE", + "SATES30-RIXS-CAM01:EVENT_I", + "SATES30-RIXS-CAM01:EVENT_J", + "SATES30-RIXS-CAM01:EVENT_I_INTERP", + "SATES30-RIXS-CAM01:EVENT_J_INTERP", + "SATES30-RIXS-CAM01:EVENT_ETA_X", + "SATES30-RIXS-CAM01:EVENT_ETA_Y", + #"SATES30-CAMS182-GIGE2:FPICTURE", + #"SATES31-CAMS187-RIXS1:FPICTURE", "SATES31-CAMS187-RIXS1:x_profile", "SATES31-CAMS187-RIXS1:y_profile", "SATES31-CAMS187-RIXS1:intensity", @@ -40,13 +52,16 @@ channels = [ "SATES30-CVME-EVR0:CALCY", "SLAAT31-LSCP1-FNS:CH0:VAL_GET", "SLAAT31-LSCP1-FNS:CH1:VAL_GET", + "SLAAT31-LSCP1-FNS:CH2:VAL_GET", "SLAAT31-LTIM01-EVR0:CALCI", "SLAAT31-LTIM01-EVR0:CALCS", - "SAT-CVME_TIFALL5:EvtSet", - "SAT-CVME_TIFALL6:EvtSet" + "SAT-CVME-TIFALL5:EvtSet", + "SAT-CVME-TIFALL6:EvtSet" ] pvs = [ + #"SIN-LPOSIC1:POS1", + #"SIN-LPOSIC1:POS2", "SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG", "SATUN13-UIND030:POL-SET", "SATES30-ARES:MOT_2TRY.RBV", @@ -57,11 +72,11 @@ pvs = [ "SATES30-ARES:MOT_SRX.RBV", "SATES30-ARES:MOT_SRY.RBV", "SATES30-ARES:MOT_SRZ.RBV", - "SLAAT31-LMOT-M801:MOT.RBV", - "SLAAT31-LMOT-M802:MOT.RBV", - "SLAAT31-LMOT-M803:MOT.RBV", - "SLAAT31-LMOT-M804:MOT.RBV", - "SLAAT31-LMOT-M805:MOT.RBV", + #"SLAAT31-LMOT-M801:MOT.RBV", + #"SLAAT31-LMOT-M802:MOT.RBV", + #"SLAAT31-LMOT-M803:MOT.RBV", + #"SLAAT31-LMOT-M804:MOT.RBV", + #"SLAAT31-LMOT-M805:MOT.RBV", "SLAAT31-LMOT-M806:MOT.RBV", "SLAAT31-LMOT-M807:MOT.RBV", "SLAAT31-LMOT-M808:MOT.RBV", @@ -71,20 +86,22 @@ pvs = [ "SATFE10-OGAT053:transmission", "SATES30-LS336:C_RBV", "SATES30-LS336:A_RBV", + "SATES30-LS336:B_RBV", + "SATES30-LS336:D_RBV", "SLAAT01-LTIM-PDLY:DELAY", "SLAAT-LGEN:DLY_OFFS1", - "SLAAT01-LTIM-PDLY:DELAY_Z_OFFS", - "SATOP21-PMOS127-2D:SPECTRUM_X", - "SATOP21-PMOS127-2D:SPECTRUM_Y", - "SATES30-CAMS182-GIGE1_sp1:x_center_of_mass", - "SATES30-CAMS182-GIGE1_sp1:y_center_of_mass", + "SLAAT01-LTIM-PDLY:DELAY_Z_OFFS" + #"SATOP21-PMOS127-2D:SPECTRUM_X", + #"SATOP21-PMOS127-2D:SPECTRUM_Y", + #"SATES30-CAMS182-GIGE1_sp1:x_center_of_mass", + #"SATES30-CAMS182-GIGE1_sp1:y_center_of_mass", "SLAAT31-LCAM-C801:FIT-XPOS_EGU", "SLAAT31-LCAM-C801:FIT-YPOS_EGU", # "SLAAT31-LCAM-C801:FIT-XEGU-ARRAY", "SLAAT31-LCAM-C802:FIT-XPOS_EGU", - "SLAAT31-LCAM-C802:FIT-YPOS_EGU", + "SLAAT31-LCAM-C802:FIT-YPOS_EGU" # "SLAAT31-LCAM-C802:FIT-XEGU-ARRAY", - "SATES30-CAMS182-GIGE2_sp1:x_center_of_mass", - "SATES30-CAMS182-GIGE2_sp1:y_center_of_mass" + #"SATES30-CAMS182-GIGE2_sp1:x_center_of_mass", + #"SATES30-CAMS182-GIGE2_sp1:y_center_of_mass" ] diff --git a/cmos_beta.py b/cmos_beta.py new file mode 100644 index 0000000..002999d --- /dev/null +++ b/cmos_beta.py @@ -0,0 +1,32 @@ +def cmos_live(sleep=0.1): + import numpy as np + from epics import caget, caput, cainfo + from matplotlib import pyplot as plt + import time + + data = caget('SATES31-CAMS187-RIXS1:FPICTURE') + x_size = int(caget('SATES31-CAMS187-RIXS1:CAMROI_X_END')-caget('SATES31-CAMS187-RIXS1:CAMROI_X_START')+1) + y_size = int(len(data)/x_size) + + xx = np.arange(1,x_size+1,1) + ROI = [data[i:i+x_size] for i in range(0,int(len(data)),x_size)] + + plt.ion() + fig = plt.figure() + image = plt.imshow(ROI) + plt.colorbar() + plt.clim(0,np.max(data)) + + plt.title('live PCO image',fontsize=20) + plt.xlabel('x [px]',fontsize=16) + plt.ylabel('y [px]',fontsize=16) + + for _ in iter(int,1): + data = caget('SATES31-CAMS187-RIXS1:FPICTURE') + ROI = [data[i:i+x_size] for i in range(0,int(len(data)),x_size)] + image.set_data(ROI) + fig.canvas.draw() + fig.canvas.flush_events() + plt.clim(0,np.max(data)) + time.sleep(sleep) + diff --git a/filre.txt b/filre.txt new file mode 100644 index 0000000..1971853 --- /dev/null +++ b/filre.txt @@ -0,0 +1 @@ +SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG 3253 uJ diff --git a/furka.py b/furka.py index 3289ca7..d5a70cb 100644 --- a/furka.py +++ b/furka.py @@ -18,13 +18,17 @@ from spreadsheet import overview, print_overview, print_line_for_spreadsheet from channels import channels, pvs from sensors import * -from undulator import Undulators -from undulator import Mono -from undulator import Coupled_MonoUnd +#from undulator import Undulators +#from undulator import Mono +#from undulator import Coupled_MonoUnd + +mono_new = PVAdjustable("SATOP11-OSGM087:SetEnergy", "SATOP11-OSGM087:photonenergy", accuracy=0.1, process_time=10, name="Mono new") from tth import Coupled_tth from tth import LakeShore +from tth import Coupled_THzGate +from tth import Coupled_THzGate_fixedDelta from qspace import QSpace3D from qspace import Wavelength @@ -32,6 +36,18 @@ from qspace import HistoryDummy from constraints import ExtraConstraint + + + +from epics import caput + +class ParkableMotor(Motor): + def park(self): + kill_pvname = self.pvname[:-4] + "_KILL" + caput(kill_pvname, 1) + + + dummy = DummyAdjustable(units="au") @@ -68,30 +84,30 @@ OAPU085_vert = PVAdjustable("SATOP11-OAPU085:MOTOR_Y.VAL", process_time=1, name= ##mono_slits = PVAdjustable("SATOP11-OSGM087:EXITSLIT",pvname_done_moving="SATOP31-OEXS132:MOT_H.DMOV", name = "Mono_Slits" ) -#undulators set-up -n_und_ref = 13 -n_unds = [ - 6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC - 15, 16, 17, 18, 19, 20, 21, 22 -] -chic_fudge_offset = 0 -Mon2Unds_offset = 3.0 +##undulators set-up +#n_und_ref = 13 +#n_unds = [ +# 6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC +# 15, 16, 17, 18, 19, 20, 21, 22 +#] +#chic_fudge_offset = 0 +#Mon2Unds_offset = 3.0 -und = Undulators(n_unds, n_und_ref, chic_fudge_offset, name="z Athos Undulators") -#und = Undulators(name="Undulators") +#und = Undulators(n_unds, n_und_ref, chic_fudge_offset, name="z Athos Undulators") +##und = Undulators(name="Undulators") -#Mono set up -mono_name = "Athos_mono" -pv_mono_name="SATOP11-OSGM087" +##Mono set up +#mono_name = "Athos_mono" +#pv_mono_name="SATOP11-OSGM087" -#Mon = PVAdjustable("SATOP11-OSGM087:SetEnergy", pvname_done_moving="SATOP11-OSGM087:MOVING", name="MONO") -Mon = Mono(pv_mono_name=pv_mono_name, mono_name=mono_name) -MonUnd = Coupled_MonoUnd( - n_unds, n_und_ref, chic_fudge_offset, unds_name="z Athos Undulators", - pv_mono_name=pv_mono_name, mono_name=mono_name, delta=Mon2Unds_offset, - name="Mono+Und" -) +##Mon = PVAdjustable("SATOP11-OSGM087:SetEnergy", pvname_done_moving="SATOP11-OSGM087:MOVING", name="MONO") +#Mon = Mono(pv_mono_name=pv_mono_name, mono_name=mono_name) +#MonUnd = Coupled_MonoUnd( +# n_unds, n_und_ref, chic_fudge_offset, unds_name="z Athos Undulators", +# pv_mono_name=pv_mono_name, mono_name=mono_name, delta=Mon2Unds_offset, +# name="Mono+Und" +#) Mon_ES = PVAdjustable("SATOP11-OSGM087:EXITSLIT", pvname_done_moving="SATOP31-OEXS132:MOT_H.DMOV", name = "Mono ES") gas_attenuator_trans = PVAdjustable("SATFE10-OGAT053:TRANSMISSION", process_time=20, name="Gas Attenuator Transmission") @@ -108,25 +124,28 @@ lakeshore = PVAdjustable("SATES30-LS336:LOOP1_SP", "SATES30-LS336:A_RBV", accura #lakeshore = LakeShore(name="Temperature") -wl = Wavelength(Mon) +#wl = Wavelength(Mon) +wl = Wavelength(mono_new) #Diffractometer motions -mu = Motor("SATES30-ARES:MOT_SRY.VAL", name = "Diff RY") -chi = Motor("SATES30-ARES:MOT_SRZ.VAL", name = "Diff RZ") -phi = Motor("SATES30-ARES:MOT_SRX.VAL", name = "Diff RX") -nu = Motor("SATES30-ARES:MOT_DRY.VAL", name = "Diff DRY") +mu = ParkableMotor("SATES30-ARES:MOT_SRY.VAL", name = "Diff RY") +chi = ParkableMotor("SATES30-ARES:MOT_SRZ.VAL", name = "Diff RZ") +phi = ParkableMotor("SATES30-ARES:MOT_SRX.VAL", name = "Diff RX") +nu = ParkableMotor("SATES30-ARES:MOT_DRY.VAL", name = "Diff DRY") q = QSpace3D("SOMETHING:Q", mu, chi, phi, nu, wl) -TX = Motor("SATES30-ARES:MOT_STX.VAL", name = "Diff TX") -TY = Motor("SATES30-ARES:MOT_STY.VAL", name = "Diff TY") -TZ = Motor("SATES30-ARES:MOT_STZ.VAL", name = "Diff TZ") -TwoTRY=Motor("SATES30-ARES:MOT_2TRY.VAL", name = "Diff 2TRY") +TX = ParkableMotor("SATES30-ARES:MOT_STX.VAL", name = "Diff TX") +TY = ParkableMotor("SATES30-ARES:MOT_STY.VAL", name = "Diff TY") +TZ = ParkableMotor("SATES30-ARES:MOT_STZ.VAL", name = "Diff TZ") +TwoTRY=ParkableMotor("SATES30-ARES:MOT_2TRY.VAL", name = "Diff 2TRY") -tth_scan = Coupled_tth(delta=0.3885, name="theta 2theta") +tth_scan = Coupled_tth(delta=0, name="theta 2theta") +Thz_Gate_scan = Coupled_THzGate( name = "THz Gate coupled ") +Thz_Gate_scan_fixedD = Coupled_THzGate_fixedDelta(delta=36.932, name = "Thz Gate fix Delta") GRX = Motor("SATES30-RIXS:MOT_GRX.VAL", name = "Pitch grating") DTZ = Motor("SATES30-RIXS:MOT_DTZ.VAL", name = "DTZ (r2)") @@ -150,6 +169,7 @@ PICO_Y1 = PVAdjustable("SLAAT31-LMNP-PICO12:DRIVE", name="PICO Y1") Thz_delay = Motor("SLAAT31-LMOT-M806:MOT", name="Thz Delay") WL_delay = Motor("SLAAT31-LMOT-M807:MOT", name="WL Delay") gate_delay = Motor("SLAAT31-LMOT-M808:MOT", name="Gate Delay") +twomicron_delay = Motor("SLAAT31-LMOT-M813:MOT", name="2um Delay") laser_WP = Motor("SLAAT31-LMOT-M801:MOT", name="Laser WavePlate") @@ -167,7 +187,7 @@ spreadsheet = Spreadsheet(spreadsheet_info, placeholders=["comment", "sample"], instrument = "furka" -pgroup = "p21162" #Commissioning p group +pgroup = "p21266" #Commissioning p group #check_intensity = PVCondition("SATFE10-PEPG046:FCUP-INTENSITY-CAL", vmin=5, vmax=None, wait_time=3, required_fraction=0.8) check_intensity = PVCondition("SATBD01-DBPM060:Q2", vmin=5, vmax=None, wait_time=1, required_fraction=0.8) @@ -188,14 +208,23 @@ gui = GUI(scan, show_goto=True, show_spec=True, show_run=True) #scanPV = Scanner(default_acquisitions=[daqPV], condition=check_intensity) +# Test park function motor + + + + ''' Button that runs a function ''' @as_shortcut -def test(): +def test(name="TEST"): print("test") # use marker() to go to a marker position +@as_shortcut +def dump_status_to_stand(): + daq.spreadsheet.add(None, None, None) + ''' Single marker ''' @@ -203,6 +232,45 @@ m1 = Marker(dummy,value=25,name='Normal IN') + +def Diffr_pos(TRYv, DRYv, TXv , TYv, TZv, RXv, RYv, RZv): + print(f"2TRY = {TRYv}, DRY = {DRYv}, TX = {TXv} , TY = {TYv}, TZ = {TZv}, RX = {RXv}, RY = {RYv}, RZ = {RZv}") + t1 = TwoTRY.set_target_value(TRYv) + t2 = nu.set_target_value(DRYv) + t3 = TX.set_target_value(TXv) + t4 = TY.set_target_value(TYv) + t5 = TZ.set_target_value(TZv) + t6 = phi.set_target_value(RXv) + t7 = mu.set_target_value(RYv) + t8 = chi.set_target_value(RZv) + + ts = [t1, t2, t3, t4, t5, t6, t7, t8] + for t in ts: + t.wait() + print("moving done") + for t in ts: + t.park() + print("done") + + +@as_shortcut +def EOS_pos(name = "EOS Positions"): + Diffr_pos(149.440, 29.5, 3.5, 1.6, -0.7, 0, 82, 0) + + +@as_shortcut +def Sample_position_45deg(name = "Sample Positions (45 deg)"): + Diffr_pos(65.0, 29.5, 2, -3.6, -0.9, 0, 45, 0) + + +@as_shortcut +def EOS_LV_pos(name = "EOS LV Positions"): + Diffr_pos(149.440, 29.5, 3.0, 2.5, -0.69, 15, 82, 0) + +@as_shortcut +def Transfer_pos(name = "Transfer Positions"): + Diffr_pos(148.40, 80.5, 4.21, -3.5, -10.93, 0, 50, -1.95) + print("To start the GUI, run: gui()") diff --git a/t1 b/t1 new file mode 100644 index 0000000..5fb92fb --- /dev/null +++ b/t1 @@ -0,0 +1 @@ +SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG 3224 uJ diff --git a/tt_lib.py b/tt_lib.py index ca5b79e..73897fc 100644 --- a/tt_lib.py +++ b/tt_lib.py @@ -44,6 +44,7 @@ def tt_live(off,sleep=0.1): plt.title('timing-tool live x profile in ROI',fontsize=20) plt.xlabel('pixel',fontsize=16) plt.ylabel('(on-off)/off [%]',fontsize=16) + plt.grid() for _ in iter(int,1): data = caget('SATES31-CAMS187-RIXS1:FPICTURE') @@ -56,6 +57,78 @@ def tt_live(off,sleep=0.1): tt.set_ydata(np.array(pp)) fig.canvas.draw() fig.canvas.flush_events() - plt.ylim(np.min(pp),np.max(pp)) +# plt.ylim(np.min(pp),np.max(pp)) + plt.ylim(-30,5) + time.sleep(sleep) + +def PCO_live_x(sleep=0.1): + import numpy as np + from epics import caget, caput, cainfo + from matplotlib import pyplot as plt + import time + + data = caget('SATES31-CAMS187-RIXS1:FPICTURE') + x_size = int(caget('SATES31-CAMS187-RIXS1:CAMROI_X_END')-caget('SATES31-CAMS187-RIXS1:CAMROI_X_START')+1) + y_size = int(len(data)/x_size) + + xx = np.arange(1,x_size+1,1) + ROI = [data[i:i+x_size] for i in range(0,int(len(data)),x_size)] + ROI = np.transpose(ROI) + x_prof = [] + for i in range(len(ROI)): + x_prof.append(np.sum(ROI[i])) + + plt.ion() + fig = plt.figure() + ax = fig.subplots(nrows=1,ncols=1) + tt, = ax.plot(xx,x_prof) + + plt.title('live x profile in ROI',fontsize=20) + plt.xlabel('pixel',fontsize=16) + plt.ylabel('intensity [arb. units]',fontsize=16) + + for _ in iter(int,1): + data = caget('SATES31-CAMS187-RIXS1:FPICTURE') + ROI = [data[i:i+x_size] for i in range(0,int(len(data)),x_size)] + ROI = np.transpose(ROI) + x_prof = [] + for i in range(len(ROI)): + x_prof.append(np.sum(ROI[i])) + tt.set_ydata(np.array(x_prof)) + fig.canvas.draw() + fig.canvas.flush_events() + plt.ylim(np.min(x_prof),np.max(x_prof)) + time.sleep(sleep) + +def PCO_live(sleep=0.1): + import numpy as np + from epics import caget, caput, cainfo + from matplotlib import pyplot as plt + import time + + data = caget('SATES31-CAMS187-RIXS1:FPICTURE') + x_size = int(caget('SATES31-CAMS187-RIXS1:CAMROI_X_END')-caget('SATES31-CAMS187-RIXS1:CAMROI_X_START')+1) + y_size = int(len(data)/x_size) + + xx = np.arange(1,x_size+1,1) + ROI = [data[i:i+x_size] for i in range(0,int(len(data)),x_size)] + + plt.ion() + fig = plt.figure() + image = plt.imshow(ROI) + plt.colorbar() + plt.clim(0,np.max(data)) + + plt.title('live PCO image',fontsize=20) + plt.xlabel('x [px]',fontsize=16) + plt.ylabel('y [px]',fontsize=16) + + for _ in iter(int,1): + data = caget('SATES31-CAMS187-RIXS1:FPICTURE') + ROI = [data[i:i+x_size] for i in range(0,int(len(data)),x_size)] + image.set_data(ROI) + fig.canvas.draw() + fig.canvas.flush_events() + plt.clim(0,np.max(data)) time.sleep(sleep) diff --git a/tth.py b/tth.py index dca84af..efb2c6d 100644 --- a/tth.py +++ b/tth.py @@ -55,3 +55,58 @@ class Coupled_tth(Adjustable): return self.DRY.get_current_value()*(-.5) def is_moving(self): return any([self.SRY.is_moving(),self.DRY.is_moving()]) + + + + + + + +class Coupled_THzGate(Adjustable): + + + def __init__(self, ID="THzGate", units="mm", name="" ): + super().__init__(ID, name=name, units=units) + self.THz = Motor("SLAAT31-LMOT-M806:MOT") + self.Gate = Motor("SLAAT31-LMOT-M808:MOT") + #self.delta = delta + + + def set_target_value(self, value): + s_THz = value + s_Gate = value - ( self.THz.get_current_value() - self.Gate.get_current_value()) + + t_THz = self.THz.set_target_value(s_THz) + t_Gate = self.Gate.set_target_value(s_Gate) + t_THz.wait() + t_Gate.wait() + def get_current_value(self): + return self.THz.get_current_value() + def is_moving(self): + return any([self.THz.is_moving(),self.Gate.is_moving()]) + + +class Coupled_THzGate_fixedDelta(Adjustable): + + + def __init__(self, ID="THzGate_fixed", units="mm", delta=0, name="" ): + super().__init__(ID, name=name, units=units) + self.THz = Motor("SLAAT31-LMOT-M806:MOT") + self.Gate = Motor("SLAAT31-LMOT-M808:MOT") + self.delta = delta + + + def set_target_value(self, value): + s_THz = value + s_Gate = value - self.delta + + t_THz = self.THz.set_target_value(s_THz) + t_Gate = self.Gate.set_target_value(s_Gate) + t_THz.wait() + t_Gate.wait() + def get_current_value(self): + return self.THz.get_current_value() + def is_moving(self): + return any([self.THz.is_moving(),self.Gate.is_moving()]) + + diff --git a/undulator.py b/undulator.py index 92e0a1c..86f42a8 100644 --- a/undulator.py +++ b/undulator.py @@ -127,7 +127,9 @@ class ConverterEK: electron_rest_energy = 0.51099895 # MeV - def __init__(self, pvname_electron_energy="SATCL01-MBND100:P-READ"): + +# changed from pvname_electron_energy="SATCL01-MBND100:P-READ" to: + def __init__(self, pvname_electron_energy="SATCB01:ENE-FILT-OP"): self.pv_electron_energy = PV(pvname_electron_energy) def K(self, energy):