Skip to content

Commit d0ea7a1

Browse files
authored
Merge pull request #220 from python-accelerator-middle-layer/orm-saving
orm saving
2 parents 7162616 + 88348e3 commit d0ea7a1

File tree

3 files changed

+40
-37
lines changed

3 files changed

+40
-37
lines changed

examples/ESRF_ORM_example/measure_ideal_ORM_and_disp.py

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
from pyaml.accelerator import Accelerator
77

88
parent_folder = Path(__file__).parent
9-
config_path = parent_folder.parent.parent.joinpath(
10-
"tests", "config", "EBSOrbit.yaml"
11-
).resolve()
9+
config_path = parent_folder.parent.parent.joinpath("tests", "config", "EBSOrbit.yaml").resolve()
1210
sr = Accelerator.load(config_path)
1311

1412
ebs = sr.design
@@ -19,18 +17,9 @@
1917
ebs.dispersion.measure()
2018
dispersion_data = ebs.dispersion.get()
2119

22-
rf_response = (
23-
dispersion_data["frequency_response_x"] + dispersion_data["frequency_response_y"]
24-
)
25-
26-
ideal_ORM_data = {
27-
"type": "pyaml.tuning_tools.response_matrix",
28-
"matrix": orm_data["matrix"],
29-
"input_names": orm_data["input_names"],
30-
"output_names": orm_data["output_names"],
31-
"input_planes": orm_data["input_planes"],
32-
"output_planes": orm_data["output_planes"],
33-
"rf_response": rf_response,
34-
}
35-
36-
json.dump(ideal_ORM_data, open("ideal_orm_disp.json", "w"))
20+
rf_response = dispersion_data["frequency_response_x"] + dispersion_data["frequency_response_y"]
21+
22+
orm_data["rf_response"] = rf_response
23+
orm_data["type"] = "pyaml.tuning_tools.orbit_response_matrix_data"
24+
25+
json.dump(orm_data, open("ideal_orm_disp.json", "w"))

pyaml/tuning_tools/orbit_response_matrix.py

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from ..common.element import ElementConfigModel
1212
from ..external.pySC_interface import pySCInterface
1313
from .measurement_tool import MeasurementTool
14+
from .orbit_response_matrix_data import ConfigModel as OrbitResponseMatrixDataConfigModel
15+
from .orbit_response_matrix_data import OrbitResponseMatrixData
1416

1517
logger = logging.getLogger(__name__)
1618

@@ -82,11 +84,6 @@ def measure(
8284
hcorrector_names = element_holder.get_magnets(self.hcorr_array_name).names()
8385
vcorrector_names = element_holder.get_magnets(self.vcorr_array_name).names()
8486
corrector_names = hcorrector_names + vcorrector_names
85-
else:
86-
all_hcorrector_names = element_holder.get_magnets(self.hcorr_array_name).names()
87-
all_vcorrector_names = element_holder.get_magnets(self.vcorr_array_name).names()
88-
hcorrector_names = [corr for corr in corrector_names if corr in all_hcorrector_names]
89-
vcorrector_names = [corr for corr in corrector_names if corr in all_vcorrector_names]
9087

9188
generator = measure_ORM(
9289
interface=interface,
@@ -117,19 +114,36 @@ def measure(
117114
logger.warning("Measurement aborted! Settings have not been restored.")
118115
return
119116

120-
response_data = measurement.response_data # contains also pre-processed data
121-
bpm_names = element_holder.get_bpms(self.bpm_array_name).names()
122-
# This is because we assume always dual-plane bpms now.
123-
response_data.output_names = bpm_names * 2
124-
self.latest_measurement = response_data.model_dump()
117+
orm_data = self._pySC_response_data_to_ORMData(measurement.response_data.model_dump())
118+
self.latest_measurement = orm_data.model_dump()
119+
120+
def _pySC_response_data_to_ORMData(self, data: dict) -> OrbitResponseMatrixDataConfigModel:
121+
# all metadata is discarded here. Should we keep something?
125122

126-
input_planes = []
127-
for corr in corrector_names:
128-
if corr in hcorrector_names:
129-
input_planes.append("H")
130-
elif corr in vcorrector_names:
131-
input_planes.append("V")
132-
self.latest_measurement["input_planes"] = input_planes
123+
element_holder = self._peer
124+
all_hcorrector_names = element_holder.get_magnets(self.hcorr_array_name).names()
125+
all_vcorrector_names = element_holder.get_magnets(self.vcorr_array_name).names()
126+
variable_planes = []
127+
for corr in data["input_names"]:
128+
if corr in all_hcorrector_names:
129+
variable_planes.append("H")
130+
elif corr in all_vcorrector_names:
131+
variable_planes.append("V")
133132

133+
bpm_names = element_holder.get_bpms(self.bpm_array_name).names()
134+
# This is because we assume always dual-plane bpms now.
134135
len_b = len(bpm_names)
135-
self.latest_measurement["output_planes"] = ["H"] * len_b + ["V"] * len_b
136+
observable_names = bpm_names * 2
137+
observable_planes = ["H"] * len_b + ["V"] * len_b
138+
139+
orm_data_model = {
140+
"matrix": data["matrix"],
141+
"variable_names": data["input_names"],
142+
"observable_names": observable_names,
143+
"rf_response": None,
144+
"variable_planes": variable_planes,
145+
"observable_planes": observable_planes,
146+
}
147+
148+
orm_data = OrbitResponseMatrixDataConfigModel(**orm_data_model)
149+
return orm_data

tests/config/ideal_orm_disp.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)