Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e14c382

Browse files
committedFeb 20, 2025
Implement field parsing
Covers both the electric and magnetic field inputs. RE mantidproject#38524
1 parent 1e0e646 commit e14c382

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed
 

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from sans.state.StateObjects.StateMaskDetectors import get_mask_builder, StateMaskDetectors
1919
from sans.state.StateObjects.StateMoveDetectors import get_move_builder
2020
from sans.state.StateObjects.StateNormalizeToMonitor import get_normalize_to_monitor_builder
21-
from sans.state.StateObjects.StatePolarization import StatePolarization, StateComponent, StateFilter
21+
from sans.state.StateObjects.StatePolarization import StatePolarization, StateComponent, StateFilter, StateField
2222
from sans.state.StateObjects.StateReductionMode import StateReductionMode
2323
from sans.state.StateObjects.StateSave import StateSave
2424
from sans.state.StateObjects.StateScale import StateScale
@@ -531,6 +531,8 @@ def _parse_polarization(self):
531531
self.polarization.flippers.append(self._parse_component(flipper_dict))
532532
self.polarization.polarizer = self._parse_filter(self.get_val("polarizer", polarization_dict))
533533
self.polarization.analyzer = self._parse_filter(self.get_val("analyzer", polarization_dict))
534+
self.polarization.magnetic_field = self._parse_field(self.get_val("magnetic_field", polarization_dict))
535+
self.polarization.electric_field = self._parse_field(self.get_val("electric_field", polarization_dict))
534536

535537
def _parse_component(self, component_dict: dict) -> StateComponent:
536538
component_state = StateComponent()
@@ -557,6 +559,19 @@ def _parse_filter(self, filter_dict: dict) -> StateFilter:
557559
filter_state.gas_pressure = self.get_val("gas_pressure", filter_dict)
558560
return filter_state
559561

562+
def _parse_field(self, field_dict: dict) -> StateField:
563+
field_state = StateField()
564+
if field_dict is None:
565+
return field_state
566+
field_state.sample_strength_log = self.get_val("sample_strength_log", field_dict)
567+
direction_dict = self.get_val("sample_direction", field_dict)
568+
if direction_dict:
569+
field_state.sample_direction_a = self.get_val("a", direction_dict)
570+
field_state.sample_direction_p = self.get_val("p", direction_dict)
571+
field_state.sample_direction_d = self.get_val("d", direction_dict)
572+
field_state.sample_direction_log = self.get_val("sample_direction_log", field_dict)
573+
return field_state
574+
560575
@staticmethod
561576
def _get_1d_min_max(one_d_binning: str):
562577
# TODO: We have to do some special parsing for this type on behalf of the sans codebase

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

+7
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,19 @@ def _reference_schema():
148148
"initial_polarization": None,
149149
}
150150
filter_keys = dict(component_keys, **{"cell_length": None, "gas_pressure": None})
151+
field_keys = {
152+
"sample_strength_log": None,
153+
"sample_direction": {"a", "p", "d"},
154+
"sample_direction_log": None,
155+
}
151156
polarization_keys = {
152157
"flipper_configuration": None,
153158
"spin_configuration": None,
154159
"flipper": {"*": component_keys},
155160
"polarizer": filter_keys,
156161
"analyzer": filter_keys,
162+
"magnetic_field": field_keys,
163+
"electric_field": field_keys,
157164
}
158165

159166
return {

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

+28
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,34 @@ def test_parse_polarizer_and_analyzer(self):
787787
self.assertEqual("trans_ws", polarizer_state.transmission)
788788
self.assertEqual("eff_ws", polarizer_state.efficiency)
789789

790+
def test_parse_fields(self):
791+
top_level_dict = {
792+
"polarization": {
793+
"magnetic_field": {
794+
"sample_strength_log": "nameoflog",
795+
"sample_direction": {"a": 0, "p": 2.3, "d": 0.002},
796+
},
797+
"electric_field": {
798+
"sample_strength_log": "nameofotherlog",
799+
"sample_direction_log": "nameofanotherlog",
800+
},
801+
}
802+
}
803+
parser_result = self._setup_parser(top_level_dict)
804+
polarization_state = parser_result.get_state_polarization()
805+
electric_state = polarization_state.electric_field
806+
magnetic_state = polarization_state.magnetic_field
807+
self.assertEqual("nameoflog", magnetic_state.sample_strength_log)
808+
self.assertEqual(0, magnetic_state.sample_direction_a)
809+
self.assertEqual(2.3, magnetic_state.sample_direction_p)
810+
self.assertEqual(0.002, magnetic_state.sample_direction_d)
811+
self.assertIsNone(magnetic_state.sample_direction_log)
812+
self.assertEqual("nameofotherlog", electric_state.sample_strength_log)
813+
self.assertEqual("nameofanotherlog", electric_state.sample_direction_log)
814+
self.assertIsNone(electric_state.sample_direction_a)
815+
self.assertIsNone(electric_state.sample_direction_p)
816+
self.assertIsNone(electric_state.sample_direction_d)
817+
790818

791819
if __name__ == "__main__":
792820
unittest.main()

0 commit comments

Comments
 (0)