Skip to content

Commit 25576ef

Browse files
committed
Add functions to GenericLookupTable
1 parent 909b5a6 commit 25576ef

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/daq_config_server/converters/models.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,24 @@ def check_row_length_matches_n_columns(self):
4545
f"of columns: {self.column_names}"
4646
)
4747
return self
48+
49+
def get_value(
50+
self,
51+
column_name: str,
52+
value: int | float,
53+
target_column_name: str,
54+
value_must_exist: bool = True,
55+
) -> int | float:
56+
column_index = self.column_names.index(column_name)
57+
column = [row[column_index] for row in self.rows]
58+
target_column_index = self.column_names.index(target_column_name)
59+
60+
closest_value = (
61+
min(column, key=lambda x: abs(x - value)) if not value_must_exist else value
62+
)
63+
target_row = self.rows[column.index(closest_value)]
64+
65+
return target_row[target_column_index]
66+
67+
def columns(self):
68+
return [[row[i] for row in self.rows] for i in range(len(self.column_names))]

tests/unit_tests/test_converters.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def test_bad_beamline_parameters_with_non_keyword_string_value_causes_error():
190190
beamline_parameters_to_dict(contents)
191191

192192

193-
def test_beam_line_parameters_with_repeated_key_causes_error():
193+
def test_beamline_parameters_with_repeated_key_causes_error():
194194
input = "thing = 1\nthing = 2"
195195
with pytest.raises(ValueError, match="Repeated key in parameters: thing"):
196196
beamline_parameters_to_dict(input)
@@ -247,6 +247,33 @@ def test_detector_xy_lut_gives_expected_results():
247247
assert result == expected
248248

249249

250+
def test_generic_lut_model_get_value_function():
251+
my_lut = GenericLookupTable(
252+
column_names=["detector_distances_mm", "beam_centre_x_mm", "beam_centre_y_mm"],
253+
rows=[[150, 152.2, 166.26], [800, 152.08, 160.96]],
254+
)
255+
assert my_lut.get_value("detector_distances_mm", 150, "beam_centre_x_mm") == 152.2
256+
assert my_lut.get_value("beam_centre_y_mm", 160.96, "detector_distances_mm") == 800
257+
with pytest.raises(ValueError):
258+
# value doesn't exist
259+
my_lut.get_value("beam_centre_y_mm", 160.97, "detector_distances_mm")
260+
assert (
261+
my_lut.get_value(
262+
"beam_centre_x_mm", 153, "beam_centre_y_mm", value_must_exist=False
263+
)
264+
== 166.26 # get closest value
265+
)
266+
267+
268+
def test_generic_lut_model_columns_function():
269+
my_lut = GenericLookupTable(
270+
column_names=["detector_distances_mm", "beam_centre_x_mm", "beam_centre_y_mm"],
271+
rows=[[150, 152.2, 166.26], [800, 152.08, 160.96]],
272+
)
273+
expected_columns = [[150, 800], [152.2, 152.08], [166.26, 160.96]]
274+
assert my_lut.columns() == expected_columns
275+
276+
250277
def test_beamline_pitch_lut_gives_expected_result():
251278
input = (
252279
"# Bragg pitch\n"

0 commit comments

Comments
 (0)