Control System set up#
The control system interface is in a separated package from pyaml
pyaml itself:
pip install accelerator-middle-layer
tango interface to pyaml:
pip install tango-pyaml
ophyd-asynch interface to pyaml:
pip install pyaml-oa-cs
If the above packages are installed the examples below will work
from pyaml.accelerator import Accelerator
Assuming these lines are present in …/…/tests/config/EBSTune_TANGO.yaml
type: pyaml.accelerator
name: sr
energy: 6e9
controls:
- type: tango.pyaml.controlsystem
tango_host: ebs-simu-3:10000
name: live
...
powerconverter:
type: tango.pyaml.attribute
...
tune_h:
type: tango.pyaml.attribute_read_only
...
# work with TANGO
SR_Tango: Accelerator = Accelerator.load("../../tests/config/EBSTune.yaml")
---------------------------------------------------------------------------
PyAMLConfigException Traceback (most recent call last)
Cell In[2], line 2
1 # work with TANGO
----> 2 SR_Tango: Accelerator = Accelerator.load("../../tests/config/EBSTune.yaml")
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/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/stable/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/stable/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.depth_first_build(config_dict, ignore_external)
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/factory.py:194, in PyAMLFactory.depth_first_build(self, d, ignore_external)
191 # Do not recurse dict defined in ConfigModel
192 # pydantic use TypedDict not usable with isinstance
193 if str(fieldType) != "<class 'dict'>":
--> 194 obj = self.depth_first_build(value, ignore_external)
195 # Replace the inner dict by the object itself
196 d[key] = obj
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/factory.py:177, in PyAMLFactory.depth_first_build(self, d, ignore_external)
175 for _index, e in enumerate(d):
176 if isinstance(e, dict) or isinstance(e, list):
--> 177 obj = self.depth_first_build(e, ignore_external)
178 l.append(obj)
179 else:
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/factory.py:184, in PyAMLFactory.depth_first_build(self, d, ignore_external)
181 return l
183 elif isinstance(d, dict):
--> 184 _, config_cls, *_ = self.get_infos(d, ignore_external)
186 for key, value in d.items():
187 if not key == "__fieldlocations__":
File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/factory.py:84, in PyAMLFactory.get_infos(self, d, ignore_external)
81 except ModuleNotFoundError as ex:
82 if not ignore_external:
83 # Discard module not found stack trace
---> 84 raise PyAMLConfigException(
85 "Module referenced in type cannot be found:" + f"'{module_str}' {location_str}"
86 ) from None
87 else:
88 return None
PyAMLConfigException: Module referenced in type cannot be found:'tango.pyaml.controlsystem' /home/docs/checkouts/readthedocs.org/user_builds/pyaml/checkouts/stable/tests/config/EBSTune.yaml at line 12, column 5.
Assuming these lines are present in …/…/tests/config/EBSTuneOATango.yaml
type: pyaml.accelerator
name: sr
energy: 6e9
controls:
- type: pyaml-cs-oa.pyaml.controlsystem
name: live
...
powerconverter:
type: pyaml_cs_oa.tangoRW
...
tune_h:
type: pyaml_cs_oa.tangoR
this works with Ophyd-Asynch - tango:
SR_OphydAsynch_Tango: Accelerator = Accelerator.load(”…/…/tests/config/EBSTuneOATango.yaml”)
Assuming these lines are present in …/…/tests/config/EBSTuneOAEpics.yaml
type: pyaml.accelerator
name: sr
energy: 6e9
controls:
- type: pyaml-cs-oa.pyaml.controlsystem
name: live
...
powerconverter:
type: pyaml_cs_oa.epicsRW
...
tune_h:
type: pyaml_cs_oa.epicsR
This work with Ophyd-Asynch - epics :
SR_OphydAsynch_Epics: Accelerator = Accelerator.load(”…/…/examples/BESSY2_example/BESSY2Tune.yaml”)