Source code for lightwin.physics.phases

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

Mainly used by |CS|.

"""

import math
from typing import overload

import numpy as np
from numpy.typing import NDArray


[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: NDArray[np.float64], rf_over_bunch_frequencies: float ) -> NDArray[np.float64]: ... @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 | NDArray[np.float64], rf_over_bunch_frequencies: float, ) -> float | NDArray[np.float64]: """Convert the bunch phase to a rf phase.""" return phi_bunch * rf_over_bunch_frequencies
@overload def phi_rf_to_phi_bunch( phi_rf: NDArray[np.float64], bunch_over_rf_frequencies: float ) -> NDArray[np.float64]: ... @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 | NDArray[np.float64], bunch_over_rf_frequencies: float, ) -> float | NDArray[np.float64]: """Convert the bunch phase to rf phase.""" return phi_rf * bunch_over_rf_frequencies