Skip to content

Commit 20197e7

Browse files
authored
Update ADCore to match ADAravis (#807)
* Add to docstrings and change enum names * Fix test and rename ImageMode references * Amend references to old enum names * Revert to ND identifier
1 parent f50f67d commit 20197e7

File tree

14 files changed

+69
-28
lines changed

14 files changed

+69
-28
lines changed

src/ophyd_async/epics/adandor/_andor_controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ async def prepare(self, trigger_info: TriggerInfo):
3434
self.driver.num_images.set(
3535
trigger_info.total_number_of_triggers or _MAX_NUM_IMAGE
3636
),
37-
self.driver.image_mode.set(adcore.ImageMode.MULTIPLE),
37+
self.driver.image_mode.set(adcore.ADImageMode.MULTIPLE),
3838
)
3939

4040
def _get_trigger_mode(self, trigger: DetectorTrigger) -> Andor2TriggerMode:

src/ophyd_async/epics/adaravis/_aravis_controller.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ async def prepare(self, trigger_info: TriggerInfo) -> None:
3636
raise ValueError(f"ADAravis does not support {trigger_info.trigger}")
3737

3838
if trigger_info.total_number_of_triggers == 0:
39-
image_mode = adcore.ImageMode.CONTINUOUS
39+
image_mode = adcore.ADImageMode.CONTINUOUS
4040
else:
41-
image_mode = adcore.ImageMode.MULTIPLE
41+
image_mode = adcore.ADImageMode.MULTIPLE
4242
await asyncio.gather(
4343
self.driver.num_images.set(trigger_info.total_number_of_triggers),
4444
self.driver.image_mode.set(image_mode),

src/ophyd_async/epics/adcore/__init__.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
"""Core components of the areaDetector software.
2+
3+
https://github.com/areaDetector/ADCore
4+
"""
5+
16
from ._core_detector import AreaDetector
27
from ._core_io import (
38
ADBaseDatasetDescriber,
@@ -19,8 +24,8 @@
1924
from ._tiff_writer import ADTIFFWriter
2025
from ._utils import (
2126
ADBaseDataType,
22-
FileWriteMode,
23-
ImageMode,
27+
ADFileWriteMode,
28+
ADImageMode,
2429
NDAttributeDataType,
2530
NDAttributeParam,
2631
NDAttributePv,
@@ -48,8 +53,8 @@
4853
"ADJPEGWriter",
4954
"SingleTriggerDetector",
5055
"ADBaseDataType",
51-
"FileWriteMode",
52-
"ImageMode",
56+
"ADFileWriteMode",
57+
"ADImageMode",
5358
"NDAttributePv",
5459
"NDAttributeParam",
5560
"NDAttributeDataType",

src/ophyd_async/epics/adcore/_core_io.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from ophyd_async.core import DatasetDescriber, SignalR, SignalRW, StrictEnum
55
from ophyd_async.epics.core import EpicsDevice, PvSuffix
66

7-
from ._utils import ADBaseDataType, FileWriteMode, ImageMode, convert_ad_dtype_to_np
7+
from ._utils import ADBaseDataType, ADFileWriteMode, ADImageMode, convert_ad_dtype_to_np
88

99

1010
class ADCallbacks(StrictEnum):
@@ -13,6 +13,12 @@ class ADCallbacks(StrictEnum):
1313

1414

1515
class NDArrayBaseIO(EpicsDevice):
16+
"""Class responsible for passing detector data from drivers to pluglins.
17+
18+
This mirrors the interface provided by ADCore/db/NDArrayBase.template.
19+
See HTML docs at https://areadetector.github.io/areaDetector/ADCore/NDArray.html
20+
"""
21+
1622
unique_id: A[SignalR[int], PvSuffix("UniqueId_RBV")]
1723
nd_attributes_file: A[SignalRW[str], PvSuffix("NDAttributesFile")]
1824
acquire: A[SignalRW[bool], PvSuffix.rbv("Acquire")]
@@ -40,6 +46,12 @@ async def shape(self) -> tuple[int, int]:
4046

4147

4248
class NDPluginBaseIO(NDArrayBaseIO):
49+
"""Base class from which plugins are derived.
50+
51+
This mirrors the interface provided by ADCore/db/NDPluginBase.template.
52+
See HTML docs at https://areadetector.github.io/areaDetector/ADCore/NDPluginDriver.html
53+
"""
54+
4355
nd_array_port: A[SignalRW[str], PvSuffix.rbv("NDArrayPort")]
4456
enable_callbacks: A[SignalRW[ADCallbacks], PvSuffix.rbv("EnableCallbacks")]
4557
nd_array_address: A[SignalRW[int], PvSuffix.rbv("NDArrayAddress")]
@@ -49,7 +61,11 @@ class NDPluginBaseIO(NDArrayBaseIO):
4961

5062

5163
class NDPluginStatsIO(NDPluginBaseIO):
52-
"""Plugin for computing statistics from an image or ROI within an image."""
64+
"""Plugin for computing statistics from an image or ROI within an image.
65+
66+
This mirrors the interface provided by ADCore/db/NDStats.template.
67+
See HTML docs at https://areadetector.github.io/areaDetector/ADCore/NDPluginStats.html
68+
"""
5369

5470
# Basic statistics
5571
compute_statistics: A[SignalRW[bool], PvSuffix.rbv("ComputeStatistics")]
@@ -91,10 +107,16 @@ class ADState(StrictEnum):
91107

92108

93109
class ADBaseIO(NDArrayBaseIO):
110+
"""Base class from which areaDetector drivers are derived.
111+
112+
This mirrors the interface provided by ADCore/db/ADBase.template.
113+
See HTML docs at https://areadetector.github.io/areaDetector/ADCore/ADDriver.html
114+
"""
115+
94116
acquire_time: A[SignalRW[float], PvSuffix.rbv("AcquireTime")]
95117
acquire_period: A[SignalRW[float], PvSuffix.rbv("AcquirePeriod")]
96118
num_images: A[SignalRW[int], PvSuffix.rbv("NumImages")]
97-
image_mode: A[SignalRW[ImageMode], PvSuffix.rbv("ImageMode")]
119+
image_mode: A[SignalRW[ADImageMode], PvSuffix.rbv("ImageMode")]
98120
detector_state: A[SignalR[ADState], PvSuffix("DetectorState_RBV")]
99121

100122

@@ -110,14 +132,20 @@ class ADCompression(StrictEnum):
110132

111133

112134
class NDFileIO(NDPluginBaseIO):
135+
"""Base class from which file plugins are derived.
136+
137+
This mirrors the interface provided by ADCore/db/NDFile.template.
138+
See HTML docs at https://areadetector.github.io/areaDetector/ADCore/NDPluginFile.html
139+
"""
140+
113141
file_path: A[SignalRW[str], PvSuffix.rbv("FilePath")]
114142
file_name: A[SignalRW[str], PvSuffix.rbv("FileName")]
115143
file_path_exists: A[SignalR[bool], PvSuffix("FilePathExists_RBV")]
116144
file_template: A[SignalRW[str], PvSuffix.rbv("FileTemplate")]
117145
full_file_name: A[SignalR[str], PvSuffix("FullFileName_RBV")]
118146
file_number: A[SignalRW[int], PvSuffix("FileNumber")]
119147
auto_increment: A[SignalRW[bool], PvSuffix("AutoIncrement")]
120-
file_write_mode: A[SignalRW[FileWriteMode], PvSuffix.rbv("FileWriteMode")]
148+
file_write_mode: A[SignalRW[ADFileWriteMode], PvSuffix.rbv("FileWriteMode")]
121149
num_capture: A[SignalRW[int], PvSuffix.rbv("NumCapture")]
122150
num_captured: A[SignalR[int], PvSuffix("NumCaptured_RBV")]
123151
capture: A[SignalRW[bool], PvSuffix.rbv("Capture")]
@@ -127,6 +155,12 @@ class NDFileIO(NDPluginBaseIO):
127155

128156

129157
class NDFileHDFIO(NDFileIO):
158+
"""Plugin for storing data in HDF5 file format.
159+
160+
This mirrors the interface provided by ADCore/db/NDFileHDF5.template.
161+
See HTML docs at https://areadetector.github.io/areaDetector/ADCore/NDFileHDF5.html
162+
"""
163+
130164
position_mode: A[SignalRW[bool], PvSuffix.rbv("PositionMode")]
131165
compression: A[SignalRW[ADCompression], PvSuffix.rbv("Compression")]
132166
num_extra_dims: A[SignalRW[int], PvSuffix.rbv("NumExtraDims")]

src/ophyd_async/epics/adcore/_core_logic.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
)
1212

1313
from ._core_io import ADBaseIO, ADState
14-
from ._utils import ImageMode, stop_busy_record
14+
from ._utils import ADImageMode, stop_busy_record
1515

1616
# Default set of states that we should consider "good" i.e. the acquisition
1717
# is complete and went well
@@ -44,7 +44,7 @@ async def prepare(self, trigger_info: TriggerInfo) -> None:
4444
)
4545
await asyncio.gather(
4646
self.driver.num_images.set(trigger_info.total_number_of_triggers),
47-
self.driver.image_mode.set(ImageMode.MULTIPLE),
47+
self.driver.image_mode.set(ADImageMode.MULTIPLE),
4848
)
4949

5050
async def arm(self):

src/ophyd_async/epics/adcore/_core_writer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
NDFileIO,
3030
NDPluginBaseIO,
3131
)
32-
from ._utils import FileWriteMode
32+
from ._utils import ADFileWriteMode
3333

3434
NDFileIOT = TypeVar("NDFileIOT", bound=NDFileIO)
3535
ADWriterT = TypeVar("ADWriterT", bound="ADWriter")
@@ -104,7 +104,7 @@ async def begin_capture(self) -> None:
104104
# See https://github.com/bluesky/ophyd-async/issues/122
105105
self.fileio.file_path.set(str(info.directory_path)),
106106
self.fileio.file_name.set(info.filename),
107-
self.fileio.file_write_mode.set(FileWriteMode.STREAM),
107+
self.fileio.file_write_mode.set(ADFileWriteMode.STREAM),
108108
# For non-HDF file writers, use AD file templating mechanism
109109
# for generating multi-image datasets
110110
self.fileio.file_template.set(

src/ophyd_async/epics/adcore/_single_trigger.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from ophyd_async.core import StandardReadableFormat as Format
88

99
from ._core_io import ADBaseIO, NDPluginBaseIO
10-
from ._utils import ImageMode
10+
from ._utils import ADImageMode
1111

1212

1313
class SingleTriggerDetector(StandardReadable, Triggerable):
@@ -35,7 +35,7 @@ def __init__(
3535
@AsyncStatus.wrap
3636
async def stage(self) -> None:
3737
await asyncio.gather(
38-
self.drv.image_mode.set(ImageMode.SINGLE),
38+
self.drv.image_mode.set(ADImageMode.SINGLE),
3939
self.drv.wait_for_plugins.set(True),
4040
)
4141
await super().stage()

src/ophyd_async/epics/adcore/_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ def convert_param_dtype_to_np(datatype: str) -> str:
7979
return np_datatype
8080

8181

82-
class FileWriteMode(StrictEnum):
82+
class ADFileWriteMode(StrictEnum):
8383
SINGLE = "Single"
8484
CAPTURE = "Capture"
8585
STREAM = "Stream"
8686

8787

88-
class ImageMode(SubsetEnum):
88+
class ADImageMode(SubsetEnum):
8989
SINGLE = "Single"
9090
MULTIPLE = "Multiple"
9191
CONTINUOUS = "Continuous"

src/ophyd_async/epics/adkinetix/_kinetix_controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ async def prepare(self, trigger_info: TriggerInfo):
3535
KINETIX_TRIGGER_MODE_MAP[trigger_info.trigger]
3636
),
3737
self.driver.num_images.set(trigger_info.total_number_of_triggers),
38-
self.driver.image_mode.set(adcore.ImageMode.MULTIPLE),
38+
self.driver.image_mode.set(adcore.ADImageMode.MULTIPLE),
3939
)
4040
if trigger_info.livetime is not None and trigger_info.trigger not in [
4141
DetectorTrigger.VARIABLE_GATE,

src/ophyd_async/epics/adpilatus/_pilatus_controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ async def prepare(self, trigger_info: TriggerInfo):
5555
if trigger_info.total_number_of_triggers == 0
5656
else trigger_info.total_number_of_triggers
5757
),
58-
self.driver.image_mode.set(adcore.ImageMode.MULTIPLE),
58+
self.driver.image_mode.set(adcore.ADImageMode.MULTIPLE),
5959
)
6060

6161
async def arm(self):

0 commit comments

Comments
 (0)