Source code for lightwin.core.commands.factory

"""Define a class to easily create :class:`.Command` objects."""

from pathlib import Path
from typing import Any

from lightwin.core.commands.adjust import Adjust
from lightwin.core.commands.chopper import Chopper
from lightwin.core.commands.command import Command
from lightwin.core.commands.dummy_command import DummyCommand
from lightwin.core.commands.end import End
from lightwin.core.commands.error import (
    ErrorBeamDyn,
    ErrorBeamStat,
    ErrorBendCPLDyn,
    ErrorBendCPLStat,
    ErrorBendNCPLDyn,
    ErrorBendNCPLStat,
    ErrorCavCPLDyn,
    ErrorCavCPLStat,
    ErrorCavNCPLDyn,
    ErrorCavNCPLStat,
    ErrorCavNCPLStatFile,
    ErrorGaussianCutOff,
    ErrorQuadNCPLDyn,
    ErrorQuadNCPLStat,
    ErrorRFQCelNCPLDyn,
    ErrorRFQCelNCPLStat,
    ErrorSetRatio,
    ErrorStatFile,
)
from lightwin.core.commands.field_map_path import FieldMapPath
from lightwin.core.commands.freq import Freq
from lightwin.core.commands.lattice import Lattice, LatticeEnd
from lightwin.core.commands.marker import Marker
from lightwin.core.commands.repeat_ele import RepeatEle
from lightwin.core.commands.set_adv import SetAdv
from lightwin.core.commands.set_sync_phase import SetSyncPhase
from lightwin.core.commands.shift import Shift
from lightwin.core.commands.steerer import Steerer
from lightwin.core.commands.superpose_map import SuperposeMap
from lightwin.tracewin_utils.line import DatLine

#: Commands handled by LightWin.
IMPLEMENTED_COMMANDS = {
    "ADJUST": Adjust,
    "ADJUST_STEERER": DummyCommand,
    "DUMMY_COMMAND": DummyCommand,
    "CHOPPER": Chopper,
    "END": End,
    "ERROR_BEAM_DYN": ErrorBeamDyn,
    "ERROR_BEAM_STAT": ErrorBeamStat,
    "ERROR_BEND_CPL_DYN": ErrorBendCPLDyn,
    "ERROR_BEND_CPL_STAT": ErrorBendCPLStat,
    "ERROR_BEND_NCPL_DYN": ErrorBendNCPLDyn,
    "ERROR_BEND_NCPL_STAT": ErrorBendNCPLStat,
    "ERROR_CAV_CPL_DYN": ErrorCavCPLDyn,
    "ERROR_CAV_CPL_STAT": ErrorCavCPLStat,
    "ERROR_CAV_NCPL_DYN": ErrorCavNCPLDyn,
    "ERROR_CAV_NCPL_STAT": ErrorCavNCPLStat,
    "ERROR_CAV_NCPL_STAT_FILE": ErrorCavNCPLStatFile,
    "ERROR_GAUSSIAN_CUT_OFF": ErrorGaussianCutOff,
    "ERROR_QUAD_NCPL_DYN": ErrorQuadNCPLDyn,
    "ERROR_QUAD_NCPL_STAT": ErrorQuadNCPLStat,
    "ERROR_RFQ_CEL_NCPL_DYN": ErrorRFQCelNCPLDyn,
    "ERROR_RFQ_CEL_NCPL_STAT": ErrorRFQCelNCPLStat,
    "ERROR_STAT_FILE": ErrorStatFile,
    "ERROR_SET_RATIO": ErrorSetRatio,
    "FIELD_MAP_PATH": FieldMapPath,
    "FREQ": Freq,
    "LATTICE": Lattice,
    "LATTICE_END": LatticeEnd,
    "MARKER": Marker,
    "PLOT_DST": DummyCommand,
    "REPEAT_ELE": RepeatEle,
    "SET_ADV": SetAdv,
    "SET_SYNC_PHASE": SetSyncPhase,
    "SHIFT": Shift,
    "STEERER": Steerer,
    "SUPERPOSE_MAP": SuperposeMap,
}


[docs] class CommandFactory: """An object to create :class:`.Command` objects."""
[docs] def __init__( self, default_field_map_folder: Path, **factory_kw: Any ) -> None: """Do nothing for now. .. todo:: Check if it would be relatable to hold some arguments? As for now, I would be better off with a run function instead of a class. """ self.default_field_map_folder = default_field_map_folder return
[docs] def run( self, line: DatLine, dat_idx: int | None = None, **command_kw ) -> Command: """Call proper constructor.""" command_creator = IMPLEMENTED_COMMANDS[line.instruction] command = command_creator( line, dat_idx, default_field_map_folder=self.default_field_map_folder, name=line.personalized_name, **command_kw, ) return command