From 9ee2a373416ab56422465a2daf8778d34e6f6d0b Mon Sep 17 00:00:00 2001 From: Matthew Carre Date: Mon, 18 May 2026 09:24:29 +0100 Subject: [PATCH 1/5] Adds initial circular plans --- .../test_arithmetic_conversions.py | 21 ++++++++++++++ .../test_transmission_interconversion.py | 29 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/tests/common/general_maths/test_arithmetic_conversions.py b/tests/common/general_maths/test_arithmetic_conversions.py index 6a69519692f..fdd40f09706 100644 --- a/tests/common/general_maths/test_arithmetic_conversions.py +++ b/tests/common/general_maths/test_arithmetic_conversions.py @@ -56,6 +56,27 @@ def test_conversion_from_microns_to_centimetres(input, result): assert convert_microns_to_cm(input) == pytest.approx(result) +# circularity tests (expected success, all numbers here arbitrary) + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_cm_to_mm_and_back(input): + assert convert_cm_to_mm(convert_mm_to_cm(input)) == input + assert convert_mm_to_cm(convert_cm_to_mm(input)) == input + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_microns_to_mm_and_back(input): + assert convert_microns_to_mm(convert_mm_to_microns(input)) == input + assert convert_mm_to_microns(convert_microns_to_mm(input)) == input + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_percentage_to_factor(input): + assert convert_percentage_to_factor(convert_factor_to_percentage(input)) == input + assert convert_factor_to_percentage(convert_percentage_to_factor(input)) == input + + # The inauspicuous path @pytest.mark.parametrize( "bad_input", diff --git a/tests/common/general_maths/test_transmission_interconversion.py b/tests/common/general_maths/test_transmission_interconversion.py index db3fa312932..ad1289ab797 100644 --- a/tests/common/general_maths/test_transmission_interconversion.py +++ b/tests/common/general_maths/test_transmission_interconversion.py @@ -98,6 +98,35 @@ def test_attenuation_from_natural_log_of_transmission(ln_t, result): assert attenuation_from_natural_log_of_transmission(ln_t) == pytest.approx(result) +# circularity tests, all numbers here are arbitrary + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_attenuation_from_log_and_back(input): + assert ( + attenuation_from_natural_log_of_transmission( + natural_log_of_transmission_from_attenuation(input) + ) + == input + ) + assert ( + natural_log_of_transmission_from_attenuation( + attenuation_from_natural_log_of_transmission(input) + ) + == input + ) + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_attenuation_from_transmission_and_back(input): + assert attenuation_from_transmission( + transmission_from_attenutation(input) + ) == pytest.approx(input) + assert transmission_from_attenutation( + attenuation_from_transmission(input) + ) == pytest.approx(input) + + # inauspicious: @pytest.mark.parametrize("bad_input", ["a", [], None, math.sin, object(), False]) def test_natural_log_of_transmission_from_attenuation_raises_error(bad_input): From 7720c5419d59b4dc2accb152d44329820a24424c Mon Sep 17 00:00:00 2001 From: Matthew Carre Date: Mon, 18 May 2026 09:30:10 +0100 Subject: [PATCH 2/5] adds circular tests for the two branches present --- .../test_arithmetic_conversions.py | 21 ++++++++++++++ .../test_transmission_interconversion.py | 29 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/tests/common/general_maths/test_arithmetic_conversions.py b/tests/common/general_maths/test_arithmetic_conversions.py index 6a69519692f..ffba7d18e79 100644 --- a/tests/common/general_maths/test_arithmetic_conversions.py +++ b/tests/common/general_maths/test_arithmetic_conversions.py @@ -56,6 +56,27 @@ def test_conversion_from_microns_to_centimetres(input, result): assert convert_microns_to_cm(input) == pytest.approx(result) +# Circular tests (all numbers here arbitrary) + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_cm_to_mm_and_back(input): + assert convert_cm_to_mm(convert_mm_to_cm(input)) == input + assert convert_mm_to_cm(convert_cm_to_mm(input)) == input + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_microns_to_mm_and_back(input): + assert convert_microns_to_mm(convert_mm_to_microns(input)) == input + assert convert_mm_to_microns(convert_microns_to_mm(input)) == input + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_percentage_to_factor(input): + assert convert_percentage_to_factor(convert_factor_to_percentage(input)) == input + assert convert_factor_to_percentage(convert_percentage_to_factor(input)) == input + + # The inauspicuous path @pytest.mark.parametrize( "bad_input", diff --git a/tests/common/general_maths/test_transmission_interconversion.py b/tests/common/general_maths/test_transmission_interconversion.py index db3fa312932..40622d9c48f 100644 --- a/tests/common/general_maths/test_transmission_interconversion.py +++ b/tests/common/general_maths/test_transmission_interconversion.py @@ -98,6 +98,35 @@ def test_attenuation_from_natural_log_of_transmission(ln_t, result): assert attenuation_from_natural_log_of_transmission(ln_t) == pytest.approx(result) +# Circular tests (all numbers here arbitrary) + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_attenuation_from_log_and_back(input): + assert ( + attenuation_from_natural_log_of_transmission( + natural_log_of_transmission_from_attenuation(input) + ) + == input + ) + assert ( + natural_log_of_transmission_from_attenuation( + attenuation_from_natural_log_of_transmission(input) + ) + == input + ) + + +@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) +def test_circular_attenuation_from_transmission_and_back(input): + assert attenuation_from_transmission( + transmission_from_attenutation(input) + ) == pytest.approx(input) + assert transmission_from_attenutation( + attenuation_from_transmission(input) + ) == pytest.approx(input) + + # inauspicious: @pytest.mark.parametrize("bad_input", ["a", [], None, math.sin, object(), False]) def test_natural_log_of_transmission_from_attenuation_raises_error(bad_input): From 4ff9586d5006bf728dad386a89df0195ea6868cd Mon Sep 17 00:00:00 2001 From: Matthew Carre Date: Mon, 18 May 2026 15:57:51 +0100 Subject: [PATCH 3/5] Adds Booleans to the list of bad inputs in check_bounds --- .../common/general_maths/test_check_bounds.py | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/tests/common/general_maths/test_check_bounds.py b/tests/common/general_maths/test_check_bounds.py index 2ce0dc70422..1633b19ff6a 100644 --- a/tests/common/general_maths/test_check_bounds.py +++ b/tests/common/general_maths/test_check_bounds.py @@ -48,12 +48,7 @@ def test_has_misordered_inputs(): @pytest.mark.parametrize( "bad_input", [ - ( - "a", - None, - math.sin, - object(), - ), + ("a", None, math.sin, object(), False), ], ) def test_is_within_range_raises_error_with_bad_tested_value( @@ -66,12 +61,7 @@ def test_is_within_range_raises_error_with_bad_tested_value( @pytest.mark.parametrize( "bad_input", [ - ( - "a", - None, - math.sin, - object(), - ), + ("a", None, math.sin, object(), False), ], ) def test_is_within_range_raises_error_with_bad_upper_bound( @@ -84,12 +74,7 @@ def test_is_within_range_raises_error_with_bad_upper_bound( @pytest.mark.parametrize( "bad_input", [ - ( - "a", - None, - math.sin, - object(), - ), + ("a", None, math.sin, object(), False), ], ) def test_is_within_range_raises_error_with_bad_lower_bound( From 6ab60b843a5882d8f1fdd9766bf2ae2fbf24734d Mon Sep 17 00:00:00 2001 From: Matthew Carre Date: Wed, 20 May 2026 10:18:15 +0100 Subject: [PATCH 4/5] adds config server to i19_2 --- src/dodal/beamlines/i19_2.py | 12 +++++++++++ .../test_arithmetic_conversions.py | 21 ------------------- .../test_transmission_interconversion.py | 19 ----------------- 3 files changed, 12 insertions(+), 40 deletions(-) diff --git a/src/dodal/beamlines/i19_2.py b/src/dodal/beamlines/i19_2.py index d341c764e8a..5966540b74a 100644 --- a/src/dodal/beamlines/i19_2.py +++ b/src/dodal/beamlines/i19_2.py @@ -1,6 +1,7 @@ from functools import cache from pathlib import Path +from daq_config_server import ConfigClient from ophyd_async.core import PathProvider from ophyd_async.fastcs.eiger import EigerDetector from ophyd_async.fastcs.panda import HDFPanda @@ -8,6 +9,9 @@ from dodal.common.beamlines.beamline_utils import ( set_beamline as set_utils_beamline, ) +from dodal.common.beamlines.beamline_utils import ( + set_config_client, +) from dodal.common.visit import StaticVisitPathProvider from dodal.device_manager import DeviceManager from dodal.devices.beamlines.i19.access_controlled.attenuator_motor_squad import ( @@ -63,6 +67,14 @@ def path_provider() -> PathProvider: ) +@devices.fixture +@cache +def config_client() -> ConfigClient: + client = ConfigClient() + set_config_client(client) + return client + + @devices.factory() def attenuator_motor_squad() -> AttenuatorMotorSquad: return AttenuatorMotorSquad( diff --git a/tests/common/general_maths/test_arithmetic_conversions.py b/tests/common/general_maths/test_arithmetic_conversions.py index fdd40f09706..6a69519692f 100644 --- a/tests/common/general_maths/test_arithmetic_conversions.py +++ b/tests/common/general_maths/test_arithmetic_conversions.py @@ -56,27 +56,6 @@ def test_conversion_from_microns_to_centimetres(input, result): assert convert_microns_to_cm(input) == pytest.approx(result) -# circularity tests (expected success, all numbers here arbitrary) - - -@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) -def test_circular_cm_to_mm_and_back(input): - assert convert_cm_to_mm(convert_mm_to_cm(input)) == input - assert convert_mm_to_cm(convert_cm_to_mm(input)) == input - - -@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) -def test_circular_microns_to_mm_and_back(input): - assert convert_microns_to_mm(convert_mm_to_microns(input)) == input - assert convert_mm_to_microns(convert_microns_to_mm(input)) == input - - -@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) -def test_circular_percentage_to_factor(input): - assert convert_percentage_to_factor(convert_factor_to_percentage(input)) == input - assert convert_factor_to_percentage(convert_percentage_to_factor(input)) == input - - # The inauspicuous path @pytest.mark.parametrize( "bad_input", diff --git a/tests/common/general_maths/test_transmission_interconversion.py b/tests/common/general_maths/test_transmission_interconversion.py index ad1289ab797..d478706432c 100644 --- a/tests/common/general_maths/test_transmission_interconversion.py +++ b/tests/common/general_maths/test_transmission_interconversion.py @@ -98,25 +98,6 @@ def test_attenuation_from_natural_log_of_transmission(ln_t, result): assert attenuation_from_natural_log_of_transmission(ln_t) == pytest.approx(result) -# circularity tests, all numbers here are arbitrary - - -@pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) -def test_circular_attenuation_from_log_and_back(input): - assert ( - attenuation_from_natural_log_of_transmission( - natural_log_of_transmission_from_attenuation(input) - ) - == input - ) - assert ( - natural_log_of_transmission_from_attenuation( - attenuation_from_natural_log_of_transmission(input) - ) - == input - ) - - @pytest.mark.parametrize("input", [1.0, 10.0, 100.0]) def test_circular_attenuation_from_transmission_and_back(input): assert attenuation_from_transmission( From ac1708a78bf1a00c0a669c9b1d861a1f25f4ab0e Mon Sep 17 00:00:00 2001 From: Matthew Carre Date: Thu, 21 May 2026 17:07:02 +0100 Subject: [PATCH 5/5] removes accidental duplication --- src/dodal/beamlines/i19_2.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/dodal/beamlines/i19_2.py b/src/dodal/beamlines/i19_2.py index cda88773fe2..165f8349fa6 100644 --- a/src/dodal/beamlines/i19_2.py +++ b/src/dodal/beamlines/i19_2.py @@ -73,14 +73,6 @@ def path_provider() -> PathProvider: ) -@devices.fixture -@cache -def config_client() -> ConfigClient: - client = ConfigClient() - set_config_client(client) - return client - - @devices.factory() def attenuator_motor_squad() -> AttenuatorMotorSquad: return AttenuatorMotorSquad(