Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
b4dbd8e
Add mock config server fixture
jacob720 Dec 9, 2025
bf08ced
Use config server to read beamlineParmaeters
jacob720 Dec 9, 2025
91fc322
Remove tests for removed functions
jacob720 Dec 9, 2025
386b521
Convert test beamlineParameters files
jacob720 Dec 9, 2025
acd5805
Fix test
jacob720 Dec 9, 2025
28b7823
Fix lint
jacob720 Dec 9, 2025
84f0836
Fix
jacob720 Jan 12, 2026
afd4fbc
Require latest daq-config-server
jacob720 Jan 12, 2026
2d92790
PR comments WIP
jacob720 Jan 20, 2026
e3f6fad
Parameterise config server URL
jacob720 Jan 23, 2026
3dbb881
Refactor get_beamline_parameters
jacob720 Jan 23, 2026
9517b6a
Update lockfile
jacob720 Jan 23, 2026
bc858b2
Use server deployed on i03 beamline cluster for i03 config
jacob720 Jan 29, 2026
9529dc1
typo
jacob720 Feb 4, 2026
4aac691
Merge branch 'main' into mx_bluesky_1504_migrate_beamline_parameters_…
jacob720 Feb 4, 2026
cba50ab
Merge branch 'main' into mx_bluesky_1504_migrate_beamline_parameters_…
jacob720 Feb 5, 2026
eaa20a2
WIP
jacob720 Feb 11, 2026
0d29dbe
Reset cache between tests
jacob720 Feb 11, 2026
feae3b6
Merge branch 'main' into mx_bluesky_1504_migrate_beamline_parameters_…
jacob720 Feb 11, 2026
d4fda7b
Fix
jacob720 Feb 11, 2026
a947f60
Fix lint
jacob720 Feb 11, 2026
d5bd077
Fix lint
jacob720 Feb 12, 2026
4b4a3f1
Merge branch 'main' into mx_bluesky_1504_migrate_beamline_parameters_…
jacob720 Feb 13, 2026
357a6c9
PR comments and coverage
jacob720 Feb 13, 2026
286a17c
Lint
jacob720 Feb 13, 2026
3d05eb2
Merge branch 'main' into mx_bluesky_1504_migrate_beamline_parameters_…
jacob720 Feb 23, 2026
07b3d6e
Merge branch 'main' into mx_bluesky_1504_migrate_beamline_parameters_…
jacob720 Feb 27, 2026
4534194
Use config server in undulator device
jacob720 Dec 8, 2025
c498073
Fix tests
jacob720 Dec 8, 2025
79dbb4a
Use specific lut models for each undulator lut
jacob720 Jan 6, 2026
e897e2a
PR comments
jacob720 Feb 27, 2026
9a5537a
Fix tests
jacob720 Feb 27, 2026
667e94a
Fix lint
jacob720 Mar 2, 2026
759b306
Use config server deployed on i04 cluster
jacob720 Mar 3, 2026
b89130c
Improve patching of BEAMLINE env variable in tests
jacob720 Mar 3, 2026
df01066
Merge branch 'main' into mx_bluesky_1504_migrate_beamline_parameters_…
jacob720 Mar 9, 2026
7599d49
Merge branch 'main' into mx_bluesky_1504_migrate_beamline_parameters_…
jacob720 Mar 12, 2026
40e91a9
Merge branch 'mx_bluesky_1504_migrate_beamline_parameters_to_config_s…
jacob720 Mar 12, 2026
841c063
Merge branch 'main' into mx_bluesky_1494_use_config_server_for_undulator
jacob720 Mar 17, 2026
21b0c71
Pass config client into undulator
jacob720 Mar 17, 2026
0222002
Merge branch 'main' into mx_bluesky_1494_use_config_server_for_undulator
jacob720 Mar 18, 2026
a32f358
Fix imports
jacob720 Mar 18, 2026
464b030
Fix test
jacob720 Mar 18, 2026
3ca40b4
Remove uneeded fixtures
jacob720 Mar 18, 2026
f2d2cb5
Remove beamline config client constants
jacob720 Mar 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/dodal/beamlines/i03.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.common.beamlines.beamline_utils import set_path_provider
from dodal.common.beamlines.commissioning_mode import set_commissioning_signal
from dodal.common.beamlines.config_client import get_config_client
from dodal.common.udc_directory_provider import PandASubpathProvider
from dodal.device_manager import DeviceManager
from dodal.devices.aperturescatterguard import (
Expand Down Expand Up @@ -226,6 +227,7 @@ def synchrotron() -> Synchrotron:
def undulator(baton: Baton, daq_configuration_path: str) -> UndulatorInKeV:
return UndulatorInKeV(
f"{BeamlinePrefix(BL).insertion_prefix}-MO-SERVC-01:",
config_client=get_config_client(BL),
id_gap_lookup_table_path=f"{daq_configuration_path}/lookup/BeamLine_Undulator_toGap.txt",
baton=baton,
)
Expand Down
2 changes: 2 additions & 0 deletions src/dodal/beamlines/i04.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from dodal.common.beamlines.beamline_parameters import get_beamline_parameters
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.common.beamlines.config_client import get_config_client
from dodal.device_manager import DeviceManager
from dodal.devices.aperturescatterguard import (
AperturePosition,
Expand Down Expand Up @@ -182,6 +183,7 @@ def daq_configuration_path() -> str:
def undulator(baton: Baton, daq_configuration_path: str) -> UndulatorInKeV:
return UndulatorInKeV(
prefix=f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
config_client=get_config_client(BL),
id_gap_lookup_table_path=f"{daq_configuration_path}/lookup/BeamLine_Undulator_toGap.txt",
baton=baton,
)
Expand Down
2 changes: 2 additions & 0 deletions src/dodal/beamlines/i07.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.common.beamlines.config_client import get_config_client
from dodal.device_manager import DeviceManager
from dodal.devices.beamlines.i07.dcm import DCM
from dodal.devices.beamlines.i07.id import InsertionDevice
Expand Down Expand Up @@ -35,5 +36,6 @@ def id(harmonic: UndulatorOrder) -> InsertionDevice:
return InsertionDevice(
f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
harmonic,
get_config_client(BL),
id_gap_lookup_table_path="/dls_sw/i07/software/gda/config/lookupTables/IIDCalibrationTable.txt",
)
5 changes: 4 additions & 1 deletion src/dodal/beamlines/i18.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
set_path_provider,
)
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.common.beamlines.config_client import get_config_client
from dodal.common.visit import (
LocalDirectoryServiceClient,
StaticVisitPathProvider,
Expand Down Expand Up @@ -54,7 +55,9 @@ def synchrotron() -> Synchrotron:

@device_factory()
def undulator() -> UndulatorInKeV:
return UndulatorInKeV(f"{PREFIX.insertion_prefix}-MO-SERVC-01:")
return UndulatorInKeV(
f"{PREFIX.insertion_prefix}-MO-SERVC-01:", get_config_client(BL)
)


# See https://github.com/DiamondLightSource/dodal/issues/1180
Expand Down
2 changes: 2 additions & 0 deletions src/dodal/beamlines/i22.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from ophyd_async.fastcs.panda import HDFPanda

from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.common.beamlines.config_client import get_config_client
from dodal.common.beamlines.device_helpers import CAM_SUFFIX, DET_SUFFIX, HDF5_SUFFIX
from dodal.common.crystal_metadata import (
MaterialsEnum,
Expand Down Expand Up @@ -181,6 +182,7 @@ def dcm() -> DCM:
def undulator() -> UndulatorInKeV:
return UndulatorInKeV(
prefix=f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
config_client=get_config_client(BL),
id_gap_lookup_table_path="/dls_sw/i22/software/daq_configuration/lookup/BeamLine_Undulator_toGap.txt",
poles=80,
length=2.0,
Expand Down
2 changes: 2 additions & 0 deletions src/dodal/beamlines/p38.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
set_path_provider,
)
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.common.beamlines.config_client import get_config_client
from dodal.common.beamlines.device_helpers import HDF5_SUFFIX
from dodal.common.crystal_metadata import (
MaterialsEnum,
Expand Down Expand Up @@ -160,6 +161,7 @@ def dcm() -> DCM:
def undulator() -> UndulatorInKeV:
return UndulatorInKeV(
f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
get_config_client(BL),
poles=80,
length=2.0,
)
Expand Down
4 changes: 3 additions & 1 deletion src/dodal/common/beamlines/config_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@

BEAMLINE_CONFIG_SERVER_ENDPOINTS = {
"i03": "https://i03-daq-config.diamond.ac.uk",
"i04": "https://daq-config.diamond.ac.uk",
"i04": "https://i04-daq-config.diamond.ac.uk",
}


@cache
def get_config_client(beamline: str) -> ConfigClient:
print(beamline)
print(BEAMLINE_CONFIG_SERVER_ENDPOINTS)
url = BEAMLINE_CONFIG_SERVER_ENDPOINTS.get(
beamline, "https://daq-config.diamond.ac.uk"
)
Expand Down
4 changes: 3 additions & 1 deletion src/dodal/devices/beamlines/i07/id.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import numpy as np
from daq_config_server import ConfigClient

from dodal.devices.undulator import UndulatorInKeV, UndulatorOrder
from dodal.devices.util.lookup_tables import energy_distance_table
Expand All @@ -13,11 +14,12 @@ def __init__(
self,
prefix: str,
harmonic: UndulatorOrder,
config_client: ConfigClient,
id_gap_lookup_table_path: str = "/dls_sw/i07/software/gda/config/lookupTables/"
+ "IIDCalibrationTable.txt",
name: str = "",
):
super().__init__(prefix, id_gap_lookup_table_path, name=name)
super().__init__(prefix, config_client, id_gap_lookup_table_path, name=name)
self.harmonic = harmonic

async def _get_gap_to_match_energy(self, energy_kev: float) -> float:
Expand Down
16 changes: 12 additions & 4 deletions src/dodal/devices/undulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@

import numpy as np
from bluesky.protocols import Locatable, Location, Movable
from daq_config_server import ConfigClient
from daq_config_server.models.lookup_tables.insertion_device import (
UndulatorEnergyGapLookupTable,
)
from numpy import ndarray
from ophyd_async.core import (
AsyncStatus,
Expand All @@ -19,7 +23,6 @@
from dodal.log import LOGGER

from .baton import Baton
from .util.lookup_tables import energy_distance_table


class AccessError(Exception):
Expand Down Expand Up @@ -172,13 +175,16 @@ class UndulatorInKeV(BaseUndulator):
def __init__(
self,
prefix: str,
config_client: ConfigClient,
id_gap_lookup_table_path: str = os.devnull,
poles: int | None = None,
length: float | None = None,
undulator_period: int | None = None,
baton: Baton | None = None,
name: str = "",
) -> None:
self.config_server = config_client

self.id_gap_lookup_table_path = id_gap_lookup_table_path
super().__init__(
prefix=prefix,
Expand Down Expand Up @@ -207,14 +213,16 @@ async def _get_gap_to_match_energy(self, energy_kev: float) -> float:
"""Get a 2d np.array from lookup table that converts energies to undulator gap
distance.
"""
energy_to_distance_table: np.ndarray = await energy_distance_table(
self.id_gap_lookup_table_path
energy_to_distance_table = self.config_server.get_file_contents(
self.id_gap_lookup_table_path,
UndulatorEnergyGapLookupTable,
reset_cached_result=True,
)

# Use the lookup table to get the undulator gap associated with this dcm energy
return _get_gap_for_energy(
energy_kev * 1000,
energy_to_distance_table,
np.array(energy_to_distance_table.rows),
)


Expand Down
32 changes: 17 additions & 15 deletions tests/common/beamlines/test_config_client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from unittest.mock import MagicMock, patch

import pytest

from dodal.common.beamlines.config_client import get_config_client


Expand All @@ -11,22 +13,20 @@ def test_by_default_get_config_client_uses_centrally_deployed_config_server(
mock_config_client.assert_called_once_with(url="https://daq-config.diamond.ac.uk")


@pytest.mark.parametrize(
"beamline, expected_url",
[
("i03", "https://i03-daq-config.diamond.ac.uk"),
("i04", "https://i04-daq-config.diamond.ac.uk"),
("default", "https://daq-config.diamond.ac.uk"),
],
)
@patch("dodal.common.beamlines.config_client.ConfigClient")
def test_get_config_client_uses_i03_beamline_cluster_server_for_i03(
mock_config_client: MagicMock,
def test_get_config_client_uses_correct_url_for_each_beamline(
mock_config_client: MagicMock, beamline: str, expected_url: str
):
get_config_client("i03")
mock_config_client.assert_called_once_with(
url="https://i03-daq-config.diamond.ac.uk"
)


@patch("dodal.common.beamlines.config_client.ConfigClient")
def test_get_config_client_uses_centrally_deployed_config_server_for_i04(
mock_config_client: MagicMock,
):
get_config_client("i04")
mock_config_client.assert_called_once_with(url="https://daq-config.diamond.ac.uk")
get_config_client(beamline)
mock_config_client.assert_called_once_with(url=expected_url)


@patch("dodal.common.beamlines.config_client.ConfigClient")
Expand All @@ -45,7 +45,9 @@ def test_get_config_client_resets_cache_if_called_with_same_beamline(
):
assert mock_config_client.assert_not_called
get_config_client("i04")
mock_config_client.assert_called_once_with(url="https://daq-config.diamond.ac.uk")
mock_config_client.assert_called_once_with(
url="https://i04-daq-config.diamond.ac.uk"
)
get_config_client("i03")
assert mock_config_client.call_count == 2
mock_config_client.assert_called_with(url="https://i03-daq-config.diamond.ac.uk")
5 changes: 5 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,3 +177,8 @@ def eiger_params(tmp_path: Path) -> DetectorParams:
@pytest.fixture(autouse=True)
def clear_cache():
get_config_client.cache_clear()


@pytest.fixture
def set_beamline_env_variable(monkeypatch):
monkeypatch.setenv("BEAMLINE", "test")
23 changes: 19 additions & 4 deletions tests/devices/beamlines/i03/test_undulator_dcm.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@

import numpy as np
import pytest
from daq_config_server import ConfigClient
from daq_config_server.models.lookup_tables.insertion_device import (
UndulatorEnergyGapLookupTable,
)
from ophyd_async.core import AsyncStatus, get_mock_put, init_devices, set_mock_value

from dodal.common.enums import EnabledDisabledUpper
Expand Down Expand Up @@ -48,6 +52,7 @@ async def fake_undulator_dcm() -> UndulatorDCM:
baton = Baton("BATON-01:")
undulator = UndulatorInKeV(
"UND-01",
ConfigClient(""),
name="undulator",
poles=80,
id_gap_lookup_table_path=TEST_BEAMLINE_UNDULATOR_TO_GAP_LUT,
Expand Down Expand Up @@ -89,16 +94,26 @@ async def test_fixed_offset_decoded(fake_undulator_dcm: UndulatorDCM):
assert fake_undulator_dcm.dcm_fixed_offset_mm == 25.6


@patch("dodal.devices.util.lookup_tables.loadtxt")
@patch("dodal.devices.undulator.LOGGER")
async def test_if_gap_is_wrong_then_logger_info_is_called_and_gap_is_set_correctly(
mock_logger: MagicMock, mock_load: MagicMock, fake_undulator_dcm: UndulatorDCM
mock_logger: MagicMock,
fake_undulator_dcm: UndulatorDCM,
):
mock_config_server = MagicMock()
mock_config_server.get_file_contents = MagicMock(
return_value=UndulatorEnergyGapLookupTable(
rows=[
[5700, 5.4606],
[7000, 6.045],
[9700, 6.404],
],
)
)
fake_undulator_dcm.undulator_ref().config_server = mock_config_server

set_mock_value(fake_undulator_dcm.undulator_ref().current_gap, 5.3)
set_mock_value(fake_undulator_dcm.dcm_ref().energy_in_keV.user_readback, 5.7)

mock_load.return_value = np.array([[5700, 5.4606], [7000, 6.045], [9700, 6.404]])

await fake_undulator_dcm.set(6.9)

assert (
Expand Down
2 changes: 2 additions & 0 deletions tests/devices/beamlines/i07/test_id.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import pytest
from daq_config_server import ConfigClient
from ophyd_async.core import init_devices

from dodal.devices.beamlines.i07.id import InsertionDevice
Expand All @@ -19,6 +20,7 @@ async def id(harmonic: UndulatorOrder) -> InsertionDevice:
id = InsertionDevice(
"ID-01",
harmonic,
ConfigClient(""),
TEST_LOOKUP_TABLE_PATH,
)
return id
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
# Bragg pitch
# Degree values for pitch are interpreted as mrad
# The values cannot change direction.
# last update 2023/06/26 NP
Units Deg mrad
Units Deg Deg
19.24347 -0.79775
16.40949 -0.78679
14.31123 -0.77838
12.69287 -0.77276
11.40555 -0.77276
10.35662 -0.77031
9.48522 -0.76693
8.95826 -0.76387
8.74953 -0.76387
8.12020 -0.76387
7.57556 -0.76354
7.09950 -0.76166
6.67997 -0.76044
6.30732 -0.75953
5.97411 -0.75845
5.67434 -0.75796
5.40329 -0.75789
5.15700 -0.75551
4.93218 -0.75513
{
"rows": [
[19.24347, -0.79775],
[16.40949, -0.78679],
[14.31123, -0.77838],
[12.69287, -0.77276],
[11.40555, -0.77276],
[10.35662, -0.77031],
[9.48522, -0.76693],
[8.95826, -0.76387],
[8.74953, -0.76387],
[8.1202, -0.76387],
[7.57556, -0.76354],
[7.0995, -0.76166],
[6.67997, -0.76044],
[6.30732, -0.75953],
[5.97411, -0.75845],
[5.67434, -0.75796],
[5.40329, -0.75789],
[5.157, -0.75551],
[4.93218, -0.75513]
]
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Bragg angle against roll( absolute number)
#reloadLookupTables()
# last update 2023/01/19 NP
Units Deg mrad
26.4095 -0.2799
6.3075 -0.2799
{
"rows": [
[26.4095, -0.2799],
[6.3075, -0.2799]
]
}
Loading
Loading