From bc1bac7529609516592584c2709cc31577c3c4b6 Mon Sep 17 00:00:00 2001 From: Jacob Williamson Date: Wed, 10 Dec 2025 10:46:45 +0000 Subject: [PATCH 1/6] Reformat test data --- .../lookup/test_det_dist_converter.txt | 14 +++++++------- tests/test_data/test_det_dist_converter.txt | 14 +++++++------- tests/test_data/test_lookup_table.txt | 12 +++++++----- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/tests/test_data/test_daq_configuration/lookup/test_det_dist_converter.txt b/tests/test_data/test_daq_configuration/lookup/test_det_dist_converter.txt index 81d1f60b58..46defc0e06 100644 --- a/tests/test_data/test_daq_configuration/lookup/test_det_dist_converter.txt +++ b/tests/test_data/test_daq_configuration/lookup/test_det_dist_converter.txt @@ -1,7 +1,7 @@ -#Table giving position of beam X and Y as a function of detector distance -#Units mm mm mm -# Eiger values -# distance beamY beamX (values from mosflm) -Units mm mm mm -200 119.78 127.0 -1500 119.4 126.9 +{ + "column_names": ["detector_distances_mm", "beam_centre_x_mm", "beam_centre_y_mm"], + "rows": [ + [200.0, 119.78, 127.0], + [1500.0, 119.4, 126.9] + ] +} diff --git a/tests/test_data/test_det_dist_converter.txt b/tests/test_data/test_det_dist_converter.txt index 084853e432..4ba3260e3d 100644 --- a/tests/test_data/test_det_dist_converter.txt +++ b/tests/test_data/test_det_dist_converter.txt @@ -1,7 +1,7 @@ -#Table giving position of beam X and Y as a function of detector distance -#Units mm mm mm -# Eiger values -# distance beamY beamX (values from mosflm) -Units mm mm mm -200 153.61 162.45 -500 153.57 159.96 +{ + "column_names": ["detector_distances_mm", "beam_centre_x_mm", "beam_centre_y_mm"], + "rows": [ + [200.0, 153.61, 162.45], + [500.0, 153.57, 159.96] + ] +} diff --git a/tests/test_data/test_lookup_table.txt b/tests/test_data/test_lookup_table.txt index 16fa297a05..40099c39f0 100644 --- a/tests/test_data/test_lookup_table.txt +++ b/tests/test_data/test_lookup_table.txt @@ -1,5 +1,7 @@ -# Beam converter lookup table for testing - -Units det_dist beam_x beam_y -100.0 150.0 160.0 -200.0 151.0 165.0 +{ + "column_names": ["detector_distances_mm", "beam_centre_x_mm", "beam_centre_y_mm"], + "rows": [ + [100.0, 150.0, 160.0], + [200.0, 151.0, 165.0] + ] +} From 711bb1b5f2688e7ee89d355a1384a1dd01e223c7 Mon Sep 17 00:00:00 2001 From: Jacob Williamson Date: Wed, 10 Dec 2025 11:05:33 +0000 Subject: [PATCH 2/6] Add mock config server --- tests/conftest.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index b87822cc8d..3203eb1a43 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -17,6 +17,7 @@ import pytest from bluesky.simulators import RunEngineSimulator from bluesky.utils import Msg +from daq_config_server.converters.models import ConfigModel from dodal.beamlines import aithre, i03 from dodal.common.beamlines import beamline_parameters as bp from dodal.common.beamlines import beamline_utils @@ -1725,7 +1726,7 @@ def _fake_config_server_read( @pytest.fixture(autouse=True) -def mock_config_server(): +def mock_mx_config_server(): # Don't actually talk to central service during unit tests, and reset caches between test for client in IMPLEMENTED_CONFIG_CLIENTS: @@ -1738,6 +1739,36 @@ def mock_config_server(): yield +def _fake_config_server_get_file_contents( + filepath: str | Path, + desired_return_type: type[str] | type[dict] | ConfigModel = str, + reset_cached_result: bool = True, +): + filepath = Path(filepath) + # Minimal logic required for unit tests + with filepath.open("r") as f: + contents = f.read() + print(contents) + if desired_return_type is str: + return contents + elif desired_return_type is dict: + print("return type is dict") + return json.loads(contents) + elif issubclass(desired_return_type, ConfigModel): # type: ignore + return desired_return_type.model_validate(json.loads(contents)) + + +@pytest.fixture(autouse=True) +def mock_config_server(): + # Don't actually talk to central service during unit tests, and reset caches between test + + with patch( + "daq_config_server.client.ConfigServer.get_file_contents", + side_effect=_fake_config_server_get_file_contents, + ): + yield + + def mock_beamline_module_filepaths(bl_name, bl_module): if mock_attributes := mock_attributes_table.get(bl_name): [bl_module.__setattr__(attr[0], attr[1]) for attr in mock_attributes] From 6865053f3e5f19d29b9c2c66d19c552ab9760990 Mon Sep 17 00:00:00 2001 From: Jacob Williamson Date: Wed, 10 Dec 2025 11:05:57 +0000 Subject: [PATCH 3/6] Read detector lookup table through config server --- .../i24/serial/setup_beamline/setup_beamline.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py b/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py index dff3d88d80..381652554f 100644 --- a/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py +++ b/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py @@ -1,6 +1,8 @@ from pathlib import Path import bluesky.plan_stubs as bps +from daq_config_server.client import ConfigServer +from daq_config_server.converters.models import GenericLookupTable from dodal.devices.detector.det_dim_constants import DetectorSizeConstants from dodal.devices.i24.aperture import Aperture, AperturePositions from dodal.devices.i24.beam_center import DetectorBeamCenter @@ -10,7 +12,6 @@ from dodal.devices.motors import YZStage from dodal.devices.util.lookup_tables import ( linear_interpolation_lut, - parse_lookup_table, ) from mx_bluesky.beamlines.i24.serial.log import SSX_LOGGER @@ -26,9 +27,12 @@ def compute_beam_center_position_from_lut( """Calculate the beam center position for the detector distance \ using the values in the lookup table for the conversion. """ - lut_values = parse_lookup_table(lut_path.as_posix()) + config_server = ConfigServer(url="https://daq-config.diamond.ac.uk") + lut_columns = config_server.get_file_contents( + lut_path, GenericLookupTable + ).columns() - calc_x = linear_interpolation_lut(lut_values[0], lut_values[1]) + calc_x = linear_interpolation_lut(lut_columns[0], lut_columns[1]) beam_x_mm = calc_x(detector_distance_mm) beam_x = ( beam_x_mm @@ -36,7 +40,7 @@ def compute_beam_center_position_from_lut( / det_size_constants.det_dimension.width ) - calc_y = linear_interpolation_lut(lut_values[0], lut_values[2]) + calc_y = linear_interpolation_lut(lut_columns[0], lut_columns[2]) beam_y_mm = calc_y(detector_distance_mm) beam_y = ( beam_y_mm From ce7e50fc4613fc203fb53d58f37c979f974dc1ca Mon Sep 17 00:00:00 2001 From: Jacob Williamson Date: Wed, 10 Dec 2025 11:08:48 +0000 Subject: [PATCH 4/6] Pin dodal --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4a2b16698d..5a2518221b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ dependencies = [ "ophyd >= 1.10.5", "ophyd-async >= 0.14.0", "bluesky >= 1.14.6", - "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@62960e0e587bf86943ce1b581848fa131ef884d5", + "dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@mx_bluesky_1509_use_config_server_for_detector_lut", ] From 82bab998e46ac395baddfb4c26f65acf2156d05a Mon Sep 17 00:00:00 2001 From: Jacob Williamson Date: Tue, 6 Jan 2026 11:21:36 +0000 Subject: [PATCH 5/6] Use DetectorXY lut config model --- .../beamlines/i24/serial/setup_beamline/setup_beamline.py | 4 ++-- tests/conftest.py | 2 +- tests/test_data/test_lookup_table.txt | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py b/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py index 381652554f..69af1b3a0c 100644 --- a/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py +++ b/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py @@ -2,7 +2,7 @@ import bluesky.plan_stubs as bps from daq_config_server.client import ConfigServer -from daq_config_server.converters.models import GenericLookupTable +from daq_config_server.models import DetectorXYLookupTable from dodal.devices.detector.det_dim_constants import DetectorSizeConstants from dodal.devices.i24.aperture import Aperture, AperturePositions from dodal.devices.i24.beam_center import DetectorBeamCenter @@ -29,7 +29,7 @@ def compute_beam_center_position_from_lut( """ config_server = ConfigServer(url="https://daq-config.diamond.ac.uk") lut_columns = config_server.get_file_contents( - lut_path, GenericLookupTable + lut_path, DetectorXYLookupTable ).columns() calc_x = linear_interpolation_lut(lut_columns[0], lut_columns[1]) diff --git a/tests/conftest.py b/tests/conftest.py index 3203eb1a43..364ca96d44 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -17,7 +17,7 @@ import pytest from bluesky.simulators import RunEngineSimulator from bluesky.utils import Msg -from daq_config_server.converters.models import ConfigModel +from daq_config_server.models import ConfigModel from dodal.beamlines import aithre, i03 from dodal.common.beamlines import beamline_parameters as bp from dodal.common.beamlines import beamline_utils diff --git a/tests/test_data/test_lookup_table.txt b/tests/test_data/test_lookup_table.txt index 40099c39f0..00f6357bfd 100644 --- a/tests/test_data/test_lookup_table.txt +++ b/tests/test_data/test_lookup_table.txt @@ -1,5 +1,4 @@ { - "column_names": ["detector_distances_mm", "beam_centre_x_mm", "beam_centre_y_mm"], "rows": [ [100.0, 150.0, 160.0], [200.0, 151.0, 165.0] From 4844e9d920c87ed1a3bf7b7036d888e25176ea26 Mon Sep 17 00:00:00 2001 From: Jacob Williamson Date: Tue, 6 Jan 2026 14:08:53 +0000 Subject: [PATCH 6/6] Fix for columns becoming a property --- .../beamlines/i24/serial/setup_beamline/setup_beamline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py b/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py index 69af1b3a0c..14acf8d5a6 100644 --- a/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py +++ b/src/mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py @@ -30,7 +30,7 @@ def compute_beam_center_position_from_lut( config_server = ConfigServer(url="https://daq-config.diamond.ac.uk") lut_columns = config_server.get_file_contents( lut_path, DetectorXYLookupTable - ).columns() + ).columns calc_x = linear_interpolation_lut(lut_columns[0], lut_columns[1]) beam_x_mm = calc_x(detector_distance_mm)