From 057010dd2919c8f141dd042bf43ef84ddfd06a8c Mon Sep 17 00:00:00 2001 From: David Perl Date: Tue, 7 May 2024 12:44:43 +0100 Subject: [PATCH 1/3] (#1354) update Hyperion to use the new ApertureScatterguard --- setup.cfg | 2 +- tests/conftest.py | 52 ++++++++++++------- .../test_flyscan_xray_centre_plan.py | 8 ++- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/setup.cfg b/setup.cfg index d974bbe46..1609d833e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -33,7 +33,7 @@ install_requires = xarray doct databroker - dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@6864607ad8cf5415fa63cafa0a8a7ff955471eeb + dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@daaf2de4e98dc0e12e88a70b85a1268c1861b48f pydantic<2.0 # See https://github.com/DiamondLightSource/hyperion/issues/774 scipy pyzmq<25 # See https://github.com/DiamondLightSource/hyperion/issues/1103 diff --git a/tests/conftest.py b/tests/conftest.py index 6cf6cf71f..acff8ae0a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,11 +1,13 @@ +import asyncio import json import logging import sys import threading from functools import partial from typing import Any, Callable, Generator, Optional, Sequence -from unittest.mock import MagicMock, patch +from unittest.mock import AsyncMock, MagicMock, patch +import bluesky.plan_stubs as bps import pytest from bluesky.run_engine import RunEngine from bluesky.utils import Msg @@ -41,6 +43,7 @@ from ophyd.status import DeviceStatus, Status from ophyd_async.core import set_sim_value from ophyd_async.core.async_status import AsyncStatus +from ophyd_async.epics.motion.motor import Motor from scanspec.core import Path as ScanPath from scanspec.specs import Line @@ -181,6 +184,26 @@ def patch_motor(motor: EpicsMotor): return patch.object(motor, "set", MagicMock(side_effect=partial(mock_set, motor))) +async def mock_good_coroutine(): + return asyncio.sleep(0) + + +def mock_async_motor_move(motor: Motor, val, *args, **kwargs): + motor.user_setpoint._backend._set_value(val) # type: ignore + motor.user_readback._backend._set_value(val) # type: ignore + return mock_good_coroutine() # type: ignore + + +def patch_async_motor(motor: Motor, initial_position=0): + motor.user_setpoint._backend._set_value(initial_position) # type: ignore + motor.user_readback._backend._set_value(initial_position) # type: ignore + motor.deadband._backend._set_value(0.001) # type: ignore + motor.motor_done_move._backend._set_value(1) # type: ignore + return patch.object( + motor, "_move", AsyncMock(side_effect=partial(mock_async_motor_move, motor)) + ) + + @pytest.fixture def beamline_parameters(): return GDABeamlineParameters.from_file( @@ -433,7 +456,7 @@ def webcam(RE) -> Generator[Webcam, Any, Any]: @pytest.fixture -def aperture_scatterguard(done_status): +def aperture_scatterguard(done_status, RE): AperturePositions.LARGE = SingleAperturePosition( location=ApertureFiveDimensionalLocation(0, 1, 2, 3, 4), name="Large", @@ -467,16 +490,16 @@ def aperture_scatterguard(done_status): AperturePositions.ROBOT_LOAD, ), ) - ap_sg.aperture.z.user_setpoint.sim_put(2) # type: ignore - ap_sg.aperture.z.motor_done_move.sim_put(1) # type: ignore + ap_sg.aperture.z.user_setpoint._backend._set_value(2) # type: ignore + ap_sg.aperture.z.motor_done_move._backend._set_value(1) # type: ignore with ( - patch_motor(ap_sg.aperture.x), - patch_motor(ap_sg.aperture.y), - patch_motor(ap_sg.aperture.z), - patch_motor(ap_sg.scatterguard.x), - patch_motor(ap_sg.scatterguard.y), + patch_async_motor(ap_sg.aperture.x), + patch_async_motor(ap_sg.aperture.y), + patch_async_motor(ap_sg.aperture.z), + patch_async_motor(ap_sg.scatterguard.x), + patch_async_motor(ap_sg.scatterguard.y), ): - ap_sg.set(ap_sg.aperture_positions.SMALL) # type: ignore + RE(bps.abs_set(ap_sg, ap_sg.aperture_positions.SMALL)) # type: ignore yield ap_sg @@ -622,15 +645,6 @@ def fake_fgs_composite( fake_composite.eiger.ALL_FRAMES_TIMEOUT = 2 # type: ignore fake_composite.eiger.stop_odin_when_all_frames_collected = MagicMock() fake_composite.eiger.odin.check_odin_state = lambda: True - fake_composite.aperture_scatterguard.aperture.x.user_setpoint._use_limits = False - fake_composite.aperture_scatterguard.aperture.y.user_setpoint._use_limits = False - fake_composite.aperture_scatterguard.aperture.z.user_setpoint._use_limits = False - fake_composite.aperture_scatterguard.scatterguard.x.user_setpoint._use_limits = ( - False - ) - fake_composite.aperture_scatterguard.scatterguard.y.user_setpoint._use_limits = ( - False - ) mock_gridscan_kickoff_complete(fake_composite.fast_grid_scan) mock_gridscan_kickoff_complete(fake_composite.panda_fast_grid_scan) diff --git a/tests/unit_tests/experiment_plans/test_flyscan_xray_centre_plan.py b/tests/unit_tests/experiment_plans/test_flyscan_xray_centre_plan.py index 1cf524a79..5d333c94b 100644 --- a/tests/unit_tests/experiment_plans/test_flyscan_xray_centre_plan.py +++ b/tests/unit_tests/experiment_plans/test_flyscan_xray_centre_plan.py @@ -3,6 +3,7 @@ from typing import Tuple from unittest.mock import DEFAULT, MagicMock, call, patch +import bluesky.plan_stubs as bps import bluesky.preprocessors as bpp import numpy as np import pytest @@ -212,8 +213,11 @@ def test_read_hardware_for_ispyb_updates_from_ophyd_devices( flux_test_value = 10.0 fake_fgs_composite.flux.flux_reading.sim_put(flux_test_value) # type: ignore - fake_fgs_composite.aperture_scatterguard.set( - fake_fgs_composite.aperture_scatterguard.aperture_positions.LARGE # type: ignore + RE( + bps.abs_set( + fake_fgs_composite.aperture_scatterguard, + fake_fgs_composite.aperture_scatterguard.aperture_positions.LARGE, # type: ignore + ) ) test_ispyb_callback = PlanReactiveCallback(ISPYB_LOGGER) From b1a56a7f1342fa24336067e135857ee1a937a87c Mon Sep 17 00:00:00 2001 From: David Perl Date: Tue, 7 May 2024 13:40:07 +0100 Subject: [PATCH 2/3] (#1354) fix issues from review --- tests/conftest.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index acff8ae0a..f794036bd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -189,14 +189,14 @@ async def mock_good_coroutine(): def mock_async_motor_move(motor: Motor, val, *args, **kwargs): - motor.user_setpoint._backend._set_value(val) # type: ignore - motor.user_readback._backend._set_value(val) # type: ignore + set_sim_value(motor.user_setpoint, val) + set_sim_value(motor.user_readback, val) return mock_good_coroutine() # type: ignore def patch_async_motor(motor: Motor, initial_position=0): - motor.user_setpoint._backend._set_value(initial_position) # type: ignore - motor.user_readback._backend._set_value(initial_position) # type: ignore + set_sim_value(motor.user_setpoint, initial_position) + set_sim_value(motor.user_readback, initial_position) motor.deadband._backend._set_value(0.001) # type: ignore motor.motor_done_move._backend._set_value(1) # type: ignore return patch.object( @@ -490,12 +490,10 @@ def aperture_scatterguard(done_status, RE): AperturePositions.ROBOT_LOAD, ), ) - ap_sg.aperture.z.user_setpoint._backend._set_value(2) # type: ignore - ap_sg.aperture.z.motor_done_move._backend._set_value(1) # type: ignore with ( patch_async_motor(ap_sg.aperture.x), patch_async_motor(ap_sg.aperture.y), - patch_async_motor(ap_sg.aperture.z), + patch_async_motor(ap_sg.aperture.z, 2), patch_async_motor(ap_sg.scatterguard.x), patch_async_motor(ap_sg.scatterguard.y), ): From 48e31c0bc873a940c26100dbafb351dd1dc7a360 Mon Sep 17 00:00:00 2001 From: David Perl <115003895+dperl-dls@users.noreply.github.com> Date: Tue, 7 May 2024 14:04:48 +0100 Subject: [PATCH 3/3] Update tests/conftest.py Co-authored-by: Dominic Oram --- tests/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index f794036bd..7fb536acf 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -197,8 +197,8 @@ def mock_async_motor_move(motor: Motor, val, *args, **kwargs): def patch_async_motor(motor: Motor, initial_position=0): set_sim_value(motor.user_setpoint, initial_position) set_sim_value(motor.user_readback, initial_position) - motor.deadband._backend._set_value(0.001) # type: ignore - motor.motor_done_move._backend._set_value(1) # type: ignore + set_sim_value(motor.deadband, 0.001) + set_sim_value(motor.motor_done_move, 1) return patch.object( motor, "_move", AsyncMock(side_effect=partial(mock_async_motor_move, motor)) )