Skip to content

Commit 0859ff2

Browse files
committed
Use prepare_exposures() helper when preparing the ophyd-async detectors.
1 parent 0f2cb67 commit 0859ff2

3 files changed

Lines changed: 32 additions & 53 deletions

File tree

src/haven/devices/detectors/_lambda.py

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
from ophyd_async.epics.adcore import (
1515
ADArmLogic,
1616
ADBaseIO,
17-
ADImageMode,
1817
ADWriterType,
1918
AreaDetector,
2019
NDPluginBaseIO,
20+
prepare_exposures,
2121
)
2222
from ophyd_async.epics.core import epics_signal_rw, epics_signal_rw_rbv
2323

@@ -65,20 +65,14 @@ class LambdaTriggerLogic(DetectorTriggerLogic):
6565
driver: ADBaseIO
6666

6767
def get_deadtime(self, exposure: float | None) -> float:
68-
# From manual: No readout time in 12-bit, 6-bit and1-bit mode,
68+
# From manual: No readout time in 12-bit, 6-bit and 1-bit mode,
6969
# 1 ms in 24-bit mode
7070
return 1e-3
7171

72-
async def prepare_common(self, num: int) -> None:
73-
await asyncio.gather(
74-
self.driver.num_images.set(num),
75-
self.driver.image_mode.set(ADImageMode.MULTIPLE),
76-
)
77-
7872
async def prepare_level(self, num: int) -> None:
7973
task = asyncio.ensure_future(
8074
asyncio.gather(
81-
self.prepare_common(num=num),
75+
prepare_exposures(self.driver, num),
8276
self.driver.trigger_mode.set(LambdaTriggerMode.EXTERNAL_SEQUENCE),
8377
)
8478
)
@@ -88,16 +82,10 @@ async def prepare_level(self, num: int) -> None:
8882
async def prepare_internal(
8983
self, num: int, livetime: float, deadtime: float
9084
) -> None:
91-
task = asyncio.ensure_future(
92-
asyncio.gather(
93-
self.prepare_common(num=num),
94-
self.driver.trigger_mode.set(LambdaTriggerMode.INTERNAL),
95-
self.driver.acquire_time.set(livetime),
96-
self.driver.acquire_period.set(livetime + deadtime),
97-
)
85+
await asyncio.gather(
86+
self.driver.trigger_mode.set(LambdaTriggerMode.INTERNAL),
87+
prepare_exposures(self.driver, num, livetime, deadtime),
9888
)
99-
await self._wait_for_num_images(num)
100-
await task
10189

10290
async def _wait_for_num_images(self, num: int):
10391
"""Make sure the number of frames is set properly (not too high)"""

src/haven/devices/detectors/eiger.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1+
import asyncio
12
from collections.abc import Sequence
23
from dataclasses import dataclass
34

45
from ophyd_async.core import DetectorTriggerLogic, PathProvider, SignalR
56
from ophyd_async.epics import adcore
6-
from ophyd_async.epics.adcore import ADBaseIO, ADWriterType, AreaDetector
7+
from ophyd_async.epics.adcore import (
8+
ADBaseIO,
9+
ADWriterType,
10+
AreaDetector,
11+
prepare_exposures,
12+
)
713

814
# from ophyd_async.epics.adcore._utils import ADBaseDataType, convert_ad_dtype_to_np
915
from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv
@@ -36,6 +42,13 @@ def get_deadtime(self, exposure: float | None) -> float:
3642
# keV threshold energy. Set it to 10× to be safe.
3743
return 3e-5
3844

45+
async def prepare_internal(
46+
self, num: int, livetime: float, deadtime: float
47+
) -> None:
48+
await asyncio.gather(
49+
prepare_exposures(self.driver, num, livetime, deadtime),
50+
)
51+
3952

4053
class EigerDetector(AreaDetector):
4154
"""An Eiger area detector, e.g. Eiger 500K."""

src/haven/devices/detectors/xspress.py

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323

2424
import numpy as np
2525
from ophyd_async.core import (
26-
DEFAULT_TIMEOUT,
2726
Array1D,
2827
AsyncStatus,
2928
DetectorTrigger,
@@ -35,20 +34,19 @@
3534
StrictEnum,
3635
TriggerInfo,
3736
derived_signal_r,
38-
observe_value,
3937
soft_signal_r_and_setter,
4038
)
4139
from ophyd_async.epics.adcore import (
4240
ADArmLogic,
4341
ADBaseDataType,
4442
ADBaseIO,
45-
ADImageMode,
4643
ADWriterType,
4744
AreaDetector,
4845
NDAttributeDataType,
4946
NDAttributeParam,
5047
NDPluginBaseIO,
5148
ndattributes_to_xml,
49+
prepare_exposures,
5250
)
5351
from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_x
5452

@@ -102,43 +100,23 @@ def get_deadtime(self, exposure: float) -> float:
102100
return 1e-6
103101

104102
async def prepare_common(self, num: int):
105-
await asyncio.gather(
106-
self.driver.num_images.set(num),
107-
self.driver.image_mode.set(ADImageMode.MULTIPLE),
108-
# Hardware deadtime correction is not reliable
109-
# https://github.com/epics-modules/xspress3/issues/57
110-
self.driver.deadtime_correction.set(False),
111-
)
103+
# Hardware deadtime correction is not reliable
104+
# https://github.com/epics-modules/xspress3/issues/57
105+
await self.driver.deadtime_correction.set(False)
112106

113107
async def prepare_internal(self, num: int, livetime: float, deadtime: float):
114-
task = asyncio.ensure_future(
115-
asyncio.gather(
116-
self.prepare_common(num),
117-
self.driver.trigger_mode.set(XspressTriggerMode.INTERNAL),
118-
)
108+
await asyncio.gather(
109+
self.prepare_common(num),
110+
prepare_exposures(self.driver, num, livetime, deadtime),
111+
self.driver.trigger_mode.set(XspressTriggerMode.INTERNAL),
119112
)
120-
# Make sure the number of frames is set properly (not too high)
121-
async for num_images in observe_value(
122-
self.driver.num_images, done_timeout=DEFAULT_TIMEOUT
123-
):
124-
if num_images == num:
125-
break
126-
await task
127113

128114
async def prepare_level(self, num: int):
129-
task = asyncio.ensure_future(
130-
asyncio.gather(
131-
self.prepare_common(num),
132-
self.driver.trigger_mode.set(XspressTriggerMode.TTL_VETO_ONLY),
133-
)
115+
await asyncio.gather(
116+
self.prepare_common(num),
117+
prepare_exposures(self.driver, num),
118+
self.driver.trigger_mode.set(XspressTriggerMode.TTL_VETO_ONLY),
134119
)
135-
# Make sure the number of frames is set properly (not too high)
136-
async for num_images in observe_value(
137-
self.driver.num_images, done_timeout=DEFAULT_TIMEOUT
138-
):
139-
if num_images == num:
140-
break
141-
await task
142120

143121

144122
class XspressElement(Device):

0 commit comments

Comments
 (0)