Source code for lightwin.physics.phases

"""Define functions to switch between the various phases.

Mainly used by :class:`.CavitySettings`.

"""

import math
from typing import overload

import numpy as np


[docs] def diff_angle(phi_1: float, phi_2: float) -> float: """Compute smallest difference between two angles.""" delta_phi = math.atan2(math.sin(phi_2 - phi_1), math.cos(phi_2 - phi_1)) return delta_phi
# ============================================================================= # Conversion between different phases # =============================================================================
[docs] def phi_0_abs_to_rel(phi_0_abs: float, phi_rf: float) -> float: """Compute relative entry phase from absolute.""" phi_0_rel = (phi_0_abs + phi_rf) % (2.0 * math.pi) return phi_0_rel
[docs] def phi_0_rel_to_abs(phi_0_rel: float, phi_rf: float) -> float: """Compute relative entry phase from absolute.""" phi_0_abs = (phi_0_rel - phi_rf) % (2.0 * math.pi) return phi_0_abs
@overload def phi_bunch_to_phi_rf( phi_bunch: np.ndarray, rf_over_bunch_frequencies: float ) -> np.ndarray: ... @overload def phi_bunch_to_phi_rf( phi_bunch: float, rf_over_bunch_frequencies: float, ) -> float: ...
[docs] def phi_bunch_to_phi_rf( phi_bunch: float | np.ndarray, rf_over_bunch_frequencies: float, ) -> float | np.ndarray: """Convert the bunch phase to a rf phase.""" return phi_bunch * rf_over_bunch_frequencies
@overload def phi_rf_to_phi_bunch( phi_rf: np.ndarray, bunch_over_rf_frequencies: float ) -> np.ndarray: ... @overload def phi_rf_to_phi_bunch( phi_rf: float, bunch_over_rf_frequencies: float, ) -> float: ...
[docs] def phi_rf_to_phi_bunch( phi_rf: float | np.ndarray, bunch_over_rf_frequencies: float, ) -> float | np.ndarray: """Convert the bunch phase to rf phase.""" return phi_rf * bunch_over_rf_frequencies