Source code for pyaml.magnet.identity_cfm_model
import numpy as np
from pydantic import BaseModel, ConfigDict
from .. import PyAMLException
from ..common.element import __pyaml_repr__
from ..control.deviceaccess import DeviceAccess
from .model import MagnetModel
# Define the main class name for this module
PYAMLCLASS = "IdentityCFMagnetModel"
[docs]
class ConfigModel(BaseModel):
"""
Configuration model for identity combined function magnet model
Parameters
----------
multipoles : list[str]
List of supported functions: A0, B0, A1, B1, etc (i.e. [B0, A1, B2])
powerconverters : list[DeviceAccess], optional
Power converter devices to apply current
physics : list[DeviceAccess], optional
Magnet devices to apply strength
units : list[str]
List of strength units (i.e. ['rad', 'm-1', 'm-2'])
"""
model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid")
multipoles: list[str]
powerconverters: list[DeviceAccess | None] | None = None
physics: list[DeviceAccess | None] | None = None
units: list[str]
[docs]
class IdentityCFMagnetModel(MagnetModel):
"""
Class that map values to underlying devices without conversion
"""
def __init__(self, cfg: ConfigModel):
self._cfg = cfg
# Check config
self.__nbFunction: int = len(cfg.multipoles)
if cfg.physics is None and cfg.powerconverters is None:
raise PyAMLException("Invalid IdentityCFMagnetModel configuration,physics or powerconverters device required")
if cfg.physics is not None and cfg.powerconverters is not None:
raise PyAMLException(
"Invalid IdentityCFMagnetModel configuration,physics or powerconverters device required but not both"
)
if cfg.physics:
self.__devices = cfg.physics
else:
self.__devices = cfg.powerconverters
self.__nbDev: int = len(self.__devices)
self.__check_len(cfg.units, "units", self.__nbFunction)
def __check_len(self, obj, name, expected_len):
lgth = len(obj)
if lgth != expected_len:
raise PyAMLException(
f"{name} does not have the expected number of items ({expected_len} items expected but got {lgth})"
)
[docs]
def compute_hardware_values(self, strengths: np.array) -> np.array:
return strengths
[docs]
def compute_strengths(self, currents: np.array) -> np.array:
return currents
[docs]
def get_strength_units(self) -> list[str]:
return self._cfg.units
[docs]
def get_hardware_units(self) -> list[str]:
return self._cfg.units
[docs]
def get_devices(self) -> list[DeviceAccess | None]:
return self.__devices
[docs]
def set_magnet_rigidity(self, brho: np.double):
pass
[docs]
def has_physics(self) -> bool:
return self._cfg.physics is not None
[docs]
def has_hardware(self) -> bool:
return self._cfg.powerconverters is not None
def __repr__(self):
return __pyaml_repr__(self)