Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 15 additions & 20 deletions pyaml/arrays/array.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,17 @@
Array configuration
"""

from pydantic import BaseModel, ConfigDict

from pyaml.common.exception import PyAMLException

from ..common.element import __pyaml_repr__
from ..common.element_holder import ElementHolder
from ..validation import DynamicValidation, register_schema


class ArrayConfigModel(BaseModel):
@register_schema
class ArrayConfig(DynamicValidation):
"""
Base class for configuration of array of :py:class:`~pyaml.arrays.element.Element`,
:py:class:`~pyaml.arrays.bpm.BPM`, :py:class:`~pyaml.arrays.magnet.Magnet` or
:py:class:`~pyaml.arrays.cfm_magnet.CombinedFunctionMagnet`.
Base class for configuration of arrays (families).

Parameters
----------
Expand All @@ -23,19 +22,17 @@ class ArrayConfigModel(BaseModel):
List of pyaml element names
"""

model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid")

name: str
elements: list[str]

def __init__(self, name: str, elements: list[str]):
self._name = name
self._elements = elements

class ArrayConfig(object):
"""
Base class that implements configuration for access to arrays (families)
"""
@property
def name(self):
return self._name

def __init__(self, cfg: ArrayConfigModel):
self._cfg = cfg
@property
def elements(self):
return self._elements

def fill_array(self, holder: ElementHolder):
"""
Expand All @@ -57,6 +54,4 @@ def fill_array(self, holder: ElementHolder):
raise PyAMLException("Array.fill_array() is not subclassed")

def __repr__(self):
# ArrayConfigModel is a super class
# ConfigModel is expected from sub classes
return repr(self._cfg).replace("ConfigModel", self.__class__.__name__)
return __pyaml_repr__(self)
16 changes: 7 additions & 9 deletions pyaml/arrays/bpm.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
from ..common.element_holder import ElementHolder
from .array import ArrayConfig, ArrayConfigModel
from ..validation import DynamicValidation, register_schema
from .array import ArrayConfig

# Define the main class name for this module
PYAMLCLASS = "BPM"


class ConfigModel(ArrayConfigModel):
"""Configuration model for :py:class:`.BPMArray`."""


class BPM(ArrayConfig):
@register_schema
class BPM(ArrayConfig, DynamicValidation):
"""
:py:class:`.BPMArray` configuration.

Expand Down Expand Up @@ -40,8 +38,8 @@ class BPM(ArrayConfig):

"""

def __init__(self, cfg: ArrayConfigModel):
super().__init__(cfg)
def __init__(self, name: str, elements: list[str]):
super().__init__(name, elements)

def fill_array(self, holder: ElementHolder):
"""
Expand All @@ -66,4 +64,4 @@ def fill_array(self, holder: ElementHolder):
holder : ElementHolder
The element holder to populate the :py:class:`.BPMArray` with.
"""
holder.fill_bpm_array(self._cfg.name, self._cfg.elements)
holder.fill_bpm_array(self._name, self._elements)
18 changes: 7 additions & 11 deletions pyaml/arrays/cfm_magnet.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
from ..common.element_holder import ElementHolder
from .array import ArrayConfig, ArrayConfigModel
from ..validation import DynamicValidation, register_schema
from .array import ArrayConfig

# Define the main class name for this module
PYAMLCLASS = "CombinedFunctionMagnet"


class ConfigModel(ArrayConfigModel):
"""Configuration model for Combined Function Magnet array."""

...


class CombinedFunctionMagnet(ArrayConfig):
@register_schema
class CombinedFunctionMagnet(ArrayConfig, DynamicValidation):
"""
Combined function magnet array confirguration

Expand All @@ -28,8 +24,8 @@ class CombinedFunctionMagnet(ArrayConfig):
)
"""

def __init__(self, cfg: ArrayConfigModel):
super().__init__(cfg)
def __init__(self, name: str, elements: list[str]):
super().__init__(name, elements)

def fill_array(self, holder: ElementHolder):
"""
Expand All @@ -40,4 +36,4 @@ def fill_array(self, holder: ElementHolder):
holder : ElementHolder
The element holder to populate with combined function magnet array
"""
holder.fill_cfm_magnet_array(self._cfg.name, self._cfg.elements)
holder.fill_cfm_magnet_array(self._name, self._elements)
16 changes: 7 additions & 9 deletions pyaml/arrays/element.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
from ..common.element_holder import ElementHolder
from .array import ArrayConfig, ArrayConfigModel
from ..validation import DynamicValidation, register_schema
from .array import ArrayConfig

# Define the main class name for this module
PYAMLCLASS = "Element"


class ConfigModel(ArrayConfigModel):
"""Configuration model for :py:class:`.ElementArray`."""


class Element(ArrayConfig):
@register_schema
class Element(ArrayConfig, DynamicValidation):
"""
:py:class:`.ElementArray` configuration.

Expand All @@ -29,8 +27,8 @@ class Element(ArrayConfig):

"""

def __init__(self, cfg: ArrayConfigModel):
super().__init__(cfg)
def __init__(self, name: str, elements: list[str]):
super().__init__(name, elements)

def fill_array(self, holder: ElementHolder):
"""
Expand All @@ -54,4 +52,4 @@ def fill_array(self, holder: ElementHolder):
holder : ElementHolder
The element holder to populate with element array
"""
holder.fill_element_array(self._cfg.name, self._cfg.elements)
holder.fill_element_array(self._name, self._elements)
18 changes: 7 additions & 11 deletions pyaml/arrays/magnet.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
from ..common.element_holder import ElementHolder
from .array import ArrayConfig, ArrayConfigModel
from ..validation import DynamicValidation, register_schema
from .array import ArrayConfig

# Define the main class name for this module
PYAMLCLASS = "Magnet"


class ConfigModel(ArrayConfigModel):
"""Configuration model for Magnet array."""

...


class Magnet(ArrayConfig):
@register_schema
class Magnet(ArrayConfig, DynamicValidation):
"""
Magnet array confirguration

Expand All @@ -27,8 +23,8 @@ class Magnet(ArrayConfig):
)
"""

def __init__(self, cfg: ArrayConfigModel):
super().__init__(cfg)
def __init__(self, name: str, elements: list[str]):
super().__init__(name, elements)

def fill_array(self, holder: ElementHolder):
"""
Expand All @@ -39,4 +35,4 @@ def fill_array(self, holder: ElementHolder):
holder : ElementHolder
The element holder to populate with magnet array
"""
holder.fill_magnet_array(self._cfg.name, self._cfg.elements)
holder.fill_magnet_array(self._name, self._elements)
18 changes: 7 additions & 11 deletions pyaml/arrays/serialized_magnet.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
from ..common.element_holder import ElementHolder
from .array import ArrayConfig, ArrayConfigModel
from ..validation import DynamicValidation, register_schema
from .array import ArrayConfig

# Define the main class name for this module
PYAMLCLASS = "SerializedMagnets"


class ConfigModel(ArrayConfigModel):
"""Configuration model for Serialized Magnets array."""

...


class SerializedMagnets(ArrayConfig):
@register_schema
class SerializedMagnets(ArrayConfig, DynamicValidation):
"""
Serialized magnets array configuration

Expand All @@ -28,8 +24,8 @@ class SerializedMagnets(ArrayConfig):
)
"""

def __init__(self, cfg: ArrayConfigModel):
super().__init__(cfg)
def __init__(self, name: str, elements: list[str]):
super().__init__(name, elements)

def fill_array(self, holder: ElementHolder):
"""
Expand All @@ -40,4 +36,4 @@ def fill_array(self, holder: ElementHolder):
holder : ElementHolder
The element holder to populate with serialized magnet array
"""
holder.fill_serialized_magnet_array(self._cfg.name, self._cfg.elements)
holder.fill_serialized_magnet_array(self._name, self._elements)
2 changes: 1 addition & 1 deletion pyaml/validation/validation_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ def __init_subclass__(cls, **kwargs):

super().__init_subclass__(**kwargs)

if getattr(cls, "validation_model", None) is not None:
if "validation_model" in cls.__dict__:
raise TypeError(f"{cls.__name__} may not define validation_model manually.")

cls.validation_model = cls._build_validation_model()
Expand Down
9 changes: 3 additions & 6 deletions tests/arrays/test_arrays.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,9 @@

from pyaml.accelerator import Accelerator
from pyaml.arrays.bpm import BPM
from pyaml.arrays.bpm import ConfigModel as BPMArrayConfigModel
from pyaml.arrays.bpm_array import BPMArray
from pyaml.arrays.cfm_magnet import CombinedFunctionMagnet
from pyaml.arrays.cfm_magnet import ConfigModel as CombinedFunctionMagnetConfigModel
from pyaml.arrays.element_array import ElementArray
from pyaml.arrays.magnet import ConfigModel as MagnetArrayConfigModel
from pyaml.arrays.magnet import Magnet
from pyaml.arrays.magnet_array import MagnetArray

Expand Down Expand Up @@ -228,17 +225,17 @@ def test_arrays(install_test_package):
assert isinstance(magSH1AC, ElementArray) and len(magSH1AC) == 32

# Empty arrays
emptyMag = Magnet(MagnetArrayConfigModel(name="EmptyMag", elements=[]))
emptyMag = Magnet(name="EmptyMag", elements=[])
emptyMag.fill_array(sr.design) # Attach the array
v = sr.design.get_magnets("EmptyMag").strengths.get() # Ensure good attach
assert np.shape(v) == (0,)

emptyBPM = BPM(BPMArrayConfigModel(name="emptyBPM", elements=[]))
emptyBPM = BPM(name="emptyBPM", elements=[])
emptyBPM.fill_array(sr.design) # Attach the array
v = sr.design.get_bpms("emptyBPM").positions.get() # Ensure good attach
assert np.shape(v) == (0,)

emptyCFM = CombinedFunctionMagnet(CombinedFunctionMagnetConfigModel(name="emptyCFM", elements=[]))
emptyCFM = CombinedFunctionMagnet(name="emptyCFM", elements=[])
emptyCFM.fill_array(sr.design) # Attach the array
v = sr.design.get_cfm_magnets("emptyCFM").strengths.get() # Ensure good attach
assert np.shape(v) == (0,)
Expand Down
Loading