From aa5c2099c255198721495222f6085a197d09feeb Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Mon, 18 May 2026 15:59:54 +0100 Subject: [PATCH 1/8] Fixup jungfrau for updated ophyd_async --- .../callbacks/metadata_writer.py | 4 +- .../i24/jungfrau_commissioning/composites.py | 6 ++- .../experiment_plans/do_darks.py | 12 +++-- .../experiment_plans/rotation_scan_plan.py | 8 +-- .../plan_stubs/do_external_acquisition.py | 6 ++- .../plan_stubs/do_internal_acquisition.py | 4 +- .../plan_stubs/plan_utils.py | 8 +-- .../callbacks/test_metadata_writer.py | 6 +-- .../i24/jungfrau_commissioning/conftest.py | 8 ++- .../experiment_plans/test_do_darks.py | 50 +++++++++++-------- .../test_do_external_acquisition.py | 10 ++-- .../test_do_internal_acquisition.py | 10 ++-- .../plan_stubs/test_plan_utils.py | 22 ++++---- .../jungfrau_commissioning/test_do_darks.py | 37 +++++++------- .../test_rotation_scan.py | 4 +- .../i24/web_gui/test_jungfrau_plans.py | 6 ++- tests/unit_tests/conftest.py | 12 +++-- 17 files changed, 123 insertions(+), 90 deletions(-) diff --git a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/callbacks/metadata_writer.py b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/callbacks/metadata_writer.py index fa80c19cde..a038c004ec 100644 --- a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/callbacks/metadata_writer.py +++ b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/callbacks/metadata_writer.py @@ -57,10 +57,10 @@ def event(self, doc: dict): # type: ignore self.wavelength_in_a = data.get("dcm-wavelength_in_a") self.energy_in_kev = data.get("dcm-energy_in_keV") self.detector_distance_mm = data.get("detector_motion-z") - assert data.get("detector-_writer-file_path"), ( + assert data.get("detector-writer-file_path"), ( "No detector writer path was found" ) - self.final_path = Path(data.get("detector-_writer-file_path")) + self.final_path = Path(data.get("detector-writer-file_path")) LOGGER.info( f"Metadata writer received parameters, energy_in_kev: {self.energy_in_kev}, wavelength: {self.wavelength_in_a}, det_distance_mm: {self.detector_distance_mm}, file path: {self.final_path}" diff --git a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/composites.py b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/composites.py index 3f6eab657e..c36b96e8ea 100644 --- a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/composites.py +++ b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/composites.py @@ -4,7 +4,9 @@ from dodal.devices.attenuator.attenuator import EnumFilterAttenuator from dodal.devices.beamlines.i24.aperture import Aperture from dodal.devices.beamlines.i24.beamstop import Beamstop -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from dodal.devices.beamlines.i24.dcm import DCM from dodal.devices.beamlines.i24.dual_backlight import DualBacklight from dodal.devices.beamlines.i24.vgonio import VerticalGoniometer @@ -22,7 +24,7 @@ class RotationScanComposite: aperture: Aperture attenuator: EnumFilterAttenuator - jungfrau: CommissioningJungfrau + jungfrau: CommissioningJungfrauDetector gonio: VerticalGoniometer synchrotron: Synchrotron sample_shutter: ZebraShutter diff --git a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/do_darks.py b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/do_darks.py index 3616b8b3d9..f89b1f20c2 100644 --- a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/do_darks.py +++ b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/do_darks.py @@ -2,7 +2,9 @@ from bluesky import plan_stubs as bps from bluesky.utils import MsgGenerator from dodal.common import inject -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from ophyd_async.fastcs.jungfrau import ( AcquisitionType, GainMode, @@ -25,7 +27,7 @@ def do_pedestal_darks( pedestal_frames: PositiveInt = 20, pedestal_loops: PositiveInt = 200, filename: str = "pedestal_darks", - jungfrau: CommissioningJungfrau = inject("jungfrau"), + jungfrau: CommissioningJungfrauDetector = inject("jungfrau"), ) -> MsgGenerator: """Acquire darks in pedestal mode, using dynamic gain mode. This calibrates the offsets for the jungfrau, and must be performed before acquiring real data in dynamic gain mode. @@ -61,11 +63,13 @@ def _do_decorated_plan(): trigger_info = create_jungfrau_pedestal_triggering_info( exp_time_s, pedestal_frames, pedestal_loops ) + yield from bps.mv(jungfrau.detector.pedestal_mode_loops, pedestal_loops) + yield from bps.mv(jungfrau.detector.pedestal_mode_frames, pedestal_frames) LOGGER.info( "Jungfrau will be triggered in pedestal mode and in dynamic gain mode" ) yield from bps.mv( - jungfrau.drv.acquisition_type, + jungfrau.acquisition_type, AcquisitionType.PEDESTAL, ) yield from fly_jungfrau( @@ -84,7 +88,7 @@ def do_non_pedestal_darks( exp_time_s: float = 0.001, total_triggers: PositiveInt = 1000, filename: str = "darks", - jungfrau: CommissioningJungfrau = inject("jungfrau"), + jungfrau: CommissioningJungfrauDetector = inject("jungfrau"), ) -> MsgGenerator: """Internally take a set of images at a given gain mode. diff --git a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/rotation_scan_plan.py b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/rotation_scan_plan.py index 477521be3c..3ac0bd02b8 100644 --- a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/rotation_scan_plan.py +++ b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/rotation_scan_plan.py @@ -6,7 +6,9 @@ from bluesky.utils import MsgGenerator from dodal.devices.beamlines.i24.aperture import AperturePositions from dodal.devices.beamlines.i24.beamstop import BeamstopPositions -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from dodal.devices.beamlines.i24.dual_backlight import BacklightPositions from dodal.devices.hutch_shutter import ShutterState from dodal.devices.zebra.zebra import ArmDemand, I24Axes, Zebra @@ -238,7 +240,7 @@ def _rotation_scan_plan( composite.dcm.energy_in_keV, composite.dcm.wavelength_in_a, composite.det_stage.z, - composite.jungfrau._writer.file_path, # noqa: SLF001 N + composite.jungfrau.writer.file_path, # noqa: SLF001 N ], PlanNameConstants.ROTATION_DEVICE_READ, ) @@ -280,7 +282,7 @@ def _rotation_scan_plan( def _cleanup_plan( zebra: Zebra, - jf: CommissioningJungfrau, + jf: CommissioningJungfrauDetector, zebra_shutter: ZebraShutter, group="rotation cleanup", ): diff --git a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_external_acquisition.py b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_external_acquisition.py index b34048bc37..9e8e25947a 100644 --- a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_external_acquisition.py +++ b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_external_acquisition.py @@ -1,6 +1,8 @@ from bluesky.utils import MsgGenerator from dodal.common import inject -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from ophyd_async.core import ( WatchableAsyncStatus, ) @@ -20,7 +22,7 @@ def do_external_acquisition( gain_mode: GainMode, total_triggers: PositiveInt = 1, wait: bool = False, - jungfrau: CommissioningJungfrau = inject("commissioning_jungfrau"), + jungfrau: CommissioningJungfrauDetector = inject("commissioning_jungfrau"), ) -> MsgGenerator[WatchableAsyncStatus]: """ Kickoff external triggering on the Jungfrau, and optionally wait for completion. diff --git a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_internal_acquisition.py b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_internal_acquisition.py index 2d209a692a..76d7c39276 100644 --- a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_internal_acquisition.py +++ b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_internal_acquisition.py @@ -1,5 +1,5 @@ from bluesky.utils import MsgGenerator -from dodal.beamlines.i24 import CommissioningJungfrau +from dodal.beamlines.i24 import CommissioningJungfrauDetector from dodal.common import inject from ophyd_async.core import ( WatchableAsyncStatus, @@ -19,7 +19,7 @@ def do_internal_acquisition( exp_time_s: float, gain_mode: GainMode, total_frames: PositiveInt = 1, - jungfrau: CommissioningJungfrau = inject("jungfrau"), + jungfrau: CommissioningJungfrauDetector = inject("jungfrau"), path_of_output_file: str | None = None, wait: bool = False, ) -> MsgGenerator[WatchableAsyncStatus]: diff --git a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/plan_utils.py b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/plan_utils.py index d8f1c3fccd..4110a19ade 100644 --- a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/plan_utils.py +++ b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/plan_utils.py @@ -4,7 +4,9 @@ import bluesky.plan_stubs as bps from bluesky.utils import MsgGenerator from dodal.common.watcher_utils import log_on_percentage_complete -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from ophyd_async.core import ( TriggerInfo, WatchableAsyncStatus, @@ -17,7 +19,7 @@ def fly_jungfrau( - jungfrau: CommissioningJungfrau, + jungfrau: CommissioningJungfrauDetector, trigger_info: TriggerInfo, gain_mode: GainMode, wait: bool = False, @@ -43,7 +45,7 @@ def fly_jungfrau( """ LOGGER.info(f"Setting Jungfrau to gain mode {gain_mode}") - yield from bps.mv(jungfrau.drv.gain_mode, gain_mode) + yield from bps.mv(jungfrau.detector.gain_mode, gain_mode) LOGGER.info("Preparing detector...") yield from bps.prepare(jungfrau, trigger_info, wait=True) LOGGER.info("Detector prepared") diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/callbacks/test_metadata_writer.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/callbacks/test_metadata_writer.py index 797ca8fe2e..3cba3146a8 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/callbacks/test_metadata_writer.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/callbacks/test_metadata_writer.py @@ -40,7 +40,7 @@ async def test_metadata_writer_produces_correct_output( await rotation_composite.dcm.wavelength_in_a.set(wavelength) await rotation_composite.dcm.energy_in_keV.set(energy) await rotation_composite.det_stage.z.set(det_z) - await rotation_composite.jungfrau._writer.file_path.set(tmp_path) + await rotation_composite.jungfrau.writer.file_path.set(tmp_path) expected_output = { "wavelength_in_a": wavelength, @@ -54,7 +54,7 @@ async def test_metadata_writer_produces_correct_output( rotation_composite.dcm.energy_in_keV, rotation_composite.dcm.wavelength_in_a, rotation_composite.det_stage.z, - rotation_composite.jungfrau._writer.file_path, + rotation_composite.jungfrau.writer.file_path, ], params, metadata_writer, @@ -90,7 +90,7 @@ async def test_assertion_error_if_no_jf_path_found( rotation_composite.dcm.energy_in_keV, rotation_composite.dcm.wavelength_in_a, rotation_composite.det_stage.z, - rotation_composite.jungfrau._writer.file_path, + rotation_composite.jungfrau.writer.file_path, ], params, metadata_writer, diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/conftest.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/conftest.py index f648b4f7ec..1e63586e4f 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/conftest.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/conftest.py @@ -3,7 +3,9 @@ from dodal.devices.attenuator.attenuator import EnumFilterAttenuator from dodal.devices.beamlines.i24.aperture import Aperture from dodal.devices.beamlines.i24.beamstop import Beamstop -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from dodal.devices.beamlines.i24.dcm import DCM from dodal.devices.beamlines.i24.dual_backlight import DualBacklight from dodal.devices.hutch_shutter import InterlockedHutchShutter @@ -22,7 +24,9 @@ @pytest.fixture def rotation_composite( - jungfrau: CommissioningJungfrau, zebra: Zebra, enum_attenuator: EnumFilterAttenuator + jungfrau: CommissioningJungfrauDetector, + zebra: Zebra, + enum_attenuator: EnumFilterAttenuator, ) -> RotationScanComposite: with init_devices(mock=True): aperture = Aperture("") diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/experiment_plans/test_do_darks.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/experiment_plans/test_do_darks.py index d292465771..58fa195a78 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/experiment_plans/test_do_darks.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/experiment_plans/test_do_darks.py @@ -7,7 +7,9 @@ from bluesky.callbacks import CallbackBase from bluesky.run_engine import RunEngine from bluesky.simulators import RunEngineSimulator, assert_message_and_return_remaining -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from ophyd_async.core import completed_status from ophyd_async.fastcs.jungfrau import ( AcquisitionType, @@ -58,7 +60,7 @@ def fake_complete(_, group=None): new=MagicMock(side_effect=fake_complete), ) async def test_full_do_pedestal_darks( - jungfrau: CommissioningJungfrau, + jungfrau: CommissioningJungfrauDetector, run_engine: RunEngine, ): # Test that plan succeeds in RunEngine and pedestal-specific signals are changed as expected @@ -71,31 +73,33 @@ async def test_full_do_pedestal_darks( } ) def test_plan(): - yield from bps.monitor(jungfrau.drv.acquisition_type, name="AT") - yield from bps.monitor(jungfrau.drv.pedestal_mode_state, name="PM") - yield from bps.monitor(jungfrau.drv.gain_mode, name="GM") + yield from bps.monitor(jungfrau.acquisition_type, name="AT") + yield from bps.monitor(jungfrau.detector.pedestal_mode_state, name="PM") + yield from bps.monitor(jungfrau.detector.gain_mode, name="GM") yield from do_pedestal_darks(0.001, 2, 2, test_path, jungfrau=jungfrau) - jungfrau._controller.arm = AsyncMock() - assert await jungfrau.drv.acquisition_type.get_value() == AcquisitionType.STANDARD - await jungfrau.drv.gain_mode.set(GainMode.FIX_G2) - await jungfrau.drv.pedestal_mode_state.set(PedestalMode.OFF) + jungfrau._arm_logic.arm = AsyncMock() # type: ignore + assert await jungfrau.acquisition_type.get_value() == AcquisitionType.STANDARD + await jungfrau.detector.gain_mode.set(GainMode.FIX_G2) + await jungfrau.detector.pedestal_mode_state.set(PedestalMode.OFF) monitor_tracker = CheckMonitor( [ - "detector-drv-acquisition_type", - "detector-drv-pedestal_mode_state", - "detector-drv-gain_mode", + "detector-acquisition_type", + "detector-detector-pedestal_mode_state", + "detector-detector-gain_mode", ] ) run_engine.subscribe(monitor_tracker) run_engine(test_plan()) - assert monitor_tracker.signals_and_values["detector-drv-acquisition_type"] == [ + assert monitor_tracker.signals_and_values["detector-acquisition_type"] == [ AcquisitionType.STANDARD, AcquisitionType.PEDESTAL, AcquisitionType.STANDARD, ] - assert monitor_tracker.signals_and_values["detector-drv-pedestal_mode_state"] == [ + assert monitor_tracker.signals_and_values[ + "detector-detector-pedestal_mode_state" + ] == [ PedestalMode.OFF, PedestalMode.ON, PedestalMode.OFF, @@ -103,7 +107,7 @@ def test_plan(): # When using the real detector, the switching of gain mode is a bit more complicated, # see the docstring for the do_pedestal_darks plan. - assert monitor_tracker.signals_and_values["detector-drv-gain_mode"] == [ + assert monitor_tracker.signals_and_values["detector-detector-gain_mode"] == [ GainMode.FIX_G2, GainMode.DYNAMIC, ] @@ -113,7 +117,7 @@ class FakeError(Exception): ... async def test_pedestals_unstage_and_wait_on_exception( - jungfrau: CommissioningJungfrau, + jungfrau: CommissioningJungfrauDetector, run_engine: RunEngine, ): jungfrau.prepare = MagicMock(side_effect=FakeError) @@ -131,7 +135,7 @@ async def test_pedestals_unstage_and_wait_on_exception( new=MagicMock(), ) async def test_do_pedestals_waits_on_stage_before_prepare( - jungfrau: CommissioningJungfrau, sim_run_engine: RunEngineSimulator + jungfrau: CommissioningJungfrauDetector, sim_run_engine: RunEngineSimulator ): msgs = sim_run_engine.simulate_plan( do_pedestal_darks(0.001, 2, 2, jungfrau=jungfrau) @@ -145,11 +149,15 @@ async def test_do_pedestals_waits_on_stage_before_prepare( ) +@pytest.mark.timeout(5) def test_do_darks_stops_if_exception_after_stage( - run_engine: RunEngine, jungfrau: CommissioningJungfrau + run_engine: RunEngine, jungfrau: CommissioningJungfrauDetector ): mock_stop = AsyncMock() - jungfrau.drv.acquisition_stop.trigger = mock_stop + jungfrau.detector.acquisition_stop.trigger = mock_stop + jungfrau.complete = MagicMock( + side_effect=FailedStatus("Simulated completion exception") + ) with pytest.raises(FailedStatus): run_engine(do_pedestal_darks(0, 2, 2, jungfrau=jungfrau)) @@ -162,7 +170,7 @@ def test_do_darks_stops_if_exception_after_stage( new=MagicMock(side_effect=FakeError), ) def test_do_non_pedestal_darks_unstages_jf_on_exception( - run_engine: RunEngine, jungfrau: CommissioningJungfrau + run_engine: RunEngine, jungfrau: CommissioningJungfrauDetector ): jungfrau.stage = MagicMock(side_effect=lambda: completed_status()) jungfrau.unstage = MagicMock(side_effect=lambda: completed_status()) @@ -179,7 +187,7 @@ def test_do_non_pedestal_darks_unstages_jf_on_exception( def test_do_non_pedestal_darks_triggers_correct_plans( mock_fly_jf: MagicMock, run_engine: RunEngine, - jungfrau: CommissioningJungfrau, + jungfrau: CommissioningJungfrauDetector, ): gain_mode = GainMode.FORCE_SWITCH_G1 parent_mock = MagicMock() diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_do_external_acquisition.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_do_external_acquisition.py index ba2546c61e..a5598467fc 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_do_external_acquisition.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_do_external_acquisition.py @@ -6,7 +6,7 @@ from bluesky.preprocessors import run_decorator from bluesky.run_engine import RunEngine from bluesky.simulators import RunEngineSimulator, assert_message_and_return_remaining -from dodal.beamlines.i24 import CommissioningJungfrau +from dodal.beamlines.i24 import CommissioningJungfrauDetector from ophyd_async.core import set_mock_value from ophyd_async.fastcs.jungfrau import GainMode @@ -19,7 +19,7 @@ def test_full_do_external_acquisition( - jungfrau: CommissioningJungfrau, run_engine: RunEngine, caplog + jungfrau: CommissioningJungfrauDetector, run_engine: RunEngine, caplog ): @run_decorator( md={ @@ -34,13 +34,13 @@ def test_plan(): val = 0 while not status.done: val += 1 - set_mock_value(jungfrau._writer.frame_counter, val) + set_mock_value(jungfrau.writer.frame_counter, val) # Let status update yield from bps.wait_for([partial(asyncio.sleep, 0)]) yield from bps.wait(JF_COMPLETE_GROUP) - jungfrau._controller.arm = AsyncMock() + jungfrau._arm_logic.arm = AsyncMock() # type: ignore run_engine(test_plan()) for i in range(20, 120, 20): assert f"Jungfrau data collection triggers received: {i}%" in caplog.messages @@ -52,7 +52,7 @@ def test_plan(): def test_do_external_acquisition_does_wait( mock_log_on_percent_complete: MagicMock, sim_run_engine: RunEngineSimulator, - jungfrau: CommissioningJungfrau, + jungfrau: CommissioningJungfrauDetector, ): msgs = sim_run_engine.simulate_plan( do_external_acquisition(0.01, GainMode.DYNAMIC, 1, wait=True, jungfrau=jungfrau) diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_do_internal_acquisition.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_do_internal_acquisition.py index e8ef8fb86b..4f77fe9c0d 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_do_internal_acquisition.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_do_internal_acquisition.py @@ -6,7 +6,7 @@ from bluesky.preprocessors import run_decorator from bluesky.run_engine import RunEngine from bluesky.simulators import RunEngineSimulator, assert_message_and_return_remaining -from dodal.beamlines.i24 import CommissioningJungfrau +from dodal.beamlines.i24 import CommissioningJungfrauDetector from ophyd_async.core import set_mock_value from ophyd_async.fastcs.jungfrau import GainMode @@ -19,7 +19,7 @@ def test_full_do_internal_acquisition( - run_engine: RunEngine, jungfrau: CommissioningJungfrau, caplog + run_engine: RunEngine, jungfrau: CommissioningJungfrauDetector, caplog ): @run_decorator( md={ @@ -34,11 +34,11 @@ def test_plan(): val = 0 while not status.done: val += 1 - set_mock_value(jungfrau._writer.frame_counter, val) + set_mock_value(jungfrau.writer.frame_counter, val) yield from bps.wait_for([partial(asyncio.sleep, 0)]) yield from bps.wait(JF_COMPLETE_GROUP) - jungfrau._controller.arm = AsyncMock() + jungfrau._arm_logic.arm = AsyncMock() # type: ignore run_engine(test_plan()) assert "Jungfrau data collection triggers received: 100%" in caplog.messages @@ -49,7 +49,7 @@ def test_plan(): ) def test_do_internal_acquisition_does_wait( sim_run_engine: RunEngineSimulator, - jungfrau: CommissioningJungfrau, + jungfrau: CommissioningJungfrauDetector, ): msgs = sim_run_engine.simulate_plan( do_internal_acquisition(0.01, GainMode.DYNAMIC, 1, jungfrau, wait=True) diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_plan_utils.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_plan_utils.py index 693e1c981f..58408e707e 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_plan_utils.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/plan_stubs/test_plan_utils.py @@ -6,7 +6,9 @@ import bluesky.plan_stubs as bps from bluesky.preprocessors import run_decorator from bluesky.run_engine import RunEngine -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from ophyd_async.core import ( TriggerInfo, completed_status, @@ -21,11 +23,11 @@ async def test_fly_jungfrau( - run_engine: RunEngine, jungfrau: CommissioningJungfrau, tmp_path: Path + run_engine: RunEngine, jungfrau: CommissioningJungfrauDetector, tmp_path: Path ): - set_mock_value(jungfrau._writer.frame_counter, 10) + set_mock_value(jungfrau.writer.frame_counter, 10) mock_stop = AsyncMock() - jungfrau.drv.acquisition_stop.trigger = mock_stop + jungfrau.detector.acquisition_stop.trigger = mock_stop filename = "test" @@ -34,18 +36,18 @@ def _open_run_and_fly(): frames = 5 status = yield from fly_jungfrau( jungfrau, - TriggerInfo(livetime=1e-3, exposures_per_event=frames), + TriggerInfo(livetime=1e-3, collections_per_event=frames), GainMode.DYNAMIC, ) val = 0 while not status.done: val += 1 - set_mock_value(jungfrau._writer.frame_counter, val) + set_mock_value(jungfrau.writer.frame_counter, val) yield from bps.sleep(0.001) yield from bps.wait(JF_COMPLETE_GROUP) assert val == frames assert ( - yield from bps.rd(jungfrau._writer.file_path) + yield from bps.rd(jungfrau.writer.file_path) ) == f"{tmp_path}/0000_{filename}" run_engine(_open_run_and_fly()) @@ -57,10 +59,10 @@ def _open_run_and_fly(): new=MagicMock(), ) async def test_fly_jungfrau_does_read_plan_after_prepare( - run_engine: RunEngine, jungfrau: CommissioningJungfrau + run_engine: RunEngine, jungfrau: CommissioningJungfrauDetector ): mock_stop = AsyncMock() - jungfrau.drv.acquisition_stop.trigger = mock_stop + jungfrau.detector.acquisition_stop.trigger = mock_stop read_hardware = MagicMock() @@ -72,7 +74,7 @@ async def test_fly_jungfrau_does_read_plan_after_prepare( parent_mock.attach_mock(read_hardware, "read_hardware") jungfrau.kickoff = MagicMock(side_effect=lambda: completed_status()) jungfrau.complete = MagicMock(side_effect=lambda: completed_status()) - test_trigger_info = TriggerInfo(livetime=1e-3, exposures_per_event=5) + test_trigger_info = TriggerInfo(livetime=1e-3, collections_per_event=5) @run_decorator(md={"detector_file_template": filename}) def fly_in_run(): diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/test_do_darks.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/test_do_darks.py index a32808615a..8f085aa340 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/test_do_darks.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/test_do_darks.py @@ -5,7 +5,9 @@ import pytest from bluesky.callbacks import CallbackBase from bluesky.run_engine import RunEngine -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from ophyd_async.core import completed_status from ophyd_async.fastcs.jungfrau import ( AcquisitionType, @@ -49,39 +51,40 @@ def fake_complete(_, group=None): new=MagicMock(side_effect=fake_complete), ) async def test_full_do_pedestal_darks( - jungfrau: CommissioningJungfrau, + jungfrau: CommissioningJungfrauDetector, run_engine: RunEngine, ): # Test that plan succeeds in RunEngine and pedestal-specific signals are changed as expected @bpp.run_decorator() def test_plan(): - yield from bps.monitor(jungfrau.drv.acquisition_type, name="AT") - yield from bps.monitor(jungfrau.drv.pedestal_mode_state, name="PM") - yield from bps.monitor(jungfrau.drv.gain_mode, name="GM") + yield from bps.monitor(jungfrau.acquisition_type, name="AT") + yield from bps.monitor(jungfrau.detector.pedestal_mode_state, name="PM") + yield from bps.monitor(jungfrau.detector.gain_mode, name="GM") yield from do_pedestal_darks(0.001, 2, 2, jungfrau=jungfrau) - jungfrau._controller.arm = AsyncMock() - assert await jungfrau.drv.acquisition_type.get_value() == AcquisitionType.STANDARD - await jungfrau.drv.gain_mode.set(GainMode.FIX_G2) - await jungfrau.drv.pedestal_mode_state.set(PedestalMode.OFF) + jungfrau._arm_logic.arm = AsyncMock() # type: ignore + assert await jungfrau.acquisition_type.get_value() == AcquisitionType.STANDARD + await jungfrau.detector.gain_mode.set(GainMode.FIX_G2) + await jungfrau.detector.pedestal_mode_state.set(PedestalMode.OFF) monitor_tracker = CheckMonitor( [ - "detector-drv-acquisition_type", - "detector-drv-pedestal_mode_state", - "detector-drv-gain_mode", + "detector-acquisition_type", + "detector-detector-pedestal_mode_state", + "detector-detector-gain_mode", ] ) run_engine.subscribe(monitor_tracker) run_engine(test_plan()) - assert monitor_tracker.signals_and_values["detector-drv-acquisition_type"] == [ - AcquisitionType.STANDARD, # Repeated as staging JF also sets to standard + assert monitor_tracker.signals_and_values["detector-acquisition_type"] == [ AcquisitionType.STANDARD, AcquisitionType.PEDESTAL, AcquisitionType.STANDARD, ] - assert monitor_tracker.signals_and_values["detector-drv-pedestal_mode_state"] == [ + assert monitor_tracker.signals_and_values[ + "detector-detector-pedestal_mode_state" + ] == [ PedestalMode.OFF, # Repeated as staging JF also turns pedestals off PedestalMode.OFF, PedestalMode.ON, @@ -90,7 +93,7 @@ def test_plan(): # When using the real detector, the switching of gain mode is a bit more complicated, # see the docstring for the do_pedestal_darks plan. - assert monitor_tracker.signals_and_values["detector-drv-gain_mode"] == [ + assert monitor_tracker.signals_and_values["detector-detector-gain_mode"] == [ GainMode.FIX_G2, GainMode.DYNAMIC, ] @@ -100,7 +103,7 @@ class FakeError(Exception): ... async def test_jungfrau_unstage_on_error( - jungfrau: CommissioningJungfrau, run_engine: RunEngine + jungfrau: CommissioningJungfrauDetector, run_engine: RunEngine ): jungfrau.stage = MagicMock(side_effect=FakeError) jungfrau.unstage = MagicMock(side_effect=lambda: completed_status()) diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/test_rotation_scan.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/test_rotation_scan.py index 5718762585..928eb7f3e9 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/test_rotation_scan.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/test_rotation_scan.py @@ -75,10 +75,10 @@ async def test_rotation_scan_plan_in_re( rotation_composite.dcm.energy_in_keV, rotation_composite.dcm.wavelength_in_a, rotation_composite.det_stage.z, - rotation_composite.jungfrau._writer.file_path, + rotation_composite.jungfrau.writer.file_path, ] - rotation_composite.jungfrau._writer.final_path = ( + rotation_composite.jungfrau.writer.final_path = ( tmp_path # Normally done during jf prepare ) # Test correct functions are called, but don't test bluesky messages diff --git a/tests/unit_tests/beamlines/i24/web_gui/test_jungfrau_plans.py b/tests/unit_tests/beamlines/i24/web_gui/test_jungfrau_plans.py index a59e8d2e5e..34f6be40bd 100644 --- a/tests/unit_tests/beamlines/i24/web_gui/test_jungfrau_plans.py +++ b/tests/unit_tests/beamlines/i24/web_gui/test_jungfrau_plans.py @@ -6,7 +6,9 @@ from dodal.devices.attenuator.attenuator import EnumFilterAttenuator from dodal.devices.beamlines.i24.aperture import Aperture from dodal.devices.beamlines.i24.beamstop import Beamstop -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from dodal.devices.beamlines.i24.dcm import DCM from dodal.devices.beamlines.i24.dual_backlight import DualBacklight from dodal.devices.beamlines.i24.vgonio import VerticalGoniometer @@ -31,7 +33,7 @@ def vertical_gonio() -> VerticalGoniometer: def test_run_jf_rotation( - jungfrau: CommissioningJungfrau, + jungfrau: CommissioningJungfrauDetector, zebra: Zebra, enum_attenuator: EnumFilterAttenuator, aperture: Aperture, diff --git a/tests/unit_tests/conftest.py b/tests/unit_tests/conftest.py index 2984284e4c..4e493ab0ae 100644 --- a/tests/unit_tests/conftest.py +++ b/tests/unit_tests/conftest.py @@ -25,7 +25,9 @@ from dodal.devices.backlight import Backlight from dodal.devices.beamlines.i03 import Beamstop from dodal.devices.beamlines.i03.dcm import DCM -from dodal.devices.beamlines.i24.commissioning_jungfrau import CommissioningJungfrau +from dodal.devices.beamlines.i24.commissioning_jungfrau import ( + CommissioningJungfrauDetector, +) from dodal.devices.beamsize.beamsize import BeamsizeBase from dodal.devices.detector.detector_motion import DetectorMotion from dodal.devices.eiger import EigerDetector @@ -535,12 +537,12 @@ def __call__(self, device_name: str | None = None) -> PathInfo: # See https://github.com/DiamondLightSource/dodal/issues/1455 @pytest.fixture -def jungfrau(tmp_path: Path, run_engine: RunEngine) -> CommissioningJungfrau: +def jungfrau(tmp_path: Path, run_engine: RunEngine) -> CommissioningJungfrauDetector: with init_devices(mock=True): base_provider = _BasePathProvider(tmp_path) - path = AutoMaxIncrementingPathProvider(base_provider) - detector = CommissioningJungfrau("", "", path) - set_mock_value(detector._writer.writer_ready, 1) + path_provider = AutoMaxIncrementingPathProvider(base_provider) + detector = CommissioningJungfrauDetector("", "", path_provider, "CAM:") + set_mock_value(detector.writer.writer_ready, 1) run_engine.subscribe(base_provider.run_start, "start") return detector From fa003a03d516c2f5d55d7193053f603f9500e060 Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Mon, 18 May 2026 16:00:56 +0100 Subject: [PATCH 2/8] Bump ophyd-async dependency --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9eae49827e..1e2350216c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,7 +53,7 @@ dependencies = [ "daq-config-server >= 1.3.0", "blueapi >= 1.12.0", "ophyd >= 1.10.5", - "ophyd-async >= 0.16.0", + "ophyd-async >= 0.17.0a4", "bluesky >= 1.14.6", "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@main", ] From fe4dec76822f66d51455c5d78c4846cd5139bded Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Mon, 18 May 2026 16:01:21 +0100 Subject: [PATCH 3/8] Update uv.lock --- uv.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/uv.lock b/uv.lock index a932ab5ee9..10a9c31d19 100644 --- a/uv.lock +++ b/uv.lock @@ -807,8 +807,8 @@ wheels = [ [[package]] name = "dls-dodal" -version = "2.3.1.dev11+g0f2534ce9" -source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=main#0f2534ce926a173dba046352ea258a97b90176c2" } +version = "2.3.1.dev12+g5824ccd04" +source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=main#5824ccd0465b8ad825feafd8b48bf4b6f64d50df" } dependencies = [ { name = "aiofiles", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "aiohttp", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, @@ -2130,7 +2130,7 @@ requires-dist = [ { name = "opentelemetry-distro" }, { name = "opentelemetry-exporter-otlp" }, { name = "ophyd", specifier = ">=1.10.5" }, - { name = "ophyd-async", specifier = ">=0.16.0" }, + { name = "ophyd-async", specifier = ">=0.17.0a4" }, { name = "pydantic" }, { name = "pydantic-extra-types", specifier = ">=2.10.1" }, { name = "pyepics" }, @@ -2682,7 +2682,7 @@ wheels = [ [[package]] name = "ophyd-async" -version = "0.16" +version = "0.17a4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bluesky", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, @@ -2696,9 +2696,9 @@ dependencies = [ { name = "stamina", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "velocity-profile", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/2d/cd178f31c4efb7f2a1b2787900d62b70b478111c5db51a625307f5fb9b15/ophyd_async-0.16.tar.gz", hash = "sha256:c8a3671c704da77c7a7b7c5343b972230f743b1029a100f6c5780123fb0df33d", size = 545367, upload-time = "2026-02-17T16:39:37.897Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/e1/2f0de5ded648fe9ca2e6f7415b9229ecb53226a56e775028410fddf0e7c7/ophyd_async-0.17a4.tar.gz", hash = "sha256:0ac0a890499700f8d6024a272ee616ddf278c42c2a28c3bf2d8ee80b5313a94d", size = 554974, upload-time = "2026-04-28T16:34:04.143Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/ab/0c92e9824c9e54df5a06b5759957fc23c30489c2aabef5653dd9057b3f61/ophyd_async-0.16-py3-none-any.whl", hash = "sha256:017d837767b63cdc20af1851275495b6bb0db195a887e0bd989dc7a17e0f0c79", size = 208499, upload-time = "2026-02-17T16:39:36.542Z" }, + { url = "https://files.pythonhosted.org/packages/71/59/a4ca5bd2ef8baa92733260634ba9fa6947fd88c6e7b909511964ac6406e1/ophyd_async-0.17a4-py3-none-any.whl", hash = "sha256:8dcaad6a851883c6906dda998c159a366b50b38310e8de87f385a5794c482792", size = 207790, upload-time = "2026-04-28T16:34:02.379Z" }, ] [package.optional-dependencies] From 6e7eefc5639794f30dba2ebf70678453f42f2647 Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Mon, 18 May 2026 16:02:50 +0100 Subject: [PATCH 4/8] Repin dodal --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1e2350216c..844e2087bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,7 +53,7 @@ dependencies = [ "daq-config-server >= 1.3.0", "blueapi >= 1.12.0", "ophyd >= 1.10.5", - "ophyd-async >= 0.17.0a4", + "ophyd-async >= 0.17a4", "bluesky >= 1.14.6", "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@main", ] From 83923083eb25fb6915fc1358529e911e7fa29d7d Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Mon, 18 May 2026 16:04:34 +0100 Subject: [PATCH 5/8] Pin against dodal branch --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 844e2087bf..c0b4cdf931 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ dependencies = [ "ophyd >= 1.10.5", "ophyd-async >= 0.17a4", "bluesky >= 1.14.6", - "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@main", + "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@update_dodal_ophyd_async_v0.17a1", ] From 870e4913e4c775dbbfde1454a1d554519b14c012 Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Mon, 18 May 2026 16:05:03 +0100 Subject: [PATCH 6/8] Update uv.lock --- uv.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index 10a9c31d19..7434e64101 100644 --- a/uv.lock +++ b/uv.lock @@ -807,8 +807,8 @@ wheels = [ [[package]] name = "dls-dodal" -version = "2.3.1.dev12+g5824ccd04" -source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=main#5824ccd0465b8ad825feafd8b48bf4b6f64d50df" } +version = "2.3.1.dev59+g8f0e46358" +source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=update_dodal_ophyd_async_v0.17a1#8f0e463580a7637603af050a48694d8288d71057" } dependencies = [ { name = "aiofiles", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "aiohttp", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, @@ -2118,7 +2118,7 @@ requires-dist = [ { name = "caproto" }, { name = "daq-config-server", specifier = ">=1.3.0" }, { name = "deepdiff" }, - { name = "dls-dodal", git = "https://github.com/DiamondLightSource/dodal.git?rev=main" }, + { name = "dls-dodal", git = "https://github.com/DiamondLightSource/dodal.git?rev=update_dodal_ophyd_async_v0.17a1" }, { name = "fastapi", extras = ["all"] }, { name = "flask-restful" }, { name = "jupyterlab" }, @@ -2130,7 +2130,7 @@ requires-dist = [ { name = "opentelemetry-distro" }, { name = "opentelemetry-exporter-otlp" }, { name = "ophyd", specifier = ">=1.10.5" }, - { name = "ophyd-async", specifier = ">=0.17.0a4" }, + { name = "ophyd-async", specifier = ">=0.17a4" }, { name = "pydantic" }, { name = "pydantic-extra-types", specifier = ">=2.10.1" }, { name = "pyepics" }, From 74efdc12224792edc42b97f63ddf91edd52d9250 Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Tue, 12 May 2026 10:36:27 +0100 Subject: [PATCH 7/8] Beamline hotfixes for 500Hz gridscan, multipin snapshots, mod-360 robot load --- src/mx_bluesky/hyperion/blueapi/parameters.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mx_bluesky/hyperion/blueapi/parameters.py b/src/mx_bluesky/hyperion/blueapi/parameters.py index 01d9d92f88..87184e850a 100644 --- a/src/mx_bluesky/hyperion/blueapi/parameters.py +++ b/src/mx_bluesky/hyperion/blueapi/parameters.py @@ -94,12 +94,14 @@ def load_centre_collect_to_internal( ) -> LoadCentreCollect: params_as_dict = external_params.model_dump() params_as_dict["parameter_model_version"] = get_param_version() - tip_offset, grid_width = pin_type_to_tip_offset_and_grid_width( - external_params.robot_load_then_centre.pin_type - ) + pin_type = external_params.robot_load_then_centre.pin_type + tip_offset, grid_width = pin_type_to_tip_offset_and_grid_width(pin_type) params_as_dict["robot_load_then_centre"]["grid_width_um"] = grid_width params_as_dict["robot_load_then_centre"]["tip_offset_um"] = tip_offset del params_as_dict["robot_load_then_centre"]["pin_type"] + if pin_type.name == "msp": + params_as_dict["multi_rotation_scan"]["use_grid_snapshots"] = True + params_as_dict["multi_rotation_scan"]["snapshot_omegas_deg"] = None return LoadCentreCollect(**params_as_dict) From 1625ae7b22d44d62f06d8d4b2cece31731d559e5 Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Mon, 18 May 2026 17:06:16 +0100 Subject: [PATCH 8/8] Update tests, fix flaky baton test --- tests/unit_tests/hyperion/blueapi_plans/test_parameters.py | 3 +++ tests/unit_tests/hyperion/test_baton_handler.py | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit_tests/hyperion/blueapi_plans/test_parameters.py b/tests/unit_tests/hyperion/blueapi_plans/test_parameters.py index a970ff539b..7e71a6b854 100644 --- a/tests/unit_tests/hyperion/blueapi_plans/test_parameters.py +++ b/tests/unit_tests/hyperion/blueapi_plans/test_parameters.py @@ -34,6 +34,7 @@ def test_map_external_to_internal_parameters(tmp_path): ) actual_internal = load_centre_collect_to_internal(external_params) assert expected_internal == actual_internal + assert not actual_internal.multi_rotation_scan.use_grid_snapshots def test_map_external_to_internal_multisample_pin(tmp_path): @@ -46,6 +47,8 @@ def test_map_external_to_internal_multisample_pin(tmp_path): assert actual_internal.robot_load_then_centre.grid_width_um == 520 assert actual_internal.robot_load_then_centre.tip_offset_um == 260 + assert actual_internal.multi_rotation_scan.use_grid_snapshots + assert actual_internal.multi_rotation_scan.snapshot_omegas_deg is None def test_pin_type_to_tip_offset_and_grid_width_raises_value_error_on_unrecognised_type(): diff --git a/tests/unit_tests/hyperion/test_baton_handler.py b/tests/unit_tests/hyperion/test_baton_handler.py index b4c4878e0c..2e0345aceb 100644 --- a/tests/unit_tests/hyperion/test_baton_handler.py +++ b/tests/unit_tests/hyperion/test_baton_handler.py @@ -785,7 +785,6 @@ async def release_baton_and_check_commissioning_signal_set(): call.current_user("Hyperion"), call.set_commissioning_signal(baton.commissioning), call.create_parameters_from_agamemnon(), - call.create_parameters_from_agamemnon(), ] ) finally: