diff --git a/pxii_bec/device_configs/pxii-devices-new.csv b/pxii_bec/device_configs/pxii-devices-new.csv new file mode 100644 index 0000000..4a2a020 --- /dev/null +++ b/pxii_bec/device_configs/pxii-devices-new.csv @@ -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,Motor,X10SA-FE-SL1:TRXR,baseline,fe,no,yes,, +fe_sl_yt,FE Slit Y top,Motor,X10SA-FE-SL1:TRYT,baseline,fe,no,yes,, +fe_sl_xw,FE Slit X Wall,Motor,X10SA-FE-SL1:TRXW,baseline,fe,no,yes,, +fe_sl_yb,FE SlitY Bottom,Motor,X10SA-FE-SL1:TRYB,baseline,fe,no,yes,, +fe_sl_xcen,FE Slit X Centre,Motor,X10SA-FE-SL1:CENTERX,baseline,fe,no,yes,, +fe_sl_xsize,FE Slit X Size,Motor,X10SA-FE-SL1:SIZEX,baseline,fe,no,yes,, +fe_sl_ycen,FE Slit Y Centre,Motor,X10SA-FE-SL1:CENTERY,baseline,fe,no,yes,, +fe_sl_ysize,FE Slit Y Size,Motor,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,Motor,X10SA-OP-BSFSLH:TRXW,baseline,bsf,no,yes,, +bsf_sl_xr,BSF slit inboard,Motor,X10SA-OP-BSFSLH:TRXR,baseline,bsf,no,yes,, +bsf_sl_yt,BSF slit top,Motor,X10SA-OP-BSFSLV:TRYT,baseline,bsf,no,yes,, +bsf_sl_yb,BSF slit bottom,Motor,X10SA-OP-BSFSLV:TRYB,baseline,bsf,no,yes,, +bsf_sl_xcen,BSF X centre,Motor,X10SA-OP-BSFSLH:CENTER,baseline,bsf,no,yes,, +bsf_sl_xsize,BSF X size,Motor,X10SA-OP-BSFSLH:SIZE,baseline,bsf,no,yes,, +bsf_sl_ycen,BSF Y centre,Motor,X10SA-OP-BSFSLV:CENTER,baseline,bsf,no,yes,, +bsf_sl_ysize,BSF Y size,Motor,X10SA-OP-BSFSLV:SIZE,baseline,bsf,no,yes,, +bsf_f1_y,BSF Filter 1 Y,Motor,X10SA-OP-BSFFI1:TRY,baseline,bsf,no,yes,, +bsf_f2_y,BSF Filter 2 Y,Motor,X10SA-OP-BSFFI2:TRY,baseline,bsf,no,yes,, +dcm_bragg,DCM Bragg angle,Motor,X10SA-OP-DCM:ROTY,baseline,dcm,no,yes,, +dcm_x,DCM lateral,Motor,X10SA-OP-DCM:TRX,baseline,dcm,no,yes,, +dcm_perp,DCM Perp,Motor,X10SA-OP-DCM:TRX-CR2,baseline,dcm,no,yes,, +dcm_pitch,DCM 2nd crystal pitch,Motor,X10SA-OP-DCM:ROTY-CR2-PITCH,baseline,dcm,no,yes,, +dcm_fpitch,DCM 2nd crystal fine pitch,Motor,X10SA-OP-DCM:ROTY-CR2-FINEPITCH,baseline,dcm,no,yes,, +dcm_froll,DCM 2nd crystal fine roll,Motor,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,yes,, +ss_xicam_y,ss cam Y,SignalRO,X10SA-ES-SSXI:cam1:Stats5:CentroidY_RBV,baseline,ss,yes,yes,, +ss_xicam_max,ss cam max value,SignalRO,X10SA-ES-SSXI:cam1:Stats5:MaxValue_RBV,monitored,ss,yes,yes,, +ss_xicam_exp,ss camera exposure,Signal,X10SA-ES-SSXI:cam1:AcquireTime,baseline,ss,no,yes,, +ss_xicam_gain,ss camera gain,Signal,X10SA-ES-SSXI:cam1:cam1:Gain,baseline,ss,no,yes,, +ss_xicam_xsig,ss camera x sigma,Signal,X10SA-ES-SSXI:cam1:Stats5:SigmaX_RBV,baseline,ss,yes,yes,, +ss_xicam_ysig,ss camera y sigma,Signal,X10SA-ES-SSXI:cam1:Stats5:SigmaY_RBV,baseline,ss,yes,yes,, +vfm_xu,VFM Upstream X,Motor,X10SA-ES-KBV:TRXU,baseline,vfm,no,no,, +vfm_xd,VFM Downstream X,Motor,X10SA-ES-KBV:TRXD,baseline,vfm,no,no,, +vfm_yur,VFM Upstream Ring Y,Motor,X10SA-ES-KBV:TRYUR,baseline,vfm,no,no,, +vfm_yw,VFM Wall Y,Motor,X10SA-ES-KBV:TRYW,baseline,vfm,no,no,, +vfm_ydr,VFM Downstream Ring Y,Motor,X10SA-ES-KBV:TRYDR,baseline,vfm,no,no,, +vfm_bu,VFM Upstream Bender,Motor,X10SA-ES-KBV:BNDU,baseline,vfm,no,no,, +vfm_bd,VFM Downstream Bender,Motor,X10SA-ES-KBV:BNDD,baseline,vfm,no,no,, +vfm_yaw,VFM Virtual Yaw,Motor,X10SA-ES-KBV:YAW,baseline,vfm,no,no,, +vfm_roll,VFM Virtual Roll,Motor,X10SA-ES-KBV:ROLL,baseline,vfm,no,no,, +vfm_pitch,VFM Virtual Pitch,Motor,X10SA-ES-KBV:PITCH,baseline,vfm,no,no,, +vfm_x,VFM Virtual X,Motor,X10SA-ES-KBV:TRX,baseline,vfm,no,no,, +vfm_y,VFM Virtual Y ,Motor,X10SA-ES-KBV:TRY,baseline,vfm,no,no,, +hfm_xu,HFM Upstream X,Motor,X10SA-ES-KBH:TRXU,baseline,hfm,no,no,, +hfm_xd,HFM Downstream X,Motor,X10SA-ES-KBH:TRXD,baseline,hfm,no,no,, +hfm_yuw,HFM Upstream Wall Y,Motor,X10SA-ES-KBH:TRYUW,baseline,hfm,no,no,, +hfm_yr,HFM Ring Y,Motor,X10SA-ES-KBH:TRYR,baseline,hfm,no,no,, +hfm_ydw,HFM Downstream Wall Y,Motor,X10SA-ES-KBH:TRYDW,baseline,hfm,no,no,, +hfm_bu,HFM Upstream Bender,Motor,X10SA-ES-KBH:BNDU,baseline,hfm,no,no,, +hfm_bd,HFM Downstream Bender,Motor,X10SA-ES-KBH:BNDD,baseline,hfm,no,no,, +hfm_yaw,HFM Virtual Yaw,Motor,X10SA-ES-KBH:YAW,baseline,hfm,no,no,, +hfm_roll,HFM Virtual Roll,Motor,X10SA-ES-KBH:ROLL,baseline,hfm,no,no,, +hfm_pitch,HFM Virtual Pitch,Motor,X10SA-ES-KBH:PITCH,baseline,hfm,no,no,, +hfm_x,HFM Virtual X,Motor,X10SA-ES-KBH:TRX,baseline,hfm,no,no,, +hfm_y,HFM Virtual Y ,Motor,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,yes,"{""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,yes,, +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,yes,"{""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,yes,"{""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,yes,"{""type"":positioner}", +bl_bright,Backlight brightness,Signal,X10SA-ES-BL:SET,baseline,se,no,yes,, +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,yes,"{""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,yes,"{""type"":positioner}", +gon_x,Goniometer X,Motor,X10SA-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,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,yes,"{""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,yes,"{""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,, diff --git a/pxii_bec/device_configs/x10sa_device_config.yaml b/pxii_bec/device_configs/x10sa_device_config.yaml index db42938..91a4104 100644 --- a/pxii_bec/device_configs/x10sa_device_config.yaml +++ b/pxii_bec/device_configs/x10sa_device_config.yaml @@ -10,36 +10,4 @@ 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 \ No newline at end of file + diff --git a/pxii_bec/macros/APscripts.py b/pxii_bec/macros/APscripts.py index ea26559..74ad4d4 100755 --- a/pxii_bec/macros/APscripts.py +++ b/pxii_bec/macros/APscripts.py @@ -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: @@ -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" @@ -645,7 +621,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,7 +644,8 @@ def getdiodepos(diode="i1"): """ diode_in = 1 - dpos = 44 # mm + dpos = dev.diag_y.user_parameter["i1"] # 44 # mm + measdev = dev.scin_y diodepos_rb = measdev.user_readback.get() if abs(dpos - diodepos_rb) > 0.1: @@ -692,7 +669,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 +704,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 +744,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 +761,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 +785,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 +815,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) ##################### @@ -895,10 +860,10 @@ def colliscan(direction: str, range=0.3, nsteps=30, stime=0.5, centre=1): # 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 +964,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 +1000,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 @@ -1088,25 +1053,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 +1126,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,9 +1224,7 @@ def bstatus(): # dock_area = bec.gui.new() - dbrowser = dock_area.new("device_browser").new( - bec.gui.available_widgets.DeviceBrowser - ) + dbrowser = dock_area.new("device_browser").new(bec.gui.available_widgets.DeviceBrowser) dock_area.new("queue").new(bec.gui.available_widgets.BECQueue) # queue = dock_area.queue.BECQueue # give it a name @@ -1307,15 +1268,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(): @@ -1352,20 +1313,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 +1342,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 +1431,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 +1477,11 @@ def scan_eg(erange, nsteps=50, fit=True): ### compute a signal ########################### # see in config file + + +################################################ +### open window/doch for long gap scan +################################################ +# + + diff --git a/pxii_bec/macros/Undu_Helpers.py b/pxii_bec/macros/Undu_Helpers.py index 8c984ed..7552782 100755 --- a/pxii_bec/macros/Undu_Helpers.py +++ b/pxii_bec/macros/Undu_Helpers.py @@ -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}" @@ -233,21 +230,22 @@ def long_gscan(estart=7, end_en=20.5, g_low=4.5, g_high=9.0, nsteps=1500): 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,8 +268,8 @@ 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() @@ -285,15 +283,13 @@ def gscan(centre=0, gomax=0, detune=0): 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,17 +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 - - diff --git a/pxii_bec/macros/findattr.py b/pxii_bec/macros/findattr.py new file mode 100644 index 0000000..5873afe --- /dev/null +++ b/pxii_bec/macros/findattr.py @@ -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) + + + + + diff --git a/pxii_bec/macros/mx_basics.py b/pxii_bec/macros/mx_basics.py index 853d690..80aeaf2 100755 --- a/pxii_bec/macros/mx_basics.py +++ b/pxii_bec/macros/mx_basics.py @@ -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']}") @@ -164,7 +182,11 @@ def select_bec_window(dock_area_name="Fitting"): 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 +211,10 @@ def plot_live_data_bec(motor_name, signal_name, window_name="Fitting"): wf.plot(x_name=motor_name, y_name=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 +246,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) + + diff --git a/pxii_bec/macros/mx_methods.py b/pxii_bec/macros/mx_methods.py index e9ee114..8631d0f 100755 --- a/pxii_bec/macros/mx_methods.py +++ b/pxii_bec/macros/mx_methods.py @@ -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) diff --git a/pxii_bec/macros/pxii_guards.py b/pxii_bec/macros/pxii_guards.py index 8d514c1..0e704c7 100644 --- a/pxii_bec/macros/pxii_guards.py +++ b/pxii_bec/macros/pxii_guards.py @@ -277,4 +277,4 @@ def init_positioned_devices(): file = "/sls/x10sa/config/bec/production/pxii_bec/pxii_bec/device_configs/pxii-autogenerated.yaml" build_pd(file) init_collision_guards() - print("Defined positions for devices have been updated from pxii-autogenerated.yaml") + print(f"Defined positions for devices have been updated from {file}") diff --git a/pxii_bec/macros/set_kbox.sh b/pxii_bec/macros/set_kbox.sh new file mode 100755 index 0000000..fa30fd9 --- /dev/null +++ b/pxii_bec/macros/set_kbox.sh @@ -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") " + 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 diff --git a/pxii_bec/macros/test.py_txt b/pxii_bec/macros/test.py_txt new file mode 100644 index 0000000..f97dc7e --- /dev/null +++ b/pxii_bec/macros/test.py_txt @@ -0,0 +1,6 @@ +print("Hello World") +try: + print(PD.coll_y.state) + print("success") +except Exception as e: + print(f"Error {e}") \ No newline at end of file