dls-dodal 1.67.0__py3-none-any.whl → 1.69.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. {dls_dodal-1.67.0.dist-info → dls_dodal-1.69.0.dist-info}/METADATA +2 -32
  2. {dls_dodal-1.67.0.dist-info → dls_dodal-1.69.0.dist-info}/RECORD +79 -71
  3. dodal/_version.py +2 -2
  4. dodal/beamlines/adsim.py +30 -23
  5. dodal/beamlines/b07.py +1 -1
  6. dodal/beamlines/b07_1.py +1 -1
  7. dodal/beamlines/i02_1.py +14 -42
  8. dodal/beamlines/i02_2.py +5 -11
  9. dodal/beamlines/i03.py +4 -1
  10. dodal/beamlines/i03_supervisor.py +19 -0
  11. dodal/beamlines/i04.py +74 -179
  12. dodal/beamlines/i05.py +9 -1
  13. dodal/beamlines/i06.py +1 -1
  14. dodal/beamlines/i06_1.py +24 -0
  15. dodal/beamlines/i09.py +53 -9
  16. dodal/beamlines/i09_1.py +9 -1
  17. dodal/beamlines/i09_2.py +7 -6
  18. dodal/beamlines/i10_optics.py +1 -1
  19. dodal/beamlines/i16.py +34 -0
  20. dodal/beamlines/i17.py +1 -1
  21. dodal/beamlines/i20_1.py +14 -0
  22. dodal/beamlines/i21.py +71 -4
  23. dodal/beamlines/i23.py +19 -25
  24. dodal/beamlines/i24.py +55 -105
  25. dodal/beamlines/p60.py +12 -2
  26. dodal/common/__init__.py +2 -1
  27. dodal/common/maths.py +80 -0
  28. dodal/devices/eiger.py +44 -23
  29. dodal/devices/electron_analyser/__init__.py +0 -33
  30. dodal/devices/electron_analyser/base/__init__.py +58 -0
  31. dodal/devices/electron_analyser/base/base_controller.py +84 -0
  32. dodal/devices/electron_analyser/base/base_detector.py +214 -0
  33. dodal/devices/electron_analyser/{abstract → base}/base_driver_io.py +23 -42
  34. dodal/devices/electron_analyser/{enums.py → base/base_enums.py} +0 -5
  35. dodal/devices/electron_analyser/{abstract → base}/base_region.py +48 -11
  36. dodal/devices/electron_analyser/{util.py → base/base_util.py} +1 -1
  37. dodal/devices/electron_analyser/{energy_sources.py → base/energy_sources.py} +27 -26
  38. dodal/devices/electron_analyser/specs/__init__.py +4 -4
  39. dodal/devices/electron_analyser/specs/specs_detector.py +47 -0
  40. dodal/devices/electron_analyser/specs/{driver_io.py → specs_driver_io.py} +23 -26
  41. dodal/devices/electron_analyser/specs/{region.py → specs_region.py} +4 -3
  42. dodal/devices/electron_analyser/vgscienta/__init__.py +4 -4
  43. dodal/devices/electron_analyser/vgscienta/vgscienta_detector.py +53 -0
  44. dodal/devices/electron_analyser/vgscienta/{driver_io.py → vgscienta_driver_io.py} +25 -31
  45. dodal/devices/electron_analyser/vgscienta/{region.py → vgscienta_region.py} +6 -6
  46. dodal/devices/fast_shutter.py +108 -25
  47. dodal/devices/i04/beam_centre.py +84 -0
  48. dodal/devices/i04/max_pixel.py +4 -17
  49. dodal/devices/i04/murko_results.py +18 -3
  50. dodal/devices/i09_2_shared/i09_apple2.py +0 -72
  51. dodal/devices/i10/i10_apple2.py +7 -7
  52. dodal/devices/i17/i17_apple2.py +6 -6
  53. dodal/devices/i21/__init__.py +3 -1
  54. dodal/devices/i24/commissioning_jungfrau.py +9 -10
  55. dodal/devices/insertion_device/__init__.py +62 -0
  56. dodal/devices/insertion_device/apple2_controller.py +380 -0
  57. dodal/devices/insertion_device/apple2_undulator.py +152 -481
  58. dodal/devices/insertion_device/energy.py +88 -0
  59. dodal/devices/insertion_device/energy_motor_lookup.py +1 -1
  60. dodal/devices/insertion_device/enum.py +17 -0
  61. dodal/devices/insertion_device/lookup_table_models.py +66 -36
  62. dodal/devices/insertion_device/polarisation.py +36 -0
  63. dodal/devices/oav/oav_detector.py +66 -1
  64. dodal/devices/oav/utils.py +17 -0
  65. dodal/devices/robot.py +35 -18
  66. dodal/devices/selectable_source.py +38 -0
  67. dodal/devices/zebra/zebra.py +15 -0
  68. dodal/devices/zebra/zebra_constants_mapping.py +1 -0
  69. dodal/plans/configure_arm_trigger_and_disarm_detector.py +0 -1
  70. dodal/testing/__init__.py +0 -0
  71. dodal/testing/electron_analyser/device_factory.py +4 -4
  72. dodal/testing/fixtures/devices/apple2.py +1 -1
  73. dodal/testing/fixtures/run_engine.py +4 -0
  74. dodal/devices/electron_analyser/abstract/__init__.py +0 -25
  75. dodal/devices/electron_analyser/abstract/base_detector.py +0 -63
  76. dodal/devices/electron_analyser/abstract/types.py +0 -12
  77. dodal/devices/electron_analyser/detector.py +0 -143
  78. dodal/devices/electron_analyser/specs/detector.py +0 -34
  79. dodal/devices/electron_analyser/types.py +0 -57
  80. dodal/devices/electron_analyser/vgscienta/detector.py +0 -48
  81. {dls_dodal-1.67.0.dist-info → dls_dodal-1.69.0.dist-info}/WHEEL +0 -0
  82. {dls_dodal-1.67.0.dist-info → dls_dodal-1.69.0.dist-info}/entry_points.txt +0 -0
  83. {dls_dodal-1.67.0.dist-info → dls_dodal-1.69.0.dist-info}/licenses/LICENSE +0 -0
  84. {dls_dodal-1.67.0.dist-info → dls_dodal-1.69.0.dist-info}/top_level.txt +0 -0
  85. /dodal/devices/electron_analyser/specs/{enums.py → specs_enums.py} +0 -0
  86. /dodal/devices/electron_analyser/vgscienta/{enums.py → vgscienta_enums.py} +0 -0
@@ -7,11 +7,15 @@ from functools import partialmethod
7
7
  from bluesky.protocols import Movable
8
8
  from ophyd_async.core import (
9
9
  AsyncStatus,
10
+ DeviceMock,
10
11
  DeviceVector,
11
12
  SignalRW,
12
13
  StandardReadable,
13
14
  StrictEnum,
15
+ callback_on_mock_put,
16
+ default_mock_class,
14
17
  observe_value,
18
+ set_mock_value,
15
19
  )
16
20
  from ophyd_async.epics.core import epics_signal_r, epics_signal_rw
17
21
 
@@ -88,6 +92,17 @@ class SoftInState(StrictEnum):
88
92
  NO = "No"
89
93
 
90
94
 
95
+ class InstantArmMock(DeviceMock["ArmingDevice"]):
96
+ async def connect(self, device: ArmingDevice) -> None:
97
+ callback_on_mock_put(
98
+ device.arm_set, lambda *_, **__: set_mock_value(device.armed, 1)
99
+ )
100
+ callback_on_mock_put(
101
+ device.disarm_set, lambda *_, **__: set_mock_value(device.armed, 0)
102
+ )
103
+
104
+
105
+ @default_mock_class(InstantArmMock)
91
106
  class ArmingDevice(StandardReadable, Movable[ArmDemand]):
92
107
  """A useful device that can abstract some of the logic of arming.
93
108
  Allows a user to just call arm.set(ArmDemand.ARM)"""
@@ -49,6 +49,7 @@ class ZebraTTLOutputs(ZebraMappingValidations):
49
49
  TTL_SHUTTER: int = Field(default=-1, ge=-1, le=4)
50
50
  TTL_XSPRESS3: int = Field(default=-1, ge=-1, le=4)
51
51
  TTL_PANDA: int = Field(default=-1, ge=-1, le=4)
52
+ TTL_JUNGFRAU: int = Field(default=-1, ge=-1, le=4)
52
53
 
53
54
 
54
55
  class ZebraSources(ZebraMappingValidations):
@@ -76,7 +76,6 @@ def set_cam_pvs(
76
76
  yield from bps.abs_set(
77
77
  eiger.drv.detector.frame_time, detector_params.exposure_time_s, group=group
78
78
  )
79
- yield from bps.abs_set(eiger.drv.detector.nexpi, 1, group=group)
80
79
 
81
80
  if wait:
82
81
  yield from bps.wait(group)
File without changes
@@ -1,16 +1,16 @@
1
1
  from typing import Any, get_args, get_origin
2
2
 
3
- from dodal.devices.electron_analyser.abstract import (
3
+ from dodal.devices.electron_analyser.base.base_detector import TElectronAnalyserDetector
4
+ from dodal.devices.electron_analyser.base.base_driver_io import (
4
5
  TAbstractAnalyserDriverIO,
5
6
  )
6
- from dodal.devices.electron_analyser.detector import TElectronAnalyserDetector
7
7
  from dodal.devices.electron_analyser.vgscienta import (
8
8
  VGScientaAnalyserDriverIO,
9
9
  VGScientaDetector,
10
10
  )
11
11
 
12
12
 
13
- async def create_driver(
13
+ def create_driver(
14
14
  driver_class: type[TAbstractAnalyserDriverIO],
15
15
  **kwargs: Any,
16
16
  ) -> TAbstractAnalyserDriverIO:
@@ -34,7 +34,7 @@ async def create_driver(
34
34
  return driver_class(**(parameters | kwargs))
35
35
 
36
36
 
37
- async def create_detector(
37
+ def create_detector(
38
38
  detector_class: type[TElectronAnalyserDetector],
39
39
  **kwargs: Any,
40
40
  ) -> TElectronAnalyserDetector:
@@ -7,7 +7,7 @@ from ophyd_async.core import (
7
7
  set_mock_value,
8
8
  )
9
9
 
10
- from dodal.devices.insertion_device.apple2_undulator import (
10
+ from dodal.devices.insertion_device import (
11
11
  EnabledDisabledUpper,
12
12
  UndulatorGap,
13
13
  UndulatorGateStatus,
@@ -3,6 +3,7 @@ Allow external repos to reuse these fixtures so defined in single place.
3
3
  """
4
4
 
5
5
  import asyncio
6
+ import copy
6
7
  import os
7
8
  import threading
8
9
  import time
@@ -34,10 +35,13 @@ async def _ensure_running_bluesky_event_loop(_global_run_engine):
34
35
 
35
36
  @pytest.fixture()
36
37
  async def run_engine(_global_run_engine: RunEngine) -> AsyncGenerator[RunEngine, None]:
38
+ initial_md = copy.deepcopy(_global_run_engine.md)
37
39
  try:
38
40
  yield _global_run_engine
39
41
  finally:
42
+ # Clear subscriptions, cache, and reset metadata
40
43
  _global_run_engine.reset()
44
+ _global_run_engine.md = initial_md
41
45
 
42
46
 
43
47
  @pytest_asyncio.fixture(scope="session", loop_scope="session")
@@ -1,25 +0,0 @@
1
- from .base_detector import (
2
- BaseElectronAnalyserDetector,
3
- )
4
- from .base_driver_io import AbstractAnalyserDriverIO, TAbstractAnalyserDriverIO
5
- from .base_region import (
6
- AbstractBaseRegion,
7
- AbstractBaseSequence,
8
- TAbstractBaseRegion,
9
- TAbstractBaseSequence,
10
- TAcquisitionMode,
11
- TLensMode,
12
- )
13
-
14
- __all__ = [
15
- "AbstractBaseRegion",
16
- "AbstractBaseSequence",
17
- "TAbstractBaseRegion",
18
- "TAbstractBaseSequence",
19
- "TAcquisitionMode",
20
- "TLensMode",
21
- "AbstractAnalyserDriverIO",
22
- "BaseElectronAnalyserDetector",
23
- "AbstractAnalyserDriverIO",
24
- "TAbstractAnalyserDriverIO",
25
- ]
@@ -1,63 +0,0 @@
1
- from typing import Generic
2
-
3
- from bluesky.protocols import Reading, Triggerable
4
- from event_model import DataKey
5
- from ophyd_async.core import (
6
- AsyncConfigurable,
7
- AsyncReadable,
8
- AsyncStatus,
9
- Device,
10
- )
11
- from ophyd_async.epics.adcore import ADBaseController
12
-
13
- from dodal.devices.electron_analyser.abstract.base_driver_io import (
14
- TAbstractAnalyserDriverIO,
15
- )
16
-
17
-
18
- class BaseElectronAnalyserDetector(
19
- Device,
20
- Triggerable,
21
- AsyncReadable,
22
- AsyncConfigurable,
23
- Generic[TAbstractAnalyserDriverIO],
24
- ):
25
- """
26
- Detector for data acquisition of electron analyser. Can only acquire using settings
27
- already configured for the device.
28
-
29
- If possible, this should be changed to inherit from a StandardDetector. Currently,
30
- StandardDetector forces you to use a file writer which doesn't apply here.
31
- See issue https://github.com/bluesky/ophyd-async/issues/888
32
- """
33
-
34
- def __init__(
35
- self,
36
- controller: ADBaseController[TAbstractAnalyserDriverIO],
37
- name: str = "",
38
- ):
39
- self._controller = controller
40
- super().__init__(name)
41
-
42
- @AsyncStatus.wrap
43
- async def trigger(self) -> None:
44
- await self._controller.arm()
45
- await self._controller.wait_for_idle()
46
-
47
- async def read(self) -> dict[str, Reading]:
48
- return await self._controller.driver.read()
49
-
50
- async def describe(self) -> dict[str, DataKey]:
51
- data = await self._controller.driver.describe()
52
- # Correct the shape for image
53
- prefix = self._controller.driver.name + "-"
54
- energy_size = len(await self._controller.driver.energy_axis.get_value())
55
- angle_size = len(await self._controller.driver.angle_axis.get_value())
56
- data[prefix + "image"]["shape"] = [angle_size, energy_size]
57
- return data
58
-
59
- async def read_configuration(self) -> dict[str, Reading]:
60
- return await self._controller.driver.read_configuration()
61
-
62
- async def describe_configuration(self) -> dict[str, DataKey]:
63
- return await self._controller.driver.describe_configuration()
@@ -1,12 +0,0 @@
1
- from typing import TypeVar
2
-
3
- from ophyd_async.core import StrictEnum, SupersetEnum
4
-
5
- TAcquisitionMode = TypeVar("TAcquisitionMode", bound=StrictEnum)
6
- # Allow SupersetEnum. Specs analysers can connect to Lens and Psu mode separately to the
7
- # analyser which leaves the enum to either be "Not connected" OR the available enums
8
- # when connected.
9
- TLensMode = TypeVar("TLensMode", bound=SupersetEnum | StrictEnum)
10
- TPsuMode = TypeVar("TPsuMode", bound=SupersetEnum | StrictEnum)
11
- TPassEnergy = TypeVar("TPassEnergy", bound=StrictEnum | float)
12
- TPassEnergyEnum = TypeVar("TPassEnergyEnum", bound=StrictEnum)
@@ -1,143 +0,0 @@
1
- from typing import Generic, TypeVar
2
-
3
- from bluesky.protocols import Stageable
4
- from ophyd_async.core import AsyncStatus
5
- from ophyd_async.epics.adcore import ADBaseController
6
-
7
- from dodal.common.data_util import load_json_file_to_class
8
- from dodal.devices.controllers import ConstantDeadTimeController
9
- from dodal.devices.electron_analyser.abstract.base_detector import (
10
- BaseElectronAnalyserDetector,
11
- )
12
- from dodal.devices.electron_analyser.abstract.base_driver_io import (
13
- TAbstractAnalyserDriverIO,
14
- )
15
- from dodal.devices.electron_analyser.abstract.base_region import (
16
- TAbstractBaseRegion,
17
- TAbstractBaseSequence,
18
- )
19
-
20
-
21
- class ElectronAnalyserRegionDetector(
22
- BaseElectronAnalyserDetector[TAbstractAnalyserDriverIO],
23
- Generic[TAbstractAnalyserDriverIO, TAbstractBaseRegion],
24
- ):
25
- """
26
- Extends electron analyser detector to configure specific region settings before data
27
- acquisition. It is designed to only exist inside a plan.
28
- """
29
-
30
- def __init__(
31
- self,
32
- controller: ADBaseController[TAbstractAnalyserDriverIO],
33
- region: TAbstractBaseRegion,
34
- name: str = "",
35
- ):
36
- self.region = region
37
- super().__init__(controller, name)
38
-
39
- @AsyncStatus.wrap
40
- async def trigger(self) -> None:
41
- # Configure region parameters on the driver first before data collection.
42
- await self._controller.driver.set(self.region)
43
- await super().trigger()
44
-
45
-
46
- TElectronAnalyserRegionDetector = TypeVar(
47
- "TElectronAnalyserRegionDetector",
48
- bound=ElectronAnalyserRegionDetector,
49
- )
50
-
51
-
52
- class ElectronAnalyserDetector(
53
- BaseElectronAnalyserDetector[TAbstractAnalyserDriverIO],
54
- Stageable,
55
- Generic[
56
- TAbstractAnalyserDriverIO,
57
- TAbstractBaseSequence,
58
- TAbstractBaseRegion,
59
- ],
60
- ):
61
- """
62
- Electron analyser detector with the additional functionality to load a sequence file
63
- and create a list of temporary ElectronAnalyserRegionDetector objects. These will
64
- setup configured region settings before data acquisition.
65
- """
66
-
67
- def __init__(
68
- self,
69
- sequence_class: type[TAbstractBaseSequence],
70
- driver: TAbstractAnalyserDriverIO,
71
- name: str = "",
72
- ):
73
- # Save driver as direct child so participates with connect()
74
- self.driver = driver
75
- self._sequence_class = sequence_class
76
- controller = ConstantDeadTimeController[TAbstractAnalyserDriverIO](driver, 0)
77
- super().__init__(controller, name)
78
-
79
- @AsyncStatus.wrap
80
- async def stage(self) -> None:
81
- """
82
- Prepare the detector for use by ensuring it is idle and ready.
83
-
84
- This method asynchronously stages the detector by first disarming the controller
85
- to ensure the detector is not actively acquiring data, then invokes the driver's
86
- stage procedure. This ensures the detector is in a known, ready state
87
- before use.
88
-
89
- Raises:
90
- Any exceptions raised by the driver's stage or controller's disarm methods.
91
- """
92
- await self._controller.disarm()
93
- await self.driver.stage()
94
-
95
- @AsyncStatus.wrap
96
- async def unstage(self) -> None:
97
- """Disarm the detector."""
98
- await self._controller.disarm()
99
- await self.driver.unstage()
100
-
101
- def load_sequence(self, filename: str) -> TAbstractBaseSequence:
102
- """
103
- Load the sequence data from a provided json file into a sequence class.
104
-
105
- Args:
106
- filename: Path to the sequence file containing the region data.
107
-
108
- Returns:
109
- Pydantic model representing the sequence file.
110
- """
111
- return load_json_file_to_class(self._sequence_class, filename)
112
-
113
- def create_region_detector_list(
114
- self, filename: str, enabled_only=True
115
- ) -> list[
116
- ElectronAnalyserRegionDetector[TAbstractAnalyserDriverIO, TAbstractBaseRegion]
117
- ]:
118
- """
119
- Create a list of detectors equal to the number of regions in a sequence file.
120
- Each detector is responsible for setting up a specific region.
121
-
122
- Args:
123
- filename: Path to the sequence file containing the region data.
124
- enabled_only: If true, only include the region if enabled is True.
125
-
126
- Returns:
127
- List of ElectronAnalyserRegionDetector, equal to the number of regions in
128
- the sequence file.
129
- """
130
- seq = self.load_sequence(filename)
131
- regions = seq.get_enabled_regions() if enabled_only else seq.regions
132
- return [
133
- ElectronAnalyserRegionDetector(
134
- self._controller, r, self.name + "_" + r.name
135
- )
136
- for r in regions
137
- ]
138
-
139
-
140
- TElectronAnalyserDetector = TypeVar(
141
- "TElectronAnalyserDetector",
142
- bound=ElectronAnalyserDetector,
143
- )
@@ -1,34 +0,0 @@
1
- from typing import Generic
2
-
3
- from dodal.devices.electron_analyser.abstract.types import TLensMode, TPsuMode
4
- from dodal.devices.electron_analyser.detector import (
5
- ElectronAnalyserDetector,
6
- )
7
- from dodal.devices.electron_analyser.energy_sources import (
8
- DualEnergySource,
9
- EnergySource,
10
- )
11
- from dodal.devices.electron_analyser.specs.driver_io import SpecsAnalyserDriverIO
12
- from dodal.devices.electron_analyser.specs.region import SpecsRegion, SpecsSequence
13
-
14
-
15
- class SpecsDetector(
16
- ElectronAnalyserDetector[
17
- SpecsAnalyserDriverIO[TLensMode, TPsuMode],
18
- SpecsSequence[TLensMode, TPsuMode],
19
- SpecsRegion[TLensMode, TPsuMode],
20
- ],
21
- Generic[TLensMode, TPsuMode],
22
- ):
23
- def __init__(
24
- self,
25
- prefix: str,
26
- lens_mode_type: type[TLensMode],
27
- psu_mode_type: type[TPsuMode],
28
- energy_source: DualEnergySource | EnergySource,
29
- name: str = "",
30
- ):
31
- driver = SpecsAnalyserDriverIO[TLensMode, TPsuMode](
32
- prefix, lens_mode_type, psu_mode_type, energy_source
33
- )
34
- super().__init__(SpecsSequence[lens_mode_type, psu_mode_type], driver, name)
@@ -1,57 +0,0 @@
1
- from ophyd_async.core import StrictEnum, SupersetEnum
2
-
3
- from dodal.devices.electron_analyser.abstract.base_driver_io import (
4
- AbstractAnalyserDriverIO,
5
- )
6
- from dodal.devices.electron_analyser.abstract.base_region import (
7
- AbstractBaseRegion,
8
- AbstractBaseSequence,
9
- )
10
- from dodal.devices.electron_analyser.detector import (
11
- ElectronAnalyserDetector,
12
- ElectronAnalyserRegionDetector,
13
- )
14
- from dodal.devices.electron_analyser.specs.detector import (
15
- SpecsAnalyserDriverIO,
16
- SpecsDetector,
17
- )
18
- from dodal.devices.electron_analyser.vgscienta.detector import (
19
- VGScientaAnalyserDriverIO,
20
- VGScientaDetector,
21
- )
22
-
23
- AnyAcqMode = StrictEnum
24
- AnyLensMode = SupersetEnum | StrictEnum
25
- AnyPsuMode = SupersetEnum | StrictEnum
26
- AnyPassEnergy = StrictEnum | float
27
- AnyPassEnergyEnum = StrictEnum
28
-
29
- # Electron analyser types that encompasses all implementations, useful for tests and
30
- # plans
31
- ElectronAnalyserDetectorImpl = (
32
- VGScientaDetector[AnyLensMode, AnyPsuMode, AnyPassEnergyEnum]
33
- | SpecsDetector[AnyLensMode, AnyPsuMode]
34
- )
35
- ElectronAnalyserDriverImpl = (
36
- VGScientaAnalyserDriverIO[AnyLensMode, AnyPsuMode, AnyPassEnergyEnum]
37
- | SpecsAnalyserDriverIO[AnyLensMode, AnyPsuMode]
38
- )
39
-
40
- # Short hand the type so less verbose
41
- AbstractBaseRegion = AbstractBaseRegion[AnyAcqMode, AnyLensMode, AnyPassEnergy]
42
-
43
- # Generic electron analyser types that supports full typing with the abstract classes.
44
- GenericElectronAnalyserDetector = ElectronAnalyserDetector[
45
- AbstractAnalyserDriverIO[
46
- AbstractBaseRegion, AnyAcqMode, AnyLensMode, AnyPsuMode, AnyPassEnergy
47
- ],
48
- AbstractBaseSequence[AbstractBaseRegion],
49
- AbstractBaseRegion,
50
- ]
51
-
52
- GenericElectronAnalyserRegionDetector = ElectronAnalyserRegionDetector[
53
- AbstractAnalyserDriverIO[
54
- AbstractBaseRegion, AnyAcqMode, AnyLensMode, AnyPsuMode, AnyPassEnergy
55
- ],
56
- AbstractBaseRegion,
57
- ]
@@ -1,48 +0,0 @@
1
- from typing import Generic
2
-
3
- from dodal.devices.electron_analyser.abstract.types import (
4
- TLensMode,
5
- TPassEnergyEnum,
6
- TPsuMode,
7
- )
8
- from dodal.devices.electron_analyser.detector import (
9
- ElectronAnalyserDetector,
10
- )
11
- from dodal.devices.electron_analyser.energy_sources import (
12
- DualEnergySource,
13
- EnergySource,
14
- )
15
- from dodal.devices.electron_analyser.vgscienta.driver_io import (
16
- VGScientaAnalyserDriverIO,
17
- )
18
- from dodal.devices.electron_analyser.vgscienta.region import (
19
- VGScientaRegion,
20
- VGScientaSequence,
21
- )
22
-
23
-
24
- class VGScientaDetector(
25
- ElectronAnalyserDetector[
26
- VGScientaAnalyserDriverIO[TLensMode, TPsuMode, TPassEnergyEnum],
27
- VGScientaSequence[TLensMode, TPsuMode, TPassEnergyEnum],
28
- VGScientaRegion[TLensMode, TPassEnergyEnum],
29
- ],
30
- Generic[TLensMode, TPsuMode, TPassEnergyEnum],
31
- ):
32
- def __init__(
33
- self,
34
- prefix: str,
35
- lens_mode_type: type[TLensMode],
36
- psu_mode_type: type[TPsuMode],
37
- pass_energy_type: type[TPassEnergyEnum],
38
- energy_source: DualEnergySource | EnergySource,
39
- name: str = "",
40
- ):
41
- driver = VGScientaAnalyserDriverIO[TLensMode, TPsuMode, TPassEnergyEnum](
42
- prefix, lens_mode_type, psu_mode_type, pass_energy_type, energy_source
43
- )
44
- super().__init__(
45
- VGScientaSequence[lens_mode_type, psu_mode_type, pass_energy_type],
46
- driver,
47
- name,
48
- )