fix(ddg): Fix tests
CI for csaxs_bec / test (pull_request) Successful in 1m56s
CI for csaxs_bec / test (push) Successful in 1m57s

This commit was merged in pull request #166.
This commit is contained in:
2026-03-13 14:19:41 +01:00
parent 1eb2961b7f
commit 7c89086ba2
3 changed files with 14 additions and 18 deletions
@@ -217,7 +217,7 @@ class DDG1(PSIDeviceBase, DelayGeneratorCSAXS):
# in the IOC to the expected values. In the past, we've experienced that IOC and HW can go out
# of sync.
self.burst_delay.put(1)
time.sleep(0.02) # Give HW time to process
time.sleep(0.02) # Give HW time to process
self.burst_delay.put(0)
time.sleep(0.02)
@@ -226,11 +226,10 @@ class DDG1(PSIDeviceBase, DelayGeneratorCSAXS):
self.burst_count.put(1)
time.sleep(0.02)
self.burst_mode.put(0)
time.sleep(0.02)
self.burst_mode.put(1)
time.sleep(0.02)
self.burst_mode.put(0)
time.sleep(0.02)
def keep_shutter_open_during_scan(self, open: True) -> None:
"""
@@ -309,15 +308,11 @@ class DDG1(PSIDeviceBase, DelayGeneratorCSAXS):
# c/t0 + self._shutter_to_open_delay + exp_time * burst_count
# SHUTTER WIDTH timing consists of the delay for the shutter to open
# + the exposure time * frames per trigger
shutter_width = (
self._shutter_to_open_delay + exp_time * frames_per_trigger
)
shutter_width = self._shutter_to_open_delay + exp_time * frames_per_trigger
# TOTAL EXPOSURE accounts for the shutter to open AND close. In addition, we add
# a short additional delay of 3e-6 to allow for the extra trigger through 'ef'
# a short additional delay of 3e-6 to allow for the extra trigger through 'ef'
# (delay of 1e-6, width of 1e-6)
total_exposure_time = (
2*self._shutter_to_open_delay + exp_time*frames_per_trigger + 3e-6
)
total_exposure_time = 2 * self._shutter_to_open_delay + exp_time * frames_per_trigger + 3e-6
if self.burst_period.get() != shutter_width:
# The burst_period has to be slightly longer
self.burst_period.put(total_exposure_time)
@@ -29,6 +29,7 @@ from ophyd_devices import DeviceStatus, StatusBase
from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase
from csaxs_bec.devices.epics.delay_generator_csaxs.delay_generator_csaxs import (
BURSTCONFIG,
CHANNELREFERENCE,
OUTPUTPOLARITY,
STATUSBITS,
@@ -37,7 +38,6 @@ from csaxs_bec.devices.epics.delay_generator_csaxs.delay_generator_csaxs import
ChannelConfig,
DelayGeneratorCSAXS,
LiteralChannels,
BURSTCONFIG,
)
logger = bec_logger.logger
@@ -142,7 +142,7 @@ class DDG2(PSIDeviceBase, DelayGeneratorCSAXS):
# in the IOC to the expected values. In the past, we've experienced that IOC and HW can go out
# of sync.
self.burst_delay.put(1)
time.sleep(0.02) # Give HW time to process
time.sleep(0.02) # Give HW time to process
self.burst_delay.put(0)
time.sleep(0.02)
@@ -151,10 +151,10 @@ class DDG2(PSIDeviceBase, DelayGeneratorCSAXS):
self.burst_count.put(1)
time.sleep(0.02)
self.burst_mode.put(0)
time.sleep(0.02)
self.burst_mode.put(1)
time.sleep(0.02)
self.burst_mode.put(0)
time.sleep(0.02)
def on_stage(self) -> DeviceStatus | StatusBase | None:
"""
@@ -287,19 +287,20 @@ def test_ddg1_stage(mock_ddg1: DDG1):
mock_ddg1.stage()
shutter_width = mock_ddg1._shutter_to_open_delay + exp_time * frames_per_trigger
total_exposure = 2 * mock_ddg1._shutter_to_open_delay + exp_time * frames_per_trigger + 3e-6
assert np.isclose(mock_ddg1.burst_mode.get(), 1) # burst mode is enabled
assert np.isclose(mock_ddg1.burst_delay.get(), 0)
assert np.isclose(mock_ddg1.burst_period.get(), shutter_width)
assert np.isclose(mock_ddg1.burst_period.get(), total_exposure)
# Trigger DDG2 through EXT/EN
assert np.isclose(mock_ddg1.ab.delay.get(), 2e-3)
assert np.isclose(mock_ddg1.ab.width.get(), 1e-6)
assert np.isclose(mock_ddg1.ab.width.get(), shutter_width)
# Shutter channel cd
assert np.isclose(mock_ddg1.cd.delay.get(), 0)
assert np.isclose(mock_ddg1.cd.width.get(), shutter_width)
# MCS channel ef or gate
assert np.isclose(mock_ddg1.ef.delay.get(), 0)
assert np.isclose(mock_ddg1.ef.delay.get(), 1e-6)
assert np.isclose(mock_ddg1.ef.width.get(), 1e-6)
assert mock_ddg1.staged == ophyd.Staged.yes