previosuly unstaged changes to macros and device_configs #15

Merged
appleb_m merged 1 commits from x10sa_production_20260512T142714 into main 2026-05-12 15:32:57 +02:00
24 changed files with 4604 additions and 1774 deletions
@@ -0,0 +1,151 @@
states:
robot_sample_exchange:
allow_modifiers: true
bl_pos: in
bl_bright: 'off'
bs_pos: in
bs_z: safe
coll_y: out
cryo_pos: in
det_cov: 'close'
diag_y: out
fl_bright: 'off'
gon_x: in
# smargon: not implemented
xrf_pos: out
sample_alignment:
allow_modifiers: true
bl_pos: in
bl_bright: 'on'
bs_pos: in
bs_z: safe
coll_y: out
cryo_pos: in
det_cov: 'close'
diag_y: out
fl_bright: 'on'
gon_x: in
# smargon: not implemented
xrf_pos: out
data_collection:
allow_modifiers: true
bl_pos: out
bl_bright: 'off'
bs_pos: in
bs_z: safe
coll_y: in
cryo_pos: in
det_cov: 'open'
diag_y: out
fl_bright: 'on'
gon_x: in
# smargon: not implemented
xrf_pos: out
DC_XRF:
allow_modifiers: true
# bl_pos: out
bl_bright: 'off'
bs_pos: in
bs_z: safe
coll_y: in
cryo_pos: in
det_cov: 'close'
diag_y: out
fl_bright: 'on'
gon_x: in
# smargon: not implemented
xrf_pos: in
manual_sample_exchange:
allow_modifiers: true
bl_pos: out
bl_bright: 'off'
bs_pos: out
bs_z: safe
coll_y: park
cryo_pos: in
det_cov: 'close'
diag_y: park
fl_bright: 'off'
gon_x: in
# smargon: not implemented
xrf_pos: out
beam_visualisation:
bl_pos: out
bl_bright: 'off'
bs_pos: in
bs_z: safe
coll_y: out
cryo_pos: out
det_cov: 'close'
diag_y: scint
fl_bright: 'off'
gon_x: out
# smargon: not implemented
xrf_pos: out
flux_measurement:
bl_pos: in
bl_bright: 'off'
bs_pos: in
bs_z: safe
coll_y: out
cryo_pos: out
det_cov: 'close'
diag_y: i1
fl_bright: 'off'
gon_x: out
# smargon: not implemented
xrf_pos: out
beamstop_alignment:
bl_pos: out
bl_bright: 'off'
bs_pos: in
bs_z: samp
coll_y: out
cryo_pos: out
det_cov: 'close'
diag_y: out
fl_bright: 'on'
gon_x: out
# smargon: not implemented
xrf_pos: out
maintenance:
allow_modifiers: true
bl_pos: out
bl_bright: 'off'
bs_pos: out
bs_z: safe
coll_y: park
cryo_pos: in
det_cov: 'close'
diag_y: park
fl_bright: 'off'
gon_x: out
# smargon: not implemented
xrf_pos: out
xtal_snapshot:
allow_modifiers: true
bl_pos: in
bl_bright: 'on'
bs_pos: in
bs_z: safe
coll_y: intermediate
cryo_pos: in
det_cov: 'close'
diag_y: out
fl_bright: 'on'
gon_x: in
# smargon: not implemented
xrf_pos: out
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,169 @@
name,description,deviceClass,PV,readoutPriority,tag,readOnly,include,userParameter,
sls_current,SLS current,SignalRO,ARS07-DPCT-0100:CURR,monitored,SLS,yes,yes,,
fe_bpm1,FE XBPM Signal 1,SignalRO,X10SA-FE-XBPM1:Current1:MeanValue_RBV,monitored,bpm,yes,yes,,
fe_bpm2,FE XBPM Signal 2,SignalRO,X10SA-FE-XBPM1:Current2:MeanValue_RBV,monitored,bpm,yes,yes,,
fe_bpm3,FE XBPM Signal 3,SignalRO,X10SA-FE-XBPM1:Current3:MeanValue_RBV,monitored,bpm,yes,yes,,
fe_bpm4,FE XBPM Signal 4,SignalRO,X10SA-FE-XBPM1:Current4:MeanValue_RBV,monitored,bpm,yes,yes,,
fe_bpmsum,FE XBPM Summed,SignalRO,X10SA-FE-XBPM1:SumAll:MeanValue_RBV,monitored,bpm,yes,yes,,
fe_bpm_x,FE BPM X,Motor,X10SA-FE-XBPM1:TRX,baseline,fe,no,yes,,
fe_bpm_y,FE BPM Y,Motor,X10SA-FE-XBPM1:TRY,baseline,fe,no,yes,,
fe_sl_xr,FE Slit X Ring,MotorEC,X10SA-FE-SL1:TRXR,baseline,fe,no,yes,,
fe_sl_yt,FE Slit Y top,MotorEC,X10SA-FE-SL1:TRYT,baseline,fe,no,yes,,
fe_sl_xw,FE Slit X Wall,MotorEC,X10SA-FE-SL1:TRXW,baseline,fe,no,yes,,
fe_sl_yb,FE SlitY Bottom,MotorEC,X10SA-FE-SL1:TRYB,baseline,fe,no,yes,,
fe_sl_xcen,FE Slit X Centre,MotorEC,X10SA-FE-SL1:CENTERX,baseline,fe,no,yes,,
fe_sl_xsize,FE Slit X Size,MotorEC,X10SA-FE-SL1:SIZEX,baseline,fe,no,yes,,
fe_sl_ycen,FE Slit Y Centre,MotorEC,X10SA-FE-SL1:CENTERY,baseline,fe,no,yes,,
fe_sl_ysize,FE Slit Y Size,MotorEC,X10SA-FE-SL1:SIZEY,baseline,fe,no,yes,,
bsf_bpm1,BSF BPM Signal 1,SignalRO,X10SA-OP-BSFBPM:SIGNAL1,monitored,bpm,yes,no,,
bsf_bpm2,BSF BPM Signal 2,SignalRO,X10SA-OP-BSFBPM:SIGNAL2,monitored,bpm,yes,no,,
bsf_bpm3,BSF BPM Signal 3,SignalRO,X10SA-OP-BSFBPM:SIGNAL3,monitored,bpm,yes,no,,
bsf_bpm4,BSF BPM Signal 4,SignalRO,X10SA-OP-BSFBPM:SIGNAL4,monitored,bpm,yes,no,,
bsf_bpmsum,BSF BPM Summed,SignalRO,X10SA-OP-BSFBPM:SUM,monitored,bpm,yes,no,,
bsf_sl_xw,BSF slit outboard,MotorEC,X10SA-OP-BSFSLH:TRXW,baseline,bsf,no,yes,,
bsf_sl_xr,BSF slit inboard,MotorEC,X10SA-OP-BSFSLH:TRXR,baseline,bsf,no,yes,,
bsf_sl_yt,BSF slit top,MotorEC,X10SA-OP-BSFSLV:TRYT,baseline,bsf,no,yes,,
bsf_sl_yb,BSF slit bottom,MotorEC,X10SA-OP-BSFSLV:TRYB,baseline,bsf,no,yes,,
bsf_sl_xcen,BSF X centre,MotorEC,X10SA-OP-BSFSLH:CENTER,baseline,bsf,no,yes,,
bsf_sl_xsize,BSF X size,MotorEC,X10SA-OP-BSFSLH:SIZE,baseline,bsf,no,yes,,
bsf_sl_ycen,BSF Y centre,MotorEC,X10SA-OP-BSFSLV:CENTER,baseline,bsf,no,yes,,
bsf_sl_ysize,BSF Y size,MotorEC,X10SA-OP-BSFSLV:SIZE,baseline,bsf,no,yes,,
bsf_f1_y,BSF Filter 1 Y,MotorEC,X10SA-OP-BSFFI1:TRY,baseline,bsf,no,yes,,
bsf_f2_y,BSF Filter 2 Y,MotorEC,X10SA-OP-BSFFI2:TRY,baseline,bsf,no,yes,,
dcm_bragg,DCM Bragg angle,MotorEC,X10SA-OP-DCM:ROTY,baseline,dcm,no,yes,,
dcm_x,DCM lateral,MotorEC,X10SA-OP-DCM:TRX,baseline,dcm,no,yes,,
dcm_perp,DCM Perp,MotorEC,X10SA-OP-DCM:TRX-CR2,baseline,dcm,no,yes,,
dcm_pitch,DCM 2nd crystal pitch,MotorEC,X10SA-OP-DCM:ROTY-CR2-PITCH,baseline,dcm,no,yes,,
dcm_fpitch,DCM 2nd crystal fine pitch,MotorEC,X10SA-OP-DCM:ROTY-CR2-FINEPITCH,baseline,dcm,no,yes,,
dcm_froll,DCM 2nd crystal fine roll,MotorEC,X10SA-OP-DCM:ROTZ-CR2-FINEROLL,baseline,dcm,no,yes,,
lu_bpm1,LU BPM Signal 1,SignalRO,X10SA-OP-LUBPM:Current1:MeanValue_RBV,monitored,bpm,yes,yes,,
lu_bpm2,LU BPM Signal 2,SignalRO,X10SA-OP-LUBPM:Current2:MeanValue_RBV,monitored,bpm,yes,yes,,
lu_bpm3,LU BPM Signal 3,SignalRO,X10SA-OP-LUBPM:Current3:MeanValue_RBV,monitored,bpm,yes,yes,,
lu_bpm4,LU BPM Signal 4,SignalRO,X10SA-OP-LUBPM:Current4:MeanValue_RBV,monitored,bpm,yes,yes,,
lu_bpmsum,LU BPM Summed,SignalRO,X10SA-OP-LUBPM:SumAll:MeanValue_RBV,monitored,bpm,yes,yes,,
lu_bpm_x,BPM2 X translation,Motor,X10SA-OP-LUBPM:TRX,baseline,lu,no,yes,,
lu_bpm_y,BPM2 Y translation,Motor,X10SA-OP-LUBPM:TRY,baseline,lu,no,yes,,
lu_z1,Lens Z1 Motion,Motor,X10SA-OP-LUTRZ1:TRZ,baseline,lu,no,yes,,
lu_z2,Lens Z2 Motion,Motor,X10SA-OP-LUTRZ2:TRZ,baseline,lu,no,yes,,
lu_pod1_x,SmarPod1 X,Motor,X10SA-OP-LUPOD1:TRX1,baseline,lu,no,no,,
lu_lens1_x2,Lenses1 X,Motor,X10SA-OP-LUPOD1:TRX2,baseline,lu,no,no,,
lu_pod1_y,SmarPod1 Y,Motor,X10SA-OP-LUPOD1:TRY,baseline,lu,no,yes,,
lu_pod1_z,SmarPod1 Z,Motor,X10SA-OP-LUPOD1:TRZ,baseline,lu,no,yes,,
lu_pod1_rotx,SmarPod1 RX,Motor,X10SA-OP-LUPOD1:ROTX,baseline,lu,no,yes,,
lu_pod1_roty,SmarPod1 RY,Motor,X10SA-OP-LUPOD1:ROTY,baseline,lu,no,yes,,
lu_pod1_rotz,SmarPod1 RZ,Motor,X10SA-OP-LUPOD1:ROTZ,baseline,lu,no,yes,,
lu_pod2_x,SmarPod2 X,Motor,X10SA-OP-LUPOD2:TRX1,baseline,lu,no,no,,
lu_lens2_x2,Lenses2 X,Motor,X10SA-OP-LUPOD2:TRX2,baseline,lu,no,no,,
lu_pod2_y,SmarPod2 Y,Motor,X10SA-OP-LUPOD2:TRY,baseline,lu,no,yes,,
lu_pod2_z,SmarPod2 Z,Motor,X10SA-OP-LUPOD2:TRZ,baseline,lu,no,yes,,
lu_pod2_rotx,SmarPod2 RX,Motor,X10SA-OP-LUPOD2:ROTX,baseline,lu,no,yes,,
lu_pod2_roty,SmarPod2 RY,Motor,X10SA-OP-LUPOD2:ROTY,baseline,lu,no,yes,,
lu_pod2_rotz,SmarPod2 RZ,Motor,X10SA-OP-LUPOD2:ROTZ,baseline,lu,no,yes,,
ss_bpm1,SS BPM Signal 1,SignalRO,X10SA-ES-SSBPM:Current1:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpm2,SS BPM Signal 2,SignalRO,X10SA-ES-SSBPM:Current2:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpm3,SS BPM Signal 3,SignalRO,X10SA-ES-SSBPM:Current3:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpm4,SS BPM Signal 4,SignalRO,X10SA-ES-SSBPM:Current4:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpmsum,SS BPM Summed,SignalRO,X10SA-ES-SSBPM:SumAll:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpm_x,SS BPM X,Motor,X10SA-ES-SSBPM:TRX,baseline,ss,no,yes,,
ss_bpm_y,SS BPM Y,Motor,X10SA-ES-SSBPM:TRY,baseline,ss,no,yes,,
ss_f1_x,SS Filter 1 X,Motor,X10SA-ES-SSFI1:TRX,baseline,ss,no,yes,,
ss_f2_x,SS Filter 2 X,Motor,X10SA-ES-SSFI2:TRX,baseline,ss,no,yes,,
ss_f3_x,SS Filter 2 X,Motor,X10SA-ES-SSFI3:TRX,baseline,ss,no,yes,,
ss_f4_x,SS Filter 4 X,Motor,X10SA-ES-SSFI4:TRX,baseline,ss,no,yes,,
ss_sl_xw,SS slit wall,Motor,X10SA-ES-SSSLH:TRXW,baseline,ss,no,yes,,
ss_sl_xr,SS slit ring,Motor,X10SA-ES-SSSLH:TRXR,baseline,ss,no,yes,,
ss_sl_xcen,SS slit X centre,Motor,X10SA-ES-SSSLH:CENTER,baseline,ss,no,yes,,
ss_sl_xsize,SS slit X size,Motor,X10SA-ES-SSSLH:SIZE,baseline,ss,no,yes,,
ss_sl_yt,SS slit top,Motor,X10SA-ES-SSSLV:TRYT,baseline,ss,no,yes,,
ss_sl_yb,SS slit bottom,Motor,X10SA-ES-SSSLV:TRYB,baseline,ss,no,yes,,
ss_sl_ycen,SS slit Y centre,Motor,X10SA-ES-SSSLV:CENTER,baseline,ss,no,yes,,
ss_sl_ysize,SS slit Y size,Motor,X10SA-ES-SSSLV:SIZE,baseline,ss,no,yes,,
ss_xi_x,SS X-ray eye X,Motor,X10SA-ES-SSXI:TRX,baseline,ss,no,yes,"{""type"": multi-position,""in"": 7.5, ""out"": -2.1}",
ss_xi_y,SS X-ray eye Y,Motor,X10SA-ES-SSXI:TRY,baseline,ss,no,yes,,
ss_xicam_x,ss cam X,SignalRO,X10SA-ES-SSXI:cam1:Stats5:CentroidX_RBV,baseline,ss,yes,no,,
ss_xicam_y,ss cam Y,SignalRO,X10SA-ES-SSXI:cam1:Stats5:CentroidY_RBV,baseline,ss,yes,no,,
ss_xicam_max,ss cam max value,SignalRO,X10SA-ES-SSXI:cam1:Stats5:MaxValue_RBV,monitored,ss,yes,no,,
ss_xicam_exp,ss camera exposure,Signal,X10SA-ES-SSXI:cam1:AcquireTime,baseline,ss,no,no,,
ss_xicam_gain,ss camera gain,Signal,X10SA-ES-SSXI:cam1:cam1:Gain,baseline,ss,no,no,,
ss_xicam_xsig,ss camera x sigma,Signal,X10SA-ES-SSXI:cam1:Stats5:SigmaX_RBV,baseline,ss,yes,no,,
ss_xicam_ysig,ss camera y sigma,Signal,X10SA-ES-SSXI:cam1:Stats5:SigmaY_RBV,baseline,ss,yes,no,,
vfm_xu,VFM Upstream X,MotorEC,X10SA-ES-KBV:TRXU,baseline,vfm,no,no,,
vfm_xd,VFM Downstream X,MotorEC,X10SA-ES-KBV:TRXD,baseline,vfm,no,no,,
vfm_yur,VFM Upstream Ring Y,MotorEC,X10SA-ES-KBV:TRYUR,baseline,vfm,no,no,,
vfm_yw,VFM Wall Y,MotorEC,X10SA-ES-KBV:TRYW,baseline,vfm,no,no,,
vfm_ydr,VFM Downstream Ring Y,MotorEC,X10SA-ES-KBV:TRYDR,baseline,vfm,no,no,,
vfm_bu,VFM Upstream Bender,MotorEC,X10SA-ES-KBV:BNDU,baseline,vfm,no,no,,
vfm_bd,VFM Downstream Bender,MotorEC,X10SA-ES-KBV:BNDD,baseline,vfm,no,no,,
vfm_yaw,VFM Virtual Yaw,MotorEC,X10SA-ES-KBV:YAW,baseline,vfm,no,no,,
vfm_roll,VFM Virtual Roll,MotorEC,X10SA-ES-KBV:ROLL,baseline,vfm,no,no,,
vfm_pitch,VFM Virtual Pitch,MotorEC,X10SA-ES-KBV:PITCH,baseline,vfm,no,no,,
vfm_x,VFM Virtual X,MotorEC,X10SA-ES-KBV:TRX,baseline,vfm,no,no,,
vfm_y,VFM Virtual Y ,MotorEC,X10SA-ES-KBV:TRY,baseline,vfm,no,no,,
hfm_xu,HFM Upstream X,MotorEC,X10SA-ES-KBH:TRXU,baseline,hfm,no,no,,
hfm_xd,HFM Downstream X,MotorEC,X10SA-ES-KBH:TRXD,baseline,hfm,no,no,,
hfm_yuw,HFM Upstream Wall Y,MotorEC,X10SA-ES-KBH:TRYUW,baseline,hfm,no,no,,
hfm_yr,HFM Ring Y,MotorEC,X10SA-ES-KBH:TRYR,baseline,hfm,no,no,,
hfm_ydw,HFM Downstream Wall Y,MotorEC,X10SA-ES-KBH:TRYDW,baseline,hfm,no,no,,
hfm_bu,HFM Upstream Bender,MotorEC,X10SA-ES-KBH:BNDU,baseline,hfm,no,no,,
hfm_bd,HFM Downstream Bender,MotorEC,X10SA-ES-KBH:BNDD,baseline,hfm,no,no,,
hfm_yaw,HFM Virtual Yaw,MotorEC,X10SA-ES-KBH:YAW,baseline,hfm,no,no,,
hfm_roll,HFM Virtual Roll,MotorEC,X10SA-ES-KBH:ROLL,baseline,hfm,no,no,,
hfm_pitch,HFM Virtual Pitch,MotorEC,X10SA-ES-KBH:PITCH,baseline,hfm,no,no,,
hfm_x,HFM Virtual X,MotorEC,X10SA-ES-KBH:TRX,baseline,hfm,no,no,,
hfm_y,HFM Virtual Y ,MotorEC,X10SA-ES-KBH:TRY,baseline,hfm,no,no,,
bcu_bpm1,BCU BPM Signal 1 ,SignalRO,X10SA-ES-BCBPM:Current1:MeanValue_RBV,monitored,bpm,yes,yes,,
bcu_bpm2,BCU BPM Signal 2,SignalRO,X10SA-ES-BCBPM:Current2:MeanValue_RBV,monitored,bpm,yes,yes,,
bcu_bpm3,BCU BPM Signal 3,SignalRO,X10SA-ES-BCBPM:Current3:MeanValue_RBV,monitored,bpm,yes,yes,,
bcu_bpm4,BCU BPM Signal 4,SignalRO,X10SA-ES-BCBPM:Current4:MeanValue_RBV,monitored,bpm,yes,yes,,
bcu_bpmsum,BCU BPM Summed,SignalRO,X10SA-ES-BCBPM:SumAll:MeanValue_RBV,monitored,bpm,yes,yes,,
bcu_bpm_x,BCU BPM X,Motor,X10SA-ES-BCBPM:TRX,baseline,bcu,no,yes,,
bcu_bpm_y,BCU BPM Y ,Motor,X10SA-ES-BCBPM:TRY,baseline,bcu,no,yes,,
bcu_sl_xw,BCU slit wall,Motor,X10SA-ES-BCSLH:TRXW,baseline,bcu,no,no,,
bcu_sl_xr,BCU slit ring,Motor,X10SA-ES-BCSLH:TRXR,baseline,bcu,no,no,,
bcu_sl_xcen,BCU slit X centre,Motor,X10SA-ES-BCSLH:CENTER,baseline,bcu,no,no,,
bcu_sl_xsize,BCU slit X size,Motor,X10SA-ES-BCSLH:SIZEX,baseline,bcu,no,no,,
bcu_sl_yt,BCU slit top,Motor,X10SA-ES-BCSLV:TRYT,baseline,bcu,no,no,,
bcu_sl_yb,BCU slit bottom,Motor,X10SA-ES-BCSLV:TRYB,baseline,bcu,no,no,,
bcu_sl_ycen,BCU slit Y centre,Motor,X10SA-ES-BCSLV:CENTER,baseline,bcu,no,no,,
bcu_sl_ysize,BCU slit Y size,Motor,X10SA-ES-BCSLV:SIZE,baseline,bcu,no,no,,
xrf_pos,XRF det in/out,Signal,X10SA-ES-XRF:POS-SET,baseline,se,no,no,"{""type"":positioner}",
samcam_x,sample cam X ,SignalRO,X10SA-ES-MS:Stats5:CentroidX_RBV,baseline,scam,yes,yes,,
samcam_xsig,sample cam X sigma,SignalRO,X10SA-ES-MS:Stats5:SigmaX_RBV,monitored,scam,yes,yes,,
samcam_y,sample cam Y ,SignalRO,X10SA-ES-MS:Stats5:CentroidY_RBV,baseline,scam,yes,yes,,
samcam_ysig,sample cam Y sigma,SignalRO,X10SA-ES-MS:Stats5:SigmaY_RBV,monitored,scam,yes,yes,,
samcam_max,sample cam max value,SignalRO,X10SA-ES-MS:Stats5:MaxValue_RBV,monitored,scam,yes,yes,,
samcam_exp,sample cam exp time,Signal,X10SA-ES-MS:cam1:AcquireTime,baseline,scam,no,yes,,
samcam_gain,sample cam gain,Signal,X10SA-ES-MS:cam1:Gain,baseline,scam,no,yes,,
scam_zoom,Sample cam zoom,Motor,X10SA-ES-MS:ZOOM,baseline,scam,no,yes,,
fl_bright,Frontlight brightness,Signal,X10SA-ES-FL:SET,baseline,se,no,no,,
coll_x,Collimator X,Motor,X10SA-ES-COL:TRX,baseline,se,no,yes,,
coll_y,Collimator Y,Motor,X10SA-ES-COL:TRY,baseline,se,no,no,"{""type"": multi-position, ""in"": 41.5, ""out"": 20.0, ""park"": 0,""tol"":0.05}",
diag_y,Scintillator/diode Y,Motor,X10SA-ES-SCL:TRY,baseline,se,no,no,"{""type"": multi-position, ""scint"": 38.62, ""i1"": 44.0, ""out"": 20.0,""park"": 0,""tol"":0.3}",
diag_z,Scintillator/diode Z,Motor,X10SA-ES-SCL:TRZ,baseline,se,no,yes,,
i1,i1 diode reading,SignalRO,X10SA-ES-SCLDI:READOUT,monitored,bpm,yes,yes,,
bl_pos,Backlight positioner,Signal,X10SA-ES-BL:POS-SET,baseline,se,no,no,"{""type"":positioner}",
bl_bright,Backlight brightness,Signal,X10SA-ES-BL:SET,baseline,se,no,no,,
bs_x,Beamstop X,Motor,X10SA-ES-BS:TRX,baseline,se,no,yes,,
bs_y,Beamstop Y,Motor,X10SA-ES-BS:TRY,baseline,se,no,yes,,
bs_z,Beamstop Z,Motor,X10SA-ES-BS:TRZ,baseline,se,no,no,"{""type"": guarded, ""min"": 13, ""samp"": 15, ""work_min"": 20, ""safe"": 41, ""max_blin"": 42, ""max_blout"": 70}",
bs_pos,Beamstop positioner,Signal,X10SA-ES-BS:POS-SET,baseline,se,no,no,"{""type"":positioner}",
gon_x,Goniometer X,Motor,X10SA-ES-DF1:TRX1,baseline,det,no,no,"{""type"": guarded, ""in"": 18.0, ""out"": -10.0, ""safe"": -100,""tol"":0.5}",
gon_y,Goniometer Y,Motor,X10SA-ES-DF1:TRY1,baseline,det,no,yes,,
gon_z,Goniometer X,Motor,X10SA-ES-DF1:TRZ1,baseline,det,no,yes,,
omega,Omega,Motor,X10SA-ES-DF1:ROTU,baseline,det,no,yes,,
cryo_pos,Cryo positioner,Signal,X10SA-ES-CS:POS-SET,baseline,se,no,no,"{""type"":positioner}",
cryo_x,Cryojet X ,Motor,X10SA-ES-CS:TRX,baseline,se,no,yes,,
det_xi_focus,X-ray eye 2 Focus,Motor,X10SA-ES-XEYE:FOCUS,baseline,det,no,yes,,
det_xi_zoom,X-ray eye 2 Zoom,Motor,X10SA-ES-XEYE:ZOOM,baseline,det,no,yes,,
det_xi_x,X-ray eye X,Motor,X10SA-ES-XEYE:TRX,baseline,det,no,yes,,
i2,i2,SignalRO,X10SA-ES-XEYEDI:READOUT,monitored,bpm,yes,yes,,
det_xicam_x,sample cam X ,SignalRO,X10SA-ES-XEYE:cam1:Stats5:CentroidX_RBV,baseline,scam,yes,no,,
det_xicam_xsig,sample cam X sigma,SignalRO,X10SA-ES-XEYE:cam1:Stats5:SigmaX_RBV,monitored,scam,yes,no,,
det_xicam_y,sample cam Y ,SignalRO,X10SA-ES-XEYE:cam1:Stats5:CentroidY_RBV,baseline,scam,yes,no,,
det_xicam_ysig,sample cam Y sigma,SignalRO,X10SA-ES-XEYE:cam1:Stats5:SigmaY_RBV,monitored,scam,yes,no,,
det_xicam_max,sample cam max value,SignalRO,X10SA-ES-XEYE:cam1:Stats5:MaxValue_RBV,monitored,scam,yes,no,,
det_xicam_exp,sample cam exp time,Signal,X10SA-ES-XEYE:cam1:cam1:AcquireTime,baseline,scam,no,no,,
det_xicam_gain,sample cam gain,Signal,X10SA-ES-XEYE:cam1:cam1:Gain,baseline,scam,no,no,,
det_cov,Detector cover,Signal,X10SA-ES-DETCOV:SET,baseline,det,no,no,"{""type"":positioner}",
det_y,Detector Y,Motor,X10SA-ES-DET:TRY,baseline,det,no,yes,,
det_z,Detector Z,Motor,X10SA-ES-DET:TRZ,baseline,det,no,yes,,
1 name description deviceClass PV readoutPriority tag readOnly include userParameter
2 sls_current SLS current SignalRO ARS07-DPCT-0100:CURR monitored SLS yes yes
3 fe_bpm1 FE XBPM Signal 1 SignalRO X10SA-FE-XBPM1:Current1:MeanValue_RBV monitored bpm yes yes
4 fe_bpm2 FE XBPM Signal 2 SignalRO X10SA-FE-XBPM1:Current2:MeanValue_RBV monitored bpm yes yes
5 fe_bpm3 FE XBPM Signal 3 SignalRO X10SA-FE-XBPM1:Current3:MeanValue_RBV monitored bpm yes yes
6 fe_bpm4 FE XBPM Signal 4 SignalRO X10SA-FE-XBPM1:Current4:MeanValue_RBV monitored bpm yes yes
7 fe_bpmsum FE XBPM Summed SignalRO X10SA-FE-XBPM1:SumAll:MeanValue_RBV monitored bpm yes yes
8 fe_bpm_x FE BPM X Motor X10SA-FE-XBPM1:TRX baseline fe no yes
9 fe_bpm_y FE BPM Y Motor X10SA-FE-XBPM1:TRY baseline fe no yes
10 fe_sl_xr FE Slit X Ring MotorEC X10SA-FE-SL1:TRXR baseline fe no yes
11 fe_sl_yt FE Slit Y top MotorEC X10SA-FE-SL1:TRYT baseline fe no yes
12 fe_sl_xw FE Slit X Wall MotorEC X10SA-FE-SL1:TRXW baseline fe no yes
13 fe_sl_yb FE SlitY Bottom MotorEC X10SA-FE-SL1:TRYB baseline fe no yes
14 fe_sl_xcen FE Slit X Centre MotorEC X10SA-FE-SL1:CENTERX baseline fe no yes
15 fe_sl_xsize FE Slit X Size MotorEC X10SA-FE-SL1:SIZEX baseline fe no yes
16 fe_sl_ycen FE Slit Y Centre MotorEC X10SA-FE-SL1:CENTERY baseline fe no yes
17 fe_sl_ysize FE Slit Y Size MotorEC X10SA-FE-SL1:SIZEY baseline fe no yes
18 bsf_bpm1 BSF BPM Signal 1 SignalRO X10SA-OP-BSFBPM:SIGNAL1 monitored bpm yes no
19 bsf_bpm2 BSF BPM Signal 2 SignalRO X10SA-OP-BSFBPM:SIGNAL2 monitored bpm yes no
20 bsf_bpm3 BSF BPM Signal 3 SignalRO X10SA-OP-BSFBPM:SIGNAL3 monitored bpm yes no
21 bsf_bpm4 BSF BPM Signal 4 SignalRO X10SA-OP-BSFBPM:SIGNAL4 monitored bpm yes no
22 bsf_bpmsum BSF BPM Summed SignalRO X10SA-OP-BSFBPM:SUM monitored bpm yes no
23 bsf_sl_xw BSF slit outboard MotorEC X10SA-OP-BSFSLH:TRXW baseline bsf no yes
24 bsf_sl_xr BSF slit inboard MotorEC X10SA-OP-BSFSLH:TRXR baseline bsf no yes
25 bsf_sl_yt BSF slit top MotorEC X10SA-OP-BSFSLV:TRYT baseline bsf no yes
26 bsf_sl_yb BSF slit bottom MotorEC X10SA-OP-BSFSLV:TRYB baseline bsf no yes
27 bsf_sl_xcen BSF X centre MotorEC X10SA-OP-BSFSLH:CENTER baseline bsf no yes
28 bsf_sl_xsize BSF X size MotorEC X10SA-OP-BSFSLH:SIZE baseline bsf no yes
29 bsf_sl_ycen BSF Y centre MotorEC X10SA-OP-BSFSLV:CENTER baseline bsf no yes
30 bsf_sl_ysize BSF Y size MotorEC X10SA-OP-BSFSLV:SIZE baseline bsf no yes
31 bsf_f1_y BSF Filter 1 Y MotorEC X10SA-OP-BSFFI1:TRY baseline bsf no yes
32 bsf_f2_y BSF Filter 2 Y MotorEC X10SA-OP-BSFFI2:TRY baseline bsf no yes
33 dcm_bragg DCM Bragg angle MotorEC X10SA-OP-DCM:ROTY baseline dcm no yes
34 dcm_x DCM lateral MotorEC X10SA-OP-DCM:TRX baseline dcm no yes
35 dcm_perp DCM Perp MotorEC X10SA-OP-DCM:TRX-CR2 baseline dcm no yes
36 dcm_pitch DCM 2nd crystal pitch MotorEC X10SA-OP-DCM:ROTY-CR2-PITCH baseline dcm no yes
37 dcm_fpitch DCM 2nd crystal fine pitch MotorEC X10SA-OP-DCM:ROTY-CR2-FINEPITCH baseline dcm no yes
38 dcm_froll DCM 2nd crystal fine roll MotorEC X10SA-OP-DCM:ROTZ-CR2-FINEROLL baseline dcm no yes
39 lu_bpm1 LU BPM Signal 1 SignalRO X10SA-OP-LUBPM:Current1:MeanValue_RBV monitored bpm yes yes
40 lu_bpm2 LU BPM Signal 2 SignalRO X10SA-OP-LUBPM:Current2:MeanValue_RBV monitored bpm yes yes
41 lu_bpm3 LU BPM Signal 3 SignalRO X10SA-OP-LUBPM:Current3:MeanValue_RBV monitored bpm yes yes
42 lu_bpm4 LU BPM Signal 4 SignalRO X10SA-OP-LUBPM:Current4:MeanValue_RBV monitored bpm yes yes
43 lu_bpmsum LU BPM Summed SignalRO X10SA-OP-LUBPM:SumAll:MeanValue_RBV monitored bpm yes yes
44 lu_bpm_x BPM2 X translation Motor X10SA-OP-LUBPM:TRX baseline lu no yes
45 lu_bpm_y BPM2 Y translation Motor X10SA-OP-LUBPM:TRY baseline lu no yes
46 lu_z1 Lens Z1 Motion Motor X10SA-OP-LUTRZ1:TRZ baseline lu no yes
47 lu_z2 Lens Z2 Motion Motor X10SA-OP-LUTRZ2:TRZ baseline lu no yes
48 lu_pod1_x SmarPod1 X Motor X10SA-OP-LUPOD1:TRX1 baseline lu no no
49 lu_lens1_x2 Lenses1 X Motor X10SA-OP-LUPOD1:TRX2 baseline lu no no
50 lu_pod1_y SmarPod1 Y Motor X10SA-OP-LUPOD1:TRY baseline lu no yes
51 lu_pod1_z SmarPod1 Z Motor X10SA-OP-LUPOD1:TRZ baseline lu no yes
52 lu_pod1_rotx SmarPod1 RX Motor X10SA-OP-LUPOD1:ROTX baseline lu no yes
53 lu_pod1_roty SmarPod1 RY Motor X10SA-OP-LUPOD1:ROTY baseline lu no yes
54 lu_pod1_rotz SmarPod1 RZ Motor X10SA-OP-LUPOD1:ROTZ baseline lu no yes
55 lu_pod2_x SmarPod2 X Motor X10SA-OP-LUPOD2:TRX1 baseline lu no no
56 lu_lens2_x2 Lenses2 X Motor X10SA-OP-LUPOD2:TRX2 baseline lu no no
57 lu_pod2_y SmarPod2 Y Motor X10SA-OP-LUPOD2:TRY baseline lu no yes
58 lu_pod2_z SmarPod2 Z Motor X10SA-OP-LUPOD2:TRZ baseline lu no yes
59 lu_pod2_rotx SmarPod2 RX Motor X10SA-OP-LUPOD2:ROTX baseline lu no yes
60 lu_pod2_roty SmarPod2 RY Motor X10SA-OP-LUPOD2:ROTY baseline lu no yes
61 lu_pod2_rotz SmarPod2 RZ Motor X10SA-OP-LUPOD2:ROTZ baseline lu no yes
62 ss_bpm1 SS BPM Signal 1 SignalRO X10SA-ES-SSBPM:Current1:MeanValue_RBV monitored bpm yes yes
63 ss_bpm2 SS BPM Signal 2 SignalRO X10SA-ES-SSBPM:Current2:MeanValue_RBV monitored bpm yes yes
64 ss_bpm3 SS BPM Signal 3 SignalRO X10SA-ES-SSBPM:Current3:MeanValue_RBV monitored bpm yes yes
65 ss_bpm4 SS BPM Signal 4 SignalRO X10SA-ES-SSBPM:Current4:MeanValue_RBV monitored bpm yes yes
66 ss_bpmsum SS BPM Summed SignalRO X10SA-ES-SSBPM:SumAll:MeanValue_RBV monitored bpm yes yes
67 ss_bpm_x SS BPM X Motor X10SA-ES-SSBPM:TRX baseline ss no yes
68 ss_bpm_y SS BPM Y Motor X10SA-ES-SSBPM:TRY baseline ss no yes
69 ss_f1_x SS Filter 1 X Motor X10SA-ES-SSFI1:TRX baseline ss no yes
70 ss_f2_x SS Filter 2 X Motor X10SA-ES-SSFI2:TRX baseline ss no yes
71 ss_f3_x SS Filter 2 X Motor X10SA-ES-SSFI3:TRX baseline ss no yes
72 ss_f4_x SS Filter 4 X Motor X10SA-ES-SSFI4:TRX baseline ss no yes
73 ss_sl_xw SS slit wall Motor X10SA-ES-SSSLH:TRXW baseline ss no yes
74 ss_sl_xr SS slit ring Motor X10SA-ES-SSSLH:TRXR baseline ss no yes
75 ss_sl_xcen SS slit X centre Motor X10SA-ES-SSSLH:CENTER baseline ss no yes
76 ss_sl_xsize SS slit X size Motor X10SA-ES-SSSLH:SIZE baseline ss no yes
77 ss_sl_yt SS slit top Motor X10SA-ES-SSSLV:TRYT baseline ss no yes
78 ss_sl_yb SS slit bottom Motor X10SA-ES-SSSLV:TRYB baseline ss no yes
79 ss_sl_ycen SS slit Y centre Motor X10SA-ES-SSSLV:CENTER baseline ss no yes
80 ss_sl_ysize SS slit Y size Motor X10SA-ES-SSSLV:SIZE baseline ss no yes
81 ss_xi_x SS X-ray eye X Motor X10SA-ES-SSXI:TRX baseline ss no yes {"type": multi-position,"in": 7.5, "out": -2.1}
82 ss_xi_y SS X-ray eye Y Motor X10SA-ES-SSXI:TRY baseline ss no yes
83 ss_xicam_x ss cam X SignalRO X10SA-ES-SSXI:cam1:Stats5:CentroidX_RBV baseline ss yes no
84 ss_xicam_y ss cam Y SignalRO X10SA-ES-SSXI:cam1:Stats5:CentroidY_RBV baseline ss yes no
85 ss_xicam_max ss cam max value SignalRO X10SA-ES-SSXI:cam1:Stats5:MaxValue_RBV monitored ss yes no
86 ss_xicam_exp ss camera exposure Signal X10SA-ES-SSXI:cam1:AcquireTime baseline ss no no
87 ss_xicam_gain ss camera gain Signal X10SA-ES-SSXI:cam1:cam1:Gain baseline ss no no
88 ss_xicam_xsig ss camera x sigma Signal X10SA-ES-SSXI:cam1:Stats5:SigmaX_RBV baseline ss yes no
89 ss_xicam_ysig ss camera y sigma Signal X10SA-ES-SSXI:cam1:Stats5:SigmaY_RBV baseline ss yes no
90 vfm_xu VFM Upstream X MotorEC X10SA-ES-KBV:TRXU baseline vfm no no
91 vfm_xd VFM Downstream X MotorEC X10SA-ES-KBV:TRXD baseline vfm no no
92 vfm_yur VFM Upstream Ring Y MotorEC X10SA-ES-KBV:TRYUR baseline vfm no no
93 vfm_yw VFM Wall Y MotorEC X10SA-ES-KBV:TRYW baseline vfm no no
94 vfm_ydr VFM Downstream Ring Y MotorEC X10SA-ES-KBV:TRYDR baseline vfm no no
95 vfm_bu VFM Upstream Bender MotorEC X10SA-ES-KBV:BNDU baseline vfm no no
96 vfm_bd VFM Downstream Bender MotorEC X10SA-ES-KBV:BNDD baseline vfm no no
97 vfm_yaw VFM Virtual Yaw MotorEC X10SA-ES-KBV:YAW baseline vfm no no
98 vfm_roll VFM Virtual Roll MotorEC X10SA-ES-KBV:ROLL baseline vfm no no
99 vfm_pitch VFM Virtual Pitch MotorEC X10SA-ES-KBV:PITCH baseline vfm no no
100 vfm_x VFM Virtual X MotorEC X10SA-ES-KBV:TRX baseline vfm no no
101 vfm_y VFM Virtual Y MotorEC X10SA-ES-KBV:TRY baseline vfm no no
102 hfm_xu HFM Upstream X MotorEC X10SA-ES-KBH:TRXU baseline hfm no no
103 hfm_xd HFM Downstream X MotorEC X10SA-ES-KBH:TRXD baseline hfm no no
104 hfm_yuw HFM Upstream Wall Y MotorEC X10SA-ES-KBH:TRYUW baseline hfm no no
105 hfm_yr HFM Ring Y MotorEC X10SA-ES-KBH:TRYR baseline hfm no no
106 hfm_ydw HFM Downstream Wall Y MotorEC X10SA-ES-KBH:TRYDW baseline hfm no no
107 hfm_bu HFM Upstream Bender MotorEC X10SA-ES-KBH:BNDU baseline hfm no no
108 hfm_bd HFM Downstream Bender MotorEC X10SA-ES-KBH:BNDD baseline hfm no no
109 hfm_yaw HFM Virtual Yaw MotorEC X10SA-ES-KBH:YAW baseline hfm no no
110 hfm_roll HFM Virtual Roll MotorEC X10SA-ES-KBH:ROLL baseline hfm no no
111 hfm_pitch HFM Virtual Pitch MotorEC X10SA-ES-KBH:PITCH baseline hfm no no
112 hfm_x HFM Virtual X MotorEC X10SA-ES-KBH:TRX baseline hfm no no
113 hfm_y HFM Virtual Y MotorEC X10SA-ES-KBH:TRY baseline hfm no no
114 bcu_bpm1 BCU BPM Signal 1 SignalRO X10SA-ES-BCBPM:Current1:MeanValue_RBV monitored bpm yes yes
115 bcu_bpm2 BCU BPM Signal 2 SignalRO X10SA-ES-BCBPM:Current2:MeanValue_RBV monitored bpm yes yes
116 bcu_bpm3 BCU BPM Signal 3 SignalRO X10SA-ES-BCBPM:Current3:MeanValue_RBV monitored bpm yes yes
117 bcu_bpm4 BCU BPM Signal 4 SignalRO X10SA-ES-BCBPM:Current4:MeanValue_RBV monitored bpm yes yes
118 bcu_bpmsum BCU BPM Summed SignalRO X10SA-ES-BCBPM:SumAll:MeanValue_RBV monitored bpm yes yes
119 bcu_bpm_x BCU BPM X Motor X10SA-ES-BCBPM:TRX baseline bcu no yes
120 bcu_bpm_y BCU BPM Y Motor X10SA-ES-BCBPM:TRY baseline bcu no yes
121 bcu_sl_xw BCU slit wall Motor X10SA-ES-BCSLH:TRXW baseline bcu no no
122 bcu_sl_xr BCU slit ring Motor X10SA-ES-BCSLH:TRXR baseline bcu no no
123 bcu_sl_xcen BCU slit X centre Motor X10SA-ES-BCSLH:CENTER baseline bcu no no
124 bcu_sl_xsize BCU slit X size Motor X10SA-ES-BCSLH:SIZEX baseline bcu no no
125 bcu_sl_yt BCU slit top Motor X10SA-ES-BCSLV:TRYT baseline bcu no no
126 bcu_sl_yb BCU slit bottom Motor X10SA-ES-BCSLV:TRYB baseline bcu no no
127 bcu_sl_ycen BCU slit Y centre Motor X10SA-ES-BCSLV:CENTER baseline bcu no no
128 bcu_sl_ysize BCU slit Y size Motor X10SA-ES-BCSLV:SIZE baseline bcu no no
129 xrf_pos XRF det in/out Signal X10SA-ES-XRF:POS-SET baseline se no no {"type":positioner}
130 samcam_x sample cam X SignalRO X10SA-ES-MS:Stats5:CentroidX_RBV baseline scam yes yes
131 samcam_xsig sample cam X sigma SignalRO X10SA-ES-MS:Stats5:SigmaX_RBV monitored scam yes yes
132 samcam_y sample cam Y SignalRO X10SA-ES-MS:Stats5:CentroidY_RBV baseline scam yes yes
133 samcam_ysig sample cam Y sigma SignalRO X10SA-ES-MS:Stats5:SigmaY_RBV monitored scam yes yes
134 samcam_max sample cam max value SignalRO X10SA-ES-MS:Stats5:MaxValue_RBV monitored scam yes yes
135 samcam_exp sample cam exp time Signal X10SA-ES-MS:cam1:AcquireTime baseline scam no yes
136 samcam_gain sample cam gain Signal X10SA-ES-MS:cam1:Gain baseline scam no yes
137 scam_zoom Sample cam zoom Motor X10SA-ES-MS:ZOOM baseline scam no yes
138 fl_bright Frontlight brightness Signal X10SA-ES-FL:SET baseline se no no
139 coll_x Collimator X Motor X10SA-ES-COL:TRX baseline se no yes
140 coll_y Collimator Y Motor X10SA-ES-COL:TRY baseline se no no {"type": multi-position, "in": 41.5, "out": 20.0, "park": 0,"tol":0.05}
141 diag_y Scintillator/diode Y Motor X10SA-ES-SCL:TRY baseline se no no {"type": multi-position, "scint": 38.62, "i1": 44.0, "out": 20.0,"park": 0,"tol":0.3}
142 diag_z Scintillator/diode Z Motor X10SA-ES-SCL:TRZ baseline se no yes
143 i1 i1 diode reading SignalRO X10SA-ES-SCLDI:READOUT monitored bpm yes yes
144 bl_pos Backlight positioner Signal X10SA-ES-BL:POS-SET baseline se no no {"type":positioner}
145 bl_bright Backlight brightness Signal X10SA-ES-BL:SET baseline se no no
146 bs_x Beamstop X Motor X10SA-ES-BS:TRX baseline se no yes
147 bs_y Beamstop Y Motor X10SA-ES-BS:TRY baseline se no yes
148 bs_z Beamstop Z Motor X10SA-ES-BS:TRZ baseline se no no {"type": guarded, "min": 13, "samp": 15, "work_min": 20, "safe": 41, "max_blin": 42, "max_blout": 70}
149 bs_pos Beamstop positioner Signal X10SA-ES-BS:POS-SET baseline se no no {"type":positioner}
150 gon_x Goniometer X Motor X10SA-ES-DF1:TRX1 baseline det no no {"type": guarded, "in": 18.0, "out": -10.0, "safe": -100,"tol":0.5}
151 gon_y Goniometer Y Motor X10SA-ES-DF1:TRY1 baseline det no yes
152 gon_z Goniometer X Motor X10SA-ES-DF1:TRZ1 baseline det no yes
153 omega Omega Motor X10SA-ES-DF1:ROTU baseline det no yes
154 cryo_pos Cryo positioner Signal X10SA-ES-CS:POS-SET baseline se no no {"type":positioner}
155 cryo_x Cryojet X Motor X10SA-ES-CS:TRX baseline se no yes
156 det_xi_focus X-ray eye 2 Focus Motor X10SA-ES-XEYE:FOCUS baseline det no yes
157 det_xi_zoom X-ray eye 2 Zoom Motor X10SA-ES-XEYE:ZOOM baseline det no yes
158 det_xi_x X-ray eye X Motor X10SA-ES-XEYE:TRX baseline det no yes
159 i2 i2 SignalRO X10SA-ES-XEYEDI:READOUT monitored bpm yes yes
160 det_xicam_x sample cam X SignalRO X10SA-ES-XEYE:cam1:Stats5:CentroidX_RBV baseline scam yes no
161 det_xicam_xsig sample cam X sigma SignalRO X10SA-ES-XEYE:cam1:Stats5:SigmaX_RBV monitored scam yes no
162 det_xicam_y sample cam Y SignalRO X10SA-ES-XEYE:cam1:Stats5:CentroidY_RBV baseline scam yes no
163 det_xicam_ysig sample cam Y sigma SignalRO X10SA-ES-XEYE:cam1:Stats5:SigmaY_RBV monitored scam yes no
164 det_xicam_max sample cam max value SignalRO X10SA-ES-XEYE:cam1:Stats5:MaxValue_RBV monitored scam yes no
165 det_xicam_exp sample cam exp time Signal X10SA-ES-XEYE:cam1:cam1:AcquireTime baseline scam no no
166 det_xicam_gain sample cam gain Signal X10SA-ES-XEYE:cam1:cam1:Gain baseline scam no no
167 det_cov Detector cover Signal X10SA-ES-DETCOV:SET baseline det no no {"type":positioner}
168 det_y Detector Y Motor X10SA-ES-DET:TRY baseline det no yes
169 det_z Detector Z Motor X10SA-ES-DET:TRZ baseline det no yes
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,146 @@
name,description,deviceClass,PV,readoutPriority,tag,readOnly,include,userParameter,
sls_current,SLS current,SignalRO,ARS07-DPCT-0100:CURR,monitored,SLS,yes,yes,,
fe_sl_xr,FE Slit X Ring,Motor,X06DA-FE-SLDI:TRXR,baseline,fe,no,yes,,
fe_sl_yt,FE Slit Y top,Motor,X06DA-FE-SLDI:TRYT,baseline,fe,no,yes,,
fe_sl_xw,FE Slit X Wall,Motor,X06DA-FE-SLDI:TRXW,baseline,fe,no,yes,,
fe_sl_yb,FE SlitY Bottom,Motor,X06DA-FE-SLDI:TRYB,baseline,fe,no,yes,,
fe_sl_xcen,FE Slit X Centre,Motor,X06DA-FE-SLDI:CENTERX,baseline,fe,no,yes,,
fe_sl_xsize,FE Slit X Size,Motor,X06DA-FE-SLDI:SIZEX,baseline,fe,no,yes,,
fe_sl_ycen,FE Slit Y Centre,Motor,X06DA-FE-SLDI:CENTERY,baseline,fe,no,yes,,
fe_sl_ysize,FE Slit Y Size,Motor,X06DA-FE-SLDI:SIZEY,baseline,fe,no,yes,,
fe_cm_xu,FE Coll Mirror Upstream X,Motor,X06DA-ES-MI1:TRXU,baseline,fe_cm,no,yes,,
fe_cm_xd,FE Coll Mirror Downstream X,Motor,X06DA-ES-MI1:TRXD,baseline,fe_cm,no,yes,,
fe_cm_yur,FE Coll Mirror Upstream Ring Y,Motor,X06DA-ES-MI1:TRYUR,baseline,fe_cm,no,yes,,
fe_cm_yw,FE Coll Mirror Wall Y,Motor,X06DA-ES-MI1:TRYW,baseline,fe_cm,no,yes,,
fe_cm_ydr,FE Coll Mirror Downstream Ring Y,Motor,X06DA-ES-MI1:TRYDR,baseline,fe_cm,no,yes,,
fe_cm_b1,FE Coll Mirror Bender,Motor,X06DA-ES-MI1:BND1,baseline,fe_cm,no,yes,,
fe_cm_yaw,FE Coll Mirror Yaw,Motor,X06DA-ES-MI1:YAW,baseline,fe_cm,no,yes,,
fe_cm_roll,FE Coll Mirror Roll,Motor,X06DA-ES-MI1:ROLL,baseline,fe_cm,no,yes,,
fe_cm_pitch,FE Coll Mirror Pitch,Motor,X06DA-ES-MI1:PITCH,baseline,fe_cm,no,yes,,
fe_cm_x,FE Coll Mirror X,Motor,X06DA-ES-MI1:TRX,baseline,fe_cm,no,yes,,
fe_cm_y,FE Coll Mirror Y ,Motor,X06DA-ES-MI1:TRY,baseline,fe_cm,no,yes,,
bsf_bpm1,BSF BPM Signal 1,SignalRO,X06DA-OP-BSFBPM:SIGNAL1,monitored,bpm,yes,no,,
bsf_bpm2,BSF BPM Signal 2,SignalRO,X06DA-OP-BSFBPM:SIGNAL2,monitored,bpm,yes,no,,
bsf_bpm3,BSF BPM Signal 3,SignalRO,X06DA-OP-BSFBPM:SIGNAL3,monitored,bpm,yes,no,,
bsf_bpm4,BSF BPM Signal 4,SignalRO,X06DA-OP-BSFBPM:SIGNAL4,monitored,bpm,yes,no,,
bsf_bpmsum,BSF BPM Summed,SignalRO,X06DA-OP-BSFBPM:SUM,monitored,bpm,yes,no,,
bsf_sl_xw,BSF slit outboard,Motor,X06DA-OP-BSFSLH:TRXW,baseline,bsf,no,yes,,
bsf_sl_xr,BSF slit inboard,Motor,X06DA-OP-BSFSLH:TRXR,baseline,bsf,no,yes,,
bsf_sl_yt,BSF slit top,Motor,X06DA-OP-BSFSLV:TRYT,baseline,bsf,no,yes,,
bsf_sl_yb,BSF slit bottom,Motor,X06DA-OP-BSFSLV:TRYB,baseline,bsf,no,yes,,
bsf_sl_xcen,BSF X centre,Motor,X06DA-OP-BSFSLH:CENTER,baseline,bsf,no,yes,,
bsf_sl_xsize,BSF X size,Motor,X06DA-OP-BSFSLH:SIZE,baseline,bsf,no,yes,,
bsf_sl_ycen,BSF Y centre,Motor,X06DA-OP-BSFSLV:CENTER,baseline,bsf,no,yes,,
bsf_sl_ysize,BSF Y size,Motor,X06DA-OP-BSFSLV:SIZE,baseline,bsf,no,yes,,
bsf_f1_y,BSF Filter 1 Y,Motor,X06DA-OP-BSFFI1:TRY,baseline,bsf,no,yes,,
bsf_f2_y,BSF Filter 2 Y,Motor,X06DA-OP-BSFFI2:TRY,baseline,bsf,no,yes,,
dccm_theta1,DCCM theta1,Motor,X06DA-OP-DCCM:ROTX-CR1,baseline,dccm,no,yes,,
dccm_theta2,DCCM theta2,Motor,X06DA-OP-DCCM:ROTX-CR2,baseline,dccm,no,yes,,
dccm_rotz,DCCM Crystal 2 rotz ,Motor,X06DA-OP-DCCM:ROTZ-CR2,baseline,dccm,no,yes,,
dccm_energy,DCCM energy,Motor,X06DA-OP-DCCM:ENERGY,baseline,dccm,no,yes,,
dccm_diode_t,Top diode between mono crystals,SignalRO,X06DA-OP-XPM1:TOP:READOUT,baseline,dccm,no,yes,,
dccm_diode_b,Bottom diode between mono crystals,SignalRO,X06DA-OP-XPM1:BOT:READOUT,baseline,dccm,no,yes,,
dccm_xbpm1,XBPM after mono ch1,SignalRO,X06DA-OP-XBPM1:Current1:MeanValue_RBV,baseline,dccm,no,yes,,
dccm_xbpm2,XBPM after mono ch2,SignalRO,X06DA-OP-XBPM1:Current2:MeanValue_RBV,baseline,dccm,no,yes,,
dccm_xbpm3,XBPM after mono ch3,SignalRO,X06DA-OP-XBPM1:Current3:MeanValue_RBV,baseline,dccm,no,yes,,
dccm_xbpm4,XBPM after mono ch4,SignalRO,X06DA-OP-XBPM1:Current4:MeanValue_RBV,baseline,dccm,no,yes,,
dccm_xbpmsum,XBPM after mono summed,SignalRO,X06DA-OP-XBPM1:SumAll:MeanValue_RBV,baseline,dccm,no,yes,,
ss_bpm1,SS BPM Signal 1,SignalRO,X06DA-ES-SSBPM:Current1:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpm2,SS BPM Signal 2,SignalRO,X06DA-ES-SSBPM:Current2:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpm3,SS BPM Signal 3,SignalRO,X06DA-ES-SSBPM:Current3:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpm4,SS BPM Signal 4,SignalRO,X06DA-ES-SSBPM:Current4:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpmsum,SS BPM Summed,SignalRO,X06DA-ES-SSBPM:SumAll:MeanValue_RBV,monitored,bpm,yes,yes,,
ss_bpm_x,SS BPM X,Motor,X06DA-ES-SSBPM:TRX,baseline,ss,no,yes,,
ss_bpm_y,SS BPM Y,Motor,X06DA-ES-SSBPM:TRY,baseline,ss,no,yes,,
ss_sl_xw,SS slit wall,Motor,X06DA-ES-SSSLH:TRXW,baseline,ss,no,yes,,
ss_sl_xr,SS slit ring,Motor,X06DA-ES-SSSLH:TRXR,baseline,ss,no,yes,,
ss_sl_xcen,SS slit X centre,Motor,X06DA-ES-SSSLH:CENTER,baseline,ss,no,yes,,
ss_sl_xsize,SS slit X size,Motor,X06DA-ES-SSSLH:SIZE,baseline,ss,no,yes,,
ss_sl_yt,SS slit top,Motor,X06DA-ES-SSSLV:TRYT,baseline,ss,no,yes,,
ss_sl_yb,SS slit bottom,Motor,X06DA-ES-SSSLV:TRYB,baseline,ss,no,yes,,
ss_sl_ycen,SS slit Y centre,Motor,X06DA-ES-SSSLV:CENTER,baseline,ss,no,yes,,
ss_sl_ysize,SS slit Y size,Motor,X06DA-ES-SSSLV:SIZE,baseline,ss,no,yes,,
ss_xi_x,SS X-ray eye X,Motor,X06DA-ES-SSXI:TRX,baseline,ss,no,yes,,
ss_xi_y,SS X-ray eye Y,Motor,X06DA-ES-SSXI:TRY,baseline,ss,no,yes,,
ss_xicam_x,ss cam X,SignalRO,X06DA-ES-SSXI:cam1:Stats5:CentroidX_RBV,baseline,ss,yes,yes,,
ss_xicam_y,ss cam Y,SignalRO,X06DA-ES-SSXI:cam1:Stats5:CentroidY_RBV,baseline,ss,yes,yes,,
ss_xicam_max,ss cam max value,SignalRO,X06DA-ES-SSXI:cam1:Stats5:MaxValue_RBV,monitored,ss,yes,yes,,
ss_xicam_exp,ss camera exposure,Signal,X06DA-ES-SSXI:cam1:AcquireTime,baseline,ss,no,yes,,
ss_xicam_gain,ss camera gain,Signal,X06DA-ES-SSXI:cam1:cam1:Gain,baseline,ss,no,yes,,
ss_xicam_xsig,ss camera x sigma,Signal,X06DA-ES-SSXI:cam1:Stats5:SigmaX_RBV,baseline,ss,yes,yes,,
ss_xicam_ysig,ss camera y sigma,Signal,X06DA-ES-SSXI:cam1:Stats5:SigmaY_RBV,baseline,ss,yes,yes,,
vfm_xu,VFM Upstream X,Motor,X06DA-ES-KBV:TRXU,baseline,vfm,no,no,,
vfm_xd,VFM Downstream X,Motor,X06DA-ES-KBV:TRXD,baseline,vfm,no,no,,
vfm_yur,VFM Upstream Ring Y,Motor,X06DA-ES-KBV:TRYUR,baseline,vfm,no,no,,
vfm_yw,VFM Wall Y,Motor,X06DA-ES-KBV:TRYW,baseline,vfm,no,no,,
vfm_ydr,VFM Downstream Ring Y,Motor,X06DA-ES-KBV:TRYDR,baseline,vfm,no,no,,
vfm_bu,VFM Upstream Bender,Motor,X06DA-ES-KBV:BNDU,baseline,vfm,no,no,,
vfm_bd,VFM Downstream Bender,Motor,X06DA-ES-KBV:BNDD,baseline,vfm,no,no,,
vfm_yaw,VFM Virtual Yaw,Motor,X06DA-ES-KBV:YAW,baseline,vfm,no,no,,
vfm_roll,VFM Virtual Roll,Motor,X06DA-ES-KBV:ROLL,baseline,vfm,no,no,,
vfm_pitch,VFM Virtual Pitch,Motor,X06DA-ES-KBV:PITCH,baseline,vfm,no,no,,
vfm_x,VFM Virtual X,Motor,X06DA-ES-KBV:TRX,baseline,vfm,no,no,,
vfm_y,VFM Virtual Y ,Motor,X06DA-ES-KBV:TRY,baseline,vfm,no,no,,
hfm_xu,HFM Upstream X,Motor,X06DA-ES-KBH:TRXU,baseline,hfm,no,no,,
hfm_xd,HFM Downstream X,Motor,X06DA-ES-KBH:TRXD,baseline,hfm,no,no,,
hfm_yuw,HFM Upstream Wall Y,Motor,X06DA-ES-KBH:TRYUW,baseline,hfm,no,no,,
hfm_yr,HFM Ring Y,Motor,X06DA-ES-KBH:TRYR,baseline,hfm,no,no,,
hfm_ydw,HFM Downstream Wall Y,Motor,X06DA-ES-KBH:TRYDW,baseline,hfm,no,no,,
hfm_bu,HFM Upstream Bender,Motor,X06DA-ES-KBH:BNDU,baseline,hfm,no,no,,
hfm_bd,HFM Downstream Bender,Motor,X06DA-ES-KBH:BNDD,baseline,hfm,no,no,,
hfm_yaw,HFM Virtual Yaw,Motor,X06DA-ES-KBH:YAW,baseline,hfm,no,no,,
hfm_roll,HFM Virtual Roll,Motor,X06DA-ES-KBH:ROLL,baseline,hfm,no,no,,
hfm_pitch,HFM Virtual Pitch,Motor,X06DA-ES-KBH:PITCH,baseline,hfm,no,no,,
hfm_x,HFM Virtual X,Motor,X06DA-ES-KBH:TRX,baseline,hfm,no,no,,
hfm_y,HFM Virtual Y ,Motor,X06DA-ES-KBH:TRY,baseline,hfm,no,no,,
bcu_bpm1,BCU BPM Signal 1 ,SignalRO,X06DA-ES-BCBPM:Current1:MeanValue_RBV,monitored,bpm,yes,no,,
bcu_bpm2,BCU BPM Signal 2,SignalRO,X06DA-ES-BCBPM:Current2:MeanValue_RBV,monitored,bpm,yes,no,,
bcu_bpm3,BCU BPM Signal 3,SignalRO,X06DA-ES-BCBPM:Current3:MeanValue_RBV,monitored,bpm,yes,no,,
bcu_bpm4,BCU BPM Signal 4,SignalRO,X06DA-ES-BCBPM:Current4:MeanValue_RBV,monitored,bpm,yes,no,,
bcu_bpmsum,BCU BPM Summed,SignalRO,X06DA-ES-BCBPM:SumAll:MeanValue_RBV,monitored,bpm,yes,no,,
bcu_bpm_x,BCU BPM X,Motor,X06DA-ES-BCBPM:TRX,baseline,bcu,no,no,,
bcu_bpm_y,BCU BPM Y ,Motor,X06DA-ES-BCBPM:TRY,baseline,bcu,no,no,,
bcu_sl_xw,BCU slit wall,Motor,X06DA-ES-BCSLH:TRXW,baseline,bcu,no,no,,
bcu_sl_xr,BCU slit ring,Motor,X06DA-ES-BCSLH:TRXR,baseline,bcu,no,no,,
bcu_sl_xcen,BCU slit X centre,Motor,X06DA-ES-BCSLH:CENTER,baseline,bcu,no,no,,
bcu_sl_xsize,BCU slit X size,Motor,X06DA-ES-BCSLH:SIZEX,baseline,bcu,no,no,,
bcu_sl_yt,BCU slit top,Motor,X06DA-ES-BCSLV:TRYT,baseline,bcu,no,no,,
bcu_sl_yb,BCU slit bottom,Motor,X06DA-ES-BCSLV:TRYB,baseline,bcu,no,no,,
bcu_sl_ycen,BCU slit Y centre,Motor,X06DA-ES-BCSLV:CENTER,baseline,bcu,no,no,,
bcu_sl_ysize,BCU slit Y size,Motor,X06DA-ES-BCSLV:SIZE,baseline,bcu,no,no,,
bcu_f1_x,BCU filter 1 X,Motor,X06DA-ES-BCFI1:TRX,baseline,bcu,no,no,,
bcu_f2_x,BCU filter 2 X,Motor,X06DA-ES-BCFI2:TRX,baseline,bcu,no,no,,
bcu_f3_x,BCU filter 3 X,Motor,X06DA-ES-BCFI3:TRX,baseline,bcu,no,no,,
bcu_f4_x,BCU filter 4 X,Motor,X06DA-ES-BCFI4:TRX,baseline,bcu,no,no,,
xrf_pos,XRF det in/out,Signal,X06DA-ES-XRF:POS-SET,baseline,se,no,yes,"{""type"":positioner}",
samcam_x,sample cam X ,SignalRO,X06DA-ES-MS:Stats5:CentroidX_RBV,baseline,scam,yes,yes,,
samcam_xsig,sample cam X sigma,SignalRO,X06DA-ES-MS:Stats5:SigmaX_RBV,monitored,scam,yes,yes,,
samcam_y,sample cam Y ,SignalRO,X06DA-ES-MS:Stats5:CentroidY_RBV,baseline,scam,yes,yes,,
samcam_ysig,sample cam Y sigma,SignalRO,X06DA-ES-MS:Stats5:SigmaY_RBV,monitored,scam,yes,yes,,
samcam_max,sample cam max value,SignalRO,X06DA-ES-MS:Stats5:MaxValue_RBV,monitored,scam,yes,yes,,
samcam_exp,sample cam exp time,Signal,X06DA-ES-MS:cam1:AcquireTime,baseline,scam,no,yes,,
samcam_gain,sample cam gain,Signal,X06DA-ES-MS:cam1:Gain,baseline,scam,no,yes,,
scam_zoom,Sample cam zoom,Motor,X06DA-ES-MS:ZOOM,baseline,scam,no,yes,,
fl_bright,Frontlight brightness,Signal,X06DA-ES-FL:SET,baseline,se,no,yes,,
coll_x,Collimator X,Motor,X06DA-ES-COL:TRX,baseline,se,no,yes,,
coll_y,Collimator Y,Motor,X06DA-ES-COL:TRY,baseline,se,no,yes,"{""type"": multi-position, ""in"": 41.5, ""out"": 20.0, ""park"": 0,""tol"":0.05}",
diag_y,Scintillator/diode Y,Motor,X06DA-ES-SCL:TRY,baseline,se,no,yes,"{""type"": multi-position, ""scint"": 38.62, ""i1"": 44.0, ""out"": 20.0,""park"": 0,""tol"":0.3}",
diag_z,Scintillator/diode Z,Motor,X06DA-ES-SCL:TRZ,baseline,se,no,yes,,
i1,i1 diode reading,SignalRO,X06DA-ES-SCLDI:READOUT,monitored,bpm,yes,yes,,
bl_pos,Backlight positioner,Signal,X06DA-ES-BL:POS-SET,baseline,se,no,yes,"{""type"":positioner}",
bl_bright,Backlight brightness,Signal,X06DA-ES-BL:SET,baseline,se,no,yes,,
bs_x,Beamstop X,Motor,X06DA-ES-BS:TRX,baseline,se,no,yes,,
bs_y,Beamstop Y,Motor,X06DA-ES-BS:TRY,baseline,se,no,yes,,
bs_z,Beamstop Z,Motor,X06DA-ES-BS:TRZ,baseline,se,no,yes,"{""type"": guarded, ""min"": 13, ""samp"": 15, ""work_min"": 20, ""safe"": 41, ""max_blin"": 42, ""max_blout"": 70}",
bs_pos,Beamstop positioner,Signal,X06DA-ES-BS:POS-SET,baseline,se,no,yes,"{""type"":positioner}",
gon_x,Goniometer X,Motor,X06DA-ES-DF1:TRX1,baseline,det,no,yes,"{""type"": guarded, ""in"": 18.0, ""out"": -10.0, ""safe"": -100,""tol"":0.5}",
gon_y,Goniometer Y,Motor,X06DA-ES-DF1:TRY1,baseline,det,no,yes,,
gon_z,Goniometer X,Motor,X06DA-ES-DF1:TRZ1,baseline,det,no,yes,,
omega,Omega,Motor,X06DA-ES-DF1:ROTU,baseline,det,no,yes,,
cryo_pos,Cryo positioner,Signal,X06DA-ES-CS:POS-SET,baseline,se,no,yes,"{""type"":positioner}",
cryo_x,Cryojet X ,Motor,X06DA-ES-CS:TRX,baseline,se,no,yes,,
det_cov,Detector cover,Signal,X06DA-ES-DETCOV:SET,baseline,det,no,yes,"{""type"":positioner}",
det_y,Detector Y,Motor,X06DA-ES-DET:TRY,baseline,det,no,yes,,
det_z,Detector Z,Motor,X06DA-ES-DET:TRZ,baseline,det,no,yes,,
gonpos,Sample sensor distance,SignalRO,X06DA-ES-DF1:CBOX-USER1,baseline,se,no,yes,,
gonvalid,Sample in valid distance,SignalRO,X06DA-ES-DF1:CBOX-CMP1,baseline,se,no,yes,,
1 name description deviceClass PV readoutPriority tag readOnly include userParameter
2 sls_current SLS current SignalRO ARS07-DPCT-0100:CURR monitored SLS yes yes
3 fe_sl_xr FE Slit X Ring Motor X06DA-FE-SLDI:TRXR baseline fe no yes
4 fe_sl_yt FE Slit Y top Motor X06DA-FE-SLDI:TRYT baseline fe no yes
5 fe_sl_xw FE Slit X Wall Motor X06DA-FE-SLDI:TRXW baseline fe no yes
6 fe_sl_yb FE SlitY Bottom Motor X06DA-FE-SLDI:TRYB baseline fe no yes
7 fe_sl_xcen FE Slit X Centre Motor X06DA-FE-SLDI:CENTERX baseline fe no yes
8 fe_sl_xsize FE Slit X Size Motor X06DA-FE-SLDI:SIZEX baseline fe no yes
9 fe_sl_ycen FE Slit Y Centre Motor X06DA-FE-SLDI:CENTERY baseline fe no yes
10 fe_sl_ysize FE Slit Y Size Motor X06DA-FE-SLDI:SIZEY baseline fe no yes
11 fe_cm_xu FE Coll Mirror Upstream X Motor X06DA-ES-MI1:TRXU baseline fe_cm no yes
12 fe_cm_xd FE Coll Mirror Downstream X Motor X06DA-ES-MI1:TRXD baseline fe_cm no yes
13 fe_cm_yur FE Coll Mirror Upstream Ring Y Motor X06DA-ES-MI1:TRYUR baseline fe_cm no yes
14 fe_cm_yw FE Coll Mirror Wall Y Motor X06DA-ES-MI1:TRYW baseline fe_cm no yes
15 fe_cm_ydr FE Coll Mirror Downstream Ring Y Motor X06DA-ES-MI1:TRYDR baseline fe_cm no yes
16 fe_cm_b1 FE Coll Mirror Bender Motor X06DA-ES-MI1:BND1 baseline fe_cm no yes
17 fe_cm_yaw FE Coll Mirror Yaw Motor X06DA-ES-MI1:YAW baseline fe_cm no yes
18 fe_cm_roll FE Coll Mirror Roll Motor X06DA-ES-MI1:ROLL baseline fe_cm no yes
19 fe_cm_pitch FE Coll Mirror Pitch Motor X06DA-ES-MI1:PITCH baseline fe_cm no yes
20 fe_cm_x FE Coll Mirror X Motor X06DA-ES-MI1:TRX baseline fe_cm no yes
21 fe_cm_y FE Coll Mirror Y Motor X06DA-ES-MI1:TRY baseline fe_cm no yes
22 bsf_bpm1 BSF BPM Signal 1 SignalRO X06DA-OP-BSFBPM:SIGNAL1 monitored bpm yes no
23 bsf_bpm2 BSF BPM Signal 2 SignalRO X06DA-OP-BSFBPM:SIGNAL2 monitored bpm yes no
24 bsf_bpm3 BSF BPM Signal 3 SignalRO X06DA-OP-BSFBPM:SIGNAL3 monitored bpm yes no
25 bsf_bpm4 BSF BPM Signal 4 SignalRO X06DA-OP-BSFBPM:SIGNAL4 monitored bpm yes no
26 bsf_bpmsum BSF BPM Summed SignalRO X06DA-OP-BSFBPM:SUM monitored bpm yes no
27 bsf_sl_xw BSF slit outboard Motor X06DA-OP-BSFSLH:TRXW baseline bsf no yes
28 bsf_sl_xr BSF slit inboard Motor X06DA-OP-BSFSLH:TRXR baseline bsf no yes
29 bsf_sl_yt BSF slit top Motor X06DA-OP-BSFSLV:TRYT baseline bsf no yes
30 bsf_sl_yb BSF slit bottom Motor X06DA-OP-BSFSLV:TRYB baseline bsf no yes
31 bsf_sl_xcen BSF X centre Motor X06DA-OP-BSFSLH:CENTER baseline bsf no yes
32 bsf_sl_xsize BSF X size Motor X06DA-OP-BSFSLH:SIZE baseline bsf no yes
33 bsf_sl_ycen BSF Y centre Motor X06DA-OP-BSFSLV:CENTER baseline bsf no yes
34 bsf_sl_ysize BSF Y size Motor X06DA-OP-BSFSLV:SIZE baseline bsf no yes
35 bsf_f1_y BSF Filter 1 Y Motor X06DA-OP-BSFFI1:TRY baseline bsf no yes
36 bsf_f2_y BSF Filter 2 Y Motor X06DA-OP-BSFFI2:TRY baseline bsf no yes
37 dccm_theta1 DCCM theta1 Motor X06DA-OP-DCCM:ROTX-CR1 baseline dccm no yes
38 dccm_theta2 DCCM theta2 Motor X06DA-OP-DCCM:ROTX-CR2 baseline dccm no yes
39 dccm_rotz DCCM Crystal 2 rotz Motor X06DA-OP-DCCM:ROTZ-CR2 baseline dccm no yes
40 dccm_energy DCCM energy Motor X06DA-OP-DCCM:ENERGY baseline dccm no yes
41 dccm_diode_t Top diode between mono crystals SignalRO X06DA-OP-XPM1:TOP:READOUT baseline dccm no yes
42 dccm_diode_b Bottom diode between mono crystals SignalRO X06DA-OP-XPM1:BOT:READOUT baseline dccm no yes
43 dccm_xbpm1 XBPM after mono ch1 SignalRO X06DA-OP-XBPM1:Current1:MeanValue_RBV baseline dccm no yes
44 dccm_xbpm2 XBPM after mono ch2 SignalRO X06DA-OP-XBPM1:Current2:MeanValue_RBV baseline dccm no yes
45 dccm_xbpm3 XBPM after mono ch3 SignalRO X06DA-OP-XBPM1:Current3:MeanValue_RBV baseline dccm no yes
46 dccm_xbpm4 XBPM after mono ch4 SignalRO X06DA-OP-XBPM1:Current4:MeanValue_RBV baseline dccm no yes
47 dccm_xbpmsum XBPM after mono summed SignalRO X06DA-OP-XBPM1:SumAll:MeanValue_RBV baseline dccm no yes
48 ss_bpm1 SS BPM Signal 1 SignalRO X06DA-ES-SSBPM:Current1:MeanValue_RBV monitored bpm yes yes
49 ss_bpm2 SS BPM Signal 2 SignalRO X06DA-ES-SSBPM:Current2:MeanValue_RBV monitored bpm yes yes
50 ss_bpm3 SS BPM Signal 3 SignalRO X06DA-ES-SSBPM:Current3:MeanValue_RBV monitored bpm yes yes
51 ss_bpm4 SS BPM Signal 4 SignalRO X06DA-ES-SSBPM:Current4:MeanValue_RBV monitored bpm yes yes
52 ss_bpmsum SS BPM Summed SignalRO X06DA-ES-SSBPM:SumAll:MeanValue_RBV monitored bpm yes yes
53 ss_bpm_x SS BPM X Motor X06DA-ES-SSBPM:TRX baseline ss no yes
54 ss_bpm_y SS BPM Y Motor X06DA-ES-SSBPM:TRY baseline ss no yes
55 ss_sl_xw SS slit wall Motor X06DA-ES-SSSLH:TRXW baseline ss no yes
56 ss_sl_xr SS slit ring Motor X06DA-ES-SSSLH:TRXR baseline ss no yes
57 ss_sl_xcen SS slit X centre Motor X06DA-ES-SSSLH:CENTER baseline ss no yes
58 ss_sl_xsize SS slit X size Motor X06DA-ES-SSSLH:SIZE baseline ss no yes
59 ss_sl_yt SS slit top Motor X06DA-ES-SSSLV:TRYT baseline ss no yes
60 ss_sl_yb SS slit bottom Motor X06DA-ES-SSSLV:TRYB baseline ss no yes
61 ss_sl_ycen SS slit Y centre Motor X06DA-ES-SSSLV:CENTER baseline ss no yes
62 ss_sl_ysize SS slit Y size Motor X06DA-ES-SSSLV:SIZE baseline ss no yes
63 ss_xi_x SS X-ray eye X Motor X06DA-ES-SSXI:TRX baseline ss no yes
64 ss_xi_y SS X-ray eye Y Motor X06DA-ES-SSXI:TRY baseline ss no yes
65 ss_xicam_x ss cam X SignalRO X06DA-ES-SSXI:cam1:Stats5:CentroidX_RBV baseline ss yes yes
66 ss_xicam_y ss cam Y SignalRO X06DA-ES-SSXI:cam1:Stats5:CentroidY_RBV baseline ss yes yes
67 ss_xicam_max ss cam max value SignalRO X06DA-ES-SSXI:cam1:Stats5:MaxValue_RBV monitored ss yes yes
68 ss_xicam_exp ss camera exposure Signal X06DA-ES-SSXI:cam1:AcquireTime baseline ss no yes
69 ss_xicam_gain ss camera gain Signal X06DA-ES-SSXI:cam1:cam1:Gain baseline ss no yes
70 ss_xicam_xsig ss camera x sigma Signal X06DA-ES-SSXI:cam1:Stats5:SigmaX_RBV baseline ss yes yes
71 ss_xicam_ysig ss camera y sigma Signal X06DA-ES-SSXI:cam1:Stats5:SigmaY_RBV baseline ss yes yes
72 vfm_xu VFM Upstream X Motor X06DA-ES-KBV:TRXU baseline vfm no no
73 vfm_xd VFM Downstream X Motor X06DA-ES-KBV:TRXD baseline vfm no no
74 vfm_yur VFM Upstream Ring Y Motor X06DA-ES-KBV:TRYUR baseline vfm no no
75 vfm_yw VFM Wall Y Motor X06DA-ES-KBV:TRYW baseline vfm no no
76 vfm_ydr VFM Downstream Ring Y Motor X06DA-ES-KBV:TRYDR baseline vfm no no
77 vfm_bu VFM Upstream Bender Motor X06DA-ES-KBV:BNDU baseline vfm no no
78 vfm_bd VFM Downstream Bender Motor X06DA-ES-KBV:BNDD baseline vfm no no
79 vfm_yaw VFM Virtual Yaw Motor X06DA-ES-KBV:YAW baseline vfm no no
80 vfm_roll VFM Virtual Roll Motor X06DA-ES-KBV:ROLL baseline vfm no no
81 vfm_pitch VFM Virtual Pitch Motor X06DA-ES-KBV:PITCH baseline vfm no no
82 vfm_x VFM Virtual X Motor X06DA-ES-KBV:TRX baseline vfm no no
83 vfm_y VFM Virtual Y Motor X06DA-ES-KBV:TRY baseline vfm no no
84 hfm_xu HFM Upstream X Motor X06DA-ES-KBH:TRXU baseline hfm no no
85 hfm_xd HFM Downstream X Motor X06DA-ES-KBH:TRXD baseline hfm no no
86 hfm_yuw HFM Upstream Wall Y Motor X06DA-ES-KBH:TRYUW baseline hfm no no
87 hfm_yr HFM Ring Y Motor X06DA-ES-KBH:TRYR baseline hfm no no
88 hfm_ydw HFM Downstream Wall Y Motor X06DA-ES-KBH:TRYDW baseline hfm no no
89 hfm_bu HFM Upstream Bender Motor X06DA-ES-KBH:BNDU baseline hfm no no
90 hfm_bd HFM Downstream Bender Motor X06DA-ES-KBH:BNDD baseline hfm no no
91 hfm_yaw HFM Virtual Yaw Motor X06DA-ES-KBH:YAW baseline hfm no no
92 hfm_roll HFM Virtual Roll Motor X06DA-ES-KBH:ROLL baseline hfm no no
93 hfm_pitch HFM Virtual Pitch Motor X06DA-ES-KBH:PITCH baseline hfm no no
94 hfm_x HFM Virtual X Motor X06DA-ES-KBH:TRX baseline hfm no no
95 hfm_y HFM Virtual Y Motor X06DA-ES-KBH:TRY baseline hfm no no
96 bcu_bpm1 BCU BPM Signal 1 SignalRO X06DA-ES-BCBPM:Current1:MeanValue_RBV monitored bpm yes no
97 bcu_bpm2 BCU BPM Signal 2 SignalRO X06DA-ES-BCBPM:Current2:MeanValue_RBV monitored bpm yes no
98 bcu_bpm3 BCU BPM Signal 3 SignalRO X06DA-ES-BCBPM:Current3:MeanValue_RBV monitored bpm yes no
99 bcu_bpm4 BCU BPM Signal 4 SignalRO X06DA-ES-BCBPM:Current4:MeanValue_RBV monitored bpm yes no
100 bcu_bpmsum BCU BPM Summed SignalRO X06DA-ES-BCBPM:SumAll:MeanValue_RBV monitored bpm yes no
101 bcu_bpm_x BCU BPM X Motor X06DA-ES-BCBPM:TRX baseline bcu no no
102 bcu_bpm_y BCU BPM Y Motor X06DA-ES-BCBPM:TRY baseline bcu no no
103 bcu_sl_xw BCU slit wall Motor X06DA-ES-BCSLH:TRXW baseline bcu no no
104 bcu_sl_xr BCU slit ring Motor X06DA-ES-BCSLH:TRXR baseline bcu no no
105 bcu_sl_xcen BCU slit X centre Motor X06DA-ES-BCSLH:CENTER baseline bcu no no
106 bcu_sl_xsize BCU slit X size Motor X06DA-ES-BCSLH:SIZEX baseline bcu no no
107 bcu_sl_yt BCU slit top Motor X06DA-ES-BCSLV:TRYT baseline bcu no no
108 bcu_sl_yb BCU slit bottom Motor X06DA-ES-BCSLV:TRYB baseline bcu no no
109 bcu_sl_ycen BCU slit Y centre Motor X06DA-ES-BCSLV:CENTER baseline bcu no no
110 bcu_sl_ysize BCU slit Y size Motor X06DA-ES-BCSLV:SIZE baseline bcu no no
111 bcu_f1_x BCU filter 1 X Motor X06DA-ES-BCFI1:TRX baseline bcu no no
112 bcu_f2_x BCU filter 2 X Motor X06DA-ES-BCFI2:TRX baseline bcu no no
113 bcu_f3_x BCU filter 3 X Motor X06DA-ES-BCFI3:TRX baseline bcu no no
114 bcu_f4_x BCU filter 4 X Motor X06DA-ES-BCFI4:TRX baseline bcu no no
115 xrf_pos XRF det in/out Signal X06DA-ES-XRF:POS-SET baseline se no yes {"type":positioner}
116 samcam_x sample cam X SignalRO X06DA-ES-MS:Stats5:CentroidX_RBV baseline scam yes yes
117 samcam_xsig sample cam X sigma SignalRO X06DA-ES-MS:Stats5:SigmaX_RBV monitored scam yes yes
118 samcam_y sample cam Y SignalRO X06DA-ES-MS:Stats5:CentroidY_RBV baseline scam yes yes
119 samcam_ysig sample cam Y sigma SignalRO X06DA-ES-MS:Stats5:SigmaY_RBV monitored scam yes yes
120 samcam_max sample cam max value SignalRO X06DA-ES-MS:Stats5:MaxValue_RBV monitored scam yes yes
121 samcam_exp sample cam exp time Signal X06DA-ES-MS:cam1:AcquireTime baseline scam no yes
122 samcam_gain sample cam gain Signal X06DA-ES-MS:cam1:Gain baseline scam no yes
123 scam_zoom Sample cam zoom Motor X06DA-ES-MS:ZOOM baseline scam no yes
124 fl_bright Frontlight brightness Signal X06DA-ES-FL:SET baseline se no yes
125 coll_x Collimator X Motor X06DA-ES-COL:TRX baseline se no yes
126 coll_y Collimator Y Motor X06DA-ES-COL:TRY baseline se no yes {"type": multi-position, "in": 41.5, "out": 20.0, "park": 0,"tol":0.05}
127 diag_y Scintillator/diode Y Motor X06DA-ES-SCL:TRY baseline se no yes {"type": multi-position, "scint": 38.62, "i1": 44.0, "out": 20.0,"park": 0,"tol":0.3}
128 diag_z Scintillator/diode Z Motor X06DA-ES-SCL:TRZ baseline se no yes
129 i1 i1 diode reading SignalRO X06DA-ES-SCLDI:READOUT monitored bpm yes yes
130 bl_pos Backlight positioner Signal X06DA-ES-BL:POS-SET baseline se no yes {"type":positioner}
131 bl_bright Backlight brightness Signal X06DA-ES-BL:SET baseline se no yes
132 bs_x Beamstop X Motor X06DA-ES-BS:TRX baseline se no yes
133 bs_y Beamstop Y Motor X06DA-ES-BS:TRY baseline se no yes
134 bs_z Beamstop Z Motor X06DA-ES-BS:TRZ baseline se no yes {"type": guarded, "min": 13, "samp": 15, "work_min": 20, "safe": 41, "max_blin": 42, "max_blout": 70}
135 bs_pos Beamstop positioner Signal X06DA-ES-BS:POS-SET baseline se no yes {"type":positioner}
136 gon_x Goniometer X Motor X06DA-ES-DF1:TRX1 baseline det no yes {"type": guarded, "in": 18.0, "out": -10.0, "safe": -100,"tol":0.5}
137 gon_y Goniometer Y Motor X06DA-ES-DF1:TRY1 baseline det no yes
138 gon_z Goniometer X Motor X06DA-ES-DF1:TRZ1 baseline det no yes
139 omega Omega Motor X06DA-ES-DF1:ROTU baseline det no yes
140 cryo_pos Cryo positioner Signal X06DA-ES-CS:POS-SET baseline se no yes {"type":positioner}
141 cryo_x Cryojet X Motor X06DA-ES-CS:TRX baseline se no yes
142 det_cov Detector cover Signal X06DA-ES-DETCOV:SET baseline det no yes {"type":positioner}
143 det_y Detector Y Motor X06DA-ES-DET:TRY baseline det no yes
144 det_z Detector Z Motor X06DA-ES-DET:TRZ baseline det no yes
145 gonpos Sample sensor distance SignalRO X06DA-ES-DF1:CBOX-USER1 baseline se no yes
146 gonvalid Sample in valid distance SignalRO X06DA-ES-DF1:CBOX-CMP1 baseline se no yes
+206
View File
@@ -0,0 +1,206 @@
ss_sl_xw:
description: SS slit wall
deviceClass: ophyd.EpicsMotor
deviceConfig: {prefix: 'X10SA-ES-SSSLH:TRXW'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- ss
readOnly: False
softwareTrigger: false
userParameter:
type: continuous
in: 1.0
out: 2.0
bs_z:
description: Beamstop Z
deviceClass: ophyd.EpicsMotor
deviceConfig: {prefix: 'X10SA-ES-BS:TRZ'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: continuous
min: 13
samp: 15
work_min: 20
safe: 41
max_blin: 42
max_blout: 70
gon_x:
description: Goniometer X
deviceClass: ophyd.EpicsMotor
deviceConfig: {prefix: 'X10SA-ES-DF1:TRX1'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- det
readOnly: False
softwareTrigger: false
userParameter:
type: continuous
in: 0.0
out: -10.0
safe: -100
tol: 0.5
diag_y:
description: Scintillator/diode Y
deviceClass: ophyd.EpicsMotor
deviceConfig: {prefix: 'X10SA-ES-SCL:TRY'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: continuous
scint: 38.62
i1: 44.0
out: 20.0
park: 1
tol: 0.3
coll_y:
description: Collimator Y
deviceClass: ophyd.EpicsMotor
deviceConfig: {prefix: 'X10SA-ES-COL:TRY'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: continuous
in: 41.5
intermediate: 32
out: 20.0
park: 1
tol: 0.05
bs_pos:
description: Beamstop positioner
deviceClass: ophyd.EpicsSignal
deviceConfig: {read_pv: 'X10SA-ES-BS:POS-SET', auto_monitor: true}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: discrete
in: 1.0
out: 0.0
xrf_pos:
description: XRF positioner
deviceClass: ophyd.EpicsSignal
deviceConfig: {read_pv: 'X10SA-ES-XRF:POS-SET', auto_monitor: true}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: discrete
in: 1.0
out: 0.0
cryo_pos:
description: Cryo positioner
deviceClass: ophyd.EpicsSignal
deviceConfig: {read_pv: 'X10SA-ES-CS:POS-SET', auto_monitor: true}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: discrete
in: 1.0
out: 0.0
det_cov:
description: Detector cover
deviceClass: ophyd.EpicsSignal
deviceConfig: {read_pv: 'X10SA-ES-DETCOV:SET', auto_monitor: true}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- det
readOnly: False
softwareTrigger: false
userParameter:
type: discrete
'open': 2.0
'close': 1.0
bl_bright:
description: Backlight brightness
deviceClass: ophyd.EpicsSignal
deviceConfig: {read_pv: 'X10SA-ES-BL:SET', auto_monitor: true}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: continuous
'on': 1.3
'off': 0.0
'tol': 0.01
bl_pos:
description: Backlight positioner
deviceClass: ophyd.EpicsSignal
deviceConfig: {read_pv: 'X10SA-ES-BL:POS-SET', auto_monitor: true}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: discrete
in: 1.0
out: 0.0
fl_bright:
description: Frontlight brightness
deviceClass: ophyd.EpicsSignal
deviceConfig: {read_pv: 'X10SA-ES-FL:SET', auto_monitor: true}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: False
softwareTrigger: false
userParameter:
type: continuous
'on': 3.0
'off': 0.0
@@ -0,0 +1,12 @@
smargon:
description: REST-based device which connects to Smargopolo
deviceClass: pxii_bec.devices.smargopolo_smargon.Smargon
deviceConfig: {prefix: 'http://localhost:8000'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- smargon
- motors
readOnly: false
softwareTrigger: false
@@ -1,5 +1,7 @@
base_config:
- !include ./pxii-autogenerated.yaml
- !include ./pxii-devices-new.yaml
sample_env:
- !include ./se_devices.yaml
id_gap:
readoutPriority: baseline
description: undulator gap
@@ -10,39 +12,6 @@ id_gap:
enabled: true
readOnly: false
softwareTrigger: false
coll_x:
description: Collimator X
deviceClass: ophyd.EpicsMotor
deviceConfig: {prefix: 'X10SA-ES-COL:TRX'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- se
readOnly: false
softwareTrigger: false
dcm_fpitch:
description: DCM 2nd crystal fine pitch
deviceClass: ophyd.EpicsMotor
deviceConfig: {prefix: 'X10SA-OP-DCM:PITCH-C2'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- dcm
readOnly: false
softwareTrigger: false
dcm_froll:
description: DCM 2nd crystal fine roll
deviceClass: ophyd.EpicsMotor
deviceConfig: {prefix: 'X10SA-OP-DCM:ROLL-C2'}
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- dcm
readOnly: false
softwareTrigger: false
smargon:
description: REST-based device which connects to Smargopolo
@@ -56,16 +25,3 @@ smargon:
- motors
readOnly: false
softwareTrigger: false
aerotech:
description: REST-based device which connects to AareScan
deviceClass: pxii_bec.devices.aerotech
deviceConfig: { prefix: "http://mx-x10sa-queue-01:5234/" }
onFailure: buffer
enabled: True
readoutPriority: baseline
deviceTags:
- aerotech
- motors
readOnly: false
softwareTrigger: false
+127 -143
View File
@@ -45,12 +45,7 @@ def a2e(a, *hkl):
if "deg" in hkl:
ideg = 1
d0 = (
2
* 5.43102
* (1 - 2.4e-4 * iln)
/ np.sqrt(h[0] ** 2.0 + h[1] ** 2.0 + h[2] ** 2.0)
)
d0 = 2 * 5.43102 * (1 - 2.4e-4 * iln) / np.sqrt(h[0] ** 2.0 + h[1] ** 2.0 + h[2] ** 2.0)
if ideg or (a > 1):
a = math.radians(a) # *math.pi/180.
@@ -91,12 +86,7 @@ def angle(e, *hkl):
if "deg" in hkl:
ideg = 1
d0 = (
2
* 5.43102
* (1 - 2.4e-4 * iln)
/ np.sqrt(h[0] ** 2.0 + h[1] ** 2.0 + h[2] ** 2.0)
)
d0 = 2 * 5.43102 * (1 - 2.4e-4 * iln) / np.sqrt(h[0] ** 2.0 + h[1] ** 2.0 + h[2] ** 2.0)
a = math.asin(12.39842 / d0 / e)
if ideg:
@@ -149,7 +139,7 @@ def rock(**kwargs):
import matplotlib.pyplot as plt
dock_area = bec.gui.new()
wr = dock_area.new(bec.gui.available_widgets.Waveform)
wr = dock_area.new().new(bec.gui.available_widgets.Waveform)
# width of rocking curve of perfect xtal: at 20 keV: 14 urad == 0.0008 deg
@@ -206,7 +196,7 @@ def rock(**kwargs):
s = scans.line_scan(mot, -dx, dx, steps=50, exp_time=time, relative=True)
# md = scan.metadata["bec"]
wr.title = f"RockingScan at Energy of {e}"
wr.plot(device_x=mot.name, device_y=det.name) ##set names/axes first !
wr.plot(x_name=mot.name, y_name=det.name) ##set names/axes first !
wr.x_label = mot.name
wr.y_label = det.name
if ax == 0:
@@ -263,13 +253,7 @@ def justfit(data_x, data_y, model="gauss", ibg=0):
gfit, xmax = justfit(data_x, data_y, model = "lorentz", ibg =0) : Lorentzian, no BG
"""
from lmfit.models import (
LinearModel,
GaussianModel,
VoigtModel,
QuadraticModel,
LorentzianModel,
)
from lmfit.models import LinearModel, GaussianModel, VoigtModel, QuadraticModel, LorentzianModel
import matplotlib.pyplot as plt
peak = GaussianModel()
@@ -338,20 +322,12 @@ def fit_plothist(hindex: int, signal_name: str, model="gauss", ibg=0):
"""
from lmfit.models import (
LinearModel,
GaussianModel,
VoigtModel,
QuadraticModel,
LorentzianModel,
)
from lmfit.models import LinearModel, GaussianModel, VoigtModel, QuadraticModel, LorentzianModel
import matplotlib.pyplot as plt
h = bec.history[hindex]
md = h.metadata["bec"]
scanvar = list(md["args"].keys())[
0
] # string, returns the variable of the last performed scan
scanvar = list(md["args"].keys())[0] # string, returns the variable of the last performed scan
# data = h.devices[device_name][signal].read()["value"]
# data_x = h.devices.dcm_pitch.dcm_pitch.read()["value"]
# data_y = h.devices.lu_bpmsum.lu_bpmsum.read()["value"]
@@ -442,9 +418,9 @@ def fit_plot(data_x, data_y, model="gauss", ibg=1, fitrange=0, fitclick=0):
sigma = 1.0
gamma = 0.2 # blurring/widening of the sigma ; the larger, the more of a Lorentzian profile
print("maxy, indmax, xm = ", maxy, indmax, xm)
#p = model.make_params(
# p = model.make_params(
# amplitude=max(data_y), center=xm, slope=0, intercept=min(data_y)
#)
# )
p = model.make_params(amplitude=maxy, center=xm)
p["center"].set(min=min(data_x), max=max(data_x))
p["sigma"].set(min=0, max=(max(data_x) - min(data_x)) / 2.0)
@@ -541,7 +517,7 @@ def save_data(hindex: int, device_name: str, signal_name: str):
ans = "n"
ans = input("Store data in csv file? y/n ")
if ans == "y":
dirname = "/home/gac-x10sa/Data/"
dirname = "/sls/x10sa/config/commissioning/Data/"
# writing output to simple data file for later analysis:
combined = np.column_stack((data_x, data_y))
filename = dirname + "Scan" + str(hindex) + device_name + ".txt"
@@ -552,7 +528,7 @@ def save_data(hindex: int, device_name: str, signal_name: str):
#########################################
### just retried the saved data from csv
### just retrieve the saved data from csv
########################################
def read_data(filename: str):
"""
@@ -560,6 +536,7 @@ def read_data(filename: str):
Args:
filename (str): the csv file, eg, of a Scan
e.g., dat = read_data("/home/e18747/SLS2/Data/gaps/gaps10.txt")
"""
# dirname = '/home/gac-x10sa/Data/'
@@ -572,6 +549,8 @@ def read_data(filename: str):
print("No of Rows =", rows)
print("No of Colums =", cols)
ind1 = 0
ind2 = 1
if cols > 2:
print(
"only first 2 colums (data[:, 0] and data[:, 1]) are plotted, please consider the other columns as well!"
@@ -645,7 +624,7 @@ def save_plot_gaps(hindex: int, device_name: str, signal_name: str):
plt.show()
dirname = "/home/gac-x10sa/Data/"
dirname = "/sls/x10sa/config/commissioning/Data/"
# writing output to simple data file for later analysis:
combined = np.column_stack((en_vec, data_y))
filename = dirname + "EnScan" + str(hindex) + ".txt"
@@ -668,8 +647,9 @@ def getdiodepos(diode="i1"):
"""
diode_in = 1
dpos = 44 # mm
measdev = dev.scin_y
dpos = dev.diag_y.user_parameter["i1"] # 44 # mm
measdev = dev.diag_y
diodepos_rb = measdev.user_readback.get()
if abs(dpos - diodepos_rb) > 0.1:
print("Diode not in, please move")
@@ -679,7 +659,7 @@ def getdiodepos(diode="i1"):
detpos_diode = 214.5
detpos_rb = dev.det_z.user_readback.get()
print("using Det diode requires det up and close and beamstop out")
if abs(detpos - detpos_rb) > 0.5:
if abs(detpos_diode - detpos_rb) > 0.5:
print("Diode not in, please move Det up")
diode_in = 0 # sys.exit(0)
@@ -692,7 +672,7 @@ def read_mon():
e = getenergy()
fesum = dev.fe_bpmsum.read()["fe_bpmsum"]["value"]
lusum = dev.lu_bpmsum.read()["lu_bpmsum"]["value"]
bscsum = dev.bsc_bpmsum.read()["bsc_bpmsum"]["value"]
sssum = dev.ss_bpmsum.read()["ss_bpmsum"]["value"]
# Mono
bragg = dev.dcm_bragg.read()["dcm_bragg"]["value"]
@@ -727,24 +707,24 @@ def read_mon():
fe_sy_size = dev.fe_sysize.read()["fe_sysize"]["value"]
## BSF slits centre and size
s1_xcen = dev.s1_xcen.read()["s1_xcen"]["value"]
s1_xsize = dev.s1_xsize.read()["s1_xsize"]["value"]
s1_ycen = dev.s1_ycen.read()["s1_ycen"]["value"]
s1_ysize = dev.s1_ysize.read()["s1_ysize"]["value"]
bsf_xcen = dev.bsf_sl_xcen.read()["bsf_sl_xcen"]["value"]
bsf_xsize = dev.bsf_sl_xsize.read()["bsf_sl_xsize"]["value"]
bsf_ycen = dev.bsf_sl_ycen.read()["bsf_sl_ycen"]["value"]
bsf_ysize = dev.bsf_sl_ysize.read()["bsf_sl_ysize"]["value"]
## BSC slits centre and size
s2_xcen = dev.s2_xcen.read()["s2_xcen"]["value"]
s2_xsize = dev.s2_xsize.read()["s2_xsize"]["value"]
s2_ycen = dev.s2_ycen.read()["s2_ycen"]["value"]
s2_ysize = dev.s2_ysize.read()["s2_ysize"]["value"]
## SS slits centre and size
ss_sl_xcen = dev.ss_sl_xcen.read()["ss_sl_xcen"]["value"]
ss_sl_xsize = dev.ss_sl_xsize.read()["ss_sl_xsize"]["value"]
ss_sl_ycen = dev.ss_sl_ycen.read()["ss_sl_ycen"]["value"]
ss_sl_ysize = dev.ss_sl_ysize.read()["ss_sl_ysize"]["value"]
## BCU slits centre and size
s3_xcen = dev.s3_xcen.read()["s3_xcen"]["value"]
s3_xsize = dev.s3_xsize.read()["s3_xsize"]["value"]
s3_ycen = dev.s3_ycen.read()["s3_ycen"]["value"]
s3_ysize = dev.s3_ysize.read()["s3_ysize"]["value"]
bcu_sl_xcen = dev.bcu_sl_xcen.read()["bcu_sl_xcen"]["value"]
bcu_sl_xsize = dev.bcu_sl_xsize.read()["bcu_sl_xsize"]["value"]
bcu_sl_ycen = dev.bcu_sl_ycen.read()["bcu_sl_ycen"]["value"]
bcu_sl_ysize = dev.bcu_sl_ysize.read()["bcu_sl_ysize"]["value"]
## move in screen in BSC chamber and get size and position
## move in screen in SS chamber and get size and position
## move out again
# umv(dev.samcam_xmot, 1)
@@ -767,12 +747,10 @@ def read_mon():
bcusum = dev.bcu_bpmsum.read()["bcu_bpmsum"]["value"]
i1signal = dev.i1.read()["i1"]["value"]
print("Energy = ", e, " keV")
print(f"fesum,lusum,bscsum,bcusum,i1signal = {fesum,lusum,bscsum,bcusum,i1signal}")
print(f"fesum,lusum,sssum,bcusum,i1signal = {fesum,lusum,sssum,bcusum,i1signal}")
print(
f"bragg, pitch, perp, fpitch, froll, gap = {bragg, pitch,perp, fpitch, froll, gap}"
)
# return e, fesum,lusum,bscsum,bcusum,i1signal
print(f"bragg, pitch, perp, fpitch, froll, gap = {bragg, pitch,perp, fpitch, froll, gap}")
# return e, fesum,lusum,sssum,bcusum,i1signal
print("KB VERT")
print(
f"vbu, vbd, vbpitch,vbyaw,vbroll,vblat,vbvert = {vbu, vbd, vbpitch,vbyaw,vbroll,vblat,vbvert}"
@@ -786,7 +764,7 @@ def read_mon():
## dump status in CSV
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
dirname = "/home/gac-x10sa/Data/"
dirname = "/sls/x10sa/config/commissioning/Data/"
filename = dirname + f"BLstatus_{timestamp}.txt"
with open(filename, "w") as f:
combined = np.column_stack((e, gap))
@@ -810,19 +788,19 @@ def read_mon():
np.savetxt(f, combined, delimiter=",", fmt="%5f")
f.write("BSF slits\n")
combined = np.column_stack((s1_xcen, s1_xsize, s1_ycen, s1_ysize))
combined = np.column_stack((bsf_sl_xcen, bsf_sl_xsize, bsf_sl_ycen, bsf_sl_ysize))
np.savetxt(f, combined, delimiter=",", fmt="%5f")
f.write("BSC slits\n")
combined = np.column_stack((s2_xcen, s2_xsize, s2_ycen, s2_ysize))
f.write("SS slits\n")
combined = np.column_stack((ss_sl_xcen, ss_sl_xsize, ss_sl_ycen, ss_sl_ysize))
np.savetxt(f, combined, delimiter=",", fmt="%5f")
f.write("BCU slits\n")
combined = np.column_stack((s3_xcen, s3_xsize, s3_ycen, s3_ysize))
combined = np.column_stack((bcu_sl_xcen, bcu_sl_xsize, bcu_sl_ycen, bcu_sl_ysize))
np.savetxt(f, combined, delimiter=",", fmt="%5f")
f.write("fesum,lusum,bscsum,bcusum,i1signal\n")
combined = np.column_stack((fesum, lusum, bscsum, bcusum, i1signal))
f.write("fesum,lusum,sssum,bcusum,i1signal\n")
combined = np.column_stack((fesum, lusum, sssum, bcusum, i1signal))
np.savetxt(f, combined, delimiter=",", fmt="%5f")
return
@@ -840,33 +818,23 @@ def longscan():
umv(dev.id_gap, 4.5)
time.sleep(0.2)
s = scans.line_scan(
dev.dcm_bragg, 406.5, 65.9, steps=1500, exp_time=0.05, relative=False
)
s = scans.line_scan(dev.dcm_bragg, 406.5, 65.9, steps=1500, exp_time=0.05, relative=False)
time.sleep(2)
umv(dev.id_gap, 5.0)
time.sleep(0.2)
s = scans.line_scan(
dev.dcm_bragg, 65.9, 406.5, steps=1500, exp_time=0.05, relative=False
)
s = scans.line_scan(dev.dcm_bragg, 65.9, 406.5, steps=1500, exp_time=0.05, relative=False)
time.sleep(2)
umv(dev.id_gap, 5.5)
time.sleep(0.2)
s = scans.line_scan(
dev.dcm_bragg, 406.5, 65.9, steps=1500, exp_time=0.05, relative=False
)
s = scans.line_scan(dev.dcm_bragg, 406.5, 65.9, steps=1500, exp_time=0.05, relative=False)
time.sleep(2)
umv(dev.id_gap, 6.0)
time.sleep(0.2)
s = scans.line_scan(
dev.dcm_bragg, 65.9, 406.5, steps=1500, exp_time=0.05, relative=False
)
s = scans.line_scan(dev.dcm_bragg, 65.9, 406.5, steps=1500, exp_time=0.05, relative=False)
time.sleep(2)
umv(dev.id_gap, 6.5)
time.sleep(0.2)
s = scans.line_scan(
dev.dcm_bragg, 406.5, 65.9, steps=1500, exp_time=0.05, relative=False
)
s = scans.line_scan(dev.dcm_bragg, 406.5, 65.9, steps=1500, exp_time=0.05, relative=False)
#####################
@@ -890,15 +858,15 @@ def colliscan(direction: str, range=0.3, nsteps=30, stime=0.5, centre=1):
import sys
dock_area = bec.gui.new()
wr = dock_area.new(bec.gui.available_widgets.Waveform)
wr = dock_area.new().new(bec.gui.available_widgets.Waveform)
# check if i1 DIODE is IN
# if not, aks to be moved
diodeinpos = 44 # mm
colli_up = 41 # mm
diodeinpos = dev.diag_y.user_parameter["i1"] # 44 # mm
colli_up = dev.coll_y.user_parameter["in"] # 41.5 # mm
measdev = dev.scin_y
measdev = dev.diag_y
diodepos_rb = measdev.user_readback.get()
if abs(diodeinpos - diodepos_rb) > 0.1:
print("Diode not in, please move")
@@ -999,32 +967,32 @@ def slitscan(device_location: str, direction: str, range: 1, nsteps=50, centre=0
default_h = 3.0 # 8125
default_v = 3.0 # ??? close more ???? # 8149.8
det = dev.lu_bpmsum
# det = dev.bsc_bpmsum or #det = dev.bcu_bpmsum would also work
# det = dev.ss_bpmsum or #det = dev.bcu_bpmsum would also work
if direction == "h":
mot = dev.s1_xcen
size = dev.s1_xsize
mot = dev.bsf_sl_xcen
size = dev.bsf_sl_xsize
s_closed = 0.1
s_open = default_h
else:
mot = dev.s1_ycen
size = dev.s1_ysize
mot = dev.bsf_sl_ycen
size = dev.bsf_sl_ysize
s_closed = 0.1
s_open = default_v
# BSC slits ================================
# SS slits ================================
if device_location in ["bsc", "s2", "ss"]:
if device_location in ["ss", "ss_sl", "ss"]:
default_h = 6.0 # ???
default_v = 5.0 # ??? close more ???? # 8149.8
det = dev.bcu_bpmsum
if direction == "h":
mot = dev.s2_xcen
size = dev.s2_xsize
mot = dev.ss_sl_xcen
size = dev.ss_sl_xsize
s_closed = 0.1
s_open = default_h
else:
mot = dev.s2_ycen
size = dev.s2_ysize
mot = dev.ss_sl_ycen
size = dev.ss_sl_ysize
s_closed = 0.1
s_open = default_v
@@ -1035,20 +1003,20 @@ def slitscan(device_location: str, direction: str, range: 1, nsteps=50, centre=0
default_v = 2.0 # ??? close more ???? # 8149.8
# change to i0 later ??
det = dev.i1
dposm = 43.8
dposm = dev.diag_y.user_parameter["i1"]
# dpos0 = dev.scin_y.user_readback.get()
# if abs(dposm - dpos0) > 1:
# print("moving diode i1 in")
# umv(dev.scin_y, dposm)
if direction == "h":
mot = dev.s3_xcen
size = dev.s3_xsize
mot = dev.bcu_sl_xcen
size = dev.bcu_sl_xsize
s_closed = 3.0 ## very large, else does not work !
s_open = default_h
else:
mot = dev.s3_ycen
size = dev.s3_ysize
mot = dev.bcu_sl_ycen
size = dev.bcu_sl_ysize
s_closed = 3.0 ## very large !
s_open = default_v
@@ -1064,14 +1032,14 @@ def slitscan(device_location: str, direction: str, range: 1, nsteps=50, centre=0
return
dock_area = bec.gui.new()
wr = dock_area.new(bec.gui.available_widgets.Waveform)
wr = dock_area.new().new(bec.gui.available_widgets.Waveform)
pos0 = mot.user_readback.get()
siz0 = size.user_readback.get()
umv(size, s_closed)
s = scans.line_scan(mot, -dx, dx, steps=nsteps, exp_time=time, relative=True)
wr.plot(device_x=mot.name, device_y=det.name)
wr.plot(x_name=mot.name, y_name=det.name)
wr.x_label = mot.name
wr.y_label = det.name
@@ -1088,25 +1056,25 @@ def slitscan(device_location: str, direction: str, range: 1, nsteps=50, centre=0
if mot.name == "fe_sycen":
data_x = s.scan.live_data.fe_sycen.fe_sycen.val
# BSF slits ================================
if mot.name == "s1_xcen":
data_x = s.scan.live_data.s1_xcen.s1_xcen.val
if mot.name == "s1_ycen":
data_x = s.scan.live_data.s1_ycen.s1_ycen.val
if mot.name == "bsf_sl_xcen":
data_x = s.scan.live_data.bsf_sl_xcen.bsf_sl_xcen.val
if mot.name == "bsf_ycen":
data_x = s.scan.live_data.bsf_sl_ycen.bsf_sl_ycen.val
# BSC slits ================================
if mot.name == "s2_xcen":
data_x = s.scan.live_data.s2_xcen.s2_xcen.val
# SS slits ================================
if mot.name == "ss_sl_xcen":
data_x = s.scan.live_data.ss_sl_xcen.ss_sl_xcen.val
data_y = s.scan.live_data.bcu_bpmsum.bcu_bpmsum.val
if mot.name == "s2_ycen":
data_x = s.scan.live_data.s2_ycen.s2_ycen.val
if mot.name == "ss_sl_ycen":
data_x = s.scan.live_data.ss_sl_ycen.ss_sl_ycen.val
data_y = s.scan.live_data.bcu_bpmsum.bcu_bpmsum.val
# BCU slits ================================
if mot.name == "s3_xcen":
data_x = s.scan.live_data.s3_xcen.s3_xcen.val
if mot.name == "bcu_sl_xcen":
data_x = s.scan.live_data.bcu_sl_xcen.bcu_sl_xcen.val
data_y = s.scan.live_data.i1.i1.val
if mot.name == "s3_ycen":
data_x = s.scan.live_data.s3_ycen.s3_ycen.val
if mot.name == "bcu_sl_ycen":
data_x = s.scan.live_data.bcu_sl_ycen.bcu_sl_ycen.val
data_y = s.scan.live_data.i1.i1.val
# change to i0 later ??
@@ -1161,9 +1129,7 @@ def kbfocus(sizex, sizey):
en = getenergy()
print(f"Energy is {en} keV")
print(
"Currently only 2 sizes supported, small approx.(2 x 2.7) and medium approx.(40 x 40)"
)
print("Currently only 2 sizes supported, small approx.(2 x 2.7) and medium approx.(40 x 40)")
## is the pitch ok ?
vpitch = 2.695
@@ -1261,11 +1227,9 @@ def bstatus():
#
dock_area = bec.gui.new()
dbrowser = dock_area.new(
bec.gui.available_widgets.DeviceBrowser, object_name="device_browser"
)
dbrowser = dock_area.new("device_browser").new(bec.gui.available_widgets.DeviceBrowser)
dock_area.new(bec.gui.available_widgets.BECQueue, object_name="queue")
dock_area.new("queue").new(bec.gui.available_widgets.BECQueue)
# queue = dock_area.queue.BECQueue # give it a name
# text_box = dock_area.new().new(widget=bec.gui.available_widgets.TextBox)
# text_box.set_plain_text("Hello, World!")
@@ -1307,15 +1271,15 @@ def detxeye_in():
print("moving X-ray eye below Eiger in")
xrpos = dev.xeye2_x.user_readback.get()
xrpos = dev.det_xi_x.user_readback.get()
if abs(setxrpos - xrpos) > 1:
umv(dev.xeye2_x, setxrpos)
zoompos = dev.xeye2_zoom.user_readback.get()
umv(dev.det_xi_x, setxrpos)
zoompos = dev.det_xi_zoom.user_readback.get()
if abs(setzoom - zoompos) > 1:
umv(dev.xeye2_zoom, setzoom)
focpos = dev.xeye2_focus.user_readback.get()
umv(dev.det_xi_zoom, setzoom)
focpos = dev.det_xi_focus.user_readback.get()
if abs(setfoc - focpos) > 1:
umv(dev.xeye2_focus, setfoc)
umv(dev.det_xi_focus, setfoc)
def detxeye_out():
@@ -1337,7 +1301,7 @@ def detxeye_out():
def measure_samcam(zoom=1000):
scinti_inpos = 38.6 # mm
sc_rb = dev.scin_y.user_readback.get()
sc_rb = dev.diag_y.user_readback.get()
if abs(scinti_inpos - sc_rb) > 0.3:
print("Scinti not in, please move")
sys.exit(0)
@@ -1352,20 +1316,20 @@ def measure_samcam(zoom=1000):
return sx, sy
def measure_bsccam():
x_inpos = 7 # mm
def measure_sscam():
x_inpos = dev.ss_xi_x.user_parameter["in"] # 7 # mm
px2mum = 20
scpos_rb = dev.xeye_x.user_readback.get()
scpos_rb = dev.ss_xi_x.user_readback.get()
if abs(x_inpos - scpos_rb) > 0.3:
print("Scinti not in, please move")
sys.exit(0)
auto_exposure(cam="bsccam", target=200)
a = dev.bsccam_xsig.read()["bsccam_xsig"]["value"]
b = dev.bsccam_ysig.read()["bsccam_ysig"]["value"]
auto_exposure(cam="sscam", target=200)
a = dev.ss_xicam_xsig.read()["ss_xicam_xsig"]["value"]
b = dev.ss_xicam_ysig.read()["ss_xicam_ysig"]["value"]
sx = a * px2mum * 2.35
sy = b * px2mum * 2.35
print(f"FWHM at BSC cam in um : {sx, sy}")
print(f"FWHM at SS cam in um : {sx, sy}")
return sx, sy
@@ -1381,9 +1345,7 @@ def knife_edge(dir="hor", range=0.05, steps=100):
if dir == "vert":
mot = dev.gon_y
s = scans.line_scan(
dev.gon_x, -range, range, steps=steps, exp_time=1, relative=True
)
s = scans.line_scan(dev.gon_x, -range, range, steps=steps, exp_time=1, relative=True)
return
@@ -1472,9 +1434,7 @@ def scan_eg(erange, nsteps=50, fit=True):
print(f"Scanning Bragg from {a_start} to {a_end} mrad")
s = scans.line_scan(
mot_scan, a_start, a_end, steps=nsteps, exp_time=exptime, relative=False
)
s = scans.line_scan(mot_scan, a_start, a_end, steps=nsteps, exp_time=exptime, relative=False)
## plot and fit the scan
bragg_data = (
@@ -1520,3 +1480,27 @@ def scan_eg(erange, nsteps=50, fit=True):
### compute a signal
###########################
# see in config file
################################################
### open window/doch for long gap scan
################################################
#
### Note: all deprecated !!!!
def scan_window(wname="Scan", fit=True):
dock_area = bec.gui.new()
# Add a new dock with a Waveform to the BECDockArea
nam = "waveform_dock_"+wname
dock_area.new(name=nam, widget="Waveform")
# dock_area.panels
# dock_area.panel_list
plt1 = dock_area.panels[nam]
# Add signals to the WaveformWidget
plt1.plot(device_x='id_gap', device_y='bpm')
dock2 = dock_area.new(name="motor_dock", widget="MotorMap",relative_to=nam, position="right")
###do stuff
### if done, remove
dock2.remove()
+51 -56
View File
@@ -10,12 +10,9 @@ from scipy.optimize import curve_fit
from scipy.ndimage import gaussian_filter1d
def fit_harm(harm, n, order):
x = harm[0, :].astype(float)
y = harm[1, :].astype(
float
) ## else funny object that might contain funny strings ...
y = harm[1, :].astype(float) ## else funny object that might contain funny strings ...
coeff = np.polyfit(x, y, order) # 3 in general i.e., 4 params
polynomial = np.poly1d(coeff)
x_fit = np.linspace(min(x), max(x), 100)
@@ -23,30 +20,27 @@ def fit_harm(harm, n, order):
print("Polynomial coefficients of the harmonic: ", n, coeff)
plot(x_fit, y_fit, color="blue")
return (
x / n,
y,
) # get the normalized energy gap relation for fitting the Halbach coeff
return (x / n, y) # get the normalized energy gap relation for fitting the Halbach coeff
######### simple exp fit ############
def exponential_func0(x, a, b, c):
# fit 3 params a,b,c
return a * np.exp(b * x + c * x ** 2)
return a * np.exp(b * x + c * x**2)
######### inverse exp fit ############
def exponential_func1(x, a, b, c):
# fit 3 params a,b,c
return 1 / (1 + (a * np.exp(b * x + c * x ** 2)))
return 1 / (1 + (a * np.exp(b * x + c * x**2)))
######### inverse exp fit plus E_max ############
def exponential_func2(x, a, b, c, d):
# fit 4 params a,b,c, e.g., fit energy of storage ring as well
return d / (1 + (a * np.exp(b * x + c * x ** 2)))
return d / (1 + (a * np.exp(b * x + c * x**2)))
##################################
@@ -79,36 +73,38 @@ def return_harmon():
return h
def plot_harmon(e_start, e_end, h_no, pr_out = False):
enarr= np.arange(e_start, e_end+1, 0.5)
def plot_harmon(e_start, e_end, h_no, pr_out=False):
enarr = np.arange(e_start, e_end + 1, 0.5)
h_all = return_harmon()
h=h_all[h_no]
h = h_all[h_no]
polynomial = np.poly1d(h)
gaps = polynomial(enarr)
if (pr_out):
print("en =", enarr )
print("gaps =", gaps )
if pr_out:
print("en =", enarr)
print("gaps =", gaps)
plt.ion()
plt.figure()
plt.plot(enarr,gaps,'*')
plt.plot(enarr, gaps, "*")
plt.title(f"harmonic no {h_no}")
plt.xlabel("E / keV")
plt.ylabel("Gap / mm")
plt.show()
def setu19(en, *harm_no, detune=0):
"""
set the U19 to the gaps defined in Jul2025, or the "theoretical" ones for higher
harmonics
USAGE:
setu19(en, *harm_no, detune=0)
en in keV, possibly select a special harmonics, or detune [0/1] to a value
with a nicer beam shape but less flux
en in keV, possibly select a special harmonics, or detune [0/1] to a value
with a nicer beam shape but less flux
"""
g0 = dev.id_gap.readback.get()
@@ -168,30 +164,31 @@ def setu19(en, *harm_no, detune=0):
print("Moving Undulator gap to ", g, " mm")
else:
print("not a valid gap, do nothing")
if detune:
g =g *0.996
g = g * 0.996
print("moving to detuned gap value, slightly below max, about 0.15 % ")
#print("move disabled!!")
res = scans.umv(dev.id_gap, g, relative=False)
# print("move disabled!!")
res = scans.umv(dev.id_gap, g, relative=False)
return
##################################
def harmon_walk(estart=7.5, end_en=13):
import time
en = estart
ans ='y'
while en < end_en+0.5 and ans == 'y':
print(en)
ans = "y"
while en < end_en + 0.5 and ans == "y":
print(en)
setu19(en, 5)
time.sleep(2)
sete(en)
en = en+0.5
sete(en)
en = en + 0.5
ans = input("Next energy? y/n: ")
##################################
def gap_harm(e=12.4):
fitpar_u19 = np.array([2.17078531, 0.519452, -0.00720255])
@@ -217,7 +214,7 @@ def long_gscan(estart=7, end_en=20.5, g_low=4.5, g_high=9.0, nsteps=1500):
import time
import numpy as np
dirname = "/home/gac-x10sa/Data/"
dirname = "/sls/x10sa/config/commissioning/Data/"
print(
f"scanning the U19 gap from {estart} keV to {end_en} keV, for a gapsize from {g_low} to {g_high}"
@@ -225,29 +222,30 @@ def long_gscan(estart=7, end_en=20.5, g_low=4.5, g_high=9.0, nsteps=1500):
resol = (g_high - g_low) / nsteps
print(f"nsteps = {nsteps}; resolution is {resol} mm")
dock_area = bec.gui.new("LongGapScan")
wr = dock_area.new(bec.gui.available_widgets.Waveform)
wr = dock_area.new().new(bec.gui.available_widgets.Waveform)
mot = dev.id_gap
det = dev.lu_bpmsum
wr.plot(device_x=mot.name, device_y=det.name) ## names first !
wr.plot(x_name=mot.name, y_name=det.name) ## names first !
wr.x_label = mot.name
wr.y_label = det.name
g0 = dev.id_gap.readback.get()
### parameters
# g_low = 4.5 # 4.5
# g_high = 9.0 # 9.0
# nsteps = 1500 # res = 3 um
## now: probably do from 5 keV to ?? 30 keV ???
en = estart
while en < end_en:
sete(en)
time.sleep(1)
time.sleep(0.2)
rock()
print(f"setting energy to {en}")
time.sleep(2)
ds = scans.line_scan(
dev.id_gap, g_low, g_high, steps=nsteps, exp_time=0.8, relative=False
)
time.sleep(0.2)
ds = scans.line_scan(dev.id_gap, g_low, g_high, steps=nsteps, exp_time=0.1, relative=False)
gap_data = ds.scan.live_data.id_gap.id_gap.val
bpm_data = ds.scan.live_data.lu_bpmsum.lu_bpmsum.val
wr.plot(x=gap_data, y=bpm_data)
@@ -270,30 +268,28 @@ def gscan(centre=0, gomax=0, detune=0):
gscan(centre=1): go to centre of fit max
gscan(centre=1, gomax=1): go to max of intensity
gscan(centre=1,detune=1): position of slightly less flux with nicer beam shape
"""
"""
import time
dock_area = bec.gui.new()
wr = dock_area.new(bec.gui.available_widgets.Waveform)
wr = dock_area.new().new(bec.gui.available_widgets.Waveform)
mot = dev.id_gap
det = dev.lu_bpmsum
wr.plot(device_x=mot.name, device_y=det.name) ## names first !
wr.plot(x_name=mot.name, y_name=det.name) ## names first !
# wr.plot(x=mot.name,y=det.name) ### this comes later
wr.x_label = mot.name
wr.y_label = det.name
g0 = dev.id_gap.readback.get()
deltag = 0.05
ds = scans.line_scan(
dev.id_gap, -deltag, deltag, steps=30, exp_time=0.5, relative=True
)
ds = scans.line_scan(dev.id_gap, -deltag, deltag, steps=30, exp_time=0.5, relative=True)
gap_data = ds.scan.live_data.id_gap.id_gap.val
bpm_data = ds.scan.live_data.lu_bpmsum.lu_bpmsum.val
#maxy = max(bpm_data)
#indmax = np.argmax(bpm_data)
#gm = gap_data[indmax]
# maxy = max(bpm_data)
# indmax = np.argmax(bpm_data)
# gm = gap_data[indmax]
gcen, xm = fit_plot(gap_data, bpm_data, model="gauss")
@@ -304,16 +300,15 @@ def gscan(centre=0, gomax=0, detune=0):
print("gap off by ", g0 - gm, " mm")
if detune:
gm=gm*0.996
gm = gm * 0.996
print("moving to detuned gap value, slightly (0.15 %) below max")
if centre:
time.sleep(0.2)
if min(gap_data) <= gm <= max(gap_data):
if min(gap_data) <= gm <= max(gap_data):
scans.umv(dev.id_gap, gm, relative=False)
print("moving to ", gm, " mm")
else:
print("Fit too far off, try using option gomax=1")
return
return
+24
View File
@@ -0,0 +1,24 @@
""" "Initialises the sample environment devices, guards,
dependencies and planner"""
# import yaml
# from devices import build_devices
# from guards import attach_guards
# from policies import attach_policies
def init_se_devices():
"""Initialises the sample environment devices"""
directory = "/sls/x10sa/config/bec/production/pxii_bec/pxii_bec/device_configs/"
# directory = "./"
filename = "se_devices.yaml"
file = directory + filename
print(f"Loading devices from {file}")
se_devices = build_devices(file)
attach_guards(se_devices)
attach_policies(se_devices)
return se_devices
+167
View File
@@ -0,0 +1,167 @@
"""Set up the positioned devices"""
from dataclasses import dataclass, field
from typing import Callable, List, Dict, Optional, Union
import yaml
@dataclass
class PositionDevice:
"""Generic device that moves between named or numeric positions"""
bec_name: str
positions: Dict[str, float] = field(default_factory=dict)
tol: float = 0.1
guards: List[Callable[[], None]] = field(default_factory=list)
policy: Optional[Callable[[float], None]] = None
# line below defines if the device is permitted to move to any arbitrary position or not
allow_arbitrary: bool = False
def __post_init__(self):
# Use this for BEC
self.mot = getattr(dev, self.bec_name)
# Use this for testing
# self.mot = self.MockMotor()
# Normalize position names
self.positions = {k.lower(): v for k, v in self.positions.items()}
# -------------------------
# internal helpers
# -------------------------
def _check_guards(self):
for g in self.guards:
g()
def _resolve_target(self, target: Union[str, float]) -> float:
"""Convert target into a motor position"""
if isinstance(target, str):
name = target.lower()
if name not in self.positions:
raise ValueError(f"Unknown position '{target}'")
return self.positions[name]
if isinstance(target, (float, int)):
if not self.allow_arbitrary:
raise ValueError(f"{self.bec_name} only accepts named positions")
return float(target)
raise TypeError("Target must be str or float")
# -------------------------
# motion
# -------------------------
def move(self, target: Union[str, float]):
"""Unified move interface"""
pos = self._resolve_target(target)
self._check_guards()
if self.policy:
self.policy(pos)
# Use for testing
# self.mot.move(pos)
# Use in BEC
scans.umv(self.mot, pos, relative=False)
# s = scans.mv(self.mot, pos, relative=False)
# s.wait(timeout=5)
# def set_position(self, target: Union[str, float]):
# """Only to be used for testing purposes"""
# pos = self._resolve_target(target)
# self.mot.move(pos)
# -------------------------
# readback
# -------------------------
@property
def actual(self) -> float:
"""Return the actual position of the device."""
return self.mot.read()[self.bec_name]["value"]
# return self.mot.position
@property
def pos(self) -> str:
"""Return the closest matching position"""
for name, pos in self.positions.items():
if abs(self.actual - pos) <= self.tol:
return name
return "unknown"
def is_at(self, position: str) -> bool:
"""Return True if the device is at the given position."""
position = position.lower()
if position not in self.positions:
raise ValueError(f"Unknown position '{position}'")
return abs(self.actual - self.positions[position]) <= self.tol
# -------------------------
# Mock Motor Implementation
# -------------------------
class MockMotor:
"""Mock implementation of MotorLike for testing and initialization."""
def __init__(self):
self.position = 0.0
def move(self, value: float):
"""Move the motor to the given position."""
self.position = value
def read(self):
"""Read the current position of the motor."""
return {"value": self.position}
def build_devices(yaml_file):
"""Takes the defined positions from the device yaml file
and adds them to the PositionDevice class.
"""
# discrete_devs = []
# continuous_devs = []
se_devices = {}
with open(yaml_file, encoding="utf-8") as f:
data = yaml.safe_load(f)
for bec_name, cfg in data.items():
# Skip devices without userParameter
user = cfg.get("userParameter")
if not user:
continue
tol = user.get("tol", 0.1)
positions = {k: v for k, v in user.items() if k not in ("type", "tol")}
if user["type"] == "discrete":
dev = PositionDevice(bec_name, positions, tol=tol, allow_arbitrary=False)
# discrete_devs.append(bec_name)
se_devices[bec_name] = dev
elif user["type"] == "continuous":
dev = PositionDevice(bec_name, positions, tol=tol, allow_arbitrary=True)
# continuous_devs.append(bec_name)
se_devices[bec_name] = dev
# print(f"Discrete devices: {discrete_devs}")
# print(f"Continuous: {continuous_devs}")
return se_devices
+49
View File
@@ -0,0 +1,49 @@
#### find out about a certain class --
#### retrieve the struct of dictionaries
# if you know the attribute you are searching for:
def check_attr(obj, attr):
# att as string
attr = getattr(obj, attr)
if isinstance(attr, dict):
print("keys:", attr.keys())
print("values:", attr.values())
print("items:", attr.items())
# Automatically Detect All Dictionary Attributes:
def list_dict_attr_single(obj):
for attr_name, value in vars(obj).items():
if isinstance(value, dict):
print(f"\nDictionary attribute: {attr_name}")
print(" Keys:", list(value.keys()))
print(" Items:")
for key, val in value.items():
print(f" {key} -> {val}")
# Also Handle Nested Dictionaries:
def list_dict_attr(obj):
def print_dict(d, indent=0): # start with zero indentation
for key, value in d.items():
print(" " * indent + str(key) + ":", end=" ")
if isinstance(value, dict):
print()
print_dict(value, indent+1)
else:
print(value)
for attr_name, value in vars(obj).items():
if isinstance(value, dict):
print(f"\nDictionary attribute: {attr_name}")
print_dict(value)
+95
View File
@@ -0,0 +1,95 @@
"""Setup guards for devices."""
class GuardViolation(Exception):
"""Raised when a guarded move is not allowed."""
class AtPositionGuard:
"""Guard that checks if a device is in a specific position."""
def __init__(self, device, position):
self.device = device
self.pos = position
def check(self):
"""Check if the device is in the specified position."""
if self.device.pos != self.pos:
raise GuardViolation(
f"{self.device.bec_name} must be in the '{self.pos}' position"
)
# print("move allowed")
return True
def requirement(self):
"""Return the requirement for the guard."""
return (self.device.bec_name, self.pos)
class MinMaxGuard:
"""Guard that checks if a device is within a specific range."""
def __init__(self, device, limit_value, direction):
self.device = device
self.limit_value = limit_value
self.direction = direction # direction: 'max' or 'min'
def check(self):
"""Check if the device is within the specified range."""
if self.direction == "less_than":
if not (self.device.actual - self.device.tol) <= self.limit_value:
raise GuardViolation(
f"{self.device.bec_name} must be less than or equal to {self.limit_value} mm"
)
elif self.direction == "more_than":
if not (self.device.actual + self.device.tol) >= self.limit_value:
raise GuardViolation(
f"{self.device.bec_name} must be greater than or equal to {self.limit_value} mm"
)
else:
raise ValueError(
f"Invalid direction '{self.direction}'. Use 'less_than' or 'more_than'."
)
# print("move allowed")
return True
def requirement(self):
"""Return the requirement for the guard."""
# planner cannot handle numeric constraints directly
# return None -> planner ignores
return None
def guards_setup(d):
"""Define guards for devices."""
guards = {}
guards["bs_safe"] = AtPositionGuard(d["bs_z"], position="safe")
guards["bs_max_blin"] = MinMaxGuard(
d["bs_z"], direction="less_than", limit_value=d["bs_z"].positions["max_blin"]
)
guards["bs_work_min"] = MinMaxGuard(
d["bs_z"], direction="more_than", limit_value=d["bs_z"].positions["work_min"]
)
guards["bs_pos_in"] = AtPositionGuard(d["bs_pos"], position="in")
guards["gonx_out"] = MinMaxGuard(
d["gon_x"], direction="less_than", limit_value=d["gon_x"].positions["out"]
)
guards["gonx_safe"] = AtPositionGuard(d["gon_x"], position="safe")
guards["diag_y_out"] = MinMaxGuard(
d["diag_y"], direction="less_than", limit_value=d["diag_y"].positions["out"]
)
guards["coll_y_out"] = MinMaxGuard(
d["coll_y"], direction="less_than", limit_value=d["coll_y"].positions["out"]
)
return guards
def attach_guards(d):
"""Attach guards to devices."""
g = guards_setup(d)
d["diag_y"].guards.append(g["bs_work_min"].check)
d["bl_pos"].guards.append(g["bs_max_blin"].check)
d["bs_pos"].guards.append(g["bs_safe"].check)
d["bs_z"].guards.append(g["bs_pos_in"].check)
d["coll_y"].guards.append(g["bs_work_min"].check)
+51 -24
View File
@@ -1,14 +1,23 @@
"""Get data from an h5 file or BEC history and perform fitting."""
import numpy as np
from lmfit.models import GaussianModel, LorentzianModel, VoigtModel, ConstantModel, LinearModel
from lmfit.models import (
GaussianModel,
LorentzianModel,
VoigtModel,
ConstantModel,
LinearModel,
)
from scipy.ndimage import gaussian_filter1d
import h5py
import matplotlib.pyplot as plt
def create_fit_parameters(
deriv: bool = False, model: str = "Voigt", baseline: str = "Linear", smoothing: None = None
deriv: bool = False,
model: str = "Voigt",
baseline: str = "Linear",
smoothing: None = None,
):
"""Store the fit parameters in a dictionary."""
# map input model to lmfit model name
@@ -45,7 +54,10 @@ def get_data_from_h5(signal_name: str = "lu_bpmsum"):
}
def get_data_from_history(history_index: int, signal_name: str = "lu_bpmsum"):
def get_data_from_history(
history_index: int,
signal_name: str = "lu_bpmsum",
):
"""Read data from the BEC history and return the X and Y data as arrays."""
scan = bec.history[history_index]
md = scan.metadata["bec"]
@@ -84,7 +96,10 @@ def process_data(data, fit_params):
else:
fitting_data = y_data
updated_data = {"y_to_fit": fitting_data, "signal_name": signal_name}
updated_data = {
"y_to_fit": fitting_data,
"signal_name": signal_name,
}
data.update(updated_data)
return data
@@ -109,15 +124,23 @@ def fit(data, fit_params):
params["base_slope"].set(value=0)
# Add peak-specific parameters
params.update(peak_model.guess(processed_data["y_to_fit"], x=processed_data["x_data"]))
params.update(
peak_model.guess(processed_data["y_to_fit"], x=processed_data["x_data"])
)
# Perform the fitting
lmfit_result = full_model.fit(processed_data["y_to_fit"], params, x=processed_data["x_data"])
lmfit_result = full_model.fit(
processed_data["y_to_fit"], params, x=processed_data["x_data"]
)
# Find the X that gives the max Y
max_index = np.argmax(processed_data["y_to_fit"])
x_max = processed_data["x_data"][max_index]
# Generate data for a smoothed fit curve
fit_xdata = np.linspace(np.min(data["x_data"]), np.max(data["x_data"]), 500)
fit_ydata = lmfit_result.eval(x=fit_xdata, params=lmfit_result.params)
# Collect results
return {
"model": fit_params["model"].__name__,
@@ -127,20 +150,15 @@ def fit(data, fit_params):
"chi_sq": lmfit_result.chisqr,
"lmfit_result": lmfit_result,
"x_max": x_max,
"fit_xdata": fit_xdata,
"fit_ydata": fit_ydata,
}
def plot_fitted_data(data, fit_result):
"""Plot the original data and the fitted model."""
plt.plot(data["x_data"], data["y_to_fit"], label="Data")
plt.plot(
data["x_data"],
fit_result["lmfit_result"].best_fit,
"-",
label=f"FWHM = {fit_result['fwhm']:.3f},"
f"Centre = {fit_result['centre']:.3f}, "
f"Height = {fit_result['height']:.3f}",
)
plt.plot(fit_result['fit_xdata'], fit_result['fit_ydata'], label="Fit")
plt.xlabel(data["motor_name"])
plt.ylabel(data["signal_name"])
plt.title(f"Scan {data['scan_number']}, fitted with {fit_result['model']}")
@@ -154,17 +172,20 @@ def select_bec_window(dock_area_name="Fitting"):
open_docks = bec.gui.windows
if open_docks.get(dock_area_name) is None:
dock_area = bec.gui.new(dock_area_name)
wf = dock_area.new(bec.gui.available_widgets.Waveform, object_name="Plot")
text_box = dock_area.new(
bec.gui.available_widgets.TextBox, object_name="Results", where="bottom"
)
# wf = dock_area.new("Plot").new(bec.gui.available_widgets.Waveform)
wf = dock_area.new(widget='Waveform', object_name='Plot')
text_box = dock_area.new(widget='TextBox', object_name="Results", where="bottom")
else:
wf = bec.gui.Fitting.Plot.Waveform
text_box = bec.gui.Fitting.Results.TextBox
wf = bec.gui.Fitting.Plot
text_box = bec.gui.Fitting.Results
return wf, text_box
def plot_live_data_bec(motor_name, signal_name, window_name="Fitting"):
def plot_live_data_bec(
motor_name,
signal_name,
window_name="Fitting"
):
"""
Plotting live data for motor and signal using BEC.
@@ -189,7 +210,10 @@ def plot_live_data_bec(motor_name, signal_name, window_name="Fitting"):
wf.plot(device_x=motor_name, device_y=signal_name)
def plot_fitted_data_bec(data, fit_result):
def plot_fitted_data_bec(
data,
fit_result,
):
"""
Plot fitted data and display fitting parameters in the specified window.
@@ -221,5 +245,8 @@ def plot_fitted_data_bec(data, fit_result):
wf.title = f"Scan: {data['scan_number']}"
wf.x_label = data["motor_name"]
wf.y_label = data["signal_name"]
wf.plot(x=data["x_data"], y=data["y_to_fit"], label="data")
wf.plot(x=data["x_data"], y=fit_result["lmfit_result"].best_fit, label="Fit to data")
wf.plot(x=data["x_data"], y=data["y_to_fit"], label="Data")
wf.plot(x=fit_result["fit_xdata"], y=fit_result["fit_ydata"], label="Fit")
# wf.Fit.set(symbol_size = 0)
wf.get_curve('Fit').set(symbol_size=0)
+19 -61
View File
@@ -74,7 +74,7 @@ def move_to_position(motor_device, motor_name: str, position: float, data: dict)
scans.umv(motor_device, motor_centre, relative=False)
msg = (
f"Position {position: .2f} is outside the scan range of "
f"{motor_min: .2f}to {motor_max: .2f}. "
f"{motor_min: .2f} to {motor_max: .2f}. "
f"Returning to centre of scan range {motor_centre: .3f}."
)
raise ValueError(msg)
@@ -249,79 +249,42 @@ def scan_bpm(bpmname):
# Open a dock area and set up the heatmaps
dock_area = bec.gui.new("XBPM_Scan")
wf5 = dock_area.new(bec.gui.available_widgets.Heatmap, object_name="Sum")
wf1 = dock_area.new(
bec.gui.available_widgets.Heatmap,
object_name="Ch1",
relative_to="Sum",
where="bottom",
wf5 = dock_area.new("Sum").new(bec.gui.available_widgets.Heatmap)
wf1 = dock_area.new("Ch1", relative_to="Sum", position="bottom").new(
bec.gui.available_widgets.Heatmap
)
wf3 = dock_area.new(
bec.gui.available_widgets.Heatmap,
object_name="Ch3",
relative_to="Ch1",
where="right",
wf3 = dock_area.new("Ch3", relative_to="Ch1", position="right").new(
bec.gui.available_widgets.Heatmap
)
wf4 = dock_area.new(
bec.gui.available_widgets.Heatmap,
object_name="Ch4",
relative_to="Ch3",
where="bottom",
wf4 = dock_area.new("Ch4", relative_to="Ch3", position="bottom").new(
bec.gui.available_widgets.Heatmap
)
wf2 = dock_area.new(
bec.gui.available_widgets.Heatmap,
object_name="Ch2",
relative_to="Ch1",
where="bottom",
wf2 = dock_area.new("Ch2", relative_to="Ch1", position="bottom").new(
bec.gui.available_widgets.Heatmap
)
wfscan = dock_area.new(bec.gui.available_widgets.ScanControl, object_name="ScanControl")
wfscan = dock_area.new("ScanControl").new(bec.gui.available_widgets.ScanControl)
cfg = getattr(BPMScans, bpmname)
wf1.x_label = cfg["x_name"]
wf1.y_label = cfg["y_name"]
wf1.plot(
device_x=cfg["x_name"],
device_y=cfg["y_name"],
device_z=cfg["z1_name"],
color_map="plasma",
)
wf1.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z1_name"], color_map="plasma")
wf2.x_label = cfg["x_name"]
wf2.y_label = cfg["y_name"]
wf2.plot(
device_x=cfg["x_name"],
device_y=cfg["y_name"],
device_z=cfg["z2_name"],
color_map="plasma",
)
wf2.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z2_name"], color_map="plasma")
wf3.x_label = cfg["x_name"]
wf3.y_label = cfg["y_name"]
wf3.plot(
device_x=cfg["x_name"],
device_y=cfg["y_name"],
device_z=cfg["z3_name"],
color_map="plasma",
)
wf3.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z3_name"], color_map="plasma")
wf4.x_label = cfg["x_name"]
wf4.y_label = cfg["y_name"]
wf4.plot(
device_x=cfg["x_name"],
device_y=cfg["y_name"],
device_z=cfg["z4_name"],
color_map="plasma",
)
wf4.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z4_name"], color_map="plasma")
wf5.x_label = cfg["x_name"]
wf5.y_label = cfg["y_name"]
wf5.plot(
device_x=cfg["x_name"],
device_y=cfg["y_name"],
device_z=cfg["z5_name"],
color_map="plasma",
)
wf5.plot(x_name=cfg["x_name"], y_name=cfg["y_name"], z_name=cfg["z5_name"], color_map="plasma")
# Run the scan
x_mot = cfg["x_device"]
y_mot = cfg["y_device"]
@@ -341,20 +304,15 @@ def optimise_kb(mirror):
# Open a dock area and set up the heatmaps
dock_area = bec.gui.new(mirror)
wf1 = dock_area.new(bec.gui.available_widgets.Heatmap, object_name="Heatmap")
wf1 = dock_area.new("Heatmap").new(bec.gui.available_widgets.Heatmap)
wfscan = dock_area.new(bec.gui.available_widgets.ScanControl, object_name="ScanControl")
wfscan = dock_area.new("ScanControl").new(bec.gui.available_widgets.ScanControl)
cfg = getattr(MirrorConfig, mirror)
wf1.x_label = cfg["bu_name"]
wf1.y_label = cfg["bd_name"]
wf1.plot(
device_x=cfg["bu_name"],
device_y=cfg["bd_name"],
device_z=cfg["z_name"],
color_map="plasma",
)
wf1.plot(x_name=cfg["bu_name"], y_name=cfg["bd_name"], z_name=cfg["z_name"], color_map="plasma")
# Run the scan
x_mot = cfg["x_device"]
+244
View File
@@ -0,0 +1,244 @@
"""Planner to move between beamline states"""
from enum import Enum
import yaml
from collections import defaultdict, deque
class BeamlineState(str, Enum):
ROBOT_SAMPLE_EXCHANGE = "robot_sample_exchange"
SAMPLE_ALIGNMENT = "sample_alignment"
DATA_COLLECTION = "data_collection"
DC_XRF = "DC_XRF"
MANUAL_SAMPLE_EXCHANGE = "manual_sample_exchange"
BEAM_VISUALISATION = "beam_visualisation"
FLUX_MEASUREMENT = "flux_measurement"
BEAMSTOP_ALIGNMENT = "beamstop_alignment"
MAINTENANCE = "maintenance"
XTAL_SNAPSHOT = "xtal_snapshot"
class TemperatureMode(str, Enum):
CRYO = "cryo"
ROOM_TEMP = "room_temp"
def get_states():
"""Returns the states defined in beamline_states.yaml"""
directory = "/sls/x10sa/config/bec/production/pxii_bec/pxii_bec/device_configs/"
# directory = "./"
filename = "beamline_states.yaml"
file = directory + filename
with open(file, "r", encoding="utf-8") as f:
cfg = yaml.safe_load(f)
states = {}
allow_modifiers = {}
for name, config in cfg["states"].items():
state = BeamlineState(name)
allow_modifiers[state] = config.pop("allow_modifiers", False)
states[state] = config
return states, allow_modifiers
# cfg = yaml.safe_load(f)
# return {
# BeamlineState(name): config
# for name, config in cfg["states"].items()
# }
class StateManager:
"""Moves devices to the correct positions to achieve a given state"""
def __init__(self,
devices,
states: dict[BeamlineState, dict[str, str]],
allow_modifiers=None,
deps=None,
debug=False,
):
self.devices = devices
self.states = states
self.allow_modifiers = allow_modifiers or {}
self.deps = deps
self.debug = debug
self.modifiers = {
TemperatureMode.CRYO: {"cryo_pos": "in"},
TemperatureMode.ROOM_TEMP: {"cryo_pos": "out"},
}
def _merged_state(self, state, modifier):
target = dict(self.states[state])
if modifier:
if isinstance(modifier, str):
modifier = TemperatureMode(modifier)
if self.allow_modifiers.get(state, False):
target.update(self.modifiers[modifier])
return target
def move_to(self, state_name, modifier=None):
"""Move devices to the correct positions to achieve a given state"""
if isinstance(state_name, str):
state_name = BeamlineState(state_name)
target = self._merged_state(state_name, modifier)
plan = self._plan(target)
print("PLAN:")
for i, stage in enumerate(plan):
print(f"Stage {i + 1}: {stage}")
for stage in plan:
for dev, pos in stage:
d = self.devices[dev]
if not d.is_at(pos):
if self.debug:
print(f"→ Moving {dev} -> {pos}")
# print(" Before:", self.get_states())
try:
d.move(pos)
except Exception as e:
print(f"Exception occurred: {e}")
print(f"\nFAILED MOVE: {dev} -> {pos}")
print("States at failure:", self.get_positions())
raise
# if self.debug:
# print(" After :", self.get_states())
# if not d.is_at(pos):
# d.move(pos)
# def reset(self, state):
# """Reset all devices to the given state"""
# if isinstance(state, str):
# state = BeamlineState(state)
# for dev, pos in self.states[state].items():
# self.devices[dev].set_pos(pos)
def available_states(self):
"""Return a list of available states"""
return list(self.states.keys())
def get_positions(self):
"""Return current positions of all SE devices"""
return {name: dev.pos for name, dev in self.devices.items()}
def print_positions(self):
"""Return current state of all devices"""
for name, device in self.devices.items():
print(f"{name:10s} : {device.pos}")
def diff_states(self, before):
"""Return a dict of {device: (before, after)} pairs for devices that changed state"""
after = self.get_positions()
return {k: (before[k], after[k]) for k in before if before[k] != after[k]}
def current_state(self):
"""Return all current matching BeamlineState and TemperatureMode combinations,
prioritizing non-None modifiers first."""
matches = [] # Store all matching (state, modifier) pairs
ignore_keys = {"bl_bright", "fl_bright"}
for state in self.states:
# Start with prioritized modifiers: Non-None first, then None.
modifiers = list(self.modifiers.keys())
modifiers.append(None) # Add `None` as a fallback after real modifiers.
for modifier in modifiers:
# Combine state and modifier to get full configuration
config = self._merged_state(state, modifier)
# Check if all devices match their expected positions
if all(self.devices[d].is_at(p)
for d, p in config.items()
if d not in ignore_keys
):
# print(f"Current state: {state.name}, Modifier: {modifier.name if modifier else 'None'}")
matches.append((state.name, modifier.name if modifier else 'None'))
return matches if matches else None
def is_state(self, state, modifier=None):
"""Check if the current state matches the given state and modifier."""
actual = self.current_state()
if not actual:
return False
if modifier is None:
# match any modifier
return any(s == state.name for s, _ in actual)
return (state.name, modifier.name) in actual
def _plan(self, target):
graph = defaultdict(set)
indeg = defaultdict(int)
nodes = set()
for dev, pos in target.items():
node = (dev, pos)
nodes.add(node)
for dep in self.deps.get(node, []):
graph[dep].add(node)
indeg[node] += 1
nodes.add(dep)
q = deque(n for n in nodes if indeg[n] == 0)
stages = []
while q:
stage = list(q)
stages.append(stage)
q.clear()
for n in stage:
for m in graph[n]:
indeg[m] -= 1
if indeg[m] == 0:
q.append(m)
if sum(len(s) for s in stages) != len(nodes):
raise RuntimeError("Circular dependency in state dependencies")
return stages
def planner_deps():
"""Define the dependencies between beamline positions"""
return {
("bs_z", "samp"): [
("gon_x", "out"),
("diag_y", "out"),
("coll_y", "out"),
],
("gon_x", "in"): [
("diag_y", "out"),
("bs_z", "safe"),
],
("diag_y", "scint"): [
("gon_x", "out"),
("cryo_pos", "out")
],
("diag_y", "i1"): [
("gon_x", "out"),
("cryo_pos", "out")],
("bs_pos", "out"): [("bs_z", "safe")],
("bs_pos", "in"): [("bs_z", "safe")],
("diag_y", "out"): [("bs_z", "safe")],
("diag_y", "park"): [("bs_z", "safe")],
("coll_y", "out"): [("bs_z", "safe")],
("coll_y", "park"): [("bs_z", "safe")],
("coll_y", "in"): [("bs_z", "safe")],
("coll_y", "intermediate"): [("bs_z", "safe")]
}
+73
View File
@@ -0,0 +1,73 @@
'''Define guard policies for devices in the beamline.'''
# from guards import GuardViolation, guards_setup
def is_sample_area_clear_for_beamstop(d):
'''Check if the sample area is clear of diag_y, coll_y, and gonx'''
g = guards_setup(d)
if g["diag_y_out"].check() and g["coll_y_out"].check() and g["gonx_out"].check():
return True
return False
def is_sample_area_clear_for_gonx(d):
'''Check if the sample area is clear of diag_y and bs_z'''
g = guards_setup(d)
if g["diag_y_out"].check() and g["bs_work_min"].check():
return True
return False
def make_gon_x_policy(d):
'''Create the policy for gon_x'''
def gon_x_policy(target):
cfg = d["gon_x"].positions
if target >= cfg["out"] and not is_sample_area_clear_for_gonx(d):
raise GuardViolation("Sample area is not clear")
return gon_x_policy
def make_bs_z_policy(d):
'''Create the policy for bs_z'''
def bs_z_policy(target):
"""Checks that the target position is within limits"""
cfg = d["bs_z"].positions
# Lower bound
if target < cfg["work_min"] and not is_sample_area_clear_for_beamstop(d):
raise GuardViolation("Sample area is not clear")
if target < cfg["min"]:
raise GuardViolation(
f"Requested beamstop Z {target} is below recommended minimum {cfg['min']}"
)
# Upper bound
if d["bl_pos"].pos == "in" and target > cfg["max_blin"]:
raise GuardViolation(
f"Beamstop Z cannot move beyond {cfg['max_blin']} when backlight is IN"
)
return bs_z_policy
def make_diag_y_policy(d):
'''Create the policy for diag_y'''
def diag_y_policy(target):
cfg = d["diag_y"].positions
# Don't move in if the goniometer is >= 'in'
if d["gon_x"].actual >= d["gon_x"].positions["in"]:
raise GuardViolation(
f"Diagnostic device cannot move beyond {cfg['out']} mm when goniometer is not OUT"
)
if d['cryo_pos'].pos == "in" and target > cfg["out"]:
raise GuardViolation(
f"Diagnostic device cannot move beyond {cfg['out']} mm when cryo is IN"
)
return diag_y_policy
def attach_policies(d):
'''Attach the policies to the devices'''
d["bs_z"].policy = make_bs_z_policy(d)
d["gon_x"].policy = make_gon_x_policy(d)
d["diag_y"].policy = make_diag_y_policy(d)
+73
View File
@@ -0,0 +1,73 @@
'''Define guard policies for devices in the beamline.'''
# from guards import GuardViolation, guards_setup
def is_sample_area_clear_for_beamstop(d):
'''Check if the sample area is clear of diag_y, coll_y, and gonx'''
g = guards_setup(d)
if g["diag_y_out"].check() and g["coll_y_out"].check() and g["gonx_out"].check():
return True
return False
def is_sample_area_clear_for_gonx(d):
'''Check if the sample area is clear of diag_y and bs_z'''
g = guards_setup(d)
if g["diag_y_out"].check() and g["bs_work_min"].check():
return True
return False
def make_gon_x_policy(d):
'''Create the policy for gon_x'''
def gon_x_policy(target):
cfg = d["gon_x"].positions
if target >= cfg["out"] and not is_sample_area_clear_for_gonx(d):
raise GuardViolation("Sample area is not clear")
return gon_x_policy
def make_bs_z_policy(d):
'''Create the policy for bs_z'''
def bs_z_policy(target):
"""Checks that the target position is within limits"""
cfg = d["bs_z"].positions
# Lower bound
if target < cfg["work_min"] and not is_sample_area_clear_for_beamstop(d):
raise GuardViolation("Sample area is not clear")
if target < cfg["min"]:
raise GuardViolation(
f"Requested beamstop Z {target} is below recommended minimum {cfg['min']}"
)
# Upper bound
if d["bl_pos"].pos == "in" and target > cfg["max_blin"]:
raise GuardViolation(
f"Beamstop Z cannot move beyond {cfg['max_blin']} when backlight is IN"
)
return bs_z_policy
def make_diag_y_policy(d):
'''Create the policy for diag_y'''
def diag_y_policy(target):
cfg = d["diag_y"].positions
# Don't move in if the goniometer is >= 'in'
if d["gon_x"].actual >= d["gon_x"].positions["in"] and target > {cfg['out']}:
raise GuardViolation(
f"Diagnostic device cannot move beyond {cfg['out']} mm when goniometer is not OUT"
)
if d['cryo_pos'].pos == "in" and target > cfg["out"]:
raise GuardViolation(
f"Diagnostic device cannot move beyond {cfg['out']} mm when cryo is IN"
)
return diag_y_policy
def attach_policies(d):
'''Attach the policies to the devices'''
d["bs_z"].policy = make_bs_z_policy(d)
d["gon_x"].policy = make_gon_x_policy(d)
d["diag_y"].policy = make_diag_y_policy(d)
+1
View File
@@ -81,6 +81,7 @@ def set_mirror_stripe(energy_ev):
def mono_pitch_scan(plot=True):
"""Scan the monochromator pitch and move to the peak."""
# Move to the calculated pitch value for the current energy
print("Starting Mono Pitch Scan.")
energy = get_current_energy()
pos = get_dcm_motors_positions(energy)
print(f"Setting DCM Pitch to default value of {pos['dcm_pitch']}")
+10 -158
View File
@@ -1,10 +1,7 @@
"""File to store beamline parameters and defaults"""
from dataclasses import dataclass
from typing import Callable
import numpy as np
import yaml
@@ -16,7 +13,7 @@ class EnergyDefaults:
min_energy_ev = 4800
max_energy_ev = 30002
beam_offset = 6
signals = {"sig1": dev.lu_bpmsum, "sig2": dev.bsc_bpmsum, "sig3": dev.bcu_bpmsum}
signals = {"sig1": dev.lu_bpmsum, "sig2": dev.ss_bpmsum, "sig3": dev.bcu_bpmsum}
energy = dev.dcm_bragg
mono_pitch = dev.dcm_pitch
mono_perp = dev.dcm_perp
@@ -148,15 +145,15 @@ class BPMScans:
"y_device": dev.lu_bpm_y,
}
bsc = {
"x_name": dev.bsc_bpm_x.name,
"y_name": dev.bsc_bpm_y.name,
"z1_name": dev.bsc_bpm1.name,
"z2_name": dev.bsc_bpm2.name,
"z3_name": dev.bsc_bpm3.name,
"z4_name": dev.bsc_bpm4.name,
"z5_name": dev.bsc_bpmsum.name,
"x_device": dev.bsc_bpm_x,
"y_device": dev.bsc_bpm_y,
"x_name": dev.ss_bpm_x.name,
"y_name": dev.ss_bpm_y.name,
"z1_name": dev.ss_bpm1.name,
"z2_name": dev.ss_bpm2.name,
"z3_name": dev.ss_bpm3.name,
"z4_name": dev.ss_bpm4.name,
"z5_name": dev.ss_bpmsum.name,
"x_device": dev.ss_bpm_x,
"y_device": dev.ss_bpm_y,
}
bcu = {
"x_name": dev.bcu_bpm_x.name,
@@ -191,148 +188,3 @@ class MirrorConfig:
}
@dataclass
class PositionedDevice:
"""Class for devices with defined in and out positions"""
device_name: str
type: str
name: str
inpos: float
outpos: float
tol: float
mot: str
reader: Callable[[], float]
@property
def actual(self):
"""Returns current motor position"""
return self.reader()
def checkin(self):
"""Returns True if motor in in the 'in' position"""
return abs(self.actual - self.inpos) <= self.tol
def mvin(self):
"""Moves motor to the 'in' position"""
scans.umv(self.mot, self.inpos, relative=False)
def mvout(self):
"""Moves motor to the 'out' position"""
scans.umv(self.mot, self.outpos, relative=False)
def status(self):
""" Check if device is in or out or moving"""
positions = ("in", "out", "moving", "undefined")
target_in = self.inpos
target_out = self.outpos
actual = self.actual
delta_in = actual - target_in
delta_out = actual - target_out
# Check if motor is moving
if "Signal" in self.type:
moving = 0
elif "Motor" in self.type:
d = getattr(dev, self.device_name)
moving = d.motor_is_moving.get()
if moving:
pos = positions[2]
return {"position": pos.upper(),
"name": self.name,
"moving": moving}
if abs(delta_in) > self.tol and abs(delta_out) > self.tol:
pos = positions[3]
return {"position": pos.upper(),
"name": self.name,
"actual": actual,
"moving": moving}
elif abs(delta_in) <= self.tol:
target = self.inpos
pos = positions[0]
delta = delta_in
elif abs(delta_out) <= self.tol:
target = self.outpos
pos = positions[1]
delta = delta_out
return {
"name": self.name,
"position": pos.upper(),
"target": target,
"actual": actual,
"delta": delta,
"tol": self.tol,
"moving": moving,
}
def report(self):
""" Print status of motor """
s = self.status()
if s['position'] == "UNDEFINED":
return (f"{s['name']:15s}: "
f"{s['position']} "
f"position {s['actual']:.3f}")
elif s['position'] == "MOVING":
return (f"{s['name']:15s}: "
f"{s['position']} ")
else:
return (
f"{s['name']:15s}: "
f"[{s['position']}] "
f"actual = {s['actual']:.3f} "
f"target = {s['target']:.3f} "
f"delta = {s['delta']:.3f}"
)
@dataclass(frozen=True)
class PD:
"""Class for positioned device positions"""
def build_pd(yaml_file):
"""Takes the in and out values from the yaml file
and adds them to the PD class
"""
with open(yaml_file, encoding="utf-8") as f:
data = yaml.safe_load(f)
for device_name, cfg in data.items():
# Skip devices without userParameter
user = cfg.get("userParameter")
if not user:
continue
# Set tolerance
if "tol" not in user:
user["tol"] = 0.01
try:
dev_obj = getattr(dev, device_name)
except:
raise KeyError(f"Device {device_name} not found in device list")
desc = cfg.get("description")
type = cfg.get("deviceClass")
target = PositionedDevice(
device_name=device_name,
type = type,
name=desc,
inpos=user["in"],
outpos=user["out"],
tol=user["tol"],
mot=dev_obj,
reader=lambda d=dev_obj, n=device_name: d.read()[n]["value"],
)
setattr(PD, device_name, target)
def init_positioned_devices():
"""Initialises the positioned devices"""
file = (
"/sls/x10sa/config/bec/production/pxii_bec/pxii_bec/device_configs/pxii-autogenerated.yaml"
)
build_pd(file)
print("Defined positions for devices have been updated from pxii-autogenerated.yaml")
+338
View File
@@ -0,0 +1,338 @@
"""File to store beamline parameters and defaults"""
from dataclasses import dataclass
from typing import Callable
import numpy as np
import yaml
@dataclass(frozen=True)
class EnergyDefaults:
"""Parameters for PXII energy changes"""
min_energy_change = 1
min_energy_ev = 4800
max_energy_ev = 30002
beam_offset = 6
signals = {"sig1": dev.lu_bpmsum, "sig2": dev.bsc_bpmsum, "sig3": dev.bcu_bpmsum}
energy = dev.dcm_bragg
mono_pitch = dev.dcm_pitch
mono_perp = dev.dcm_perp
mono_roll = dev.dcm_froll
mono_roll_value = 4.65
LUT_table = "luts/energy_lut.csv"
stripe_thresholds = {"silicon": 9000, "rhodium": 20000, "platinum": 40000}
pitch_scan = {"halfwidth": 0.075, "steps": 20}
@dataclass(frozen=True)
class Calibration:
"""Calibration parameters for PXII optics"""
pitch = np.array([4.61823701e-14, -1.97330772e-09, 2.89694543e-05, -5.34468669e00])
roll = np.array([2.28291039e-03, -2.41928101e01])
@dataclass(frozen=True)
class Gap:
"""Fit parameters to calculate gap from harmonics"""
harmonics = {
"H3": np.array([9.15e-04, 4.49e-01]),
"H5": np.array([5.19e-04, 7.149e-01]),
"H7": np.array([3.57694643e-04, 8.73775476e-01]),
"H9": np.array([2.76335714e-04, 8.98471905e-01]),
"H11": np.array([2.2225e-04, 9.582e-01]),
"H13": np.array([1.9e-4, 9.262e-01]),
"H15": np.array([1.67e-4, 8.83e-01]),
}
# Define harmonic ranges as a constant
harmonic_ranges = {
"H3": (4900, 7000),
"H5": (7000, 10000),
"H7": (10000, 13000),
"H9": (13000, 16000),
"H11": (16000, 19000),
"H13": (19000, 22000),
"H15": (22000, float("inf")),
}
@staticmethod
def get_harmonic_by_energy(energy_ev: float):
"""
Determines the harmonic key based on the provided energy.
Args:
energy_ev (float): The energy value (eV).
Returns:
Optional[str]: The harmonic name (e.g., 'H3', 'H7')
if the range matches, None otherwise.
"""
for harmonic, (low, high) in Gap.harmonic_ranges.items():
if low < energy_ev <= high:
return harmonic
return None
def get_harmonic_values(self, energy_ev: float):
"""
Retrieves the harmonic array based on the energy value.
Args:
energy_ev (float): The energy value (eV).
Returns:
Optional[np.array]: The corresponding array of harmonic values
if the range matches, None otherwise.
"""
harmonic = self.get_harmonic_by_energy(energy_ev)
return self.harmonics.get(harmonic) if harmonic else None
@dataclass(frozen=True)
class Harmonics:
"""Anuschka's harmonics data for PXII U19 Undulator"""
min_gap_value = 4.5
map = {
3: np.array([1.07141725, -0.52834258]),
4: np.array([0.007111, -0.13678409, 1.52295567, -1.06882785]),
5: np.array([0.00315051, -0.0766359, 1.13107469, -0.86442062]),
6: np.array([0.00162862, -0.04452336, 0.82948259, -0.37329674]),
7: np.array([0.00080764, -0.02418882, 0.59212947, 0.15702886]),
8: np.array([1.16699242e-03, -4.68207543e-02, 9.43972396e-01, -1.94201019e00]),
9: np.array([0.00048419, -0.02010648, 0.55514114, -0.38180067]),
10: np.array([2.11583333e-04, -8.03503571e-03, 3.43141595e-01, 6.02318000e-01]),
11: np.array([0.00334392, -0.18405336, 3.58338994, -19.3640241]),
12: np.array([3.20520798e-05, 2.39253145e-03, 8.09198503e-02, 2.22897377e00]),
13: np.array([0.00278744, 0.07979874, 2.05143916]),
}
energy_ranges = {3: (0, 7), 5: (7, 10), 7: (10, 13), 9: (13, 16), 11: (16, 19), 13: (19, 22)}
high_energy = [(15, (23, 25)), (17, (25, 29)), (19, (29, float("inf")))]
@dataclass(frozen=True)
class CamConversion:
"""Convert pixels to microns for sam cam"""
a = 0.5208
b = 0.002586
@dataclass(frozen=True)
class BPMScans:
"""Define the names of the motors and bpm channels"""
fe = {
"x_name": dev.fe_bpm_x.name,
"y_name": dev.fe_bpm_y.name,
"z1_name": dev.fe_bpm1.name,
"z2_name": dev.fe_bpm2.name,
"z3_name": dev.fe_bpm3.name,
"z4_name": dev.fe_bpm3.name,
"z5_name": dev.fe_bpmsum.name,
"x_device": dev.fe_bpm_x,
"y_device": dev.fe_bpm_y,
}
lu = {
"x_name": dev.lu_bpm_x.name,
"y_name": dev.lu_bpm_y.name,
"z1_name": dev.lu_bpm1.name,
"z2_name": dev.lu_bpm2.name,
"z3_name": dev.lu_bpm3.name,
"z4_name": dev.lu_bpm4.name,
"z5_name": dev.lu_bpmsum.name,
"x_device": dev.lu_bpm_x,
"y_device": dev.lu_bpm_y,
}
bsc = {
"x_name": dev.bsc_bpm_x.name,
"y_name": dev.bsc_bpm_y.name,
"z1_name": dev.bsc_bpm1.name,
"z2_name": dev.bsc_bpm2.name,
"z3_name": dev.bsc_bpm3.name,
"z4_name": dev.bsc_bpm4.name,
"z5_name": dev.bsc_bpmsum.name,
"x_device": dev.bsc_bpm_x,
"y_device": dev.bsc_bpm_y,
}
bcu = {
"x_name": dev.bcu_bpm_x.name,
"y_name": dev.bcu_bpm_y.name,
"z1_name": dev.bcu_bpm1.name,
"z2_name": dev.bcu_bpm2.name,
"z3_name": dev.bcu_bpm3.name,
"z4_name": dev.bcu_bpm4.name,
"z5_name": dev.bcu_bpmsum.name,
"x_device": dev.bcu_bpm_x,
"y_device": dev.bcu_bpm_y,
}
@dataclass(frozen=True)
class MirrorConfig:
"""Define the names of the mirror channels"""
hfm = {
"bu_name": dev.hfm_bu.name,
"bd_name": dev.hfm_bd.name,
"z_name": dev.samcam_xsig.name,
"x_device": dev.hfm_bu,
"y_device": dev.hfm_bd,
}
vfm = {
"bu_name": dev.vfm_bu.name,
"bd_name": dev.vfm_bd.name,
"z_name": dev.samcam_ysig.name,
"x_device": dev.vfm_bu,
"y_device": dev.vfm_bd,
}
@dataclass
class PositionedDevice:
"""Class for devices with defined in and out positions"""
device_name: str
type: str
name: str
inpos: float
outpos: float
tol: float
mot: str
reader: Callable[[], float]
@property
def actual(self):
"""Returns current motor position"""
return self.reader()
def checkin(self):
"""Returns True if motor in in the 'in' position"""
return abs(self.actual - self.inpos) <= self.tol
def mvin(self):
"""Moves motor to the 'in' position"""
scans.umv(self.mot, self.inpos, relative=False)
def mvout(self):
"""Moves motor to the 'out' position"""
scans.umv(self.mot, self.outpos, relative=False)
def status(self):
""" Check if device is in or out or moving"""
positions = ("in", "out", "moving", "undefined")
target_in = self.inpos
target_out = self.outpos
actual = self.actual
delta_in = actual - target_in
delta_out = actual - target_out
# Check if motor is moving
if "Signal" in self.type:
moving = 0
elif "Motor" in self.type:
d = getattr(dev, self.device_name)
moving = d.motor_is_moving.get()
if moving:
pos = positions[2]
return {"position": pos.upper(),
"name": self.name,
"moving": moving}
if abs(delta_in) > self.tol and abs(delta_out) > self.tol:
pos = positions[3]
return {"position": pos.upper(),
"name": self.name,
"actual": actual,
"moving": moving}
elif abs(delta_in) <= self.tol:
target = self.inpos
pos = positions[0]
delta = delta_in
elif abs(delta_out) <= self.tol:
target = self.outpos
pos = positions[1]
delta = delta_out
return {
"name": self.name,
"position": pos.upper(),
"target": target,
"actual": actual,
"delta": delta,
"tol": self.tol,
"moving": moving,
}
def report(self):
""" Print status of motor """
s = self.status()
if s['position'] == "UNDEFINED":
return (f"{s['name']:15s}: "
f"{s['position']} "
f"position {s['actual']:.3f}")
elif s['position'] == "MOVING":
return (f"{s['name']:15s}: "
f"{s['position']} ")
else:
return (
f"{s['name']:15s}: "
f"[{s['position']}] "
f"actual = {s['actual']:.3f} "
f"target = {s['target']:.3f} "
f"delta = {s['delta']:.3f}"
)
@dataclass(frozen=True)
class PD:
"""Class for positioned device positions"""
def build_pd(yaml_file):
"""Takes the in and out values from the yaml file
and adds them to the PD class
"""
with open(yaml_file, encoding="utf-8") as f:
data = yaml.safe_load(f)
for device_name, cfg in data.items():
# Skip devices without userParameter
user = cfg.get("userParameter")
if not user:
continue
# Set tolerance
if "tol" not in user:
user["tol"] = 0.01
try:
dev_obj = getattr(dev, device_name)
except:
raise KeyError(f"Device {device_name} not found in device list")
desc = cfg.get("description")
type = cfg.get("deviceClass")
target = PositionedDevice(
device_name=device_name,
type = type,
name=desc,
inpos=user["in"],
outpos=user["out"],
tol=user["tol"],
mot=dev_obj,
reader=lambda d=dev_obj, n=device_name: d.read()[n]["value"],
)
setattr(PD, device_name, target)
def init_positioned_devices():
"""Initialises the positioned devices"""
file = (
"/sls/x10sa/config/bec/production/pxii_bec/pxii_bec/device_configs/pxii-autogenerated.yaml"
)
build_pd(file)
print("Defined positions for devices have been updated from pxii-autogenerated.yaml")
+75
View File
@@ -0,0 +1,75 @@
#!/usr/bin/env bash
#
# Script Name: set_kbox.sh
# Description: Sets a value on a given device, such as scinti, diode, colli
#
set -euo pipefail
#######################################
# Usage
#######################################
usage() {
echo "Usage: $(basename "$0") <device_name> <set_value>"
echo
echo "Example:"
echo " $(basename "$0") colli_in 41.5"
echo " $(basename "$0") colli_out 20."
echo " $(basename "$0") scinti_in 40."
echo " $(basename "$0") diode_in 44."
echo " $(basename "$0") diode_out 20. or"
echo " $(basename "$0") scinti_out 20."
exit 1
}
#######################################
# Validate Arguments
#######################################
if [[ $# -ne 2 ]]; then
usage
fi
DEVICE_NAME="$1"
SET_VALUE="$2"
if ! [[ "$SET_VALUE" =~ ^[0-9]+$ ]]; then
echo "Error: set_value must be numeric"
exit 1
fi
#######################################
# Main
#######################################
main() {
echo "Device: $DEVICE_NAME"
echo "Value : $SET_VALUE"
# --- Your logic here ---
# Example placeholder:
if [[ $DEVICE_NAME == "colli_in" ]]; then
echo "caput X10SA-ES-COL:POS-SET-SEQ.DO2 $SET_VALUE"
fi
if [[ $DEVICE_NAME == "colli_out" ]]; then
echo "caput X10SA-ES-COL:POS-SET-SEQ.DO1 $SET_VALUE"
fi
#
if [[ $DEVICE_NAME == "scinti_in" ]]; then
echo "caput X10SA-ES-SCL:POS-SET-SEQ.DO2 $SET_VALUE"
fi
if [[ $DEVICE_NAME == "diode_in" ]]; then
echo "caput X10SA-ES-SCL:POS-SET-SEQ.DO3 $SET_VALUE"
fi
if [[ $DEVICE_NAME == "scinti_out" || $DEVICE_NAME == "diode_out" ]]; then
echo "caput X10SA-ES-SCL:POS-SET-SEQ.DO1 $SET_VALUE"
fi
#
echo "Setting device '$DEVICE_NAME' to '$SET_VALUE'..."
# Simulate success
echo "Done."
}
main
+38
View File
@@ -0,0 +1,38 @@
import random
import time
def test_mv():
tol = 0.1
if abs(dev.coll_y.position) < tol:
value = 40
else:
value = 0
print(f"Moving coll_y to {value}")
s = scans.mv(dev.coll_y, value, relative=False)
s.wait(timeout = 3)
def test_states():
d = init_se_devices()
states, allow_modifiers = get_states()
deps = planner_deps()
planner = StateManager(d, states, allow_modifiers, deps)
states_to_test = [
BeamlineState.ROBOT_SAMPLE_EXCHANGE,
BeamlineState.DATA_COLLECTION,
BeamlineState.MANUAL_SAMPLE_EXCHANGE,
BeamlineState.XTAL_SNAPSHOT,
]
previous = None
tested_states = []
for i in range(10):
choices = [ s for s in states_to_test if s != previous]
current = random.choice(choices)
print(f"Moving to state {current}")
planner.move_to(current)
tested_states.append(current)
time.sleep(5)
previous = current
print(f"Tested states: {tested_states}")