From 12af18c9ccc30c0070b80c9cb42ab203034db82f Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 26 Jun 2023 17:08:50 +0100 Subject: [PATCH 1/8] Remove redundant setting the snapshot plugin --- setup.cfg | 2 +- src/artemis/device_setup_plans/setup_oav.py | 2 -- src/artemis/experiment_plans/oav_grid_detection_plan.py | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/setup.cfg b/setup.cfg index 26e0c0bd4..9bae1aa60 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,7 +36,7 @@ install_requires = xarray doct databroker - dodal @ git+https://github.com/DiamondLightSource/python-dodal.git@5cb5579b3eb29bdba8d5bf966ec965ed3aeba873 + dodal @ git+https://github.com/DiamondLightSource/python-dodal.git@64f4a6cf3c2ed59dcd03fdc9ded1fc8d02f5cde7 [options.extras_require] dev = diff --git a/src/artemis/device_setup_plans/setup_oav.py b/src/artemis/device_setup_plans/setup_oav.py index 5b76b5295..56545641b 100644 --- a/src/artemis/device_setup_plans/setup_oav.py +++ b/src/artemis/device_setup_plans/setup_oav.py @@ -87,8 +87,6 @@ def pre_centring_setup_oav(oav: OAV, parameters: OAVParameters): parameters.detection_script_filename, ) - yield from bps.abs_set(oav.snapshot.input_plugin, parameters.input_plugin + ".CAM") - zoom_level_str = f"{float(parameters.zoom)}x" if zoom_level_str not in oav.zoom_controller.allowed_zoom_levels: raise OAVError_ZoomLevelNotFound( diff --git a/src/artemis/experiment_plans/oav_grid_detection_plan.py b/src/artemis/experiment_plans/oav_grid_detection_plan.py index 066d3b738..9980f1e89 100644 --- a/src/artemis/experiment_plans/oav_grid_detection_plan.py +++ b/src/artemis/experiment_plans/oav_grid_detection_plan.py @@ -209,5 +209,4 @@ def grid_detection_main_plan( def reset_oav(parameters: OAVParameters): oav = i03.oav() - yield from bps.abs_set(oav.snapshot.input_plugin, parameters.input_plugin + ".CAM") yield from bps.abs_set(oav.mxsc.enable_callbacks, 0) From df059cbf49a2059387a851dbe0559b9c8762e1e9 Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 26 Jun 2023 17:13:20 +0100 Subject: [PATCH 2/8] Updated to use renamed zoom device --- src/artemis/device_setup_plans/setup_oav.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/artemis/device_setup_plans/setup_oav.py b/src/artemis/device_setup_plans/setup_oav.py index 56545641b..0a489e752 100644 --- a/src/artemis/device_setup_plans/setup_oav.py +++ b/src/artemis/device_setup_plans/setup_oav.py @@ -88,13 +88,13 @@ def pre_centring_setup_oav(oav: OAV, parameters: OAVParameters): ) zoom_level_str = f"{float(parameters.zoom)}x" - if zoom_level_str not in oav.zoom_controller.allowed_zoom_levels: + if zoom_level_str not in oav.zoom.allowed_zoom_levels: raise OAVError_ZoomLevelNotFound( - f"Found {zoom_level_str} as a zoom level but expected one of {oav.zoom_controller.allowed_zoom_levels}" + f"Found {zoom_level_str} as a zoom level but expected one of {oav.zoom.allowed_zoom_levels}" ) yield from bps.abs_set( - oav.zoom_controller.level, + oav.zoom.level, zoom_level_str, wait=True, ) From 017e17f80d934605c8868df5c89563ea3822ecb9 Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 26 Jun 2023 17:17:15 +0100 Subject: [PATCH 3/8] Remove setting the mxsc input as this is handled by zoom device --- src/artemis/device_setup_plans/setup_oav.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/artemis/device_setup_plans/setup_oav.py b/src/artemis/device_setup_plans/setup_oav.py index 0a489e752..af6da359f 100644 --- a/src/artemis/device_setup_plans/setup_oav.py +++ b/src/artemis/device_setup_plans/setup_oav.py @@ -7,18 +7,15 @@ from artemis.log import LOGGER -def start_mxsc(oav: OAV, input_plugin, min_callback_time, filename): +def start_mxsc(oav: OAV, min_callback_time, filename): """ Sets PVs relevant to edge detection plugin. Args: - input_plugin: link to the camera stream min_callback_time: the value to set the minimum callback time to filename: filename of the python script to detect edge waveforms from camera stream. Returns: None """ - yield from bps.abs_set(oav.mxsc.input_plugin, input_plugin) - # Turns the area detector plugin on yield from bps.abs_set(oav.mxsc.enable_callbacks, 1) @@ -82,7 +79,6 @@ def pre_centring_setup_oav(oav: OAV, parameters: OAVParameters): # Connect MXSC output to MJPG input yield from start_mxsc( oav, - parameters.input_plugin + "." + parameters.mxsc_input, parameters.min_callback_time, parameters.detection_script_filename, ) From 202c91a60edfb796460f372f1bb7a9000b2fb50b Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 26 Jun 2023 17:22:35 +0100 Subject: [PATCH 4/8] Fix tests to use properly named zoom --- .../tests/test_grid_detection_plan.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/artemis/experiment_plans/tests/test_grid_detection_plan.py b/src/artemis/experiment_plans/tests/test_grid_detection_plan.py index 3799a39d5..7ab31a41c 100644 --- a/src/artemis/experiment_plans/tests/test_grid_detection_plan.py +++ b/src/artemis/experiment_plans/tests/test_grid_detection_plan.py @@ -27,12 +27,12 @@ def fake_create_devices(): bl = i03.backlight(fake_with_ophyd_sim=True) bl.wait_for_connection() - oav.zoom_controller.zrst.set("1.0x") - oav.zoom_controller.onst.set("2.0x") - oav.zoom_controller.twst.set("3.0x") - oav.zoom_controller.thst.set("5.0x") - oav.zoom_controller.frst.set("7.0x") - oav.zoom_controller.fvst.set("9.0x") + oav.zoom.zrst.set("1.0x") + oav.zoom.onst.set("2.0x") + oav.zoom.twst.set("3.0x") + oav.zoom.thst.set("5.0x") + oav.zoom.frst.set("7.0x") + oav.zoom.fvst.set("9.0x") # fmt: off oav.mxsc.bottom.set([0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,3,3,33,3,4,4,4]) # noqa: E231 From 2ebdfbe35b0020420f1536a7955bd91093e34bc7 Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 26 Jun 2023 17:29:08 +0100 Subject: [PATCH 5/8] Minor tidy up --- src/artemis/experiment_plans/oav_grid_detection_plan.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/artemis/experiment_plans/oav_grid_detection_plan.py b/src/artemis/experiment_plans/oav_grid_detection_plan.py index 9980f1e89..9ecb131e3 100644 --- a/src/artemis/experiment_plans/oav_grid_detection_plan.py +++ b/src/artemis/experiment_plans/oav_grid_detection_plan.py @@ -45,7 +45,7 @@ def grid_detection_plan( width, box_size_microns, ), - reset_oav(parameters), + reset_oav(), ) @@ -207,6 +207,6 @@ def grid_detection_main_plan( out_parameters.z_step_size = box_size_um / 1000 -def reset_oav(parameters: OAVParameters): +def reset_oav(): oav = i03.oav() yield from bps.abs_set(oav.mxsc.enable_callbacks, 0) From 14e9cca732d1ebf60ed71e87faaccf5f7611b624 Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Fri, 30 Jun 2023 13:02:29 +0100 Subject: [PATCH 6/8] (DiamondLightSource/dodal#103) Fix merge mistake --- src/artemis/device_setup_plans/setup_oav.py | 6 +++--- .../tests/test_grid_detection_plan.py | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/artemis/device_setup_plans/setup_oav.py b/src/artemis/device_setup_plans/setup_oav.py index af6da359f..e0ace9640 100644 --- a/src/artemis/device_setup_plans/setup_oav.py +++ b/src/artemis/device_setup_plans/setup_oav.py @@ -84,13 +84,13 @@ def pre_centring_setup_oav(oav: OAV, parameters: OAVParameters): ) zoom_level_str = f"{float(parameters.zoom)}x" - if zoom_level_str not in oav.zoom.allowed_zoom_levels: + if zoom_level_str not in oav.zoom_controller.allowed_zoom_levels: raise OAVError_ZoomLevelNotFound( - f"Found {zoom_level_str} as a zoom level but expected one of {oav.zoom.allowed_zoom_levels}" + f"Found {zoom_level_str} as a zoom level but expected one of {oav.zoom_controller.allowed_zoom_levels}" ) yield from bps.abs_set( - oav.zoom.level, + oav.zoom_controller.level, zoom_level_str, wait=True, ) diff --git a/src/artemis/experiment_plans/tests/test_grid_detection_plan.py b/src/artemis/experiment_plans/tests/test_grid_detection_plan.py index c8703dffa..b14463f0b 100644 --- a/src/artemis/experiment_plans/tests/test_grid_detection_plan.py +++ b/src/artemis/experiment_plans/tests/test_grid_detection_plan.py @@ -27,12 +27,12 @@ def fake_create_devices(): bl = i03.backlight(fake_with_ophyd_sim=True) bl.wait_for_connection() - oav.zoom.zrst.set("1.0x") - oav.zoom.onst.set("2.0x") - oav.zoom.twst.set("3.0x") - oav.zoom.thst.set("5.0x") - oav.zoom.frst.set("7.0x") - oav.zoom.fvst.set("9.0x") + oav.zoom_controller.zrst.set("1.0x") + oav.zoom_controller.onst.set("2.0x") + oav.zoom_controller.twst.set("3.0x") + oav.zoom_controller.thst.set("5.0x") + oav.zoom_controller.frst.set("7.0x") + oav.zoom_controller.fvst.set("9.0x") # fmt: off oav.mxsc.bottom.set([0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,3,3,33,3,4,4,4]) # noqa: E231 From 08a29d5e45cb51581d1c4a92333d74fa7d06570e Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Fri, 30 Jun 2023 16:44:02 +0100 Subject: [PATCH 7/8] (#765) Unstage detector if there is an issue in grid detection --- .../experiment_plans/full_grid_scan.py | 27 ++++++++--- .../tests/test_full_grid_scan_plan.py | 45 +++++++++++++++---- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/src/artemis/experiment_plans/full_grid_scan.py b/src/artemis/experiment_plans/full_grid_scan.py index 0f3f12138..b6202da50 100644 --- a/src/artemis/experiment_plans/full_grid_scan.py +++ b/src/artemis/experiment_plans/full_grid_scan.py @@ -65,18 +65,37 @@ def wait_for_det_to_finish_moving(detector: DetectorMotion, timeout=120): raise TimeoutError("Detector not finished moving") -def detect_grid_and_do_gridscan( +def start_arming_then_do_grid( parameters: GridScanWithEdgeDetectInternalParameters, backlight: Backlight, eiger: EigerDetector, aperture_scatterguard: ApertureScatterguard, detector_motion: DetectorMotion, oav_params: OAVParameters, - experiment_params: GridScanWithEdgeDetectParams, ): # Start stage with asynchronous arming here yield from bps.abs_set(eiger.do_arm, 1, group="arming") + yield from bpp.finalize_wrapper( + detect_grid_and_do_gridscan( + parameters, + backlight, + aperture_scatterguard, + detector_motion, + oav_params, + ), + bps.unstage(eiger), + ) + + +def detect_grid_and_do_gridscan( + parameters: GridScanWithEdgeDetectInternalParameters, + backlight: Backlight, + aperture_scatterguard: ApertureScatterguard, + detector_motion: DetectorMotion, + oav_params: OAVParameters, +): + experiment_params: GridScanWithEdgeDetectParams = parameters.experiment_params fgs_params = GridScanParams(dwell_time=experiment_params.exposure_time * 1000) detector_params = parameters.artemis_params.detector_params @@ -156,14 +175,12 @@ def get_plan( eiger.set_detector_parameters(parameters.artemis_params.detector_params) oav_params = OAVParameters("xrayCentring", **oav_param_files) - experiment_params: GridScanWithEdgeDetectParams = parameters.experiment_params - return detect_grid_and_do_gridscan( + return start_arming_then_do_grid( parameters, backlight, eiger, aperture_scatterguard, detector_motion, oav_params, - experiment_params, ) diff --git a/src/artemis/experiment_plans/tests/test_full_grid_scan_plan.py b/src/artemis/experiment_plans/tests/test_full_grid_scan_plan.py index 6a0c410a8..fbf4c20a9 100644 --- a/src/artemis/experiment_plans/tests/test_full_grid_scan_plan.py +++ b/src/artemis/experiment_plans/tests/test_full_grid_scan_plan.py @@ -14,6 +14,7 @@ create_devices, detect_grid_and_do_gridscan, get_plan, + start_arming_then_do_grid, wait_for_det_to_finish_moving, ) from artemis.parameters.plan_specific.grid_scan_with_edge_detect_params import ( @@ -93,7 +94,6 @@ def test_detect_grid_and_do_gridscan( mock_fast_grid_scan_plan: MagicMock, mock_grid_detection_plan: MagicMock, mock_wait_for_detector: MagicMock, - eiger: EigerDetector, backlight: Backlight, detector_motion: DetectorMotion, aperture_scatterguard: ApertureScatterguard, @@ -106,7 +106,7 @@ def test_detect_grid_and_do_gridscan( mock_oav_callback.out_upper_left = [[1, 1], [1, 1]] mock_grid_detection_plan.side_effect = _fake_grid_detection - with patch.object(eiger.do_arm, "set", MagicMock()) as mock_eiger_set, patch.object( + with patch.object( aperture_scatterguard, "set", MagicMock() ) as mock_aperture_scatterguard, patch( "artemis.external_interaction.callbacks.fgs.fgs_callback_collection.FGSCallbackCollection.from_params", @@ -116,17 +116,11 @@ def test_detect_grid_and_do_gridscan( detect_grid_and_do_gridscan( parameters=test_full_grid_scan_params, backlight=backlight, - eiger=eiger, aperture_scatterguard=aperture_scatterguard, detector_motion=detector_motion, oav_params=OAVParameters("xrayCentring", **test_config_files), - experiment_params=test_full_grid_scan_params.experiment_params, ) ) - - # Check detector was armed - mock_eiger_set.assert_called_once_with(1) - # Verify we called the grid detection plan mock_grid_detection_plan.assert_called_once() @@ -146,3 +140,38 @@ def test_detect_grid_and_do_gridscan( # Check we called out to underlying fast grid scan plan mock_fast_grid_scan_plan.assert_called_once_with(ANY, mock_subscriptions) + + +@patch("artemis.experiment_plans.full_grid_scan.grid_detection_plan") +@patch("artemis.experiment_plans.full_grid_scan.OavSnapshotCallback") +def test_grid_detection_running_when_exception_raised_then_eiger_unstaged( + mock_oav_callback: MagicMock, + mock_grid_detection_plan: MagicMock, + RE: RunEngine, + test_full_grid_scan_params: GridScanWithEdgeDetectInternalParameters, + mock_subscriptions: MagicMock, + test_config_files: Dict, +): + mock_grid_detection_plan.side_effect = Exception() + eiger: EigerDetector = MagicMock(spec=EigerDetector) + + with patch( + "artemis.external_interaction.callbacks.fgs.fgs_callback_collection.FGSCallbackCollection.from_params", + return_value=mock_subscriptions, + ): + with pytest.raises(Exception): + RE( + start_arming_then_do_grid( + parameters=test_full_grid_scan_params, + backlight=MagicMock(), + eiger=eiger, + aperture_scatterguard=MagicMock(), + detector_motion=MagicMock(), + oav_params=OAVParameters("xrayCentring", **test_config_files), + ) + ) + + # Check detector was armed + eiger.do_arm.set.assert_called_once_with(1) + + eiger.unstage.assert_called_once() From 29f11668c011ce3a4b1a8456502ddcf8660049eb Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Tue, 4 Jul 2023 16:13:58 +0100 Subject: [PATCH 8/8] Update dodal --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 2efc1f450..b91559a7e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,7 +36,7 @@ install_requires = xarray doct databroker - dodal @ git+https://github.com/DiamondLightSource/python-dodal.git@187da1fe34f0da7b88f7821b6c0b935c377ab9a7 + dodal @ git+https://github.com/DiamondLightSource/python-dodal.git@d6529d2d9d1883d87bbd167c1ba3787eb578f7f4 [options.extras_require] dev =