Configuration#
from pyaml.accelerator import Accelerator
SR: Accelerator = Accelerator.load("../../tests/config/EBSTune.yaml")
---------------------------------------------------------------------------
PyAMLConfigException Traceback (most recent call last)
Cell In[1], line 3
1 from pyaml.accelerator import Accelerator
2
----> 3 SR: Accelerator = Accelerator.load("../../tests/config/EBSTune.yaml")
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/accelerator.py:304, in Accelerator.load(filename, use_fast_loader, ignore_external)
299 except UnsupportedConfigurationRootError as ex:
300 raise PyAMLConfigException(
301 "Accelerator.load() expects a 'pyaml.accelerator' root configuration. "
302 "Use the factory APIs to build sub-elements directly."
303 ) from ex
--> 304 return manager.build(ignore_external=ignore_external)
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/configuration/manager.py:496, in ConfigurationManager.build(self, ignore_external)
494 set_root_folder(self._build_root)
495 snapshot = ConfigurationManager.strip_runtime_internal_metadata(self._snapshot(include_internal_metadata=True))
--> 496 return Accelerator.from_dict(snapshot, ignore_external=ignore_external)
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/accelerator.py:275, in Accelerator.from_dict(config_dict, ignore_external)
273 # Ensure factory is clean before building a new accelerator
274 Factory.clear()
--> 275 return Factory.build(config_dict, ignore_external)
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/configuration/factory.py:548, in PyAMLFactory.build(self, data, ignore_external)
545 return self._build_list(data, ignore_external)
547 elif isinstance(data, dict):
--> 548 data = self._build_dict(data, ignore_external)
549 return self.build_object(data, ignore_external)
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/configuration/factory.py:395, in PyAMLFactory._build_dict(self, data, ignore_external)
392 # Do not recurse dict defined in ConfigModel
393 # pydantic use TypedDict not usable with isinstance
394 if not self._is_plain_dict_type(field_type):
--> 395 result[key] = self.build(value, ignore_external)
397 return result
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/configuration/factory.py:545, in PyAMLFactory.build(self, data, ignore_external)
542 raise PyAMLConfigException(f"Unexpected element found. 'dict' or 'list' expected but got '{type(data).__name__}'")
544 if isinstance(data, list):
--> 545 return self._build_list(data, ignore_external)
547 elif isinstance(data, dict):
548 data = self._build_dict(data, ignore_external)
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/configuration/factory.py:360, in PyAMLFactory._build_list(self, items, ignore_external)
355 def _build_list(self, items, ignore_external: bool):
356 """
357 Recursively build all nested objects contained in a list.
358 """
--> 360 return [self.build(item, ignore_external) if isinstance(item, (dict, list)) else item for item in items]
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/configuration/factory.py:548, in PyAMLFactory.build(self, data, ignore_external)
545 return self._build_list(data, ignore_external)
547 elif isinstance(data, dict):
--> 548 data = self._build_dict(data, ignore_external)
549 return self.build_object(data, ignore_external)
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/configuration/factory.py:380, in PyAMLFactory._build_dict(self, data, ignore_external)
371 def _build_dict(self, data: dict, ignore_external: bool):
372 """
373 Recursively build nested objects referenced by a configuration
374 dictionary.
(...) 377 recursive build process and are left unchanged.
378 """
--> 380 build_info = resolve_build_info(data, ignore_external)
381 config_cls = build_info.config_cls
383 result = dict(data)
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/latest/lib/python3.13/site-packages/pyaml/configuration/factory.py:238, in resolve_build_info(data, ignore_external)
236 if ignore_external:
237 return None
--> 238 raise PyAMLConfigException(f"Module referenced in type cannot be found: '{module_str}' {location_str}") from None
240 # Get the object class name
241 if class_str is None:
PyAMLConfigException: Module referenced in type cannot be found: 'tango.pyaml.controlsystem' /home/docs/checkouts/readthedocs.org/user_builds/pyaml/checkouts/latest/tests/config/EBSTune.yaml at line 12, column 5.
pyaml/tests/config/EBSTune.yaml is an example pyAML yaml configuration file that defines:
a 6GeV Storage ring with
1 array (family) of quadrupoles used for tune correction
1 tune device
controlled by Tango
simulated with AT
It looks like this:
type: pyaml.accelerator
name: sr
energy: 6e9
simulators:
- type: pyaml.lattice.simulator
lattice: sr/lattices/ebs.mat
name: design
controls:
- type: tango.pyaml.controlsystem
tango_host: ebs-simu-3:10000
name: live
data_folder: /data/store
arrays:
- type: pyaml.arrays.magnet
name: QForTune
elements:
- QD2A-C03
- QD2E-C04
- QD2A-C05
- ...
devices:
- type: pyaml.magnet.quadrupole
name: QD2A-C03
model:
type: pyaml.magnet.linear_model
calibration_factor: 1.002096389
crosstalk: 0.99912
curve:
type: pyaml.configuration.csvcurve
file: sr/magnet_models/QD2_strength.csv
unit: 1/m
powerconverter:
type: tango.pyaml.attribute
attribute: srmag/vps-qd2/c03-a/current
unit: A
- ...
- ...
- ...
- type: pyaml.diagnostics.tune_monitor
name: BETATRON_TUNE
tune_h:
type: tango.pyaml.attribute_read_only
attribute: srdiag/tune/tune_h
unit: mm
tune_v:
type: tango.pyaml.attribute_read_only
attribute: srdiag/tune/tune_v
unit: mm