Skip to content

Commit ec21f26

Browse files
committed
Quadrupole requires either MagneticMultipoleP or ElectricMultipoleP or both
1 parent 05d626a commit ec21f26

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/pals/kinds/Quadrupole.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from typing import Literal, Optional
22

3+
from pydantic import model_validator
4+
35
from .mixin import ThickElement
46
from ..parameters import MagneticMultipoleParameters, ElectricMultipoleParameters
57

@@ -11,5 +13,14 @@ class Quadrupole(ThickElement):
1113
kind: Literal["Quadrupole"] = "Quadrupole"
1214

1315
# Octupole-specific parameters
16+
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
1417
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
15-
MagneticMultipoleP: MagneticMultipoleParameters
18+
19+
@model_validator(mode="after")
20+
def validate_at_least_one_multipole(self) -> "Quadrupole":
21+
"""Ensure at least one multipole parameter is specified."""
22+
if self.MagneticMultipoleP is None and self.ElectricMultipoleP is None:
23+
raise ValueError(
24+
"At least one of 'MagneticMultipoleP' or 'ElectricMultipoleP' must be specified"
25+
)
26+
return self

tests/test_elements.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ def test_Quadrupole():
5555
# Create one drift element with custom name and length
5656
element_name = "quadrupole_element"
5757
element_length = 1.0
58+
# Magnetic multipole parameters
5859
element_magnetic_multipole_Bn1 = 1.1
5960
element_magnetic_multipole_Bn2 = 1.2
6061
element_magnetic_multipole_Bs1 = 2.1
@@ -69,10 +70,26 @@ def test_Quadrupole():
6970
Bs2=element_magnetic_multipole_Bs2,
7071
tilt2=element_magnetic_multipole_tilt2,
7172
)
73+
# Electric multipole parameters
74+
element_electric_multipole_En1 = 1.1
75+
element_electric_multipole_En2 = 1.2
76+
element_electric_multipole_Es1 = 2.1
77+
element_electric_multipole_Es2 = 2.2
78+
element_electric_multipole_tilt1 = 3.1
79+
element_electric_multipole_tilt2 = 3.2
80+
element_electric_multipole = pals.ElectricMultipoleParameters(
81+
En1=element_electric_multipole_En1,
82+
Es1=element_electric_multipole_Es1,
83+
tilt1=element_electric_multipole_tilt1,
84+
En2=element_electric_multipole_En2,
85+
Es2=element_electric_multipole_Es2,
86+
tilt2=element_electric_multipole_tilt2,
87+
)
7288
element = pals.Quadrupole(
7389
name=element_name,
7490
length=element_length,
7591
MagneticMultipoleP=element_magnetic_multipole,
92+
ElectricMultipoleP=element_electric_multipole,
7693
)
7794
assert element.name == element_name
7895
assert element.length == element_length
@@ -82,6 +99,12 @@ def test_Quadrupole():
8299
assert element.MagneticMultipoleP.Bn2 == element_magnetic_multipole_Bn2
83100
assert element.MagneticMultipoleP.Bs2 == element_magnetic_multipole_Bs2
84101
assert element.MagneticMultipoleP.tilt2 == element_magnetic_multipole_tilt2
102+
assert element.ElectricMultipoleP.En1 == element_electric_multipole_En1
103+
assert element.ElectricMultipoleP.Es1 == element_electric_multipole_Es1
104+
assert element.ElectricMultipoleP.tilt1 == element_electric_multipole_tilt1
105+
assert element.ElectricMultipoleP.En2 == element_electric_multipole_En2
106+
assert element.ElectricMultipoleP.Es2 == element_electric_multipole_Es2
107+
assert element.ElectricMultipoleP.tilt2 == element_electric_multipole_tilt2
85108
# Serialize the BeamLine object to YAML
86109
yaml_data = yaml.dump(element.model_dump(), default_flow_style=False)
87110
print(f"\n{yaml_data}")

0 commit comments

Comments
 (0)