From 3bf9eed5235da2b78b8f2c09d5f0fde781ce410e Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Mon, 10 Feb 2025 16:32:31 +0000 Subject: [PATCH 01/11] Plan to set fastcs eiger metadata --- .../devices/util/load_eiger_metadata_plan.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/dodal/devices/util/load_eiger_metadata_plan.py diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py new file mode 100644 index 00000000000..c19f8500013 --- /dev/null +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -0,0 +1,44 @@ +import bluesky.plan_stubs as bps +from ophyd_async.epics.eiger import EigerDetector + +from dodal.devices.detector import DetectorParams + + +def load_metadata( + eiger: EigerDetector, energy: float, enable: bool, detector_params: DetectorParams +): + def _inner_plan(): + yield from change_roi_mode(eiger, enable, detector_params) + yield from bps.abs_set(eiger.drv.photon_energy, energy) + yield from set_mx_settings_pvs(eiger, detector_params) + + yield from _inner_plan() + + +def change_roi_mode( + eiger: EigerDetector, enable: bool, detector_params: DetectorParams +): + detector_dimensions = ( + detector_params.detector_size_constants.roi_size_pixels + if enable + else detector_params.detector_size_constants.det_size_pixels + ) + + yield from bps.abs_set(eiger.drv.roi_mode, 1 if enable else 0) + yield from bps.abs_set(eiger.odin.image_height, detector_dimensions.height) + yield from bps.abs_set(eiger.odin.image_width, detector_dimensions.width) + yield from bps.abs_set(eiger.odin.num_row_chunks, detector_dimensions.height) + yield from bps.abs_set(eiger.odin.num_col_chunks, detector_dimensions.width) + + +def set_mx_settings_pvs(eiger: EigerDetector, detector_params: DetectorParams): + beam_x_pixels, beam_y_pixels = detector_params.get_beam_position_pixels( + detector_params.detector_distance + ) + + yield from bps.abs_set(eiger.drv.beam_centre_x, beam_x_pixels) + yield from bps.abs_set(eiger.drv.beam_centre_y, beam_y_pixels) + yield from bps.abs_set(eiger.drv.det_distance, detector_params.detector_distance) + + yield from bps.abs_set(eiger.drv.omega_start, detector_params.omega_start) + yield from bps.abs_set(eiger.drv.omega_increment, detector_params.omega_increment) From e0aac2302928f18c1eb7de87785f8b9fb18f7183 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Tue, 11 Feb 2025 16:10:37 +0000 Subject: [PATCH 02/11] Add grouping and num_frames_chunks set --- .../devices/util/load_eiger_metadata_plan.py | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index c19f8500013..eae386529de 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -7,12 +7,10 @@ def load_metadata( eiger: EigerDetector, energy: float, enable: bool, detector_params: DetectorParams ): - def _inner_plan(): - yield from change_roi_mode(eiger, enable, detector_params) - yield from bps.abs_set(eiger.drv.photon_energy, energy) - yield from set_mx_settings_pvs(eiger, detector_params) - - yield from _inner_plan() + yield from change_roi_mode(eiger, enable, detector_params) + yield from bps.abs_set(eiger.drv.photon_energy, energy) + yield from bps.abs_set(eiger.odin.num_frames_chunks, 1) + yield from set_mx_settings_pvs(eiger, detector_params, wait=True) def change_roi_mode( @@ -31,14 +29,26 @@ def change_roi_mode( yield from bps.abs_set(eiger.odin.num_col_chunks, detector_dimensions.width) -def set_mx_settings_pvs(eiger: EigerDetector, detector_params: DetectorParams): +def set_mx_settings_pvs( + eiger: EigerDetector, + detector_params: DetectorParams, + wait: bool, + group="mx_settings", +): beam_x_pixels, beam_y_pixels = detector_params.get_beam_position_pixels( detector_params.detector_distance ) - yield from bps.abs_set(eiger.drv.beam_centre_x, beam_x_pixels) - yield from bps.abs_set(eiger.drv.beam_centre_y, beam_y_pixels) - yield from bps.abs_set(eiger.drv.det_distance, detector_params.detector_distance) + yield from bps.abs_set(eiger.drv.beam_centre_x, beam_x_pixels, group) + yield from bps.abs_set(eiger.drv.beam_centre_y, beam_y_pixels, group) + yield from bps.abs_set( + eiger.drv.det_distance, detector_params.detector_distance, group + ) + + yield from bps.abs_set(eiger.drv.omega_start, detector_params.omega_start, group) + yield from bps.abs_set( + eiger.drv.omega_increment, detector_params.omega_increment, group + ) - yield from bps.abs_set(eiger.drv.omega_start, detector_params.omega_start) - yield from bps.abs_set(eiger.drv.omega_increment, detector_params.omega_increment) + if wait: + yield from bps.wait(group) From 3cc85fc399fac40b7b01b366450b730f7f6b3be2 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Mon, 17 Feb 2025 12:18:05 +0000 Subject: [PATCH 03/11] Push local changes - Prepare Eiger Device --- .../devices/util/load_eiger_metadata_plan.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index eae386529de..8e9e57074c6 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -1,17 +1,26 @@ import bluesky.plan_stubs as bps -from ophyd_async.epics.eiger import EigerDetector +from ophyd_async.epics.eiger import EigerDetector, EigerTriggerInfo from dodal.devices.detector import DetectorParams def load_metadata( - eiger: EigerDetector, energy: float, enable: bool, detector_params: DetectorParams + eiger: EigerDetector, + enable: bool, + detector_params: DetectorParams, ): + assert detector_params.expected_energy_ev yield from change_roi_mode(eiger, enable, detector_params) - yield from bps.abs_set(eiger.drv.photon_energy, energy) yield from bps.abs_set(eiger.odin.num_frames_chunks, 1) yield from set_mx_settings_pvs(eiger, detector_params, wait=True) + trigger_info = EigerTriggerInfo( + number_of_triggers=detector_params.num_triggers, + energy_ev=detector_params.expected_energy_ev, + ) + + yield from bps.prepare(eiger, trigger_info) + def change_roi_mode( eiger: EigerDetector, enable: bool, detector_params: DetectorParams From ad31f85bd4cbc1cde0e6ecb12c9fd8e636a485c5 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Mon, 17 Feb 2025 12:48:12 +0000 Subject: [PATCH 04/11] Add setting odin pvs to plan --- src/dodal/devices/util/load_eiger_metadata_plan.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index 8e9e57074c6..42224d16164 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -10,6 +10,7 @@ def load_metadata( detector_params: DetectorParams, ): assert detector_params.expected_energy_ev + yield from set_odin_pvs(eiger, detector_params, wait=True) yield from change_roi_mode(eiger, enable, detector_params) yield from bps.abs_set(eiger.odin.num_frames_chunks, 1) yield from set_mx_settings_pvs(eiger, detector_params, wait=True) @@ -61,3 +62,12 @@ def set_mx_settings_pvs( if wait: yield from bps.wait(group) + + +def set_odin_pvs( + eiger: EigerDetector, detector_params: DetectorParams, wait: bool, group="odin_pvs" +): + yield from bps.abs_set(eiger.odin.file_path, detector_params.directory, group=group) + yield from bps.abs_set( + eiger.odin.file_name, detector_params.full_filename, group=group + ) From 84b495dcb41209a1549a504652567775ef4dd7e5 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Mon, 17 Feb 2025 12:52:08 +0000 Subject: [PATCH 05/11] Stage eiger, which should stop file writing --- src/dodal/devices/util/load_eiger_metadata_plan.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index 42224d16164..4714e00c3b2 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -10,6 +10,7 @@ def load_metadata( detector_params: DetectorParams, ): assert detector_params.expected_energy_ev + yield from bps.stage(eiger) yield from set_odin_pvs(eiger, detector_params, wait=True) yield from change_roi_mode(eiger, enable, detector_params) yield from bps.abs_set(eiger.odin.num_frames_chunks, 1) From 173ab0c0861915bec8d6ff45ab658040285af9cb Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Mon, 17 Feb 2025 13:49:01 +0000 Subject: [PATCH 06/11] Add bps.wait --- src/dodal/devices/util/load_eiger_metadata_plan.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index 4714e00c3b2..f06a477408d 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -72,3 +72,6 @@ def set_odin_pvs( yield from bps.abs_set( eiger.odin.file_name, detector_params.full_filename, group=group ) + + if wait: + yield from bps.wait(group) From 48b81c11c9aa16962c6ab64e3d9d8a8eddd4df63 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Tue, 25 Feb 2025 09:16:17 +0000 Subject: [PATCH 07/11] Add logging and wait for roi mode --- .../devices/util/load_eiger_metadata_plan.py | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index f06a477408d..71140889d66 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -1,4 +1,7 @@ +import time + import bluesky.plan_stubs as bps +from mx_bluesky.common.utils.log import LOGGER from ophyd_async.epics.eiger import EigerDetector, EigerTriggerInfo from dodal.devices.detector import DetectorParams @@ -9,12 +12,18 @@ def load_metadata( enable: bool, detector_params: DetectorParams, ): + start = time.time() assert detector_params.expected_energy_ev yield from bps.stage(eiger) + LOGGER.info(f"Staging Eiger: {time.time() - start}s") yield from set_odin_pvs(eiger, detector_params, wait=True) - yield from change_roi_mode(eiger, enable, detector_params) + LOGGER.info(f"Setting Odin PVs: {time.time() - start}s") + yield from change_roi_mode(eiger, enable, detector_params, wait=True) + LOGGER.info(f"Changing ROI Mode: {time.time() - start}s") yield from bps.abs_set(eiger.odin.num_frames_chunks, 1) + LOGGER.info(f"Setting # of Frame Chunks: {time.time() - start}s") yield from set_mx_settings_pvs(eiger, detector_params, wait=True) + LOGGER.info(f"Setting MX PVs: {time.time() - start}s") trigger_info = EigerTriggerInfo( number_of_triggers=detector_params.num_triggers, @@ -25,7 +34,11 @@ def load_metadata( def change_roi_mode( - eiger: EigerDetector, enable: bool, detector_params: DetectorParams + eiger: EigerDetector, + enable: bool, + detector_params: DetectorParams, + wait: bool, + group="roi_mode", ): detector_dimensions = ( detector_params.detector_size_constants.roi_size_pixels @@ -33,11 +46,22 @@ def change_roi_mode( else detector_params.detector_size_constants.det_size_pixels ) - yield from bps.abs_set(eiger.drv.roi_mode, 1 if enable else 0) - yield from bps.abs_set(eiger.odin.image_height, detector_dimensions.height) - yield from bps.abs_set(eiger.odin.image_width, detector_dimensions.width) - yield from bps.abs_set(eiger.odin.num_row_chunks, detector_dimensions.height) - yield from bps.abs_set(eiger.odin.num_col_chunks, detector_dimensions.width) + yield from bps.abs_set(eiger.drv.roi_mode, 1 if enable else 0, group=group) + yield from bps.abs_set( + eiger.odin.image_height, detector_dimensions.height, group=group + ) + yield from bps.abs_set( + eiger.odin.image_width, detector_dimensions.width, group=group + ) + yield from bps.abs_set( + eiger.odin.num_row_chunks, detector_dimensions.height, group=group + ) + yield from bps.abs_set( + eiger.odin.num_col_chunks, detector_dimensions.width, group=group + ) + + if wait: + yield from bps.wait(group) def set_mx_settings_pvs( From 68f664440c18b0eb447a7cd8a3665f8a1957d594 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Tue, 25 Feb 2025 18:08:36 +0000 Subject: [PATCH 08/11] Use ADOdin instead --- .../devices/util/load_eiger_metadata_plan.py | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index 71140889d66..aa5047e9b14 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -48,16 +48,24 @@ def change_roi_mode( yield from bps.abs_set(eiger.drv.roi_mode, 1 if enable else 0, group=group) yield from bps.abs_set( - eiger.odin.image_height, detector_dimensions.height, group=group + eiger.odin.file_writer.image_height, # type: ignore + detector_dimensions.height, + group=group, ) yield from bps.abs_set( - eiger.odin.image_width, detector_dimensions.width, group=group + eiger.odin.file_writer.image_width, # type: ignore + detector_dimensions.width, + group=group, ) yield from bps.abs_set( - eiger.odin.num_row_chunks, detector_dimensions.height, group=group + eiger.odin.file_writer.num_row_chunks, # type: ignore + detector_dimensions.height, + group=group, ) yield from bps.abs_set( - eiger.odin.num_col_chunks, detector_dimensions.width, group=group + eiger.odin.file_writer.num_col_chunks, # type: ignore + detector_dimensions.width, + group=group, ) if wait: @@ -90,11 +98,20 @@ def set_mx_settings_pvs( def set_odin_pvs( - eiger: EigerDetector, detector_params: DetectorParams, wait: bool, group="odin_pvs" + eiger: EigerDetector, + detector_params: DetectorParams, + wait: bool, + group="odin_pvs", ): - yield from bps.abs_set(eiger.odin.file_path, detector_params.directory, group=group) yield from bps.abs_set( - eiger.odin.file_name, detector_params.full_filename, group=group + eiger.odin.file_writer.file_path, # type: ignore + detector_params.directory, + group=group, + ) + yield from bps.abs_set( + eiger.odin.file_writer.file_name, # type: ignore + detector_params.full_filename, + group=group, ) if wait: From 5e33b147d704df65862d5d16381001bbc25005c2 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Tue, 25 Feb 2025 18:11:15 +0000 Subject: [PATCH 09/11] Use ADOdin for num frame chunks --- src/dodal/devices/util/load_eiger_metadata_plan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index aa5047e9b14..fc1e56a8c66 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -20,7 +20,7 @@ def load_metadata( LOGGER.info(f"Setting Odin PVs: {time.time() - start}s") yield from change_roi_mode(eiger, enable, detector_params, wait=True) LOGGER.info(f"Changing ROI Mode: {time.time() - start}s") - yield from bps.abs_set(eiger.odin.num_frames_chunks, 1) + yield from bps.abs_set(eiger.odin.file_writer.num_frames_chunks, 1) # type: ignore LOGGER.info(f"Setting # of Frame Chunks: {time.time() - start}s") yield from set_mx_settings_pvs(eiger, detector_params, wait=True) LOGGER.info(f"Setting MX PVs: {time.time() - start}s") From 199de03b4b3e68e205330f33e26c064d20a916d7 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 26 Feb 2025 13:29:16 +0000 Subject: [PATCH 10/11] Commit changes --- src/dodal/devices/util/load_eiger_metadata_plan.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py index fc1e56a8c66..486a07347ba 100644 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -1,6 +1,7 @@ import time import bluesky.plan_stubs as bps +from bluesky.run_engine import RunEngine from mx_bluesky.common.utils.log import LOGGER from ophyd_async.epics.eiger import EigerDetector, EigerTriggerInfo @@ -116,3 +117,7 @@ def set_odin_pvs( if wait: yield from bps.wait(group) + + +if __name__ == "__main__": + RE = RunEngine() From 78ded5978ac3241c3cdfc829263551376ed0df12 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 26 Feb 2025 15:36:40 +0000 Subject: [PATCH 11/11] Add more arming steps --- src/dodal/beamlines/i03.py | 23 +++++++++ .../devices/util/load_eiger_metadata_plan.py | 48 +++++++++++++++++-- 2 files changed, 68 insertions(+), 3 deletions(-) mode change 100644 => 100755 src/dodal/devices/util/load_eiger_metadata_plan.py diff --git a/src/dodal/beamlines/i03.py b/src/dodal/beamlines/i03.py index 30043277a9e..a153b4bd3d8 100644 --- a/src/dodal/beamlines/i03.py +++ b/src/dodal/beamlines/i03.py @@ -1,3 +1,7 @@ +from pathlib import Path + +from ophyd_async.core import StaticFilenameProvider, StaticPathProvider +from ophyd_async.epics.eiger import EigerDetector as FastEiger from ophyd_async.fastcs.panda import HDFPanda from dodal.common.beamlines.beamline_parameters import get_beamline_parameters @@ -172,6 +176,25 @@ def eiger(mock: bool = False) -> EigerDetector: ) +@device_factory(skip=BL == "s03") +def fastcs_eiger(mock: bool = False) -> FastEiger: + """Get the i03 Eiger device, instantiate it if it hasn't already been. + If this is called when already instantiated in i03, it will return the existing object. + """ + + file_name = StaticFilenameProvider("eiger_test_file") + path_provider = StaticPathProvider(file_name, Path("/scratch/qqh35939")) + + return device_instantiation( + device_factory=FastEiger, + name="fastcs_eiger", + path_provider=path_provider, + prefix="", + wait=False, + fake=mock, + ) + + @device_factory() def zebra_fast_grid_scan() -> ZebraFastGridScan: """Get the i03 zebra_fast_grid_scan device, instantiate it if it hasn't already been. diff --git a/src/dodal/devices/util/load_eiger_metadata_plan.py b/src/dodal/devices/util/load_eiger_metadata_plan.py old mode 100644 new mode 100755 index 486a07347ba..8436837e2e6 --- a/src/dodal/devices/util/load_eiger_metadata_plan.py +++ b/src/dodal/devices/util/load_eiger_metadata_plan.py @@ -2,10 +2,25 @@ import bluesky.plan_stubs as bps from bluesky.run_engine import RunEngine -from mx_bluesky.common.utils.log import LOGGER from ophyd_async.epics.eiger import EigerDetector, EigerTriggerInfo +from dodal.beamlines.i03 import fastcs_eiger from dodal.devices.detector import DetectorParams +from dodal.log import LOGGER, do_default_logging_setup + +params = DetectorParams( + expected_energy_ev=12700, + exposure_time=0.004, + directory="/dls/i03/data/2025/cm40607-2/test_new_eiger", + prefix="", + detector_distance=255, + omega_start=0, + omega_increment=0.2, + num_images_per_trigger=1, + num_triggers=50, + use_roi_mode=True, + det_dist_to_beam_converter_path="/dls_sw/i03/software/daq_configuration/lookup/DetDistToBeamXYConverter.txt", +) def load_metadata( @@ -15,8 +30,11 @@ def load_metadata( ): start = time.time() assert detector_params.expected_energy_ev - yield from bps.stage(eiger) - LOGGER.info(f"Staging Eiger: {time.time() - start}s") + yield from bps.abs_set(eiger.odin.file_writer.capture, 0) # type: ignore + yield from bps.abs_set(eiger.odin.meta.stop_writing, 1) # type: ignore + LOGGER.info(f"Stopping Odin: {time.time() - start}s") + yield from set_cam_pvs(eiger, detector_params, wait=True) + LOGGER.info(f"Setting CAM PVs: {time.time() - start}s") yield from set_odin_pvs(eiger, detector_params, wait=True) LOGGER.info(f"Setting Odin PVs: {time.time() - start}s") yield from change_roi_mode(eiger, enable, detector_params, wait=True) @@ -32,6 +50,27 @@ def load_metadata( ) yield from bps.prepare(eiger, trigger_info) + LOGGER.info(f"Preparing Eiger: {time.time() - start}s") + + +def set_cam_pvs( + eiger: EigerDetector, + detector_params: DetectorParams, + wait: bool, + group="cam_pvs", +): + yield from bps.abs_set( + eiger.drv.acquire_time, detector_params.exposure_time, group=group + ) + yield from bps.abs_set( + eiger.drv.acquire_period, detector_params.exposure_time, group=group + ) + yield from bps.abs_set(eiger.drv.num_exposures, 1, group=group) + yield from bps.abs_set(eiger.drv.trigger_mode, "exts", group=group) + # Image mode not set... + + if wait: + yield from bps.wait(group) def change_roi_mode( @@ -121,3 +160,6 @@ def set_odin_pvs( if __name__ == "__main__": RE = RunEngine() + do_default_logging_setup() + eiger = fastcs_eiger(connect_immediately=True) + RE(load_metadata(eiger=eiger, enable=True, detector_params=params))