From 5f825412e7b1344568484033cce335d2dbd94d7b Mon Sep 17 00:00:00 2001 From: PONS Date: Wed, 26 Nov 2025 09:00:43 +0100 Subject: [PATCH 1/3] Fix for empty array --- pyaml/arrays/bpm_array.py | 2 +- pyaml/arrays/element_array.py | 17 +++++++++-------- pyaml/arrays/magnet_array.py | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) 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) From 3ad1bcbfb256eb4bdf7c44954ee3bbcabbe37d4a Mon Sep 17 00:00:00 2001 From: PONS Date: Wed, 26 Nov 2025 12:11:45 +0100 Subject: [PATCH 2/3] Added tests for empty array --- tests/test_arrays.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/test_arrays.py b/tests/test_arrays.py index e26b32a3..855f1a7c 100644 --- a/tests/test_arrays.py +++ b/tests/test_arrays.py @@ -9,7 +9,9 @@ from pyaml.arrays.element_array import ElementArray from pyaml.arrays.magnet_array import MagnetArray from pyaml.configuration.factory import Factory - +from pyaml.arrays.magnet import Magnet,ConfigModel as MagnetArrayConfigModel +from pyaml.arrays.bpm import BPM,ConfigModel as BPMArrayConfigModel +from pyaml.arrays.cfm_magnet import CombinedFunctionMagnet,ConfigModel as CombinedFunctionMagnetConfigModel @pytest.mark.parametrize( "install_test_package", @@ -220,4 +222,20 @@ 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() From 8a3b176a3c827d3da3ad1c243a6152cf0aaddbc2 Mon Sep 17 00:00:00 2001 From: PONS Date: Wed, 26 Nov 2025 12:13:10 +0100 Subject: [PATCH 3/3] Fix formating --- tests/test_arrays.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/tests/test_arrays.py b/tests/test_arrays.py index 855f1a7c..3bbc9c6a 100644 --- a/tests/test_arrays.py +++ b/tests/test_arrays.py @@ -4,14 +4,18 @@ 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 -from pyaml.arrays.magnet import Magnet,ConfigModel as MagnetArrayConfigModel -from pyaml.arrays.bpm import BPM,ConfigModel as BPMArrayConfigModel -from pyaml.arrays.cfm_magnet import CombinedFunctionMagnet,ConfigModel as CombinedFunctionMagnetConfigModel + @pytest.mark.parametrize( "install_test_package", @@ -223,19 +227,21 @@ def test_arrays(install_test_package): 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 + 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 + 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 + 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()