WIP: Draft: Feat/updates from the beamline june25 #12

Draft
appel_c wants to merge 42 commits from feat/updates_from_the_beamline_june25 into main
11 changed files with 2043 additions and 159 deletions

View File

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

55
bin/test_falcon.py Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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