diff --git a/bin/test_ad_based_falcon.py b/bin/test_ad_based_falcon.py new file mode 100644 index 0000000..d5f2ffd --- /dev/null +++ b/bin/test_ad_based_falcon.py @@ -0,0 +1,59 @@ +import time + +from ophyd_devices import CompareStatus + +from superxas_bec.devices.falcon_ad import FalconAcquiringStatus, FalconAD +from superxas_bec.devices.trigger import SamplingDone, Trigger + +if __name__ == "__main__": + print("Initializing Falcon...") + time_started = time.time() + + falcon = FalconAD(name="test_device", prefix="X10DA-SITORO:", scan_info=None) + trigger = Trigger(name="trigger_device", prefix="X10DA-ES1:", scan_info=None) + + falcon.wait_for_connection(timeout=50, all_signals=True) + trigger.wait_for_connection(timeout=50, all_signals=True) + print(f"Device initialized in {time.time() - time_started:.2f} seconds.") + + if falcon.acquiring.get() != FalconAcquiringStatus.DONE: + status = CompareStatus(falcon.acquiring, FalconAcquiringStatus.DONE) + falcon.stop_all.put(1) + status.wait(timeout=5) + + # Print PVs + print("PVs:") + print(f"ICR: {falcon.dxp1.input_count_rate.describe()}") + print(f"OCR: {falcon.dxp1.output_count_rate.describe()}") + print(f"ROI: {falcon.mca1.rois.roi0.count.describe()}") + print(f"ERT: {falcon.mca1.elapsed_real_time.describe()}") + + # print(falcon.acquiring._auto_monitor) + # while True: + # print(falcon.acquiring.get()) + # time.sleep(1) + # Test loop + for i in range(500): + start_time = time.time() + print(f"Start loop iteration {i}") + + #status = CompareStatus(falcon.acquiring, FalconAcquiringStatus.ACQUIRING) + falcon.erase_start.put(1) + #status.wait(timeout=5) + + status2 = CompareStatus(trigger.smpl_done, SamplingDone.DONE) + trigger.smpl.put(1) + status2.wait(timeout=5) + + status3 = CompareStatus(falcon.acquiring, FalconAcquiringStatus.DONE) + falcon.stop_all.put(1) + status3.wait(timeout=5) + + time.sleep(0.1) + + icr = falcon.dxp1.input_count_rate.get() + ocr = falcon.dxp1.output_count_rate.get() + roi = falcon.mca1.rois.roi0.count.get() + ert = falcon.mca1.elapsed_real_time.get() + + print(f"time={time.time() - start_time:.4f}", icr, ocr, roi, ert) diff --git a/bin/test_falcon.py b/bin/test_falcon.py new file mode 100644 index 0000000..b314f14 --- /dev/null +++ b/bin/test_falcon.py @@ -0,0 +1,55 @@ +import time + +from ophyd_devices import CompareStatus + +from superxas_bec.devices.falcon import FalconAcquiringStatus, FalconSuperXAS +from superxas_bec.devices.trigger import SamplingDone, Trigger + +if __name__ == "__main__": + print("Initializing Falcon...") + time_started = time.time() + + falcon = FalconSuperXAS(name="test_device", prefix="X10DA-SITORO:", scan_info=None) + trigger = Trigger(name="trigger_device", prefix="X10DA-ES1:", scan_info=None) + + falcon.wait_for_connection(timeout=50, all_signals=True) + trigger.wait_for_connection(timeout=50, all_signals=True) + print(f"Device initialized in {time.time() - time_started:.2f} seconds.") + + if falcon.acquiring.get() != FalconAcquiringStatus.DONE: + status = CompareStatus(falcon.acquiring, FalconAcquiringStatus.DONE) + falcon.stop_all.put(1) + status.wait(timeout=5) + + # Print PVs + print("PVs:") + print(f"ICR: {falcon.icr.describe()}") + print(f"OCR: {falcon.ocr.describe()}") + print(f"ROI: {falcon.roi.describe()}") + print(f"ERT: {falcon.ert.describe()}") + + # Test loop + for i in range(500): + start_time = time.time() + + status = CompareStatus(falcon.acquiring, FalconAcquiringStatus.ACQUIRING) + falcon.erase_start.put(1) + status.wait(timeout=5) + + status2 = CompareStatus(trigger.smpl_done, SamplingDone.DONE) + trigger.smpl.put(1) + status2.wait(timeout=5) + + status3 = CompareStatus(falcon.acquiring, FalconAcquiringStatus.DONE) + falcon.stop_all.put(1) + status3.wait(timeout=5) + + time.sleep(0.1) + + icr = falcon.icr.get() + ocr = falcon.ocr.get() + roi = falcon.roi.get() + ert = falcon.ert.get() + dead_cor_roi0_count = falcon.dead_cor_roi0_count.get() + + print(f"time={time.time() - start_time:.4f}", icr, ocr, roi, ert, dead_cor_roi0_count) diff --git a/superxas_bec/device_configs/x10da_config_250616.yaml b/superxas_bec/device_configs/x10da_config_250616.yaml new file mode 100644 index 0000000..2e174b7 --- /dev/null +++ b/superxas_bec/device_configs/x10da_config_250616.yaml @@ -0,0 +1,756 @@ +absorption_transmission: + deviceClass: ophyd_devices.ComputedSignal + deviceConfig: + compute_method: "def compute_signals(signal1, signal2):\n import math\n return\ + \ math.log(signal1.get()/signal2.get())\n" + input_signals: + - ic1 + - ic2 + enabled: true + readOnly: false + readoutPriority: monitored +bm2_tr1: + description: Beam Monitor 2 Translation 1 + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-BM2:TR1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +bm2_tr2: + description: Beam Monitor 2 Translation 2 + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-BM2:TR2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +bm3_tr1: + description: Beam Monitor 3 Translation 1 + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-BM3:TR1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +bm3_tr2: + description: Beam Monitor 3 Translation 2 + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-BM3:TR2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_bnd: + description: Collimating Mirror bender + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:BND + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_pitch: + description: Collimating Mirror Pitch + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:ROTX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_roll: + description: Collimating Mirror Roll + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:ROTZ + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trx: + description: Collimating Mirror X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:XTCP + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trxd: + description: Collimating Mirror X-translation downstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRXD + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trxu: + description: Collimating Mirror X-translation upstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRXU + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_try: + description: Collimating Mirror Point Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:YTCP + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trydr: + description: Collimating Mirror Y-translation downstream ring + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRYDR + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trydw: + description: Collimating Mirror Y-translation downstream wall + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRYDW + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_tryu: + description: Collimating Mirror Y-translation upstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRYU + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_yaw: + description: Collimating Mirror Yaw + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:ROTY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +falcon: + description: Falcon Sitoro detector + deviceClass: superxas_bec.devices.falcon.FalconSuperXAS + deviceConfig: + prefix: 'X10DA-SITORO:' + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +filter_fe: + description: Front End Filter + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-FI:TRY1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_bnd: + description: Focusing Mirror bender + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRB + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_pitch: + description: Focusing Mirror Pitch + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:pitch + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_roll: + description: Focusing Mirror Roll + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:roll + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trx: + description: Focusing Mirror X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:trans + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trxd: + description: Focusing Mirror X-translation downstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRXD + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trxu: + description: Focusing Mirror X-translation upstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRXU + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_try: + description: Focusing Mirror Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:y + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trydr: + description: Focusing Mirror Y-translation downstream ring + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRYDR + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trydw: + description: Focusing Mirror Y-translation downstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRYDW + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_tryu: + description: Focusing Mirror Y-translation upstream wall + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRYU + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_yaw: + description: Focusing Mirror Yaw + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:yaw + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +hrm_rotx: + description: Harmonic Rejection Mirror X-Rotation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-HRM:ROX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +hrm_try: + description: Harmonic Rejection Mirror Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-HRM:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +ic1: + description: Ionization Chamber 1 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-ES1-SAI_01:MEAN + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +ic1_try: + description: Ionization Chamber 1 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-IC1:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +ic2: + description: Ionization Chamber 2 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-ES1-SAI_02:MEAN + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +ic2_try: + description: Ionization Chamber 2 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-IC2:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +ic3: + description: Ionization Chamber 3 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-ES1-SAI_03:MEAN + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +ic3_try: + description: Ionization Chamber 3 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-IC3:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +ic4: + description: Ionization Chamber 4 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-ES1-SAI_04:MEAN + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +manip_heavy_trx: + description: Heavy Sample Manipulator Motor X + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-PP1:MOT1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_heavy_try: + description: Heavy Sample Manipulator Motor Y + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-PP1:MOT2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_heavy_trz: + description: Heavy Sample Manipulator Motor Z + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-PP1:MOT3 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_rot: + description: Old Sample Manipulator Base rotation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:ROTY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_trx: + description: Old Sample Manipulator X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_try: + description: Old Sample Manipulator Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_trz: + description: Old Sample Manipulator Z - Along beam + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRZ + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_old_rot: + description: Old Sample Manipulator Base rotation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MA1:TRX2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_old_trx: + description: Old Sample Manipulator X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MA1:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_old_try: + description: Old Sample Manipulator Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MA1:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_old_trz: + description: Old Sample Manipulator Z - Along beam + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MA1:TRX1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_encoder_deg: + description: ROTX encoder of Mono converted to degrees + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-OP1-MO1:ENC-ROTXCalc.VAL + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +mono_encoder_raw: + description: ROTX encoder of Mono raw value + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-OP1-MO1:ENC-ROTX.RVAL + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +mono_energy: + description: Mono Energy + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-MO12-QEXAFS:E_TEST + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_rotx: + description: Monochromator 1 X-Rotation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP1-MO1:ROTX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_trx: + description: Monochromator 1 X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP1-MO1:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_try: + description: Monochromator 1 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP1-MO1:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_centerx: + description: Front-end slit diaphragm X-center + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:CENTERX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_centery: + description: Front-end slit diaphragm Y-center + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:CENTERY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_gapx: + description: Front-end slit diaphragm X-gap + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:GAPX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_gapy: + description: Front-end slit diaphragm Y-gap + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:GAPY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_trxr: + description: Front-end slit diaphragm 1 X-translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:TRXR + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_trxw: + description: Front-end slit diaphragm 2 X-translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:TRXW + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_tryb: + description: Front-end slit diaphragm 1 Y-translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:TRYB + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_tryt: + description: Front-end slit diaphragm 2 Y-translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:TRYT + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_kb_centerx: + description: KB slit axis X + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SH1:POSX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_kb_centery: + description: KB slit axis Y + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SV1:POSY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_kb_gapx: + description: KB slit axis X + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SH1:OPENX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_kb_gapy: + description: KB slit axis Y + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SV1:OPENY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_centerx: + description: Optics slit X-center + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SHtestCENTER + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_centery: + description: Optics slit Y-center + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SVcenter + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_gapx: + description: Optics slit X-gap + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SHsize + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_gapy: + description: Optics slit Y-gap + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SVsize + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_htr1: + description: Optics slit X-translation Ring + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SH1:TR1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_htr2: + description: Optics slit X-translation Wall + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SH1:TR2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_vtr1: + description: Optics slit Y-translation Up + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SV1:TR1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_vtr2: + description: Optics slit Y-translation Down + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SV1:TR2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +t_absorber1: + description: AbsorberTemperature 1 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-FE-ABS1-ETTC-0010:TEMP + enabled: false + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +table1_trx: + description: Experimental Table 1 X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-ET1:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +table1_try: + description: Experimental Table 1 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-ET1:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +table2_trx: + description: Experimental Table 2 X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES2-ET2:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +table2_try: + description: Experimental Table 2 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES2-ET2:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +trigger: + description: Trigger Card + deviceClass: superxas_bec.devices.trigger.Trigger + deviceConfig: + prefix: 'X10DA-ES1:' + enabled: true + onFailure: raise + readoutPriority: baseline + softwareTrigger: true +xrayeye_foc: + description: X-Ray Eye Fine Focus + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-XE1:FINFOC + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +xrayeye_zoom: + description: X-Ray Eye Zoom + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-XE1:ZOOM + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false diff --git a/superxas_bec/device_configs/x10da_config_250707.yaml b/superxas_bec/device_configs/x10da_config_250707.yaml new file mode 100644 index 0000000..e7b7959 --- /dev/null +++ b/superxas_bec/device_configs/x10da_config_250707.yaml @@ -0,0 +1,774 @@ +absorption_transmission: + deviceClass: ophyd_devices.ComputedSignal + deviceConfig: + compute_method: "def compute_signals(signal1, signal2):\n import math\n return\ + \ math.log(signal1.get()/signal2.get())\n" + input_signals: + - ic1 + - ic2 + enabled: false + readOnly: false + readoutPriority: monitored +bm2_tr1: + description: Beam Monitor 2 Translation 1 + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-BM2:TR1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +bm2_tr2: + description: Beam Monitor 2 Translation 2 + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-BM2:TR2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +bm3_tr1: + description: Beam Monitor 3 Translation 1 + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-BM3:TR1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +bm3_tr2: + description: Beam Monitor 3 Translation 2 + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-BM3:TR2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_bnd: + description: Collimating Mirror bender + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:BND + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_pitch: + description: Collimating Mirror Pitch + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:ROTX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_roll: + description: Collimating Mirror Roll + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:ROTZ + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trx: + description: Collimating Mirror X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:XTCP + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trxd: + description: Collimating Mirror X-translation downstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRXD + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trxu: + description: Collimating Mirror X-translation upstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRXU + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_try: + description: Collimating Mirror Point Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:YTCP + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trydr: + description: Collimating Mirror Y-translation downstream ring + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRYDR + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_trydw: + description: Collimating Mirror Y-translation downstream wall + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRYDW + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_tryu: + description: Collimating Mirror Y-translation upstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:TRYU + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +cm_yaw: + description: Collimating Mirror Yaw + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-CM:ROTY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +falcon: + description: Falcon Sitoro detector + deviceClass: superxas_bec.devices.falcon.FalconSuperXAS + deviceConfig: + prefix: 'X10DA-SITORO:' + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +filter_fe: + description: Front End Filter + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-FI:TRY1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_bnd: + description: Focusing Mirror bender + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRB + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_pitch: + description: Focusing Mirror Pitch + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:pitch + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_roll: + description: Focusing Mirror Roll + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:roll + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trx: + description: Focusing Mirror X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:trans + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trxd: + description: Focusing Mirror X-translation downstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRXD + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trxu: + description: Focusing Mirror X-translation upstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRXU + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_try: + description: Focusing Mirror Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:y + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trydr: + description: Focusing Mirror Y-translation downstream ring + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRYDR + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_trydw: + description: Focusing Mirror Y-translation downstream + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRYDW + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_tryu: + description: Focusing Mirror Y-translation upstream wall + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:TRYU + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +fm_yaw: + description: Focusing Mirror Yaw + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-MI1:yaw + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +hrm_rotx: + description: Harmonic Rejection Mirror X-Rotation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-HRM:ROX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +hrm_try: + description: Harmonic Rejection Mirror Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-HRM:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +ic1: + description: Ionization Chamber 1 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-ES1-SAI_01:MEAN + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +ic1_try: + description: Ionization Chamber 1 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-IC1:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +ic2: + description: Ionization Chamber 2 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-ES1-SAI_02:MEAN + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +ic2_try: + description: Ionization Chamber 2 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-IC2:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +ic3: + description: Ionization Chamber 3 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-ES1-SAI_03:MEAN + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +ic3_try: + description: Ionization Chamber 3 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-IC3:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +ic4: + description: Ionization Chamber 4 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-ES1-SAI_04:MEAN + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +manip_heavy_trx: + description: Heavy Sample Manipulator Motor X + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-PP1:MOT1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_heavy_try: + description: Heavy Sample Manipulator Motor Y + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-PP1:MOT2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_heavy_trz: + description: Heavy Sample Manipulator Motor Z + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-PP1:MOT3 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_rot: + description: Old Sample Manipulator Base rotation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:ROTY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_trx: + description: Old Sample Manipulator X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_try: + description: Old Sample Manipulator Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_trz: + description: Old Sample Manipulator Z - Along beam + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRZ + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_old_rot: + description: Old Sample Manipulator Base rotation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MA1:TRX2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_old_trx: + description: Old Sample Manipulator X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MA1:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_old_try: + description: Old Sample Manipulator Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MA1:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_old_trz: + description: Old Sample Manipulator Z - Along beam + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MA1:TRX1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_encoder_deg: + description: ROTX encoder of Mono converted to degrees + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-OP1-MO1:ENC-ROTXCalc.VAL + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +mono_encoder_raw: + description: ROTX encoder of Mono raw value + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-OP1-MO1:ENC-ROTX.RVAL + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +mono_energy: + description: Mono Energy + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-MO12-QEXAFS:E_TEST + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_rotx: + description: Monochromator 1 X-Rotation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP1-MO1:ROTX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_trx: + description: Monochromator 1 X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP1-MO1:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_try: + description: Monochromator 1 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP1-MO1:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_centerx: + description: Front-end slit diaphragm X-center + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:CENTERX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_centery: + description: Front-end slit diaphragm Y-center + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:CENTERY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_gapx: + description: Front-end slit diaphragm X-gap + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:GAPX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_gapy: + description: Front-end slit diaphragm Y-gap + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:GAPY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_trxr: + description: Front-end slit diaphragm 1 X-translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:TRXR + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_trxw: + description: Front-end slit diaphragm 2 X-translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:TRXW + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_tryb: + description: Front-end slit diaphragm 1 Y-translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:TRYB + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_fe_tryt: + description: Front-end slit diaphragm 2 Y-translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-FE-SLDI:TRYT + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_kb_centerx: + description: KB slit axis X + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SH1:POSX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_kb_centery: + description: KB slit axis Y + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SV1:POSY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_kb_gapx: + description: KB slit axis X + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SH1:OPENX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_kb_gapy: + description: KB slit axis Y + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SV1:OPENY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_centerx: + description: Optics slit X-center + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SHtestCENTER + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_centery: + description: Optics slit Y-center + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SVcenter + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_gapx: + description: Optics slit X-gap + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SHsize + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_gapy: + description: Optics slit Y-gap + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SVsize + enabled: false + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_htr1: + description: Optics slit X-translation Ring + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SH1:TR1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_htr2: + description: Optics slit X-translation Wall + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SH1:TR2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_vtr1: + description: Optics slit Y-translation Up + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SV1:TR1 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +slit_op_vtr2: + description: Optics slit Y-translation Down + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-OP-SV1:TR2 + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +t_absorber1: + description: AbsorberTemperature 1 + deviceClass: ophyd.EpicsSignalRO + deviceConfig: + auto_monitor: true + read_pv: X10DA-FE-ABS1-ETTC-0010:TEMP + enabled: false + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +table1_trx: + description: Experimental Table 1 X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-ET1:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +table1_try: + description: Experimental Table 1 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-ET1:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +table2_trx: + description: Experimental Table 2 X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES2-ET2:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +table2_try: + description: Experimental Table 2 Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES2-ET2:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +trigger: + description: Trigger Card + deviceClass: superxas_bec.devices.trigger.Trigger + deviceConfig: + prefix: 'X10DA-ES1:' + enabled: true + onFailure: raise + readoutPriority: baseline + softwareTrigger: true +xrayeye_foc: + description: X-Ray Eye Fine Focus + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-XE1:FINFOC + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +xrayeye_zoom: + description: X-Ray Eye Zoom + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-XE1:ZOOM + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +lasermir_rot: + description: Laser mirror + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES4-CRMO4:MOT2 + enabled: true + onFailure: retry + readoutPriority: monitored + softwareTrigger: false +lasermir_sw: + description: Laser mirror + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES4-CRMO4:MOT3 + enabled: true + onFailure: retry + readoutPriority: monitored + softwareTrigger: false \ No newline at end of file diff --git a/superxas_bec/device_configs/x10da_config_falcon_test.yaml b/superxas_bec/device_configs/x10da_config_falcon_test.yaml new file mode 100644 index 0000000..c785f88 --- /dev/null +++ b/superxas_bec/device_configs/x10da_config_falcon_test.yaml @@ -0,0 +1,63 @@ +falcon: + description: Falcon Sitoro detector + deviceClass: superxas_bec.devices.falcon.FalconSuperXAS + deviceConfig: + prefix: 'X10DA-SITORO:' + enabled: true + onFailure: raise + readoutPriority: monitored + softwareTrigger: false +manip_new_trx: + description: Old Sample Manipulator X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_try: + description: Old Sample Manipulator Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_trz: + description: Old Sample Manipulator Z - Along beam + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRZ + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_energy: + description: Mono Energy + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-MO12-QEXAFS:E_TEST + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +trigger: + description: Trigger Card + deviceClass: superxas_bec.devices.trigger.Trigger + deviceConfig: + prefix: 'X10DA-ES1:' + enabled: true + onFailure: raise + readoutPriority: baseline + softwareTrigger: true +kb_slit_y: + readoutPriority: baseline + description: KB slit axis Y + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-SV1:OPENY + onFailure: retry + enabled: true + softwareTrigger: false diff --git a/superxas_bec/device_configs/x10da_config_test.yaml b/superxas_bec/device_configs/x10da_config_test.yaml index a9171de..4265c4e 100644 --- a/superxas_bec/device_configs/x10da_config_test.yaml +++ b/superxas_bec/device_configs/x10da_config_test.yaml @@ -104,14 +104,14 @@ trigger: ##### Falcon detector ##### falcon: - readoutPriority: monitored description: Falcon Sitoro detector deviceClass: superxas_bec.devices.falcon.FalconSuperXAS deviceConfig: prefix: 'X10DA-SITORO:' + enabled: true onFailure: raise - enabled: True - softwareTrigger: False + readoutPriority: monitored + softwareTrigger: false diff --git a/superxas_bec/devices/falcon.py b/superxas_bec/devices/falcon.py index 1c12169..d42770b 100644 --- a/superxas_bec/devices/falcon.py +++ b/superxas_bec/devices/falcon.py @@ -1,14 +1,14 @@ -"""FALCON device implementation for SuperXAS""" +"""Module for Falcon detector at SuperXAS.""" import enum +import queue +import threading import numpy as np -from bec_lib.devicemanager import ScanInfo from bec_lib.logger import bec_logger from ophyd import Component as Cpt -from ophyd import DeviceStatus, Kind, Signal, StatusBase -from ophyd.status import SubscriptionStatus -from ophyd_devices.devices.dxp import EpicsDXPFalcon, EpicsMCARecord, Falcon +from ophyd import Device, EpicsSignal, EpicsSignalRO, Kind, SignalRO +from ophyd_devices import CompareStatus, DeviceStatus, PreviewSignal, StatusBase from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase logger = bec_logger.logger @@ -21,33 +21,24 @@ class FalconAcquiringStatus(int, enum.Enum): ACQUIRING = 1 -class DeadTimeCorrectedCounts(Signal): - """Signal to calculate dead time corrected counts""" +class DeadTimeCorrectedSignal(SignalRO): + """Signal for dead time corrected counts.""" - def __init__(self, name: str, channel: int, **kwargs): - """ - Initialize DeadTimeCorrectedCounts signal. + def __init__(self, name:str, *args, parent: Device | None = None, **kwargs): + super().__init__(name=name,*args, parent=parent,**kwargs) + self._dead_time = 1.182e-7 # Dead time in seconds - Args: - name (str): Name of the signal - channel (int): Channel number - """ - super().__init__(name=name, **kwargs) - self._channel = channel - self._dead_time = 1.182e-7 - - # pylint: disable=arguments-differ - def get(self) -> float: - """Get dead time corrected counts base on signals from dxp and mca of Falcon""" - dxp: EpicsDXPFalcon = getattr(self.parent, f"dxp{self._channel}") - mca: EpicsMCARecord = getattr(self.parent, f"mca{self._channel}") - - icr = dxp.input_count_rate.get() - ocr = dxp.output_count_rate.get() - roi = mca.rois.roi0.count.get() - ert = mca.elapsed_real_time.get() - print(icr, ocr, roi, ert) + def get(self, **kwargs) -> float | None: + icr = self.parent.icr.get() + ocr = self.parent.ocr.get() + roi = self.parent.roi.get() + ert = self.parent.ert.get() + return self.compute_deadtime_corrected_signal(icr, ocr, roi, ert) + def compute_deadtime_corrected_signal( + self, icr: float, ocr: float, roi: float, ert: float + ) -> float: + """Method to compute dead time corrected signal.""" if icr == 0 or ocr == 0: return 0 @@ -62,7 +53,7 @@ class DeadTimeCorrectedCounts(Signal): test_icr = true_icr n += 1 except Exception as e: # pylint: disable=broad-except - logger.info(f"Error in computation of signal {self.name}, error: {e}") + logger.info(f"Error in computation of deadtime corrected signal, error: {e}") return 0 # Return corrected roi counts @@ -72,60 +63,92 @@ class DeadTimeCorrectedCounts(Signal): return cor_roi_cnts -class FalconControl(Falcon): - """Falcon Control class at SuperXAS. prefix: 'X10DA-SITORO:'""" +class FalconControl(Device): + """Falcon Control class for SuperXAS. prefix: 'X10DA-SITORO:'""" - _default_read_attrs = Falcon._default_read_attrs + ( - "dxp1", - # # "dxp2", - "mca1", - # # "mca2", - "dead_time_cor_cnts1", - # # "dead_time_cor_cnts2", + # PVs for Falcon control + erase_start: EpicsSignal = Cpt( + EpicsSignal, "EraseStart", kind=Kind.omitted, doc="XMAP start signal" ) - _default_configuration_attrs = Falcon._default_configuration_attrs + ( - "dxp1", - # "dxp2", - "mca1", - # "mca2", - "dead_time_cor_cnts1", - # "dead_time_cor_cnts2", + stop_all: EpicsSignal = Cpt(EpicsSignal, "StopAll", kind=Kind.omitted, doc="XMAP stop signal") + acquiring: EpicsSignalRO = Cpt( + EpicsSignalRO, + "Acquiring", + kind=Kind.omitted, + auto_monitor=True, + doc="XMAP acquiring signal", + ) + # PVs for Signals, auto_monitors are active here + icr: EpicsSignalRO = Cpt( + EpicsSignalRO, + "dxp1:InputCountRate", + kind=Kind.normal, + auto_monitor=True, + doc="XMAP input count rate", + ) + ocr: EpicsSignalRO = Cpt( + EpicsSignalRO, + "dxp1:OutputCountRate", + kind=Kind.normal, + auto_monitor=True, + doc="XMAP output count rate", + ) + ert: EpicsSignalRO = Cpt( + EpicsSignalRO, + "mca1.ERTM", + kind=Kind.normal, + auto_monitor=True, + doc="XMAP elapsed real time", + ) + roi: EpicsSignalRO = Cpt( + EpicsSignalRO, "mca1.R0", kind=Kind.normal, auto_monitor=True, doc="XMAP ROI signal" + ) + label: EpicsSignalRO = Cpt(EpicsSignalRO, "mca1.R0NM", kind=Kind.config, doc="XMAP ROI label") + spectrum_val: EpicsSignalRO = Cpt( + EpicsSignalRO, "mca1.VAL", kind=Kind.omitted, doc="XMAP spectrum signal" ) - # DXP parameters - dxp1 = Cpt(EpicsDXPFalcon, "dxp1:") - # dxp2 = Cpt(EpicsDXPFalcon, "dxp2:") - - # MCA record with spectrum data - mca1 = Cpt(EpicsMCARecord, "mca1") - # mca2 = Cpt(EpicsMCARecord, "mca2") - - # Norm Signal - dead_time_cor_cnts1 = Cpt( - DeadTimeCorrectedCounts, name="dead_time_cor_cnts", channel=1, kind=Kind.hinted + # Configuration attributes + collect_mode: EpicsSignal = Cpt(EpicsSignal, "CollectMode", doc="Collect mode signal") + preset_real_time: EpicsSignal = Cpt( + EpicsSignal, "PresetReal", doc="Preset real time signal" + ) + + # Preview Signal for Falcon detector + spectrum: PreviewSignal = Cpt( + PreviewSignal, + name="spectrum", + ndim=1, + kind=Kind.omitted, + doc="Preview signal for Falcon detector spectrum", + ) + + # Computed signal for dead time corrected counts + dead_cor_roi0_count = Cpt( + DeadTimeCorrectedSignal, + kind=Kind.hinted, + doc="Dead time corrected ROI 0 count", ) - # dead_time_cor_cnts2 = Cpt(DeadTimeCorrectedCounts, name='dead_time_cor_cnts', channel=2, kind=Kind.normal) class FalconSuperXAS(PSIDeviceBase, FalconControl): - """Falcon implementierung at SuperXAS. prefix: 'X10DA-SITORO:'""" + """Slim Falcon implementation at SuperXAS. prefix: 'X10DA-SITORO:'""" - ######################################## - # Beamline Specific Implementations # - ######################################## + def __init__(self, *, name, prefix="", scan_info=None, device_manager=None, **kwargs): + super().__init__( + name=name, prefix=prefix, scan_info=scan_info, device_manager=device_manager, **kwargs + ) + self._pv_timeout = 5 # seconds + self._dead_time = 1.182e-7 # Dead time in seconds + self.update_queue: queue.Queue = queue.Queue() + self.current_values: dict = {} + self.update_thread: threading.Thread | None = None + self.threading_event = threading.Event() # Event to control the update thread + self.r_lock: threading.RLock = threading.RLock() # Lock for thread safety - def __init__(self, name: str, prefix: str = "", scan_info: ScanInfo | None = None, **kwargs): - """ - Initialize Falcon device. - - Args: - name (str): Name of the device - prefix (str): Prefix of the device - scan_info (ScanInfo): Information about the scan - **kwargs: Additional keyword arguments - """ - super().__init__(name=name, prefix=prefix, scan_info=scan_info, **kwargs) - self._pv_timeout = 1 + ######################################### + #### Custom beamline specific methods ### + ######################################### def on_init(self) -> None: """ @@ -135,40 +158,57 @@ class FalconSuperXAS(PSIDeviceBase, FalconControl): set default values on signals, please use on_connected instead. """ + def on_destroy(self): + """ + Called when the device is destroyed. + + This method can be used to clean up resources or stop threads. + """ + if self.update_thread and self.update_thread.is_alive(): + self.threading_event.set() + self.update_queue.put((None, None)) # Signal the thread to stop + self.update_thread.join(timeout=5) # Wait for the thread to finish + if self.update_thread.is_alive(): + logger.warning(f"Update thread for device {self.name} did not finish in 5s.") + self.update_thread = None + def on_connected(self) -> None: """ - Called after the device is connected and its signals are connected. - Default values for signals should be set here. + Upon being connected, make sure the Falcon is not acquiring. """ + status = CompareStatus(self.acquiring, FalconAcquiringStatus.DONE) + self.cancel_on_stop(status) + self.stop_all.put(1) + status.wait(timeout=self._pv_timeout) def on_stage(self) -> DeviceStatus | StatusBase | None: """ Called while staging the device. - Information about the upcoming scan can be accessed from the scan_info (self.scan_info.msg) object. + Information about the upcoming scan can be accessed self.scan_info.msg. """ - self.collect_mode.set(0).wait() - self.preset_real_time.set(0).wait() - self.stop_all.put(1) - if ( - self.wait_for_condition( - lambda: self.acquiring.get() == FalconAcquiringStatus.DONE, timeout=self._pv_timeout - ) - is False - ): - raise TimeoutError("Timeout on Falcon stage") + if self.acquiring.get() != FalconAcquiringStatus.DONE: + logger.info(f"Falcon state was {self.acquiring.get()} during stage. Calling stop_all") + status = CompareStatus(self.acquiring, FalconAcquiringStatus.DONE) + self.cancel_on_stop(status) + self.stop_all.put(1) + status.wait(timeout=self._pv_timeout) + + status_list = [] + status_list.append(self.collect_mode.set(0)) + status_list.append(self.preset_real_time.set(0)) + for status in status_list: + self.cancel_on_stop(status) + for status in status_list: + status.wait(timeout=self._pv_timeout) def on_unstage(self) -> DeviceStatus | StatusBase | None: """Called while unstaging the device.""" - self.stop_all.put(1) - self.erase_all.put(1) - if ( - self.wait_for_condition( - lambda: self.acquiring.get() == FalconAcquiringStatus.DONE, timeout=self._pv_timeout - ) - is False - ): - raise TimeoutError("Timeout on Falcon unstage") + if self.acquiring.get() != FalconAcquiringStatus.DONE: + status = CompareStatus(self.acquiring, FalconAcquiringStatus.DONE) + self.cancel_on_stop(status) + self.stop_all.put(1) + return status def on_pre_scan(self) -> DeviceStatus | StatusBase | None: """Called right before the scan starts on all devices automatically.""" @@ -185,20 +225,3 @@ class FalconSuperXAS(PSIDeviceBase, FalconControl): def on_stop(self) -> None: """Called when the device is stopped.""" self.stop_all.put(1) - - def _stop_erase_and_wait_for_acquiring(self) -> DeviceStatus: - """Method called from the Trigger card to reset counts on the Falcon""" - - if self.acquiring.get() != FalconAcquiringStatus.DONE: - self.stop_all.put(1) - - def _check_acquiriting(*, old_value, value, **kwargs): - if old_value == FalconAcquiringStatus.DONE and value == FalconAcquiringStatus.ACQUIRING: - return True - return False - - status = SubscriptionStatus(self.acquiring, _check_acquiriting) - - logger.info("Triggering Falcon") - self.erase_start.put(1) - return status diff --git a/superxas_bec/devices/falcon_ad.py b/superxas_bec/devices/falcon_ad.py new file mode 100644 index 0000000..22372db --- /dev/null +++ b/superxas_bec/devices/falcon_ad.py @@ -0,0 +1,131 @@ +"""FALCON device implementation for SuperXAS""" + +import enum + +from bec_lib.devicemanager import ScanInfo +from bec_lib.logger import bec_logger +from ophyd import Component as Cpt +from ophyd import DeviceStatus, EpicsSignalRO, Staged, StatusBase +from ophyd_devices import CompareStatus +from ophyd_devices.devices.dxp import EpicsDXPFalcon, EpicsMCARecord, Falcon +from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase + +logger = bec_logger.logger + + +class FalconAcquiringStatus(int, enum.Enum): + """Status of Falcon""" + + DONE = 0 + ACQUIRING = 1 + + +class FalconADControl(Falcon): + """Falcon Control class at SuperXAS. prefix: 'X10DA-SITORO:'""" + + acquiring = Cpt(EpicsSignalRO, "Acquiring", auto_monitor=True, kind="omitted") + # DXP parameters + dxp1 = Cpt(EpicsDXPFalcon, "dxp1:") + + # MCA record with spectrum data + mca1 = Cpt(EpicsMCARecord, "mca1") + + +class FalconAD(PSIDeviceBase, FalconADControl): + """Falcon implementierung at SuperXAS. prefix: 'X10DA-SITORO:'""" + + ######################################## + # Beamline Specific Implementations # + ######################################## + + def __init__( + self, + name: str, + prefix: str = "", + scan_info: ScanInfo | None = None, + device_manager=None, + **kwargs, + ): + """ + Initialize Falcon device. + + Args: + name (str): Name of the device + prefix (str): Prefix of the device + scan_info (ScanInfo): Information about the scan + **kwargs: Additional keyword arguments + """ + super().__init__( + name=name, prefix=prefix, scan_info=scan_info, device_manager=device_manager, **kwargs + ) + self.device_manager = device_manager + self._pv_timeout = 5 + + def on_init(self) -> None: + """ + Called when the device is initialized. + + No signals are connected at this point. If you like to + set default values on signals, please use on_connected instead. + """ + + def on_connected(self) -> None: + """ + Called after the device is connected and its signals are connected. + Default values for signals should be set here. + """ + status = CompareStatus(self.acquiring, FalconAcquiringStatus.DONE) + self.cancel_on_stop(status) + self.stop_all.put(1) + status.wait(timeout=self._pv_timeout) + + # TODO Skip AD stage command (trigger_value) for now! + def stage(self) -> list[object] | DeviceStatus | StatusBase: # type: ignore + """Stage the device.""" + if self.staged != Staged.no: + return [self] + self.stopped = False + status = self.on_stage() # pylint: disable=assignment-from-no-return + if isinstance(status, StatusBase): + return status + return [self] + + def on_stage(self) -> DeviceStatus | StatusBase | None: + """ + Called while staging the device. + + Information about the upcoming scan can be accessed from the scan_info (self.scan_info.msg) object. + """ + if self.acquiring.get() != FalconAcquiringStatus.DONE: + logger.info(f"Falcon state was {self.acquiring.get()} during stage. Calling stop_all") + status = CompareStatus(self.acquiring, FalconAcquiringStatus.DONE) + self.cancel_on_stop(status) + self.stop_all.put(1) + status.wait(timeout=self._pv_timeout) + + self.collect_mode.set(0).wait(timeout=self._pv_timeout) + self.preset_real_time.set(0).wait(timeout=self._pv_timeout) + + def on_unstage(self) -> DeviceStatus | StatusBase | None: + """Called while unstaging the device.""" + if self.acquiring.get() != FalconAcquiringStatus.DONE: + self.stop_all.put(1) + status = CompareStatus(self.acquiring, FalconAcquiringStatus.DONE) + self.cancel_on_stop(status) + return status + + def on_pre_scan(self) -> DeviceStatus | StatusBase | None: + """Called right before the scan starts on all devices automatically.""" + + def on_trigger(self) -> DeviceStatus | StatusBase | None: + """Called when the device is triggered.""" + + def on_complete(self) -> DeviceStatus | StatusBase | None: + """Called to inquire if a device has completed a scans.""" + + def on_kickoff(self) -> DeviceStatus | StatusBase | None: + """Called to kickoff a device for a fly scan. Has to be called explicitly.""" + + def on_stop(self) -> None: + """Called when the device is stopped.""" + self.stop_all.put(1) diff --git a/superxas_bec/devices/trigger.py b/superxas_bec/devices/trigger.py index 21e7c06..a31bd55 100644 --- a/superxas_bec/devices/trigger.py +++ b/superxas_bec/devices/trigger.py @@ -1,16 +1,19 @@ """SuperXAS Trigger Device""" +import enum +import time + +from bec_lib.devicemanager import ScanInfo from bec_lib.logger import bec_logger from ophyd import Component as Cpt from ophyd import Device, DeviceStatus, EpicsSignal, EpicsSignalRO, Kind, StatusBase +from ophyd_devices import CompareStatus, TransitionStatus +from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase + +from superxas_bec.devices.falcon import FalconAcquiringStatus, FalconSuperXAS logger = bec_logger.logger -import enum - -from bec_lib.devicemanager import ScanInfo -from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase - class ContinuousSamplingMode(int, enum.Enum): """Options for start_csmpl signal""" @@ -36,14 +39,22 @@ class TriggerControl(Device): doc="Number of cycles (multiplies by 0.2s)", ) start_csmpl = Cpt( - EpicsSignal, suffix="START-CSMPL", kind=Kind.config, doc="Continous sampling mode on/off" + EpicsSignal, + suffix="START-CSMPL", + kind=Kind.config, + doc="Continous sampling mode on/off", + put_complete=True, ) smpl = Cpt( EpicsSignal, suffix="SMPL", kind=Kind.config, doc="Sampling Trigger if cont mode is off" ) smpl_done = Cpt( - EpicsSignalRO, suffix="SMPL-DONE", kind=Kind.config, doc="Done status of trigger" - ) + EpicsSignalRO, + suffix="SMPL-DONE", + kind=Kind.config, + auto_monitor=True, + doc="Done status of trigger", + ) # Status PV updates need to be monitored as we wait and react for changes class Trigger(PSIDeviceBase, TriggerControl): @@ -59,7 +70,8 @@ class Trigger(PSIDeviceBase, TriggerControl): ): super().__init__(name=name, prefix=prefix, scan_info=scan_info, **kwargs) self.device_manager = device_manager - self._pv_timeout = 1 + self._pv_timeout = 5 + self._trigger_index = 0 ######################################## # Beamline Specific Implementations # @@ -87,41 +99,54 @@ class Trigger(PSIDeviceBase, TriggerControl): """ self.start_csmpl.set(ContinuousSamplingMode.OFF).wait(timeout=self._pv_timeout) exp_time = self.scan_info.msg.scan_parameters["exp_time"] - if self.scan_info.msg.scan_name != "exafs_scan": - self.set_exposure_time(exp_time).wait() + self._trigger_index = 0 + if self.scan_info.msg.scan_name != "exafs_scan": # TODO + self.set_exposure_time(exp_time).wait(self._pv_timeout) def on_unstage(self) -> DeviceStatus | StatusBase | None: """Called while unstaging the device.""" - status = self.start_csmpl.set(ContinuousSamplingMode.ON) + status = self.start_csmpl.set(ContinuousSamplingMode.ON).wait(timeout=self._pv_timeout) return status def on_pre_scan(self) -> DeviceStatus | StatusBase | None: """Called right before the scan starts on all devices automatically.""" def on_trigger(self) -> DeviceStatus | StatusBase | None: - """Called when the device is triggered.""" + """ + Called when the device is triggered. + If Falcon is present in the device manager, it will also wait for the Falcon to be ready for acquiring, + and then wait for the Falcon to be done with acquiring. This is to ensure that data of PVs is updated + and the sampling is done before data is being read from the device. + """ + if self.scan_info.msg.scan_name == "exafs_scan": + exp_time = self.scan_info.msg.scan_parameters["integ_time"][self._trigger_index] + self._trigger_index += 1 + self.set_exposure_time(exp_time).wait() + time_started = time.time() + logger.info(f"Triggering device {self.name} at {time_started}") + falcon = self.device_manager.devices.get("falcon", None) - - if falcon is not None: - # pylint: disable=protected-access - status = falcon._stop_erase_and_wait_for_acquiring() - status.wait() - - started = False - - def _sampling_done(): - nonlocal started - if not started and self.smpl_done.get() == SamplingDone.RUNNING: - started = True - return False - if started and self.smpl_done.get() == SamplingDone.DONE: - return True - - return self.smpl_done.get() == SamplingDone.DONE - + if falcon is not None and falcon.enabled is True: + falcon: FalconSuperXAS + status = CompareStatus(falcon.acquiring, FalconAcquiringStatus.ACQUIRING) + self.cancel_on_stop(status) + falcon.erase_start.put(1) + status.wait(timeout=self._pv_timeout) + time.sleep(0.4) + status_smpl = TransitionStatus(self.smpl_done, [SamplingDone.RUNNING, SamplingDone.DONE]) + logger.info(f"Triggering sampling for {self.name} at {time.time() - time_started}") self.smpl.put(1) - status = self.task_handler.submit_task(_sampling_done, run=True) - return status + self.cancel_on_stop(status_smpl) + status_smpl.wait(timeout=self._pv_timeout) + logger.info(f"Sampling done for {self.name} at {time.time() - time_started}") + if falcon is not None and falcon.enabled is True: + time.sleep(0.4) # Simulate some processing time + status = CompareStatus(falcon.acquiring, FalconAcquiringStatus.DONE) + self.cancel_on_stop(status) + falcon.stop_all.put(1) + status.wait(timeout=self._pv_timeout) + time.sleep(0.4) # Simulate some processing time + return status_smpl def on_complete(self) -> DeviceStatus | StatusBase | None: """Called to inquire if a device has completed a scans.""" @@ -131,9 +156,9 @@ class Trigger(PSIDeviceBase, TriggerControl): def on_stop(self) -> None: """Called when the device is stopped.""" - self.task_handler.shutdown() def set_exposure_time(self, value: float) -> DeviceStatus: """Utility method to set exposure time complying to device logic with cycle of min 0.2s.""" cycles = max(int(value * 5), 1) + logger.info(f"Device {self.name} set exp_time to {value} with N cycles: {cycles}") return self.total_cycles.set(cycles) diff --git a/superxas_bec/scans/exafs_scan.py b/superxas_bec/scans/exafs_scan.py index a73e0f2..6f463c1 100644 --- a/superxas_bec/scans/exafs_scan.py +++ b/superxas_bec/scans/exafs_scan.py @@ -39,7 +39,7 @@ class EXAFSScan(ScanBase): self.k_step_conversion = 3.81 self._check_and_upated_input_arguments() if motor is None: - default_motor = "kb_slit_y" + default_motor = "mono_energy" motor = default_motor # TODO Remove that motor, put energy of mono self.motor = motor super().__init__(exp_time=0, relative=False, settling_time=settling_time, **kwargs) diff --git a/tests/tests_devices/test_devices_falcon.py b/tests/tests_devices/test_devices_falcon.py index edea7f0..c6e7300 100644 --- a/tests/tests_devices/test_devices_falcon.py +++ b/tests/tests_devices/test_devices_falcon.py @@ -28,10 +28,10 @@ def falcon(): def test_devices_falcon(falcon): """Test init and on_connected methods of Falcon device""" - + falcon.acquiring._read_pv.mock_data = FalconAcquiringStatus.DONE assert falcon.prefix == "X10DA-SITORO:" assert falcon.name == "falcon" - assert falcon._pv_timeout == 1 + assert falcon._pv_timeout == 5 falcon.on_connected() @@ -41,17 +41,15 @@ def test_devices_falcon_stage(falcon): falcon.collect_mode.put(1) falcon.preset_real_time.put(1) falcon.stop_all.put(0) - falcon.acquiring.put(FalconAcquiringStatus.DONE) + falcon.acquiring._read_pv.mock_data = FalconAcquiringStatus.DONE # Should resolve with that status falcon.on_stage() assert falcon.collect_mode.get() == 0 assert falcon.preset_real_time.get() == 0 - assert falcon.stop_all.get() == 1 # Should timeout - falcon.acquiring.put(FalconAcquiringStatus.ACQUIRING) - falcon._pv_timeout = 0.1 - with pytest.raises(TimeoutError): - falcon.on_stage() + falcon.acquiring._read_pv.mock_data = FalconAcquiringStatus.ACQUIRING + falcon.on_stage() + assert falcon.stop_all.get() == 1 def test_devices_falcon_unstage(falcon):