Skip to content

Commit a9c3c05

Browse files
committed
[Vibe] Update Elements
Based on the prompt > We defined a meta-data schema for particle accelerator lattice lements in pals. > You will find in pals/source the description of elements and their meta-data, the pals/examples has an example. > Ignore the inheritance feature for now. > I want you to find and read the element definitions. > I want you to find and read the implementation of existing PALS Python elements in pals-python/. Follow their structure and style. > Then, do this workflow: > 1. read and understand one element at a time > 2. go to pals-python/schema and add a new element, one at a time, following the existing implementation > 3. go to pals-python/tests/test_schema.py and define a compact test per new element > Repeat this until all elements defined in PALS are implemented in pals-python. And ~10 follow-up prompts.
1 parent 46ca8be commit a9c3c05

Some content is hidden

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

52 files changed

+1581
-11
lines changed

src/pals/kinds/ACKicker.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 .ThickElement import ThickElement
4+
5+
6+
class ACKicker(ThickElement):
7+
"""ACKicker element"""
8+
9+
# Discriminator field
10+
kind: Literal["ACKicker"] = "ACKicker"
11+
12+
# 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: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from typing import Literal, Optional
2+
3+
from .BaseElement import BaseElement
4+
from ..parameters import BeamBeamParameters
5+
6+
7+
class BeamBeam(BaseElement):
8+
"""Element for simulating colliding beams"""
9+
10+
# Discriminator field
11+
kind: Literal["BeamBeam"] = "BeamBeam"
12+
13+
# Beam-beam-specific parameters
14+
BeamBeamP: Optional[BeamBeamParameters] = None

src/pals/kinds/BeamLine.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,37 @@
66
from .Drift import Drift
77
from .Quadrupole import Quadrupole
88

9+
# Import schema elements
10+
from .Marker import Marker
11+
from .Sextupole import Sextupole
12+
from .Octupole import Octupole
13+
from .Multipole import Multipole
14+
from .RBend import RBend
15+
from .SBend import SBend
16+
from .Solenoid import Solenoid
17+
from .RFCavity import RFCavity
18+
from .Patch import Patch
19+
from .FloorShift import FloorShift
20+
from .Fork import Fork
21+
from .BeamBeam import BeamBeam
22+
from .BeginningEle import BeginningEle
23+
from .Fiducial import Fiducial
24+
from .NullEle import NullEle
25+
from .Kicker import Kicker
26+
from .ACKicker import ACKicker
27+
from .CrabCavity import CrabCavity
28+
from .EGun import EGun
29+
from .Feedback import Feedback
30+
from .Girder import Girder
31+
from .Instrument import Instrument
32+
from .Mask import Mask
33+
from .Match import Match
34+
from .Taylor import Taylor
35+
from .Wiggler import Wiggler
36+
from .Converter import Converter
37+
from .Foil import Foil
38+
from .UnionEle import UnionEle
39+
940

1041
class BeamLine(BaseElement):
1142
"""A line of elements and/or other lines"""
@@ -19,11 +50,42 @@ class BeamLine(BaseElement):
1950
line: List[
2051
Annotated[
2152
Union[
53+
# Original elements
2254
BaseElement,
2355
ThickElement,
2456
Drift,
2557
Quadrupole,
2658
"BeamLine",
59+
# New schema elements
60+
Marker,
61+
Sextupole,
62+
Octupole,
63+
Multipole,
64+
RBend,
65+
SBend,
66+
Solenoid,
67+
RFCavity,
68+
Patch,
69+
FloorShift,
70+
Fork,
71+
BeamBeam,
72+
BeginningEle,
73+
Fiducial,
74+
NullEle,
75+
Kicker,
76+
ACKicker,
77+
CrabCavity,
78+
EGun,
79+
Feedback,
80+
Girder,
81+
Instrument,
82+
Mask,
83+
Match,
84+
Taylor,
85+
Wiggler,
86+
Converter,
87+
Foil,
88+
UnionEle,
2789
],
2890
Field(discriminator="kind"),
2991
]

src/pals/kinds/BeginningEle.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from typing import Literal
2+
3+
from .BaseElement import BaseElement
4+
5+
6+
class BeginningEle(BaseElement):
7+
"""Beginning Ele element"""
8+
9+
# Discriminator field
10+
kind: Literal["BeginningEle"] = "BeginningEle"

src/pals/kinds/Converter.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 ElectricMultipoleParameters
5+
from ..parameters import MagneticMultipoleParameters
6+
7+
8+
class Converter(BaseElement):
9+
"""Converter element"""
10+
11+
# Discriminator field
12+
kind: Literal["Converter"] = "Converter"
13+
14+
# Converter-specific parameters (in addition to inherited ones)
15+
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
16+
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None

src/pals/kinds/CrabCavity.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 .ThickElement import ThickElement
4+
from ..parameters import ElectricMultipoleParameters
5+
from ..parameters import MagneticMultipoleParameters
6+
7+
8+
class CrabCavity(ThickElement):
9+
"""CrabCavity element"""
10+
11+
# Discriminator field
12+
kind: Literal["CrabCavity"] = "CrabCavity"
13+
14+
# CrabCavity-specific parameters (in addition to inherited ones)
15+
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
16+
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None

src/pals/kinds/EGun.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 .ThickElement import ThickElement
4+
from ..parameters import ElectricMultipoleParameters
5+
from ..parameters import MagneticMultipoleParameters
6+
7+
8+
class EGun(ThickElement):
9+
"""EGun element"""
10+
11+
# Discriminator field
12+
kind: Literal["EGun"] = "EGun"
13+
14+
# EGun-specific parameters (in addition to inherited ones)
15+
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
16+
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None

src/pals/kinds/Feedback.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from typing import Literal
2+
3+
from .BaseElement import BaseElement
4+
5+
6+
class Feedback(BaseElement):
7+
"""Feedback element"""
8+
9+
# Discriminator field
10+
kind: Literal["Feedback"] = "Feedback"

src/pals/kinds/Fiducial.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from typing import Literal
2+
3+
from .BaseElement import BaseElement
4+
5+
6+
class Fiducial(BaseElement):
7+
"""Fiducial element"""
8+
9+
# Discriminator field
10+
kind: Literal["Fiducial"] = "Fiducial"

0 commit comments

Comments
 (0)