Skip to content

Commit 6eeec12

Browse files
committed
Implement flipper parsing
RE mantidproject#38524
1 parent a3e9a2e commit 6eeec12

File tree

3 files changed

+74
-4
lines changed

3 files changed

+74
-4
lines changed

scripts/SANS/sans/user_file/toml_parsers/toml_v1_parser.py

+22-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
# & Institut Laue - Langevin
66
# SPDX - License - Identifier: GPL - 3.0 +
77

8+
from typing import Optional
9+
810
from sans.common.enums import SANSInstrument, ReductionMode, DetectorType, RangeStepType, FitModeForMerge, DataType, FitType, RebinType
911
from sans.common.general_functions import get_bank_for_spectrum_number, get_detector_types_from_instrument
1012
from sans.state.IStateParser import IStateParser
@@ -16,7 +18,7 @@
1618
from sans.state.StateObjects.StateMaskDetectors import get_mask_builder, StateMaskDetectors
1719
from sans.state.StateObjects.StateMoveDetectors import get_move_builder
1820
from sans.state.StateObjects.StateNormalizeToMonitor import get_normalize_to_monitor_builder
19-
from sans.state.StateObjects.StatePolarization import StatePolarization
21+
from sans.state.StateObjects.StatePolarization import StatePolarization, StateComponent
2022
from sans.state.StateObjects.StateReductionMode import StateReductionMode
2123
from sans.state.StateObjects.StateSave import StateSave
2224
from sans.state.StateObjects.StateScale import StateScale
@@ -74,7 +76,7 @@ def get_state_normalize_to_monitor(self, _):
7476
def get_state_reduction_mode(self):
7577
return self._implementation.reduction_mode
7678

77-
def get_state_polarization(self):
79+
def get_state_polarization(self) -> Optional[StatePolarization]:
7880
return self._implementation.polarization
7981

8082
def get_state_save(self):
@@ -521,6 +523,24 @@ def _parse_polarization(self):
521523
polarization_dict = self.get_val("polarization")
522524
self.polarization.flipper_configuration = self.get_val("flipper_configuration", polarization_dict)
523525
self.polarization.spin_configuration = self.get_val("spin_configuration", polarization_dict)
526+
flipper_dicts = self.get_val("flipper", polarization_dict)
527+
if flipper_dicts:
528+
for flipper_dict in flipper_dicts.values():
529+
self.polarization.flippers.append(self._parse_component(flipper_dict))
530+
531+
def _parse_component(self, flipper_dict: dict) -> StateComponent:
532+
flipper_state = StateComponent()
533+
flipper_state.idf_component_name = self.get_val("idf_component_name", flipper_dict)
534+
flipper_state.device_name = self.get_val("device_name", flipper_dict)
535+
flipper_state.device_type = self.get_val("device_type", flipper_dict)
536+
location_dict = self.get_val("location", flipper_dict)
537+
if location_dict:
538+
flipper_state.location_x = self.get_val("x", location_dict)
539+
flipper_state.location_y = self.get_val("y", location_dict)
540+
flipper_state.location_z = self.get_val("z", location_dict)
541+
flipper_state.transmission = self.get_val("transmission", flipper_dict)
542+
flipper_state.efficiency = self.get_val("efficiency", flipper_dict)
543+
return flipper_state
524544

525545
@staticmethod
526546
def _get_1d_min_max(one_d_binning: str):

scripts/SANS/sans/user_file/toml_parsers/toml_v1_schema.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,20 @@ def _reference_schema():
138138
}
139139

140140
polarization_keys = {
141-
"flipper_configuration",
142-
"spin_configuration",
141+
"flipper_configuration": None,
142+
"spin_configuration": None,
143+
"flipper": {
144+
"*": {
145+
"idf_component_name": None,
146+
"device_name": None,
147+
"device_type": None,
148+
"location": {"x", "y", "z"},
149+
"transmission": None,
150+
"efficiency": None,
151+
"empty_cell": None,
152+
"initial_polarization": None,
153+
}
154+
},
143155
}
144156

145157
return {

scripts/test/SANS/user_file/toml_parsers/toml_v1_parser_test.py

+38
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,44 @@ def test_parse_polarization(self):
705705
self.assertEqual("00,11,01,10", polarization_state.flipper_configuration)
706706
self.assertEqual("-1-1,-1+1,+1-1,+1+1", polarization_state.spin_configuration)
707707

708+
def test_parse_flippers(self):
709+
top_level_dict = {
710+
"polarization": {
711+
"flipper": {
712+
"polarizing": {
713+
"idf_component_name": "name_in_IDF",
714+
"device_name": "flipper1",
715+
"device_type": "coil",
716+
"location": {"x": 1.17, "y": 0.05, "z": 0.045},
717+
"transmission": "trans_ws",
718+
"efficiency": "eff_ws",
719+
},
720+
"analyzing": {
721+
"idf_component_name": "name_in_IDF_a",
722+
"device_name": "flipper2",
723+
"device_type": "coil",
724+
"location": {"x": 2.17, "y": 0.05, "z": 0.045},
725+
"transmission": "trans_ws",
726+
"efficiency": "eff_ws",
727+
},
728+
}
729+
}
730+
}
731+
parser_result = self._setup_parser(top_level_dict)
732+
polarization_state = parser_result.get_state_polarization()
733+
flippers = polarization_state.flippers
734+
self.assertEqual(2, len(flippers))
735+
self.assertEqual("flipper1", flippers[0].device_name)
736+
self.assertEqual("flipper2", flippers[1].device_name)
737+
self.assertEqual(1.17, flippers[0].location_x)
738+
self.assertEqual(0.05, flippers[0].location_y)
739+
self.assertEqual(0.045, flippers[0].location_z)
740+
self.assertEqual(2.17, flippers[1].location_x)
741+
self.assertEqual("name_in_IDF", flippers[0].idf_component_name)
742+
self.assertEqual("coil", flippers[0].device_type)
743+
self.assertEqual("trans_ws", flippers[0].transmission)
744+
self.assertEqual("eff_ws", flippers[0].efficiency)
745+
708746

709747
if __name__ == "__main__":
710748
unittest.main()

0 commit comments

Comments
 (0)