Skip to content

Tracks

Track

Track()

Track light yield calculator for charged particles.

This class calculates Cherenkov light production from charged particle tracks, accounting for additional track length from energy loss mechanisms (ionization, bremsstrahlung, pair production, nuclear interactions) and angular distributions of emitted light.

Attributes:

Name Type Description
_medium str

Name of the propagation medium ('water' or 'ice')

_n float

Refractive index of the medium

_params dict

Parametrization parameters loaded from data file

additional_track_ratio Callable

Function to compute additional track length ratio

cherenkov_angle_distro Callable

Function to compute Cherenkov angle distribution

Methods:

Name Description
additional_track_ratio

Calculate ratio of additional track length to original length

cherenkov_angle_distro

Calculate angular distribution of Cherenkov light emission

Examples:

>>> from fennel.tracks import Track
>>> track = Track()
>>> energies = np.array([10.0, 100.0, 1000.0])
>>> ratio = track.additional_track_ratio(energies, 'total')
>>> angles = np.linspace(0, 180, 100)
>>> distro = track.cherenkov_angle_distro(100.0, angles, 1.333)
Notes
  • Currently optimized for muon tracks
  • Supports both NumPy and JAX backends
  • JAX mode provides GPU acceleration for function mode
  • The Aachen parametrization is based on detailed GEANT4 simulations

Initialize the Track calculator.

Loads parametrization data and sets up calculation methods based on whether JAX is enabled.

Raises:

Type Description
ValueError

If the specified parametrization is not implemented

ImportError

If JAX mode is enabled but JAX is not installed

Source code in fennel/tracks.py
def __init__(self) -> None:
    """
    Initialize the Track calculator.

    Loads parametrization data and sets up calculation methods
    based on whether JAX is enabled.

    Raises
    ------
    ValueError
        If the specified parametrization is not implemented
    ImportError
        If JAX mode is enabled but JAX is not installed
    """
    if not config["general"]["enable logging"]:
        _log.disabled = True
    _log.debug("Constructing a track object")
    self._medium = config["scenario"]["medium"]
    self._n = config["mediums"][self._medium]["refractive index"]
    if config["scenario"]["parametrization"] == "aachen":
        _log.info("Loading the aachen parametrization")
        param_file = pkgutil.get_data(
            __name__, "data/%s.pkl" % config["scenario"]["parametrization"]
        )
        self._params = pickle.loads(param_file)["track"]
    else:
        raise ValueError(
            "Track parametrization "
            + config["scenario"]["parametrization"]
            + " not implemented!"
        )
    if config["general"]["jax"]:
        _log.debug("Using JAX")
        self.additional_track_ratio = self._additional_track_ratio_fetcher_jax
        self.cherenkov_angle_distro = self._symmetric_angle_distro_fetcher_jax
    else:
        _log.debug("Using basic numpy")
        self.additional_track_ratio = self._additional_track_ratio_fetcher
        self.cherenkov_angle_distro = self._symmetric_angle_distro_fetcher