Source code for at.lattice.elements.crabcavity_element

"""Crab cavity :py:class:`.Element`"""

from __future__ import annotations

from .conversions import _array
from .abstract_elements import LongtMotion
from .basic_elements import LongElement


[docs] class CrabCavity(LongtMotion, LongElement): """Crab cavity element""" _BUILD_ATTRIBUTES = LongElement._BUILD_ATTRIBUTES + [ "Voltages", "Frequency", "HarmNumber", ] default_pass = {False: "DriftPass", True: "CrabCavityPass"} _conversions = dict( LongElement._conversions, Voltages=lambda v: _array(v, (2,)), Frequency=float, HarmNumber=int, TimeLag=float, PhaseLag=float, SigPhi=float, SigVV=float, ) def __init__( self, family_name: str, length: float, voltages: float, frequency: float, harmonic_number: int, **kwargs, ): """ Args: family_name: Name of the element length: Element length [m] voltages: [Horizontal voltage, Vertical voltage] [V] frequency: RF frequency [Hz] harmonic_number: Keyword Args: TimeLag=0: Cavity time lag [m] SigPhi=0: Phase noise [rad] SigVV=0: Voltage noise [V] Default PassMethod: ``CrabCavityPass`` """ kwargs.setdefault("TimeLag", 0.0) kwargs.setdefault("PassMethod", self.default_pass[True]) super().__init__( family_name, length, Voltages=voltages, Frequency=frequency, HarmNumber=harmonic_number, **kwargs, ) def _part(self, fr, sumfr): pp = super()._part(fr, sumfr) pp.Voltages = fr * self.Voltages return pp def _get_longt_motion(self): return self.PassMethod.endswith("CavityPass") # noinspection PyShadowingNames
[docs] def set_longt_motion(self, enable, new_pass=None, **kwargs): if new_pass == "auto": new_pass = ( self.default_pass[True] if enable else ("IdentityPass" if self.Length == 0 else "DriftPass") ) return super().set_longt_motion(enable, new_pass=new_pass, **kwargs)