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