diff --git a/pyaml/arrays/bpm_array.py b/pyaml/arrays/bpm_array.py index a268b2db..c594c4f0 100644 --- a/pyaml/arrays/bpm_array.py +++ b/pyaml/arrays/bpm_array.py @@ -77,7 +77,7 @@ def __init__(self, arrayName: str, bpms: list[BPM], use_aggregator=True): self.__hpos = RWBPMSinglePosition(arrayName, bpms, 0) self.__vpos = RWBPMSinglePosition(arrayName, bpms, 1) - if use_aggregator: + if use_aggregator and len(bpms) > 0: aggs = self.get_peer().create_bpm_aggregators(bpms) self.__hvpos.set_aggregator(aggs[0]) self.__hpos.set_aggregator(aggs[1]) diff --git a/pyaml/arrays/element_array.py b/pyaml/arrays/element_array.py index 2736843d..34dc8a86 100644 --- a/pyaml/arrays/element_array.py +++ b/pyaml/arrays/element_array.py @@ -30,14 +30,15 @@ def __init__(self, arrayName: str, elements: list[Element], use_aggregator=True) """ super().__init__(i for i in elements) self.__name = arrayName - self.__peer = self[0]._peer if len(self) > 0 else None - self.__use_aggretator = use_aggregator - if self.__peer is None or any([m._peer != self.__peer for m in self]): - raise PyAMLException( - f"{self.__class__.__name__} {self.get_name()}: " - "All elements must be attached to the same instance " - "of either a Simulator or a ControlSystem" - ) + if len(elements) > 0: + self.__peer = self[0]._peer if len(self) > 0 else None + self.__use_aggretator = use_aggregator + if self.__peer is None or any([m._peer != self.__peer for m in self]): + raise PyAMLException( + f"{self.__class__.__name__} {self.get_name()}: " + "All elements must be attached to the same instance " + "of either a Simulator or a ControlSystem" + ) def get_peer(self): """ diff --git a/pyaml/arrays/magnet_array.py b/pyaml/arrays/magnet_array.py index b5c992f0..30c971d8 100644 --- a/pyaml/arrays/magnet_array.py +++ b/pyaml/arrays/magnet_array.py @@ -103,7 +103,7 @@ def __init__(self, arrayName: str, magnets: list[Magnet], use_aggregator=True): self.__rwstrengths = RWMagnetStrength(arrayName, magnets) self.__rwhardwares = RWMagnetHardware(arrayName, magnets) - if use_aggregator: + if use_aggregator and len(magnets) > 0: aggs = self.get_peer().create_magnet_strength_aggregator(magnets) aggh = self.get_peer().create_magnet_harddware_aggregator(magnets) self.__rwstrengths.set_aggregator(aggs) diff --git a/tests/test_arrays.py b/tests/test_arrays.py index e26b32a3..3bbc9c6a 100644 --- a/tests/test_arrays.py +++ b/tests/test_arrays.py @@ -4,9 +4,15 @@ import pytest 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.cfm_magnet_array import CombinedFunctionMagnetArray 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 from pyaml.configuration.factory import Factory @@ -220,4 +226,22 @@ def test_arrays(install_test_package): magSH1AC = acfm["model_name:SH1A-*"] # All SH1A magnets (CFMs only) assert isinstance(magSH1AC, ElementArray) and len(magSH1AC) == 32 + # Empty arrays + emptyMag = Magnet(MagnetArrayConfigModel(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.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.fill_array(sr.design) # Attach the array + v = sr.design.get_cfm_magnets("emptyCFM").strengths.get() # Ensure good attach + assert np.shape(v) == (0,) + Factory.clear()