Source code for lightwin.core.elements.diagnostic

"""Define :class:`Diagnostic`.

As for now, diagnostics are not used by LightWin. However, LightWin can add
diagnostics (as well as ADJUST) to the final ``.dat`` in order to perform a
"pass beauty".

.. note::
    Functionalities still under implementation. In particular, the number of
    attributes were not checked.

.. note::
    This is TraceWin's equivalent of :class:`.Objective`.

"""

from typing import override

from lightwin.core.elements.element import Element
from lightwin.tracewin_utils.line import DatLine


[docs] class Diagnostic(Element): """A dummy object.""" base_name = "D" increment_lattice_idx = False is_implemented = False
[docs] def __init__( self, line: DatLine, dat_idx: int | None = None, **kwargs: str, ) -> None: """Force an element with null-length, with no index.""" super().__init__(line, dat_idx, **kwargs) self.weight = 1.0 if line.weight is not None: self.weight = line.weight self.length_m = 0.0 self.number = int(line.splitted[1])
[docs] class DiagCurrent(Diagnostic): """Measure current."""
[docs] class DiagDCurrent(Diagnostic): """Measure delta current."""
[docs] class DiagPosition(Diagnostic): """Measure position.""" is_implemented = True n_attributes = 4
[docs] class DiagDPosition(Diagnostic): """Measure delta position."""
[docs] class DiagDivergence(Diagnostic): """Measure divergences."""
[docs] class DiagDDivergence(Diagnostic): """Measure delta divergences."""
[docs] class DiagSizeFWHM(Diagnostic): """Measure full width at half maximum."""
[docs] class DiagSize(Diagnostic): """Measure sizes."""
[docs] class DiagSizeP(Diagnostic): """Measure divergences."""
[docs] class DiagDSizeFWHM(Diagnostic): """Measure delta full width at half maximum."""
[docs] class DiagDSize(Diagnostic): """Measure delta size."""
[docs] class DiagDSize2FWHM(Diagnostic): """Measure delta full width at half maximum between two positions."""
[docs] class DiagDSize2(Diagnostic): """Measure delta size between two positions.""" is_implemented = True n_attributes = (3, 4)
[docs] def __init__( self, line: DatLine, dat_idx: int | None = None, **kwargs: str, ) -> None: """Force an element with null-length, with no index.""" super().__init__(line, dat_idx, **kwargs) self.x_rms_beam_delta_size = float(line.splitted[2]) self.y_rms_beam_delta_size = float(line.splitted[3]) if line.n_args == 4: self.accuracy = float(line.splitted[4])
[docs] class DiagDSize3(Diagnostic): """Measure delta phase spread between two positions.""" is_implemented = True n_attributes = (3, 4)
[docs] def __init__( self, line: DatLine, dat_idx: int | None = None, **kwargs: str, ) -> None: """Force an element with null-length, with no index.""" super().__init__(line, dat_idx, **kwargs) self.rms_delta_phase_spread = float(line.splitted[2]) self.accuracy = float(line.splitted[3]) if line.n_args == 4: self.low_pass_filter_frequency = float(line.splitted[4])
[docs] @classmethod @override def _args_to_line( cls, number: int, rms_delta_phase_spread: float = 0.0, accuracy: float = 0.0, low_pass_filter_frequency: float | None = None, ) -> str: """Convert list of arguments to corresponding line of dat file.""" line = f"DIAG_DSIZE3 {number} {rms_delta_phase_spread} {accuracy}" if low_pass_filter_frequency is not None: line += " " + str(low_pass_filter_frequency) return line
[docs] class DiagDSize4(Diagnostic): """Measure something?"""
[docs] class DiagDPSize2(Diagnostic): """Measure delta divergence between two positions."""
[docs] class DiagPhase(Diagnostic): """Measure phase.""" n_attributes = 2
[docs] class DiagEnergy(Diagnostic): """Measure energy.""" n_attributes = 3
[docs] class DiagDEnergy(Diagnostic): """Measure difference between beam energy and perfect linac energy.""" n_attributes = 3
[docs] class DiagDPhase(Diagnostic): """Measure difference between beam phase and perfect linac phase.""" n_attributes = 2
[docs] class DiagLuminosity(Diagnostic): """Measure luminosity.""" n_attributes = 3
[docs] class DiagWaist(Diagnostic): """Measure waist setting.""" n_attributes = 4
[docs] class DiagAchromat(Diagnostic): """Measure achromat setting.""" n_attributes = 5
[docs] class DiagEmit(Diagnostic): """Measure RMS emittance setting.""" n_attributes = 4
[docs] class DiagEmit99(Diagnostic): """Measure 99% emittance setting.""" n_attributes = 4
[docs] class DiagHalo(Diagnostic): """Measure halo setting.""" n_attributes = 4
[docs] class DiagSetMatrix(Diagnostic): """Measure transfer matrix setting.""" n_attributes = 6
[docs] class DiagTwiss(Diagnostic): """Measure beam Twiss parameters settings.""" n_attributes = 7
[docs] class DiagDTwiss(Diagnostic): """Make equal two beam Twiss parameters between two positions or more.""" n_attributes = 7
[docs] class DiagDTwiss2(Diagnostic): """Make equal transverse Twiss parameters at diagnostic position.""" n_attributes = 3
[docs] class DiagSeparation(Diagnostic): """Measure beam separation setting.""" n_attributes = 6
[docs] class DiagSizeMax(Diagnostic): """Limit beam size max.""" n_attributes = 6
[docs] class DiagSizeMin(DiagSizeMax): """Limit beam size min."""
[docs] class DiagPhaseAdv(Diagnostic): """Measure beam phase advance.""" n_attributes = 4
[docs] class DiagBeta(Diagnostic): """Measure beam beta.""" n_attributes = 6
[docs] class DiagDBeta(Diagnostic): """Measure delta beam beta.""" n_attributes = 4