Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/pals/kinds/ACKicker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from typing import Literal

from .ThickElement import ThickElement
from ._warnings import under_construction


@under_construction("ACKicker")
class ACKicker(ThickElement):
"""Time varying kicker element"""

# Discriminator field
kind: Literal["ACKicker"] = "ACKicker"

# Note: ACKickerP parameter group not yet implemented
23 changes: 22 additions & 1 deletion src/pals/kinds/BaseElement.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
from pydantic import BaseModel, ConfigDict
from typing import Literal
from typing import Literal, Optional

from ..parameters import (
ApertureParameters,
BodyShiftParameters,
FloorParameters,
MetaParameters,
ReferenceParameters,
ReferenceChangeParameters,
TrackingParameters,
)


class BaseElement(BaseModel):
Expand All @@ -15,8 +25,19 @@ class BaseElement(BaseModel):
# element name
name: str

# Common parameter groups (optional for all elements)
ApertureP: Optional[ApertureParameters] = None
BodyShiftP: Optional[BodyShiftParameters] = None
FloorP: Optional[FloorParameters] = None
MetaP: Optional[MetaParameters] = None
ReferenceP: Optional[ReferenceParameters] = None
ReferenceChangeP: Optional[ReferenceChangeParameters] = None
TrackingP: Optional[TrackingParameters] = None

def model_dump(self, *args, **kwargs):
"""This makes sure the element name property is moved out and up to a one-key dictionary"""
# Exclude None values from serialization
kwargs.setdefault("exclude_none", True)
elem_dict = super().model_dump(*args, **kwargs)
name = elem_dict.pop("name", None)
if name is None:
Expand Down
16 changes: 16 additions & 0 deletions src/pals/kinds/BeamBeam.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from typing import Literal, Optional

from .BaseElement import BaseElement
from ..parameters import BeamBeamParameters
from ._warnings import under_construction


@under_construction("BeamBeam")
class BeamBeam(BaseElement):
"""Element for simulating colliding beams"""

# Discriminator field
kind: Literal["BeamBeam"] = "BeamBeam"

# Beam-beam-specific parameters
BeamBeamP: Optional[BeamBeamParameters] = None
63 changes: 62 additions & 1 deletion src/pals/kinds/BeamLine.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,38 @@

from .BaseElement import BaseElement
from .ThickElement import ThickElement

from .ACKicker import ACKicker
from .BeamBeam import BeamBeam
from .BeginningEle import BeginningEle
from .Converter import Converter
from .CrabCavity import CrabCavity
from .Drift import Drift
from .EGun import EGun
from .Feedback import Feedback
from .Fiducial import Fiducial
from .FloorShift import FloorShift
from .Foil import Foil
from .Fork import Fork
from .Girder import Girder
from .Instrument import Instrument
from .Kicker import Kicker
from .Marker import Marker
from .Mask import Mask
from .Match import Match
from .Multipole import Multipole
from .NullEle import NullEle
from .Octupole import Octupole
from .Patch import Patch
from .Quadrupole import Quadrupole
from .RBend import RBend
from .RFCavity import RFCavity
from .SBend import SBend
from .Sextupole import Sextupole
from .Solenoid import Solenoid
from .Taylor import Taylor
from .UnionEle import UnionEle
from .Wiggler import Wiggler


class BeamLine(BaseElement):
Expand All @@ -19,11 +49,42 @@ class BeamLine(BaseElement):
line: List[
Annotated[
Union[
# Base classes (for testing compatibility)
BaseElement,
ThickElement,
Comment on lines +52 to 54
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will remove this in a follow-up PR: we do not want to expose mixin classes as real element in a concrete BeamLine. I already update the tests accordingly.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With #40

# User-Facing element kinds
"BeamLine",
ACKicker,
BeamBeam,
BeginningEle,
Converter,
CrabCavity,
Drift,
EGun,
Feedback,
Fiducial,
FloorShift,
Foil,
Fork,
Girder,
Instrument,
Kicker,
Marker,
Mask,
Match,
Multipole,
NullEle,
Octupole,
Patch,
Quadrupole,
"BeamLine",
RBend,
RFCavity,
SBend,
Sextupole,
Solenoid,
Taylor,
UnionEle,
Wiggler,
],
Field(discriminator="kind"),
]
Expand Down
12 changes: 12 additions & 0 deletions src/pals/kinds/BeginningEle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Literal

from .BaseElement import BaseElement
from ._warnings import under_construction


@under_construction("BeginningEle")
class BeginningEle(BaseElement):
"""Initial element at start of a branch"""

# Discriminator field
kind: Literal["BeginningEle"] = "BeginningEle"
17 changes: 17 additions & 0 deletions src/pals/kinds/Converter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import Literal, Optional

from .BaseElement import BaseElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
from ._warnings import under_construction


@under_construction("Converter")
class Converter(BaseElement):
"""Target to produce new species. EG: Positron converter"""

# Discriminator field
kind: Literal["Converter"] = "Converter"

# Converter-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
17 changes: 17 additions & 0 deletions src/pals/kinds/CrabCavity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import Literal, Optional

from .ThickElement import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
from ._warnings import under_construction


@under_construction("CrabCavity")
class CrabCavity(ThickElement):
"""RF crab cavity"""

# Discriminator field
kind: Literal["CrabCavity"] = "CrabCavity"

# CrabCavity-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
2 changes: 1 addition & 1 deletion src/pals/kinds/Drift.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


class Drift(ThickElement):
"""A field free region"""
"""Field free region"""

# Discriminator field
kind: Literal["Drift"] = "Drift"
17 changes: 17 additions & 0 deletions src/pals/kinds/EGun.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import Literal, Optional

from .ThickElement import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
from ._warnings import under_construction


@under_construction("EGun")
class EGun(ThickElement):
"""Electron gun"""

# Discriminator field
kind: Literal["EGun"] = "EGun"

# EGun-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
12 changes: 12 additions & 0 deletions src/pals/kinds/Feedback.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Literal

from .BaseElement import BaseElement
from ._warnings import under_construction


@under_construction("Feedback")
class Feedback(BaseElement):
"""Element used to simulate a feedback circuit"""

# Discriminator field
kind: Literal["Feedback"] = "Feedback"
12 changes: 12 additions & 0 deletions src/pals/kinds/Fiducial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Literal

from .BaseElement import BaseElement
from ._warnings import under_construction


@under_construction("Fiducial")
class Fiducial(BaseElement):
"""Global coordinate system fiducial point"""

# Discriminator field
kind: Literal["Fiducial"] = "Fiducial"
14 changes: 14 additions & 0 deletions src/pals/kinds/FloorShift.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from typing import Literal, Optional

from .BaseElement import BaseElement
from ..parameters import FloorShiftParameters


class FloorShift(BaseElement):
"""Global coordinates shift element"""

# Discriminator field
kind: Literal["FloorShift"] = "FloorShift"

# Floor shift-specific parameters
FloorShiftP: Optional[FloorShiftParameters] = None
12 changes: 12 additions & 0 deletions src/pals/kinds/Foil.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Literal

from .BaseElement import BaseElement
from ._warnings import under_construction


@under_construction("Foil")
class Foil(BaseElement):
"""Material that can strip electrons from a particle. Will also cause energy loss and diffusion"""

# Discriminator field
kind: Literal["Foil"] = "Foil"
16 changes: 16 additions & 0 deletions src/pals/kinds/Fork.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from typing import Literal, Optional

from .BaseElement import BaseElement
from ..parameters import ForkParameters
from ._warnings import under_construction


@under_construction("Fork")
class Fork(BaseElement):
"""Element used to connect lattice branches together"""

# Discriminator field
kind: Literal["Fork"] = "Fork"

# Fork-specific parameters
ForkP: Optional[ForkParameters] = None
12 changes: 12 additions & 0 deletions src/pals/kinds/Girder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Literal

from .BaseElement import BaseElement
from ._warnings import under_construction


@under_construction("Girder")
class Girder(BaseElement):
"""Element to support in space a group of other elements"""

# Discriminator field
kind: Literal["Girder"] = "Girder"
17 changes: 17 additions & 0 deletions src/pals/kinds/Instrument.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import Literal, Optional

from .ThickElement import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
from ._warnings import under_construction


@under_construction("Instrument")
class Instrument(ThickElement):
"""Measurement element"""

# Discriminator field
kind: Literal["Instrument"] = "Instrument"

# Instrument-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
17 changes: 17 additions & 0 deletions src/pals/kinds/Kicker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import Literal, Optional

from .ThickElement import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
from ._warnings import under_construction


@under_construction("Kicker")
class Kicker(ThickElement):
"""Particle kicker element"""

# Discriminator field
kind: Literal["Kicker"] = "Kicker"

# Kicker-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
12 changes: 12 additions & 0 deletions src/pals/kinds/Marker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Literal

from .BaseElement import BaseElement
from ._warnings import under_construction


@under_construction("Marker")
class Marker(BaseElement):
"""Zero length element to mark a particular position"""

# Discriminator field
kind: Literal["Marker"] = "Marker"
17 changes: 17 additions & 0 deletions src/pals/kinds/Mask.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import Literal, Optional

from .ThickElement import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
from ._warnings import under_construction


@under_construction("Mask")
class Mask(ThickElement):
"""Collimation element"""

# Discriminator field
kind: Literal["Mask"] = "Mask"

# Mask-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
12 changes: 12 additions & 0 deletions src/pals/kinds/Match.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Literal

from .BaseElement import BaseElement
from ._warnings import under_construction


@under_construction("Match")
class Match(BaseElement):
"""Orbit, Twiss, and dispersion matching element"""

# Discriminator field
kind: Literal["Match"] = "Match"
Loading