Skip to content

Commit fb60cba

Browse files
ElectronAnalyser no longer depends directly on sequence file path to work with BlueAPI (#1923)
* ElectronAnalyser no longer depends directly on sequence file path to work with BlueAPI * Improve type checking * Move PsuMode to B07 shared, improve type checking * Moved some pytest fixtures to where they are used * make self.driver on impl rather than base.
1 parent ec5fc8d commit fb60cba

File tree

25 files changed

+244
-437
lines changed

25 files changed

+244
-437
lines changed

src/dodal/beamlines/b07.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
B07SampleManipulator52B,
66
Grating,
77
LensMode,
8-
PsuMode,
98
)
9+
from dodal.devices.beamlines.b07_shared import PsuMode
1010
from dodal.devices.electron_analyser.base import EnergySource
1111
from dodal.devices.electron_analyser.specs import SpecsDetector
1212
from dodal.devices.motors import XYZPolarStage

src/dodal/beamlines/b07_1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from dodal.beamlines.b07_shared import devices as b07_shared_devices
22
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
33
from dodal.device_manager import DeviceManager
4-
from dodal.devices.beamlines.b07 import PsuMode
54
from dodal.devices.beamlines.b07_1 import (
65
ChannelCutMonochromator,
76
Grating,
87
LensMode,
98
)
9+
from dodal.devices.beamlines.b07_shared import PsuMode
1010
from dodal.devices.electron_analyser.base import EnergySource
1111
from dodal.devices.electron_analyser.specs import SpecsDetector
1212
from dodal.devices.motors import XYZPolarAzimuthStage
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from .b07_motors import B07SampleManipulator52B
2-
from .enums import Grating, LensMode, PsuMode
2+
from .enums import Grating, LensMode
33

4-
__all__ = ["B07SampleManipulator52B", "Grating", "LensMode", "PsuMode"]
4+
__all__ = ["B07SampleManipulator52B", "Grating", "LensMode"]

src/dodal/devices/beamlines/b07/enums.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,3 @@ class LensMode(SupersetEnum):
2525
# option if disconnected. Once it is connected, "Not connected" is replaced with the
2626
# options above. This is also why this must be a SupersetEnum.
2727
NOT_CONNECTED = "Not connected"
28-
29-
30-
class PsuMode(SupersetEnum):
31-
V3500 = "3.5kV"
32-
V1500 = "1.5kV"
33-
V400 = "400V"
34-
V100 = "100V"
35-
V10 = "10V"
36-
# This is connected to the device separately and will only have "Not connected" as
37-
# option if disconnected. Once it is connected, "Not connected" is replaced with the
38-
# options above. This is also why this must be a SupersetEnum.
39-
NOT_CONNECTED = "Not connected"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .enums import PsuMode
2+
3+
__all__ = ["PsuMode"]
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from ophyd_async.core import SupersetEnum
2+
3+
4+
class PsuMode(SupersetEnum):
5+
V3500 = "3.5kV"
6+
V1500 = "1.5kV"
7+
V400 = "400V"
8+
V100 = "100V"
9+
V10 = "10V"
10+
# This is connected to the device separately and will only have "Not connected" as
11+
# option if disconnected. Once it is connected, "Not connected" is replaced with the
12+
# options above. This is also why this must be a SupersetEnum.
13+
NOT_CONNECTED = "Not connected"

src/dodal/devices/electron_analyser/base/base_detector.py

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
TriggerInfo,
1111
)
1212

13-
from dodal.common.data_util import load_json_file_to_class
1413
from dodal.devices.electron_analyser.base.base_controller import (
1514
ElectronAnalyserController,
1615
)
@@ -20,9 +19,7 @@
2019
)
2120
from dodal.devices.electron_analyser.base.base_region import (
2221
GenericRegion,
23-
GenericSequence,
2422
TAbstractBaseRegion,
25-
TAbstractBaseSequence,
2623
)
2724

2825

@@ -111,6 +108,9 @@ async def trigger(self) -> None:
111108
await super().trigger()
112109

113110

111+
# Used in sm-bluesky, but will hopefully be removed along with
112+
# ElectronAnalyserRegionDetector in future. Blocked by:
113+
# https://github.com/bluesky/bluesky/pull/1978
114114
GenericElectronAnalyserRegionDetector = ElectronAnalyserRegionDetector[
115115
GenericAnalyserDriverIO, GenericRegion
116116
]
@@ -123,24 +123,13 @@ async def trigger(self) -> None:
123123
class ElectronAnalyserDetector(
124124
BaseElectronAnalyserDetector[TAbstractAnalyserDriverIO, TAbstractBaseRegion],
125125
Stageable,
126-
Generic[TAbstractBaseSequence, TAbstractAnalyserDriverIO, TAbstractBaseRegion],
126+
Generic[TAbstractAnalyserDriverIO, TAbstractBaseRegion],
127127
):
128128
"""Electron analyser detector with the additional functionality to load a sequence
129129
file and create a list of temporary ElectronAnalyserRegionDetector objects. These
130130
will setup configured region settings before data acquisition.
131131
"""
132132

133-
def __init__(
134-
self,
135-
sequence_class: type[TAbstractBaseSequence],
136-
controller: ElectronAnalyserController[
137-
TAbstractAnalyserDriverIO, TAbstractBaseRegion
138-
],
139-
name: str = "",
140-
):
141-
self._sequence_class = sequence_class
142-
super().__init__(controller, name)
143-
144133
@AsyncStatus.wrap
145134
async def stage(self) -> None:
146135
"""Prepare the detector for use by ensuring it is idle and ready.
@@ -160,38 +149,24 @@ async def unstage(self) -> None:
160149
"""Disarm the detector."""
161150
await self._controller.disarm()
162151

163-
def load_sequence(self, filename: str) -> TAbstractBaseSequence:
164-
"""Load the sequence data from a provided json file into a sequence class.
165-
166-
Args:
167-
filename (str): Path to the sequence file containing the region data.
168-
169-
Returns:
170-
Pydantic model representing the sequence file.
171-
"""
172-
return load_json_file_to_class(self._sequence_class, filename)
173-
174152
def create_region_detector_list(
175-
self, filename: str, enabled_only=True
153+
self, regions: list[TAbstractBaseRegion]
176154
) -> list[
177155
ElectronAnalyserRegionDetector[TAbstractAnalyserDriverIO, TAbstractBaseRegion]
178156
]:
179-
"""Create a list of detectors equal to the number of regions in a sequence file.
180-
Each detector is responsible for setting up a specific region.
157+
"""This method can hopefully be dropped when this is merged and released.
158+
https://github.com/bluesky/bluesky/pull/1978.
159+
160+
Create a list of detectors equal to the number of regions. Each detector is
161+
responsible for setting up a specific region.
181162
182163
Args:
183-
filename (str): Path to the sequence file containing the region data.
184-
enabled_only (bool, optional): If true, only include the region if enabled
185-
is True.
164+
regions: The list of regions to give to each region detector.
186165
187166
Returns:
188167
List of ElectronAnalyserRegionDetector, equal to the number of regions in
189-
the sequence file.
168+
the sequence file.
190169
"""
191-
seq = self.load_sequence(filename)
192-
regions: list[TAbstractBaseRegion] = (
193-
seq.get_enabled_regions() if enabled_only else seq.regions
194-
)
195170
return [
196171
ElectronAnalyserRegionDetector[
197172
TAbstractAnalyserDriverIO, TAbstractBaseRegion
@@ -201,7 +176,7 @@ def create_region_detector_list(
201176

202177

203178
GenericElectronAnalyserDetector = ElectronAnalyserDetector[
204-
GenericSequence, GenericAnalyserDriverIO, GenericRegion
179+
GenericAnalyserDriverIO, GenericRegion
205180
]
206181
TElectronAnalyserDetector = TypeVar(
207182
"TElectronAnalyserDetector",

src/dodal/devices/electron_analyser/specs/specs_detector.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,13 @@
77
from dodal.devices.electron_analyser.base.base_region import TLensMode, TPsuMode
88
from dodal.devices.electron_analyser.base.energy_sources import AbstractEnergySource
99
from dodal.devices.electron_analyser.specs.specs_driver_io import SpecsAnalyserDriverIO
10-
from dodal.devices.electron_analyser.specs.specs_region import (
11-
SpecsRegion,
12-
SpecsSequence,
13-
)
10+
from dodal.devices.electron_analyser.specs.specs_region import SpecsRegion
1411
from dodal.devices.fast_shutter import FastShutter
1512
from dodal.devices.selectable_source import SourceSelector
1613

1714

1815
class SpecsDetector(
1916
ElectronAnalyserDetector[
20-
SpecsSequence[TLensMode, TPsuMode],
2117
SpecsAnalyserDriverIO[TLensMode, TPsuMode],
2218
SpecsRegion[TLensMode, TPsuMode],
2319
],
@@ -33,15 +29,12 @@ def __init__(
3329
source_selector: SourceSelector | None = None,
3430
name: str = "",
3531
):
36-
# Save to class so takes part with connect()
32+
# Make attribute of class so connect applies to driver and populates parent.
3733
self.driver = SpecsAnalyserDriverIO[TLensMode, TPsuMode](
3834
prefix, lens_mode_type, psu_mode_type
3935
)
40-
4136
controller = ElectronAnalyserController[
4237
SpecsAnalyserDriverIO[TLensMode, TPsuMode], SpecsRegion[TLensMode, TPsuMode]
4338
](self.driver, energy_source, shutter, source_selector)
4439

45-
sequence_class = SpecsSequence[lens_mode_type, psu_mode_type]
46-
47-
super().__init__(sequence_class, controller, name)
40+
super().__init__(controller, name)

src/dodal/devices/electron_analyser/vgscienta/vgscienta_detector.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,13 @@
1212
from dodal.devices.electron_analyser.vgscienta.vgscienta_region import (
1313
TPassEnergyEnum,
1414
VGScientaRegion,
15-
VGScientaSequence,
1615
)
1716
from dodal.devices.fast_shutter import FastShutter
1817
from dodal.devices.selectable_source import SourceSelector
1918

2019

2120
class VGScientaDetector(
2221
ElectronAnalyserDetector[
23-
VGScientaSequence[TLensMode, TPsuMode, TPassEnergyEnum],
2422
VGScientaAnalyserDriverIO[TLensMode, TPsuMode, TPassEnergyEnum],
2523
VGScientaRegion[TLensMode, TPassEnergyEnum],
2624
],
@@ -37,17 +35,13 @@ def __init__(
3735
source_selector: SourceSelector | None = None,
3836
name: str = "",
3937
):
40-
# Save to class so takes part with connect()
38+
# Make attribute of class so connect applies to driver and populates parent.
4139
self.driver = VGScientaAnalyserDriverIO[TLensMode, TPsuMode, TPassEnergyEnum](
4240
prefix, lens_mode_type, psu_mode_type, pass_energy_type
4341
)
44-
4542
controller = ElectronAnalyserController[
4643
VGScientaAnalyserDriverIO[TLensMode, TPsuMode, TPassEnergyEnum],
4744
VGScientaRegion[TLensMode, TPassEnergyEnum],
4845
](self.driver, energy_source, shutter, source_selector)
4946

50-
sequence_class = VGScientaSequence[
51-
lens_mode_type, psu_mode_type, pass_energy_type
52-
]
53-
super().__init__(sequence_class, controller, name)
47+
super().__init__(controller, name)

src/dodal/testing/electron_analyser/__init__.py

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)