Added ParkableMotor class

This commit is contained in:
gac-furka
2023-07-24 11:55:55 +02:00
parent 4f3e750e01
commit b6746d317a
11 changed files with 333 additions and 95 deletions

0
30] Normal file
View File

View File

@ -20,14 +20,16 @@ def PVchs():
"SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG": "FEL_pulse_en (uJ)", "SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG": "FEL_pulse_en (uJ)",
"SATES30-ARES:MOT_2TRY.RBV": "diode_otr_tth (deg)", "SATES30-ARES:MOT_2TRY.RBV": "diode_otr_tth (deg)",
"SATES30-ARES:MOT_DRY.RBV": "diode_inr_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_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_STX.RBV": "sample_x (mm)",
"SATES30-ARES:MOT_STY.RBV": "sample_y (mm)", "SATES30-ARES:MOT_STY.RBV": "sample_y (mm)",
"SATES30-ARES:MOT_STZ.RBV": "sample_z (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: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)", "SLAAT-LGEN:DLY_OFFS1": "LXT_off1 (us)",
"SLAAT01-LTIM-PDLY:DELAY": "LXT_delay (ps)", "SLAAT01-LTIM-PDLY:DELAY": "LXT_delay (ps)",
"SLAAT01-LTIM-PDLY:DELAY_Z_OFFS": "LXT_off1 (ps)", "SLAAT01-LTIM-PDLY:DELAY_Z_OFFS": "LXT_off1 (ps)",
@ -36,9 +38,21 @@ def PVchs():
"SLAAT31-LMOT-M803:MOT.RBV": "comp2", "SLAAT31-LMOT-M803:MOT.RBV": "comp2",
"SLAAT31-LMOT-M804:MOT.RBV": "comp3", "SLAAT31-LMOT-M804:MOT.RBV": "comp3",
"SLAAT31-LMOT-M805:MOT.RBV": "comp4", "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-M807:MOT.RBV": "WL_delay (mm)",
"SLAAT31-LMOT-M808:MOT.RBV": "800_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 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_SFSI=SFScanInfo(get_filename(run,dir_raw)+"/meta/scan.json")
scan_SFDF=SFDataFiles(get_filename(run,dir_raw)+"/data/*.PVDATA.h5") scan_SFDF=SFDataFiles(get_filename(run,dir_raw)+"/data/*.PVDATA.h5")
pv_name_dict = PVchs() 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, scan_info_dict={'Run':run,
'date':scan_SFSI.fs.atime.strftime("%d/%m/%Y"), 'date':scan_SFSI.fs.mtime.strftime("%d/%m/%Y"),
'time':scan_SFSI.fs.atime.strftime("%H:%M:%S"), 'time':scan_SFSI.fs.mtime.strftime("%H:%M:%S"),
'duration':f'{str(scan_SFSI.fs.mtime-scan_SFSI.fs.atime)[:-7:]}',
'scan_name':scan_SFSI.parameters['scan_name'], 'scan_name':scan_SFSI.parameters['scan_name'],
'scanned':scan_SFSI.parameters['name'][0], 'scanned':scan_SFSI.parameters['name'][0],
'start':scan_SFSI.readbacks[0], 'start':scan_SFSI.readbacks[0],
'end':scan_SFSI.readbacks[-1]} 'end':scan_SFSI.readbacks[-1]}
print('Updating run',run)
if len(scan_SFSI.readbacks)!=1: 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: elif len(scan_SFSI.readbacks)==1:
scan_info_dict['step']=0 scan_info_dict['step']=0
scan_info_dict['steps']=len(scan_SFSI.readbacks) 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': elif scanned_id=='SATES30-ARES:MOT_STX.VAL':
scan_info_dict["SATES30-ARES:MOT_STX.RBV sample_x (mm)"]='scanned' scan_info_dict["SATES30-ARES:MOT_STX.RBV sample_x (mm)"]='scanned'
elif scanned_id=='SATES30-ARES:MOT_SRX.VAL': 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': elif scanned_id=='SATES30-ARES:MOT_SRY.VAL':
scan_info_dict["SATES30-ARES:MOT_SRY.RBV sample_th (deg)"]='scanned' scan_info_dict["SATES30-ARES:MOT_SRY.RBV sample_th (deg)"]='scanned'
elif scanned_id=='SATES30-ARES:MOT_SRZ.VAL': 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': elif scanned_id=='SATES30-ARES:MOT_DRY.VAL':
scan_info_dict["SATES30-ARES:MOT_DRY.RBV diode_inr_tth (deg)"]='scanned' scan_info_dict["SATES30-ARES:MOT_DRY.RBV diode_inr_tth (deg)"]='scanned'
elif scanned_id=='SATES30-ARES:MOT_2TRY.VAL': elif scanned_id=='SATES30-ARES:MOT_2TRY.VAL':
@ -517,7 +534,7 @@ def get_scan_info_dict(dir_raw,run):
# print(matching_keys) # print(matching_keys)
return scan_info_dict 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'): if os.path.exists(path+htmlfilename+'.html'):
info_df = pd.read_html(path+htmlfilename+'.html', header=0, index_col=None)[0] info_df = pd.read_html(path+htmlfilename+'.html', header=0, index_col=None)[0]
else: 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: with open(path+htmlfilename+'.html', 'w') as f:
f.write(path+html_table) 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)

1
c Normal file
View File

@ -0,0 +1 @@
SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG 3229 uJ

View File

@ -1,5 +1,9 @@
#Channels #Channels
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:FCUP-INTENSITY-CAL",
"SATFE10-PEPG046-EVR0:CALCI", "SATFE10-PEPG046-EVR0:CALCI",
"SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG", "SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG",
@ -22,8 +26,16 @@ channels = [
# "SATES31-CAMS187-RIXS1:Spectrum", # "SATES31-CAMS187-RIXS1:Spectrum",
# "SATES31-CAMS187-RIXS1:evt_list", # "SATES31-CAMS187-RIXS1:evt_list",
"SATES30-RIXS-CAM01:FPICTURE", "SATES30-RIXS-CAM01:FPICTURE",
"SATES30-CAMS182-GIGE2:FPICTURE", "SATES30-RIXS-CAM01:EVENT_NUM",
"SATES31-CAMS187-RIXS1:FPICTURE", "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:x_profile",
"SATES31-CAMS187-RIXS1:y_profile", "SATES31-CAMS187-RIXS1:y_profile",
"SATES31-CAMS187-RIXS1:intensity", "SATES31-CAMS187-RIXS1:intensity",
@ -40,13 +52,16 @@ channels = [
"SATES30-CVME-EVR0:CALCY", "SATES30-CVME-EVR0:CALCY",
"SLAAT31-LSCP1-FNS:CH0:VAL_GET", "SLAAT31-LSCP1-FNS:CH0:VAL_GET",
"SLAAT31-LSCP1-FNS:CH1:VAL_GET", "SLAAT31-LSCP1-FNS:CH1:VAL_GET",
"SLAAT31-LSCP1-FNS:CH2:VAL_GET",
"SLAAT31-LTIM01-EVR0:CALCI", "SLAAT31-LTIM01-EVR0:CALCI",
"SLAAT31-LTIM01-EVR0:CALCS", "SLAAT31-LTIM01-EVR0:CALCS",
"SAT-CVME_TIFALL5:EvtSet", "SAT-CVME-TIFALL5:EvtSet",
"SAT-CVME_TIFALL6:EvtSet" "SAT-CVME-TIFALL6:EvtSet"
] ]
pvs = [ pvs = [
#"SIN-LPOSIC1:POS1",
#"SIN-LPOSIC1:POS2",
"SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG", "SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG",
"SATUN13-UIND030:POL-SET", "SATUN13-UIND030:POL-SET",
"SATES30-ARES:MOT_2TRY.RBV", "SATES30-ARES:MOT_2TRY.RBV",
@ -57,11 +72,11 @@ pvs = [
"SATES30-ARES:MOT_SRX.RBV", "SATES30-ARES:MOT_SRX.RBV",
"SATES30-ARES:MOT_SRY.RBV", "SATES30-ARES:MOT_SRY.RBV",
"SATES30-ARES:MOT_SRZ.RBV", "SATES30-ARES:MOT_SRZ.RBV",
"SLAAT31-LMOT-M801:MOT.RBV", #"SLAAT31-LMOT-M801:MOT.RBV",
"SLAAT31-LMOT-M802:MOT.RBV", #"SLAAT31-LMOT-M802:MOT.RBV",
"SLAAT31-LMOT-M803:MOT.RBV", #"SLAAT31-LMOT-M803:MOT.RBV",
"SLAAT31-LMOT-M804:MOT.RBV", #"SLAAT31-LMOT-M804:MOT.RBV",
"SLAAT31-LMOT-M805:MOT.RBV", #"SLAAT31-LMOT-M805:MOT.RBV",
"SLAAT31-LMOT-M806:MOT.RBV", "SLAAT31-LMOT-M806:MOT.RBV",
"SLAAT31-LMOT-M807:MOT.RBV", "SLAAT31-LMOT-M807:MOT.RBV",
"SLAAT31-LMOT-M808:MOT.RBV", "SLAAT31-LMOT-M808:MOT.RBV",
@ -71,20 +86,22 @@ pvs = [
"SATFE10-OGAT053:transmission", "SATFE10-OGAT053:transmission",
"SATES30-LS336:C_RBV", "SATES30-LS336:C_RBV",
"SATES30-LS336:A_RBV", "SATES30-LS336:A_RBV",
"SATES30-LS336:B_RBV",
"SATES30-LS336:D_RBV",
"SLAAT01-LTIM-PDLY:DELAY", "SLAAT01-LTIM-PDLY:DELAY",
"SLAAT-LGEN:DLY_OFFS1", "SLAAT-LGEN:DLY_OFFS1",
"SLAAT01-LTIM-PDLY:DELAY_Z_OFFS", "SLAAT01-LTIM-PDLY:DELAY_Z_OFFS"
"SATOP21-PMOS127-2D:SPECTRUM_X", #"SATOP21-PMOS127-2D:SPECTRUM_X",
"SATOP21-PMOS127-2D:SPECTRUM_Y", #"SATOP21-PMOS127-2D:SPECTRUM_Y",
"SATES30-CAMS182-GIGE1_sp1:x_center_of_mass", #"SATES30-CAMS182-GIGE1_sp1:x_center_of_mass",
"SATES30-CAMS182-GIGE1_sp1:y_center_of_mass", #"SATES30-CAMS182-GIGE1_sp1:y_center_of_mass",
"SLAAT31-LCAM-C801:FIT-XPOS_EGU", "SLAAT31-LCAM-C801:FIT-XPOS_EGU",
"SLAAT31-LCAM-C801:FIT-YPOS_EGU", "SLAAT31-LCAM-C801:FIT-YPOS_EGU",
# "SLAAT31-LCAM-C801:FIT-XEGU-ARRAY", # "SLAAT31-LCAM-C801:FIT-XEGU-ARRAY",
"SLAAT31-LCAM-C802:FIT-XPOS_EGU", "SLAAT31-LCAM-C802:FIT-XPOS_EGU",
"SLAAT31-LCAM-C802:FIT-YPOS_EGU", "SLAAT31-LCAM-C802:FIT-YPOS_EGU"
# "SLAAT31-LCAM-C802:FIT-XEGU-ARRAY", # "SLAAT31-LCAM-C802:FIT-XEGU-ARRAY",
"SATES30-CAMS182-GIGE2_sp1:x_center_of_mass", #"SATES30-CAMS182-GIGE2_sp1:x_center_of_mass",
"SATES30-CAMS182-GIGE2_sp1:y_center_of_mass" #"SATES30-CAMS182-GIGE2_sp1:y_center_of_mass"
] ]

32
cmos_beta.py Normal file
View File

@ -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)

1
filre.txt Normal file
View File

@ -0,0 +1 @@
SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG 3253 uJ

138
furka.py
View File

@ -18,13 +18,17 @@ from spreadsheet import overview, print_overview, print_line_for_spreadsheet
from channels import channels, pvs from channels import channels, pvs
from sensors import * from sensors import *
from undulator import Undulators #from undulator import Undulators
from undulator import Mono #from undulator import Mono
from undulator import Coupled_MonoUnd #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 Coupled_tth
from tth import LakeShore from tth import LakeShore
from tth import Coupled_THzGate
from tth import Coupled_THzGate_fixedDelta
from qspace import QSpace3D from qspace import QSpace3D
from qspace import Wavelength from qspace import Wavelength
@ -32,6 +36,18 @@ from qspace import HistoryDummy
from constraints import ExtraConstraint 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") 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" ) ##mono_slits = PVAdjustable("SATOP11-OSGM087:EXITSLIT",pvname_done_moving="SATOP31-OEXS132:MOT_H.DMOV", name = "Mono_Slits" )
#undulators set-up ##undulators set-up
n_und_ref = 13 #n_und_ref = 13
n_unds = [ #n_unds = [
6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC # 6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC
15, 16, 17, 18, 19, 20, 21, 22 # 15, 16, 17, 18, 19, 20, 21, 22
] #]
chic_fudge_offset = 0 #chic_fudge_offset = 0
Mon2Unds_offset = 3.0 #Mon2Unds_offset = 3.0
und = Undulators(n_unds, n_und_ref, chic_fudge_offset, name="z Athos Undulators") #und = Undulators(n_unds, n_und_ref, chic_fudge_offset, name="z Athos Undulators")
#und = Undulators(name="Undulators") ##und = Undulators(name="Undulators")
#Mono set up ##Mono set up
mono_name = "Athos_mono" #mono_name = "Athos_mono"
pv_mono_name="SATOP11-OSGM087" #pv_mono_name="SATOP11-OSGM087"
#Mon = PVAdjustable("SATOP11-OSGM087:SetEnergy", pvname_done_moving="SATOP11-OSGM087:MOVING", name="MONO") ##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) #Mon = Mono(pv_mono_name=pv_mono_name, mono_name=mono_name)
MonUnd = Coupled_MonoUnd( #MonUnd = Coupled_MonoUnd(
n_unds, n_und_ref, chic_fudge_offset, unds_name="z Athos Undulators", # 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, # pv_mono_name=pv_mono_name, mono_name=mono_name, delta=Mon2Unds_offset,
name="Mono+Und" # name="Mono+Und"
) #)
Mon_ES = PVAdjustable("SATOP11-OSGM087:EXITSLIT", pvname_done_moving="SATOP31-OEXS132:MOT_H.DMOV", name = "Mono ES") 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") 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") #lakeshore = LakeShore(name="Temperature")
wl = Wavelength(Mon)
#wl = Wavelength(Mon)
wl = Wavelength(mono_new)
#Diffractometer motions #Diffractometer motions
mu = Motor("SATES30-ARES:MOT_SRY.VAL", name = "Diff RY") mu = ParkableMotor("SATES30-ARES:MOT_SRY.VAL", name = "Diff RY")
chi = Motor("SATES30-ARES:MOT_SRZ.VAL", name = "Diff RZ") chi = ParkableMotor("SATES30-ARES:MOT_SRZ.VAL", name = "Diff RZ")
phi = Motor("SATES30-ARES:MOT_SRX.VAL", name = "Diff RX") phi = ParkableMotor("SATES30-ARES:MOT_SRX.VAL", name = "Diff RX")
nu = Motor("SATES30-ARES:MOT_DRY.VAL", name = "Diff DRY") nu = ParkableMotor("SATES30-ARES:MOT_DRY.VAL", name = "Diff DRY")
q = QSpace3D("SOMETHING:Q", mu, chi, phi, nu, wl) q = QSpace3D("SOMETHING:Q", mu, chi, phi, nu, wl)
TX = Motor("SATES30-ARES:MOT_STX.VAL", name = "Diff TX") TX = ParkableMotor("SATES30-ARES:MOT_STX.VAL", name = "Diff TX")
TY = Motor("SATES30-ARES:MOT_STY.VAL", name = "Diff TY") TY = ParkableMotor("SATES30-ARES:MOT_STY.VAL", name = "Diff TY")
TZ = Motor("SATES30-ARES:MOT_STZ.VAL", name = "Diff TZ") TZ = ParkableMotor("SATES30-ARES:MOT_STZ.VAL", name = "Diff TZ")
TwoTRY=Motor("SATES30-ARES:MOT_2TRY.VAL", name = "Diff 2TRY") 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") GRX = Motor("SATES30-RIXS:MOT_GRX.VAL", name = "Pitch grating")
DTZ = Motor("SATES30-RIXS:MOT_DTZ.VAL", name = "DTZ (r2)") 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") Thz_delay = Motor("SLAAT31-LMOT-M806:MOT", name="Thz Delay")
WL_delay = Motor("SLAAT31-LMOT-M807:MOT", name="WL Delay") WL_delay = Motor("SLAAT31-LMOT-M807:MOT", name="WL Delay")
gate_delay = Motor("SLAAT31-LMOT-M808:MOT", name="Gate 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") laser_WP = Motor("SLAAT31-LMOT-M801:MOT", name="Laser WavePlate")
@ -167,7 +187,7 @@ spreadsheet = Spreadsheet(spreadsheet_info, placeholders=["comment", "sample"],
instrument = "furka" 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("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) 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) #scanPV = Scanner(default_acquisitions=[daqPV], condition=check_intensity)
# Test park function motor
''' '''
Button that runs a function Button that runs a function
''' '''
@as_shortcut @as_shortcut
def test(): def test(name="TEST"):
print("test") print("test")
# use marker() to go to a marker position # use marker() to go to a marker position
@as_shortcut
def dump_status_to_stand():
daq.spreadsheet.add(None, None, None)
''' '''
Single marker 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()") print("To start the GUI, run: gui()")

1
t1 Normal file
View File

@ -0,0 +1 @@
SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG 3224 uJ

View File

@ -44,6 +44,7 @@ def tt_live(off,sleep=0.1):
plt.title('timing-tool live x profile in ROI',fontsize=20) plt.title('timing-tool live x profile in ROI',fontsize=20)
plt.xlabel('pixel',fontsize=16) plt.xlabel('pixel',fontsize=16)
plt.ylabel('(on-off)/off [%]',fontsize=16) plt.ylabel('(on-off)/off [%]',fontsize=16)
plt.grid()
for _ in iter(int,1): for _ in iter(int,1):
data = caget('SATES31-CAMS187-RIXS1:FPICTURE') data = caget('SATES31-CAMS187-RIXS1:FPICTURE')
@ -56,6 +57,78 @@ def tt_live(off,sleep=0.1):
tt.set_ydata(np.array(pp)) tt.set_ydata(np.array(pp))
fig.canvas.draw() fig.canvas.draw()
fig.canvas.flush_events() 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) time.sleep(sleep)

55
tth.py
View File

@ -55,3 +55,58 @@ class Coupled_tth(Adjustable):
return self.DRY.get_current_value()*(-.5) return self.DRY.get_current_value()*(-.5)
def is_moving(self): def is_moving(self):
return any([self.SRY.is_moving(),self.DRY.is_moving()]) 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()])

View File

@ -127,7 +127,9 @@ class ConverterEK:
electron_rest_energy = 0.51099895 # MeV 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) self.pv_electron_energy = PV(pvname_electron_energy)
def K(self, energy): def K(self, energy):