From b15fabdf6bc26df9e1fff01db473e91952485163 Mon Sep 17 00:00:00 2001 From: Oli Wenman Date: Fri, 20 Feb 2026 15:37:10 +0000 Subject: [PATCH] Simplify electron analyser generic helpers --- src/dodal/devices/electron_analyser/base/__init__.py | 9 +-------- .../devices/electron_analyser/base/base_controller.py | 6 +++--- .../devices/electron_analyser/base/base_detector.py | 10 +++++----- .../devices/electron_analyser/base/base_driver_io.py | 7 ------- .../devices/electron_analyser/base/base_region.py | 3 +-- .../electron_analyser/base/test_base_driver_io.py | 10 +++++----- .../devices/electron_analyser/base/test_base_region.py | 5 ++--- 7 files changed, 17 insertions(+), 33 deletions(-) diff --git a/src/dodal/devices/electron_analyser/base/__init__.py b/src/dodal/devices/electron_analyser/base/__init__.py index a06633ee05..44b83f63fd 100644 --- a/src/dodal/devices/electron_analyser/base/__init__.py +++ b/src/dodal/devices/electron_analyser/base/__init__.py @@ -10,16 +10,11 @@ GenericElectronAnalyserDetector, GenericElectronAnalyserRegionDetector, ) -from .base_driver_io import ( - AbstractAnalyserDriverIO, - GenericAnalyserDriverIO, - TAbstractAnalyserDriverIO, -) +from .base_driver_io import AbstractAnalyserDriverIO, TAbstractAnalyserDriverIO from .base_enums import EnergyMode from .base_region import ( AbstractBaseRegion, AbstractBaseSequence, - GenericRegion, GenericSequence, TAbstractBaseRegion, TAbstractBaseSequence, @@ -39,12 +34,10 @@ "GenericElectronAnalyserDetector", "GenericElectronAnalyserRegionDetector", "AbstractAnalyserDriverIO", - "GenericAnalyserDriverIO", "TAbstractAnalyserDriverIO", "EnergyMode", "AbstractBaseRegion", "AbstractBaseSequence", - "GenericRegion", "GenericSequence", "TAbstractBaseRegion", "TAbstractBaseSequence", diff --git a/src/dodal/devices/electron_analyser/base/base_controller.py b/src/dodal/devices/electron_analyser/base/base_controller.py index b942159de0..7443d8a990 100644 --- a/src/dodal/devices/electron_analyser/base/base_controller.py +++ b/src/dodal/devices/electron_analyser/base/base_controller.py @@ -5,11 +5,11 @@ from dodal.devices.controllers import ConstantDeadTimeController from dodal.devices.electron_analyser.base.base_driver_io import ( - GenericAnalyserDriverIO, + AbstractAnalyserDriverIO, TAbstractAnalyserDriverIO, ) from dodal.devices.electron_analyser.base.base_region import ( - GenericRegion, + AbstractBaseRegion, TAbstractBaseRegion, ) from dodal.devices.electron_analyser.base.energy_sources import AbstractEnergySource @@ -77,7 +77,7 @@ async def prepare(self, trigger_info: TriggerInfo) -> None: GenericElectronAnalyserController = ElectronAnalyserController[ - GenericAnalyserDriverIO, GenericRegion + AbstractAnalyserDriverIO, AbstractBaseRegion ] TElectronAnalyserController = TypeVar( "TElectronAnalyserController", bound=ElectronAnalyserController diff --git a/src/dodal/devices/electron_analyser/base/base_detector.py b/src/dodal/devices/electron_analyser/base/base_detector.py index aed52fe418..29353bf003 100644 --- a/src/dodal/devices/electron_analyser/base/base_detector.py +++ b/src/dodal/devices/electron_analyser/base/base_detector.py @@ -14,11 +14,11 @@ ElectronAnalyserController, ) from dodal.devices.electron_analyser.base.base_driver_io import ( - GenericAnalyserDriverIO, + AbstractAnalyserDriverIO, TAbstractAnalyserDriverIO, ) from dodal.devices.electron_analyser.base.base_region import ( - GenericRegion, + AbstractBaseRegion, TAbstractBaseRegion, ) @@ -78,7 +78,7 @@ async def describe_configuration(self) -> dict[str, DataKey]: GenericBaseElectronAnalyserDetector = BaseElectronAnalyserDetector[ - GenericAnalyserDriverIO, GenericRegion + AbstractAnalyserDriverIO, AbstractBaseRegion ] @@ -112,7 +112,7 @@ async def trigger(self) -> None: # ElectronAnalyserRegionDetector in future. Blocked by: # https://github.com/bluesky/bluesky/pull/1978 GenericElectronAnalyserRegionDetector = ElectronAnalyserRegionDetector[ - GenericAnalyserDriverIO, GenericRegion + AbstractAnalyserDriverIO, AbstractBaseRegion ] TElectronAnalyserRegionDetector = TypeVar( "TElectronAnalyserRegionDetector", @@ -176,7 +176,7 @@ def create_region_detector_list( GenericElectronAnalyserDetector = ElectronAnalyserDetector[ - GenericAnalyserDriverIO, GenericRegion + AbstractAnalyserDriverIO, AbstractBaseRegion ] TElectronAnalyserDetector = TypeVar( "TElectronAnalyserDetector", diff --git a/src/dodal/devices/electron_analyser/base/base_driver_io.py b/src/dodal/devices/electron_analyser/base/base_driver_io.py index 8bc55e7ddf..6c0a190abc 100644 --- a/src/dodal/devices/electron_analyser/base/base_driver_io.py +++ b/src/dodal/devices/electron_analyser/base/base_driver_io.py @@ -19,10 +19,6 @@ from dodal.devices.electron_analyser.base.base_enums import EnergyMode from dodal.devices.electron_analyser.base.base_region import ( - AnyAcqMode, - AnyLensMode, - AnyPassEnergy, - GenericRegion, TAbstractBaseRegion, TAcquisitionMode, TLensMode, @@ -218,9 +214,6 @@ def _calculate_total_intensity(self, spectrum: Array1D[np.float64]) -> float: return float(np.sum(spectrum, dtype=np.float64)) -GenericAnalyserDriverIO = AbstractAnalyserDriverIO[ - GenericRegion, AnyAcqMode, AnyLensMode, AnyPsuMode, AnyPassEnergy -] TAbstractAnalyserDriverIO = TypeVar( "TAbstractAnalyserDriverIO", bound=AbstractAnalyserDriverIO ) diff --git a/src/dodal/devices/electron_analyser/base/base_region.py b/src/dodal/devices/electron_analyser/base/base_region.py index 62bb4b269f..3d24570e63 100644 --- a/src/dodal/devices/electron_analyser/base/base_region.py +++ b/src/dodal/devices/electron_analyser/base/base_region.py @@ -166,7 +166,6 @@ def before_validation(cls, data: dict) -> dict: return energy_mode_validation(data) -GenericRegion = AbstractBaseRegion[AnyAcqMode, AnyLensMode, AnyPassEnergy] TAbstractBaseRegion = TypeVar("TAbstractBaseRegion", bound=AbstractBaseRegion) @@ -196,5 +195,5 @@ def get_region_by_name(self, name: str) -> TAbstractBaseRegion | None: return next((region for region in self.regions if region.name == name), None) -GenericSequence = AbstractBaseSequence[GenericRegion] +GenericSequence = AbstractBaseSequence[AbstractBaseRegion] TAbstractBaseSequence = TypeVar("TAbstractBaseSequence", bound=AbstractBaseSequence) diff --git a/tests/devices/electron_analyser/base/test_base_driver_io.py b/tests/devices/electron_analyser/base/test_base_driver_io.py index 0f588658e6..95abe4d379 100644 --- a/tests/devices/electron_analyser/base/test_base_driver_io.py +++ b/tests/devices/electron_analyser/base/test_base_driver_io.py @@ -5,7 +5,7 @@ from ophyd_async.core import StrictEnum from dodal.devices.electron_analyser.base import ( - GenericAnalyserDriverIO, + AbstractAnalyserDriverIO, GenericElectronAnalyserDetector, ) @@ -13,12 +13,12 @@ @pytest.fixture async def sim_driver( sim_detector: GenericElectronAnalyserDetector, -) -> GenericAnalyserDriverIO: +) -> AbstractAnalyserDriverIO: return sim_detector.driver # type: ignore def test_driver_throws_error_with_wrong_lens_mode( - sim_driver: GenericAnalyserDriverIO, + sim_driver: AbstractAnalyserDriverIO, run_engine: RunEngine, ) -> None: class LensModeTestEnum(StrictEnum): @@ -31,7 +31,7 @@ class LensModeTestEnum(StrictEnum): def test_driver_throws_error_with_wrong_acquisition_mode( - sim_driver: GenericAnalyserDriverIO, + sim_driver: AbstractAnalyserDriverIO, run_engine: RunEngine, ) -> None: class AcquisitionModeTestEnum(StrictEnum): @@ -44,7 +44,7 @@ class AcquisitionModeTestEnum(StrictEnum): def test_driver_throws_error_with_wrong_psu_mode( - sim_driver: GenericAnalyserDriverIO, + sim_driver: AbstractAnalyserDriverIO, run_engine: RunEngine, ) -> None: class PsuModeTestEnum(StrictEnum): diff --git a/tests/devices/electron_analyser/base/test_base_region.py b/tests/devices/electron_analyser/base/test_base_region.py index 9d53f4a5e5..56c0054bcd 100644 --- a/tests/devices/electron_analyser/base/test_base_region.py +++ b/tests/devices/electron_analyser/base/test_base_region.py @@ -6,7 +6,6 @@ from dodal.devices.electron_analyser.base import ( AbstractBaseRegion, EnergyMode, - GenericRegion, GenericSequence, TAbstractBaseRegion, to_binding_energy, @@ -93,7 +92,7 @@ def test_region_kinetic_and_binding_energy( @pytest.mark.parametrize("copy", [True, False]) @pytest.mark.parametrize("region", TEST_SEQUENCE_REGION_NAMES, indirect=True) def test_each_energy_field_for_region_is_correct_when_switching_energy_modes( - region: GenericRegion, field: str, copy: bool + region: AbstractBaseRegion, field: str, copy: bool ) -> None: excitation_energy = 100 conversion_func_map = { @@ -135,7 +134,7 @@ def test_each_energy_field_for_region_is_correct_when_switching_energy_modes( @pytest.mark.parametrize("copy", [True, False]) @pytest.mark.parametrize("region", TEST_SEQUENCE_REGION_NAMES, indirect=True) -def test_region_prepare_for_epics(region: GenericRegion, copy: bool) -> None: +def test_region_prepare_for_epics(region: AbstractBaseRegion, copy: bool) -> None: # Patch switch_energy_mode so we can spy on if it was called while also returning # true function return value with patch.object(