Skip to content

Commit bb0afa7

Browse files
ax3lEZoni
andauthored
Comprehensive Element Update (#33)
Update to include all currently defined elements and parameter classes. - [x] rebase out preparatory PRs #34 #36 - [x] vibe-code draft & iterations - [x] careful author review of - [x] elements - [x] parameters - [x] tests --------- Co-authored-by: Edoardo Zoni <[email protected]>
1 parent 5b727e5 commit bb0afa7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1604
-46
lines changed

src/pals/kinds/ACKicker.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from typing import Literal
2+
3+
from .ThickElement import ThickElement
4+
from ._warnings import under_construction
5+
6+
7+
@under_construction("ACKicker")
8+
class ACKicker(ThickElement):
9+
"""Time varying kicker element"""
10+
11+
# Discriminator field
12+
kind: Literal["ACKicker"] = "ACKicker"
13+
14+
# Note: ACKickerP parameter group not yet implemented

src/pals/kinds/BaseElement.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
from pydantic import BaseModel, ConfigDict
2-
from typing import Literal
2+
from typing import Literal, Optional
3+
4+
from ..parameters import (
5+
ApertureParameters,
6+
BodyShiftParameters,
7+
FloorParameters,
8+
MetaParameters,
9+
ReferenceParameters,
10+
ReferenceChangeParameters,
11+
TrackingParameters,
12+
)
313

414

515
class BaseElement(BaseModel):
@@ -15,8 +25,19 @@ class BaseElement(BaseModel):
1525
# element name
1626
name: str
1727

28+
# Common parameter groups (optional for all elements)
29+
ApertureP: Optional[ApertureParameters] = None
30+
BodyShiftP: Optional[BodyShiftParameters] = None
31+
FloorP: Optional[FloorParameters] = None
32+
MetaP: Optional[MetaParameters] = None
33+
ReferenceP: Optional[ReferenceParameters] = None
34+
ReferenceChangeP: Optional[ReferenceChangeParameters] = None
35+
TrackingP: Optional[TrackingParameters] = None
36+
1837
def model_dump(self, *args, **kwargs):
1938
"""This makes sure the element name property is moved out and up to a one-key dictionary"""
39+
# Exclude None values from serialization
40+
kwargs.setdefault("exclude_none", True)
2041
elem_dict = super().model_dump(*args, **kwargs)
2142
name = elem_dict.pop("name", None)
2243
if name is None:

src/pals/kinds/BeamBeam.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from typing import Literal, Optional
2+
3+
from .BaseElement import BaseElement
4+
from ..parameters import BeamBeamParameters
5+
from ._warnings import under_construction
6+
7+
8+
@under_construction("BeamBeam")
9+
class BeamBeam(BaseElement):
10+
"""Element for simulating colliding beams"""
11+
12+
# Discriminator field
13+
kind: Literal["BeamBeam"] = "BeamBeam"
14+
15+
# Beam-beam-specific parameters
16+
BeamBeamP: Optional[BeamBeamParameters] = None

src/pals/kinds/BeamLine.py

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,38 @@
33

44
from .BaseElement import BaseElement
55
from .ThickElement import ThickElement
6+
7+
from .ACKicker import ACKicker
8+
from .BeamBeam import BeamBeam
9+
from .BeginningEle import BeginningEle
10+
from .Converter import Converter
11+
from .CrabCavity import CrabCavity
612
from .Drift import Drift
13+
from .EGun import EGun
14+
from .Feedback import Feedback
15+
from .Fiducial import Fiducial
16+
from .FloorShift import FloorShift
17+
from .Foil import Foil
18+
from .Fork import Fork
19+
from .Girder import Girder
20+
from .Instrument import Instrument
21+
from .Kicker import Kicker
22+
from .Marker import Marker
23+
from .Mask import Mask
24+
from .Match import Match
25+
from .Multipole import Multipole
26+
from .NullEle import NullEle
27+
from .Octupole import Octupole
28+
from .Patch import Patch
729
from .Quadrupole import Quadrupole
30+
from .RBend import RBend
31+
from .RFCavity import RFCavity
32+
from .SBend import SBend
33+
from .Sextupole import Sextupole
34+
from .Solenoid import Solenoid
35+
from .Taylor import Taylor
36+
from .UnionEle import UnionEle
37+
from .Wiggler import Wiggler
838

939

1040
class BeamLine(BaseElement):
@@ -19,11 +49,42 @@ class BeamLine(BaseElement):
1949
line: List[
2050
Annotated[
2151
Union[
52+
# Base classes (for testing compatibility)
2253
BaseElement,
2354
ThickElement,
55+
# User-Facing element kinds
56+
"BeamLine",
57+
ACKicker,
58+
BeamBeam,
59+
BeginningEle,
60+
Converter,
61+
CrabCavity,
2462
Drift,
63+
EGun,
64+
Feedback,
65+
Fiducial,
66+
FloorShift,
67+
Foil,
68+
Fork,
69+
Girder,
70+
Instrument,
71+
Kicker,
72+
Marker,
73+
Mask,
74+
Match,
75+
Multipole,
76+
NullEle,
77+
Octupole,
78+
Patch,
2579
Quadrupole,
26-
"BeamLine",
80+
RBend,
81+
RFCavity,
82+
SBend,
83+
Sextupole,
84+
Solenoid,
85+
Taylor,
86+
UnionEle,
87+
Wiggler,
2788
],
2889
Field(discriminator="kind"),
2990
]

src/pals/kinds/BeginningEle.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from typing import Literal
2+
3+
from .BaseElement import BaseElement
4+
from ._warnings import under_construction
5+
6+
7+
@under_construction("BeginningEle")
8+
class BeginningEle(BaseElement):
9+
"""Initial element at start of a branch"""
10+
11+
# Discriminator field
12+
kind: Literal["BeginningEle"] = "BeginningEle"

src/pals/kinds/Converter.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from typing import Literal, Optional
2+
3+
from .BaseElement import BaseElement
4+
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
5+
from ._warnings import under_construction
6+
7+
8+
@under_construction("Converter")
9+
class Converter(BaseElement):
10+
"""Target to produce new species. EG: Positron converter"""
11+
12+
# Discriminator field
13+
kind: Literal["Converter"] = "Converter"
14+
15+
# Converter-specific parameters
16+
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
17+
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None

src/pals/kinds/CrabCavity.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from typing import Literal, Optional
2+
3+
from .ThickElement import ThickElement
4+
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
5+
from ._warnings import under_construction
6+
7+
8+
@under_construction("CrabCavity")
9+
class CrabCavity(ThickElement):
10+
"""RF crab cavity"""
11+
12+
# Discriminator field
13+
kind: Literal["CrabCavity"] = "CrabCavity"
14+
15+
# CrabCavity-specific parameters
16+
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
17+
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None

src/pals/kinds/Drift.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
class Drift(ThickElement):
7-
"""A field free region"""
7+
"""Field free region"""
88

99
# Discriminator field
1010
kind: Literal["Drift"] = "Drift"

src/pals/kinds/EGun.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from typing import Literal, Optional
2+
3+
from .ThickElement import ThickElement
4+
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
5+
from ._warnings import under_construction
6+
7+
8+
@under_construction("EGun")
9+
class EGun(ThickElement):
10+
"""Electron gun"""
11+
12+
# Discriminator field
13+
kind: Literal["EGun"] = "EGun"
14+
15+
# EGun-specific parameters
16+
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
17+
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None

src/pals/kinds/Feedback.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from typing import Literal
2+
3+
from .BaseElement import BaseElement
4+
from ._warnings import under_construction
5+
6+
7+
@under_construction("Feedback")
8+
class Feedback(BaseElement):
9+
"""Element used to simulate a feedback circuit"""
10+
11+
# Discriminator field
12+
kind: Literal["Feedback"] = "Feedback"

0 commit comments

Comments
 (0)