From c96576a7bddd83cb40fabb3ae7d0f8ee877435d2 Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 11 May 2026 14:18:29 +0100 Subject: [PATCH 1/5] Fix for shutter renaming --- pyproject.toml | 2 +- .../i04_grid_detect_then_xray_centre_plan.py | 4 +-- .../i04/oav_centering_plans/oav_imaging.py | 8 ++--- .../i24/jungfrau_commissioning/composites.py | 4 +-- .../experiment_plans/rotation_scan_plan.py | 4 +-- .../common/device_setup_plans/gonio.py | 5 +++ .../setup_zebra_and_shutter.py | 19 ++++++----- .../common/experiment_plans/beamstop_check.py | 7 ++-- .../common/parameters/device_composites.py | 4 +-- .../device_setup_plans/setup_zebra.py | 4 +-- .../optimise_attenuation_plan.py | 7 ++-- .../robot_load_then_centre_plan.py | 4 +-- .../experiment_plans/rotation_scan_plan.py | 4 +-- .../hyperion/parameters/device_composites.py | 4 +-- tests/conftest.py | 6 ++-- .../hyperion/external_interaction/conftest.py | 4 +-- ...t_i04_grid_detect_then_xray_centre_plan.py | 4 +-- .../beamlines/i04/test_oav_imaging.py | 12 +++---- .../i24/jungfrau_commissioning/conftest.py | 4 +-- .../i24/web_gui/test_jungfrau_plans.py | 4 +-- .../common/device_setup_plans/test_gonio.py | 34 +++++++++++++++++++ .../test_setup_zebra_and_shutter.py | 12 +++---- .../device_setup_plans/test_zebra_setup.py | 4 +-- uv.lock | 6 ++-- 24 files changed, 109 insertions(+), 61 deletions(-) create mode 100644 tests/unit_tests/common/device_setup_plans/test_gonio.py diff --git a/pyproject.toml b/pyproject.toml index 6ade793d98..2b712e6577 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ dependencies = [ "ophyd >= 1.10.5", "ophyd-async >= 0.16.0", "bluesky >= 1.14.6", - "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@main", + "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@cryst_bluesky_10_fast_shutter", ] diff --git a/src/mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py b/src/mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py index a4c5e08f5a..9b8e3afb15 100644 --- a/src/mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py +++ b/src/mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py @@ -29,7 +29,7 @@ from dodal.devices.undulator import UndulatorInKeV from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from dodal.devices.zocalo import ZocaloResults from dodal.plans.preprocessors.verify_undulator_gap import ( verify_undulator_gap_before_run_decorator, @@ -136,7 +136,7 @@ def i04_default_grid_detect_and_xray_centre( xbpm_feedback: XBPMFeedback = inject("xbpm_feedback"), zebra: Zebra = inject("zebra"), robot: BartRobot = inject("robot"), - sample_shutter: ZebraShutter = inject("sample_shutter"), + sample_shutter: MXZebraShutter = inject("sample_shutter"), eiger: EigerDetector = inject("eiger"), synchrotron: Synchrotron = inject("synchrotron"), zocalo: ZocaloResults = inject("zocalo"), diff --git a/src/mx_bluesky/beamlines/i04/oav_centering_plans/oav_imaging.py b/src/mx_bluesky/beamlines/i04/oav_centering_plans/oav_imaging.py index 0fca782755..47a2a58b63 100644 --- a/src/mx_bluesky/beamlines/i04/oav_centering_plans/oav_imaging.py +++ b/src/mx_bluesky/beamlines/i04/oav_centering_plans/oav_imaging.py @@ -15,7 +15,7 @@ from dodal.devices.scintillator import InOut, Scintillator from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra_controlled_shutter import ( - ZebraShutter, + MXZebraShutter, ZebraShutterControl, ZebraShutterState, ) @@ -38,7 +38,7 @@ class FindBeamCentresComposite: centre_ellipse: CentreEllipseMethod attenuator: BinaryFilterAttenuator zoom_controller: ZoomControllerWithBeamCentres - shutter: ZebraShutter + shutter: MXZebraShutter def take_oav_image_with_scintillator_in( @@ -46,7 +46,7 @@ def take_oav_image_with_scintillator_in( image_path: str = "dls_sw/i04/software/bluesky/scratch", transmission: float = 1, attenuator: BinaryFilterAttenuator = inject("attenuator"), - shutter: ZebraShutter = inject("sample_shutter"), + shutter: MXZebraShutter = inject("sample_shutter"), oav: OAV = inject("oav"), robot: BartRobot = inject("robot"), beamstop: Beamstop = inject("beamstop"), @@ -104,7 +104,7 @@ def _prepare_beamline_for_scintillator_images( backlight: Backlight, scintillator: Scintillator, xbpm_feedback: XBPMFeedback, - shutter: ZebraShutter, + shutter: MXZebraShutter, group: str, ) -> MsgGenerator: """ diff --git a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/composites.py b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/composites.py index 3f6eab657e..d9de41cbf7 100644 --- a/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/composites.py +++ b/src/mx_bluesky/beamlines/i24/jungfrau_commissioning/composites.py @@ -13,7 +13,7 @@ from dodal.devices.synchrotron import Synchrotron from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter @pydantic.dataclasses.dataclass(config={"arbitrary_types_allowed": True}) @@ -25,7 +25,7 @@ class RotationScanComposite: jungfrau: CommissioningJungfrau gonio: VerticalGoniometer synchrotron: Synchrotron - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter zebra: Zebra xbpm_feedback: XBPMFeedback hutch_shutter: InterlockedHutchShutter 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..ed336518ed 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 @@ -10,7 +10,7 @@ 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 -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from ophyd_async.fastcs.jungfrau import ( GainMode, create_jungfrau_external_triggering_info, @@ -281,7 +281,7 @@ def _rotation_scan_plan( def _cleanup_plan( zebra: Zebra, jf: CommissioningJungfrau, - zebra_shutter: ZebraShutter, + zebra_shutter: MXZebraShutter, group="rotation cleanup", ): LOGGER.info("Tidying up Zebra and Jungfrau...") diff --git a/src/mx_bluesky/common/device_setup_plans/gonio.py b/src/mx_bluesky/common/device_setup_plans/gonio.py index 8876e10621..18c4fc648c 100644 --- a/src/mx_bluesky/common/device_setup_plans/gonio.py +++ b/src/mx_bluesky/common/device_setup_plans/gonio.py @@ -26,3 +26,8 @@ def move_gonio_warn_on_out_of_range( ) from fs.__cause__ else: raise fs + + +def find_nearest_omega_360(gonio: XYZOmegaStage): + current_omega = yield from bps.rd(gonio.omega.user_readback) + return round(current_omega / 360) * 360 diff --git a/src/mx_bluesky/common/device_setup_plans/setup_zebra_and_shutter.py b/src/mx_bluesky/common/device_setup_plans/setup_zebra_and_shutter.py index cea0933690..a344886c1f 100644 --- a/src/mx_bluesky/common/device_setup_plans/setup_zebra_and_shutter.py +++ b/src/mx_bluesky/common/device_setup_plans/setup_zebra_and_shutter.py @@ -10,7 +10,7 @@ Zebra, ) from dodal.devices.zebra.zebra_controlled_shutter import ( - ZebraShutter, + MXZebraShutter, ZebraShutterControl, ) @@ -30,7 +30,7 @@ @runtime_checkable class GridscanSetupDevices(Protocol): zebra: Zebra - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter def setup_zebra_for_gridscan( @@ -73,16 +73,19 @@ def setup_zebra_for_gridscan( def set_shutter_auto_input(zebra: Zebra, input: int, group="set_shutter_trigger"): """Set the signal that controls the shutter. We use the second input to the - Zebra's AND_GATE_FOR_AUTO_SHUTTER for this input. ZebraShutter control mode must be in auto for this input to take control + Zebra's AND_GATE_FOR_AUTO_SHUTTER for this input. MXZebraShutter control mode must be in auto for this input to take control - For more details see the ZebraShutter device.""" + For more details see the MXZebraShutter device.""" auto_gate = zebra.mapping.AND_GATE_FOR_AUTO_SHUTTER auto_shutter_control = zebra.logic_gates.and_gates[auto_gate] yield from bps.abs_set(auto_shutter_control.sources[2], input, group=group) def configure_zebra_and_shutter_for_auto_shutter( - zebra: Zebra, zebra_shutter: ZebraShutter, input: int, group="use_automatic_shutter" + zebra: Zebra, + zebra_shutter: MXZebraShutter, + input: int, + group="use_automatic_shutter", ): """Set the shutter to auto mode, and configure the zebra to trigger the shutter on an input source. For the input, use one of the source constants in zebra.py @@ -113,7 +116,7 @@ def configure_zebra_and_shutter_for_auto_shutter( def tidy_up_zebra_after_gridscan( zebra: Zebra, - zebra_shutter: ZebraShutter, + zebra_shutter: MXZebraShutter, group="tidy_up_zebra_after_gridscan", wait=True, ttl_input_for_detector_to_use: int | None = None, @@ -150,7 +153,7 @@ def tidy_up_zebra_after_gridscan( def setup_zebra_for_rotation( zebra: Zebra, - zebra_shutter: ZebraShutter, + zebra_shutter: MXZebraShutter, axis: EncEnum = I03Axes.OMEGA, start_angle: float = 0, scan_width: float = 360, @@ -221,7 +224,7 @@ def setup_zebra_for_rotation( def tidy_up_zebra_after_rotation_scan( zebra: Zebra, - zebra_shutter: ZebraShutter, + zebra_shutter: MXZebraShutter, group="tidy_up_zebra_after_rotation", wait=True, ): diff --git a/src/mx_bluesky/common/experiment_plans/beamstop_check.py b/src/mx_bluesky/common/experiment_plans/beamstop_check.py index 4454e03bad..82cb25a754 100644 --- a/src/mx_bluesky/common/experiment_plans/beamstop_check.py +++ b/src/mx_bluesky/common/experiment_plans/beamstop_check.py @@ -11,7 +11,10 @@ from dodal.devices.ipin import IPin, IPinGain from dodal.devices.mx_phase1.beamstop import Beamstop, BeamstopPositions from dodal.devices.xbpm_feedback import XBPMFeedback -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter, ZebraShutterState +from dodal.devices.zebra.zebra_controlled_shutter import ( + MXZebraShutter, + ZebraShutterState, +) from ophyd_async.core import InOut from mx_bluesky.common.device_setup_plans.xbpm_feedback import ( @@ -36,7 +39,7 @@ class BeamstopCheckDevices: beamstop: Beamstop detector_motion: DetectorMotion ipin: IPin - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter xbpm_feedback: XBPMFeedback diff --git a/src/mx_bluesky/common/parameters/device_composites.py b/src/mx_bluesky/common/parameters/device_composites.py index acc3104b63..15553020c0 100644 --- a/src/mx_bluesky/common/parameters/device_composites.py +++ b/src/mx_bluesky/common/parameters/device_composites.py @@ -25,7 +25,7 @@ from dodal.devices.wrapped_axis import WrappedAxis from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from dodal.devices.zocalo import ZocaloResults from ophyd_async.epics.motor import Motor @@ -78,4 +78,4 @@ class GridDetectThenXRayCentreComposite(FlyScanEssentialDevices[Smargon]): xbpm_feedback: XBPMFeedback zebra: Zebra robot: BartRobot - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter diff --git a/src/mx_bluesky/hyperion/device_setup_plans/setup_zebra.py b/src/mx_bluesky/hyperion/device_setup_plans/setup_zebra.py index 6d695bbca8..d3a4d7fc19 100644 --- a/src/mx_bluesky/hyperion/device_setup_plans/setup_zebra.py +++ b/src/mx_bluesky/hyperion/device_setup_plans/setup_zebra.py @@ -4,7 +4,7 @@ Zebra, ) from dodal.devices.zebra.zebra_controlled_shutter import ( - ZebraShutter, + MXZebraShutter, ) from mx_bluesky.common.device_setup_plans.setup_zebra_and_shutter import ( @@ -19,7 +19,7 @@ def arm_zebra(zebra: Zebra): def setup_zebra_for_panda_flyscan( zebra: Zebra, - zebra_shutter: ZebraShutter, + zebra_shutter: MXZebraShutter, group="setup_zebra_for_panda_flyscan", wait=True, ): diff --git a/src/mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py b/src/mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py index 91d9f5cea6..ba20bbd4f1 100644 --- a/src/mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py +++ b/src/mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py @@ -7,7 +7,10 @@ from blueapi.core import BlueskyContext from dodal.devices.attenuator.attenuator import BinaryFilterAttenuator from dodal.devices.xspress3.xspress3 import Xspress3 -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter, ZebraShutterState +from dodal.devices.zebra.zebra_controlled_shutter import ( + MXZebraShutter, + ZebraShutterState, +) from mx_bluesky.common.utils.context import device_composite_from_context from mx_bluesky.common.utils.log import LOGGER @@ -27,7 +30,7 @@ class OptimizeAttenuationComposite: """All devices which are directly or indirectly required by this plan""" attenuator: BinaryFilterAttenuator - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter xspress3mini: Xspress3 diff --git a/src/mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py b/src/mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py index acdcd84540..e30192ba78 100644 --- a/src/mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py +++ b/src/mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py @@ -31,7 +31,7 @@ from dodal.devices.webcam import Webcam from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from dodal.devices.zocalo import ZocaloResults from dodal.log import LOGGER from ophyd_async.fastcs.panda import HDFPanda @@ -87,7 +87,7 @@ class RobotLoadThenCentreComposite: panda: HDFPanda panda_fast_grid_scan: PandAFastGridScan thawer: Thawer - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter # SetEnergyComposite fields vfm: FocusingMirrorWithStripes diff --git a/src/mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py b/src/mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py index a3110e4e32..6f89deea74 100644 --- a/src/mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py +++ b/src/mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py @@ -23,7 +23,7 @@ from dodal.devices.undulator import UndulatorInKeV from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from dodal.plan_stubs.check_topup import check_topup_and_wait_if_necessary from dodal.plans.preprocessors.verify_undulator_gap import ( verify_undulator_gap_before_run_decorator, @@ -86,7 +86,7 @@ class RotationScanComposite(OavSnapshotComposite): undulator: UndulatorInKeV synchrotron: Synchrotron s4_slit_gaps: S4SlitGaps - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter zebra: Zebra oav: OAV xbpm_feedback: XBPMFeedback diff --git a/src/mx_bluesky/hyperion/parameters/device_composites.py b/src/mx_bluesky/hyperion/parameters/device_composites.py index 9610a26087..e72c73f515 100644 --- a/src/mx_bluesky/hyperion/parameters/device_composites.py +++ b/src/mx_bluesky/hyperion/parameters/device_composites.py @@ -21,7 +21,7 @@ from dodal.devices.undulator import UndulatorInKeV from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from dodal.devices.zocalo import ZocaloResults from ophyd_async.fastcs.panda import HDFPanda @@ -48,7 +48,7 @@ class HyperionFlyScanXRayCentreComposite(FlyScanEssentialDevices[Smargon]): panda: HDFPanda panda_fast_grid_scan: PandAFastGridScan robot: BartRobot - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter backlight: Backlight xbpm_feedback: XBPMFeedback zebra_fast_grid_scan: ZebraFastGridScanThreeD diff --git a/tests/conftest.py b/tests/conftest.py index b7396a7625..74f46c3dbc 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -61,7 +61,7 @@ from dodal.devices.webcam import Webcam from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from dodal.devices.zocalo import ZocaloResults from dodal.devices.zocalo.zocalo_results import _NO_SAMPLE_ID from dodal.log import LOGGER as DODAL_LOGGER @@ -656,7 +656,7 @@ def thawer() -> Generator[Thawer, Any, Any]: @pytest.fixture -def sample_shutter() -> Generator[ZebraShutter, Any, Any]: +def sample_shutter() -> Generator[MXZebraShutter, Any, Any]: yield i03.sample_shutter.build(connect_immediately=True, mock=True) @@ -793,7 +793,7 @@ def fake_create_rotation_devices( dcm: DCM, robot: BartRobot, oav: OAV, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, xbpm_feedback: XBPMFeedback, thawer: Thawer, beamsize: BeamsizeBase, diff --git a/tests/system_tests/hyperion/external_interaction/conftest.py b/tests/system_tests/hyperion/external_interaction/conftest.py index 1fc532e8e5..40032856ea 100644 --- a/tests/system_tests/hyperion/external_interaction/conftest.py +++ b/tests/system_tests/hyperion/external_interaction/conftest.py @@ -29,7 +29,7 @@ from dodal.devices.undulator import UndulatorInKeV from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from dodal.devices.zocalo import ZocaloResults from ispyb.sqlalchemy import ( BLSample, @@ -431,7 +431,7 @@ def composite_for_rotation_scan( dcm: DCM, robot: BartRobot, oav_for_system_test: OAV, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, xbpm_feedback: XBPMFeedback, thawer: Thawer, beamsize: BeamsizeBase, diff --git a/tests/unit_tests/beamlines/i04/test_i04_grid_detect_then_xray_centre_plan.py b/tests/unit_tests/beamlines/i04/test_i04_grid_detect_then_xray_centre_plan.py index 2cf3bc9f9e..f8d0246bd0 100644 --- a/tests/unit_tests/beamlines/i04/test_i04_grid_detect_then_xray_centre_plan.py +++ b/tests/unit_tests/beamlines/i04/test_i04_grid_detect_then_xray_centre_plan.py @@ -29,7 +29,7 @@ from dodal.devices.undulator import UndulatorInKeV from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from dodal.devices.zocalo import ZocaloResults from dodal.devices.zocalo.zocalo_results import ( ZOCALO_STAGE_GROUP, @@ -79,7 +79,7 @@ def i04_grid_detect_then_xrc_default_params( xbpm_feedback: XBPMFeedback, zebra: Zebra, robot: BartRobot, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, eiger: EigerDetector, synchrotron: Synchrotron, zocalo: ZocaloResults, diff --git a/tests/unit_tests/beamlines/i04/test_oav_imaging.py b/tests/unit_tests/beamlines/i04/test_oav_imaging.py index 73db02d30f..9f84e3abab 100644 --- a/tests/unit_tests/beamlines/i04/test_oav_imaging.py +++ b/tests/unit_tests/beamlines/i04/test_oav_imaging.py @@ -14,7 +14,7 @@ from dodal.devices.scintillator import InOut, Scintillator from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra_controlled_shutter import ( - ZebraShutter, + MXZebraShutter, ZebraShutterControl, ZebraShutterState, ) @@ -46,7 +46,7 @@ async def test_check_exception_raised_if_pin_mounted( beamstop_phase1: Beamstop, scintillator: Scintillator, attenuator: BinaryFilterAttenuator, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, oav: OAV, ): set_mock_value(robot.gonio_pin_sensor, PinMounted.PIN_MOUNTED) @@ -71,7 +71,7 @@ def test_prepare_beamline_for_scint_images( backlight: Backlight, scintillator: Scintillator, xbpm_feedback: XBPMFeedback, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, ): test_group = "my_group" messages = sim_run_engine.simulate_plan( @@ -154,7 +154,7 @@ def test_plan_stubs_called_in_correct_order( scintillator: Scintillator, attenuator: BinaryFilterAttenuator, oav: OAV, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, backlight: Backlight, xbpm_feedback: XBPMFeedback, ): @@ -227,7 +227,7 @@ def test_plan_called_with_specified_transmission_then_transmission_set( scintillator: Scintillator, attenuator: BinaryFilterAttenuator, oav: OAV, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, backlight: Backlight, xbpm_feedback: XBPMFeedback, transmission: float, @@ -695,7 +695,7 @@ def find_beam_centre_devices( centre_ellipse: CentreEllipseMethod, attenuator: BinaryFilterAttenuator, zoom_controller_with_centres: ZoomControllerWithBeamCentres, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, ): return FindBeamCentresComposite( robot=robot, diff --git a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/conftest.py b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/conftest.py index 742fef4841..37924f51c5 100644 --- a/tests/unit_tests/beamlines/i24/jungfrau_commissioning/conftest.py +++ b/tests/unit_tests/beamlines/i24/jungfrau_commissioning/conftest.py @@ -11,7 +11,7 @@ from dodal.devices.synchrotron import Synchrotron from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from ophyd_async.core import init_devices from mx_bluesky.beamlines.i24.jungfrau_commissioning.experiment_plans.rotation_scan_plan import ( @@ -27,7 +27,7 @@ def rotation_composite( aperture = Aperture("") gonio = VerticalGoniometer("") synchrotron = Synchrotron("") - sample_shutter = ZebraShutter("") + sample_shutter = MXZebraShutter("") xbpm_feedback = XBPMFeedback("") hutch_shutter = InterlockedHutchShutter("", HutchInterlock("")) beamstop = Beamstop("") 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..02b6e02586 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 @@ -15,7 +15,7 @@ from dodal.devices.synchrotron import Synchrotron from dodal.devices.xbpm_feedback import XBPMFeedback from dodal.devices.zebra.zebra import Zebra -from dodal.devices.zebra.zebra_controlled_shutter import ZebraShutter +from dodal.devices.zebra.zebra_controlled_shutter import MXZebraShutter from mx_bluesky.beamlines.i24.jungfrau_commissioning.composites import ( RotationScanComposite, @@ -42,7 +42,7 @@ def test_run_jf_rotation( dcm: DCM, synchrotron: Synchrotron, shutter: InterlockedHutchShutter, - sample_shutter: ZebraShutter, + sample_shutter: MXZebraShutter, xbpm_feedback: XBPMFeedback, run_engine: RunEngine, ): diff --git a/tests/unit_tests/common/device_setup_plans/test_gonio.py b/tests/unit_tests/common/device_setup_plans/test_gonio.py new file mode 100644 index 0000000000..ab105a67dc --- /dev/null +++ b/tests/unit_tests/common/device_setup_plans/test_gonio.py @@ -0,0 +1,34 @@ +import pytest +from bluesky.run_engine import RunEngine +from dodal.devices.motors import XYZOmegaStage +from ophyd_async.core import set_mock_value + +from mx_bluesky.common.device_setup_plans.gonio import find_nearest_omega_360 + + +@pytest.mark.parametrize( + "current, expected", + [ + # exact multiples + (0, 0), + (360, 360), + (-360, -360), + # near positives + (10, 0), + (200, 360), + # near negatives + (-10, 0), + (-200, -360), + # halfway cases + (180, 0), + (-180, 0), + (540, 720), + (-540, -720), + ], +) +def test_nearest_omega_halfway( + run_engine: RunEngine, smargon: XYZOmegaStage, current: float, expected: float +): + set_mock_value(smargon.omega.user_readback, current) + result = run_engine(find_nearest_omega_360(smargon)) + assert result.plan_result == expected # type: ignore diff --git a/tests/unit_tests/common/device_setup_plans/test_setup_zebra_and_shutter.py b/tests/unit_tests/common/device_setup_plans/test_setup_zebra_and_shutter.py index f3c538888d..414930eee4 100644 --- a/tests/unit_tests/common/device_setup_plans/test_setup_zebra_and_shutter.py +++ b/tests/unit_tests/common/device_setup_plans/test_setup_zebra_and_shutter.py @@ -7,7 +7,7 @@ Zebra, ) from dodal.devices.zebra.zebra_controlled_shutter import ( - ZebraShutter, + MXZebraShutter, ZebraShutterControl, ) @@ -36,7 +36,7 @@ async def _get_shutter_input_1(zebra: Zebra): async def test_configure_zebra_and_shutter_for_auto( - run_engine, zebra: Zebra, zebra_shutter: ZebraShutter + run_engine, zebra: Zebra, zebra_shutter: MXZebraShutter ): run_engine( configure_zebra_and_shutter_for_auto_shutter( @@ -48,7 +48,7 @@ async def test_configure_zebra_and_shutter_for_auto( assert await _get_shutter_input_2(zebra) == zebra.mapping.sources.IN4_TTL -async def test_zebra_cleanup(run_engine, zebra: Zebra, zebra_shutter: ZebraShutter): +async def test_zebra_cleanup(run_engine, zebra: Zebra, zebra_shutter: MXZebraShutter): run_engine(tidy_up_zebra_after_gridscan(zebra, zebra_shutter, wait=True)) assert ( await zebra.output.out_pvs[zebra.mapping.outputs.TTL_DETECTOR].get_value() @@ -58,12 +58,12 @@ async def test_zebra_cleanup(run_engine, zebra: Zebra, zebra_shutter: ZebraShutt async def test_zebra_set_up_for_gridscan( - run_engine, zebra: Zebra, zebra_shutter: ZebraShutter + run_engine, zebra: Zebra, zebra_shutter: MXZebraShutter ): @dataclasses.dataclass class Composite: zebra: Zebra - sample_shutter: ZebraShutter + sample_shutter: MXZebraShutter composite = Composite(zebra, zebra_shutter) run_engine(setup_zebra_for_gridscan(composite, wait=True)) @@ -79,7 +79,7 @@ class Composite: async def test_zebra_set_up_for_rotation( run_engine, zebra: Zebra, - zebra_shutter: ZebraShutter, + zebra_shutter: MXZebraShutter, ): axis = I24Axes.OMEGA start_angle = 90 diff --git a/tests/unit_tests/hyperion/device_setup_plans/test_zebra_setup.py b/tests/unit_tests/hyperion/device_setup_plans/test_zebra_setup.py index c65393cd59..116e65e03e 100644 --- a/tests/unit_tests/hyperion/device_setup_plans/test_zebra_setup.py +++ b/tests/unit_tests/hyperion/device_setup_plans/test_zebra_setup.py @@ -2,7 +2,7 @@ Zebra, ) from dodal.devices.zebra.zebra_controlled_shutter import ( - ZebraShutter, + MXZebraShutter, ZebraShutterControl, ) @@ -28,7 +28,7 @@ async def _get_shutter_input_1(zebra: Zebra): async def test_zebra_set_up_for_panda_gridscan( - run_engine, zebra: Zebra, zebra_shutter: ZebraShutter + run_engine, zebra: Zebra, zebra_shutter: MXZebraShutter ): run_engine(setup_zebra_for_panda_flyscan(zebra, zebra_shutter, wait=True)) assert ( diff --git a/uv.lock b/uv.lock index a3cbc9a23d..9365379b29 100644 --- a/uv.lock +++ b/uv.lock @@ -807,8 +807,8 @@ wheels = [ [[package]] name = "dls-dodal" -version = "2.2.4.dev10+g0649293ed" -source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=main#0649293ed97538713ef77ab6e6f55fe984abd616" } +version = "2.2.4.dev8+g7cad07c52" +source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=cryst_bluesky_10_fast_shutter#7cad07c52fda3e2f00a45ea60e06361364b7470f" } 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=cryst_bluesky_10_fast_shutter" }, { name = "fastapi", extras = ["all"] }, { name = "flask-restful" }, { name = "jupyterlab" }, From 782f851b48f69af28e0b60c0cdf4cba52165291d Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 11 May 2026 16:39:32 +0100 Subject: [PATCH 2/5] Update dodal pin --- uv.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uv.lock b/uv.lock index 9365379b29..382103c9f7 100644 --- a/uv.lock +++ b/uv.lock @@ -807,8 +807,8 @@ wheels = [ [[package]] name = "dls-dodal" -version = "2.2.4.dev8+g7cad07c52" -source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=cryst_bluesky_10_fast_shutter#7cad07c52fda3e2f00a45ea60e06361364b7470f" } +version = "2.3.1.dev3+g3a2fbb935" +source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=cryst_bluesky_10_fast_shutter#3a2fbb935987349d952abb0c5d71cf1b145370bb" } dependencies = [ { name = "aiofiles", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "aiohttp", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, From 64d5205887a4a11e8ce7050eff2ffa6ab81e6f8b Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Tue, 12 May 2026 18:47:16 +0100 Subject: [PATCH 3/5] Remove accidentally added code --- .../common/device_setup_plans/gonio.py | 5 --- .../common/device_setup_plans/test_gonio.py | 34 ------------------- 2 files changed, 39 deletions(-) delete mode 100644 tests/unit_tests/common/device_setup_plans/test_gonio.py diff --git a/src/mx_bluesky/common/device_setup_plans/gonio.py b/src/mx_bluesky/common/device_setup_plans/gonio.py index 18c4fc648c..8876e10621 100644 --- a/src/mx_bluesky/common/device_setup_plans/gonio.py +++ b/src/mx_bluesky/common/device_setup_plans/gonio.py @@ -26,8 +26,3 @@ def move_gonio_warn_on_out_of_range( ) from fs.__cause__ else: raise fs - - -def find_nearest_omega_360(gonio: XYZOmegaStage): - current_omega = yield from bps.rd(gonio.omega.user_readback) - return round(current_omega / 360) * 360 diff --git a/tests/unit_tests/common/device_setup_plans/test_gonio.py b/tests/unit_tests/common/device_setup_plans/test_gonio.py deleted file mode 100644 index ab105a67dc..0000000000 --- a/tests/unit_tests/common/device_setup_plans/test_gonio.py +++ /dev/null @@ -1,34 +0,0 @@ -import pytest -from bluesky.run_engine import RunEngine -from dodal.devices.motors import XYZOmegaStage -from ophyd_async.core import set_mock_value - -from mx_bluesky.common.device_setup_plans.gonio import find_nearest_omega_360 - - -@pytest.mark.parametrize( - "current, expected", - [ - # exact multiples - (0, 0), - (360, 360), - (-360, -360), - # near positives - (10, 0), - (200, 360), - # near negatives - (-10, 0), - (-200, -360), - # halfway cases - (180, 0), - (-180, 0), - (540, 720), - (-540, -720), - ], -) -def test_nearest_omega_halfway( - run_engine: RunEngine, smargon: XYZOmegaStage, current: float, expected: float -): - set_mock_value(smargon.omega.user_readback, current) - result = run_engine(find_nearest_omega_360(smargon)) - assert result.plan_result == expected # type: ignore From 7e20a90af435ff2aa87d99ab0837a0ee1ef6f32a Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Wed, 27 May 2026 10:27:02 +0100 Subject: [PATCH 4/5] unpin dodal --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3f482be602..844e2087bf 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@cryst_bluesky_10_fast_shutter", + "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@main", ] From 75ed27a84ab7ff512edf7d3034c2a7938229164a Mon Sep 17 00:00:00 2001 From: Robert Tuck Date: Wed, 27 May 2026 10:27:23 +0100 Subject: [PATCH 5/5] Update uv.lock --- uv.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uv.lock b/uv.lock index de0d894c38..eba2a67c4c 100644 --- a/uv.lock +++ b/uv.lock @@ -807,8 +807,8 @@ wheels = [ [[package]] name = "dls-dodal" -version = "2.4.0" -source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=main#79c8d490fd5c4bde4710901035fb93944608e16f" } +version = "2.4.1.dev6+g171a1a4ad" +source = { git = "https://github.com/DiamondLightSource/dodal.git?rev=main#171a1a4adbdfa63fedd3eaf4520548b2afb985ac" } dependencies = [ { name = "aiofiles", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "aiohttp", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },