Skip to content

Photons

Photon

Photon(particle: Dict[int, Particle], track: Track, em_cascade: EM_Cascade, hadron_cascade: Hadron_Cascade)

Cherenkov photon yield calculator.

Calculates photon production for tracks and cascades, including wavelength-dependent yields and angular distributions.

Attributes:

Name Type Description
_medium str

Medium name

_n float

Refractive index

_alpha float

Fine structure constant

_charge float

Elementary charge

_wavelengths ndarray

Wavelength grid in nm

_angle_grid ndarray

Angular grid in degrees

_zgrid ndarray

Depth grid in cm

Examples:

>>> from fennel import Fennel
>>> f = Fennel()
>>> # Photon object used internally by Fennel
Notes
  • Handles tracks (muons), EM cascades (e±, γ), and hadronic cascades
  • Supports both NumPy and JAX backends
  • Integrates all cascade components

Initialize the photon calculator.

Parameters:

Name Type Description Default
particle dict of {int: Particle}

Dictionary of particle objects keyed by PDG ID

required
track Track

Track calculator instance

required
em_cascade EM_Cascade

EM cascade calculator instance

required
hadron_cascade Hadron_Cascade

Hadron cascade calculator instance

required

Raises:

Type Description
ValueError

If distribution type not implemented

Source code in fennel/photons.py
def __init__(
    self,
    particle: Dict[int, Particle],
    track: Track,
    em_cascade: EM_Cascade,
    hadron_cascade: Hadron_Cascade,
) -> None:
    """
    Initialize the photon calculator.

    Parameters
    ----------
    particle : dict of {int: Particle}
        Dictionary of particle objects keyed by PDG ID
    track : Track
        Track calculator instance
    em_cascade : EM_Cascade
        EM cascade calculator instance
    hadron_cascade : Hadron_Cascade
        Hadron cascade calculator instance

    Raises
    ------
    ValueError
        If distribution type not implemented
    """
    if not config["general"]["enable logging"]:
        _log.disabled = True
    _log.debug("Constructing a photon object")
    self._medium = config["scenario"]["medium"]
    self._n = config["mediums"][self._medium]["refractive index"]
    self._alpha = config["advanced"]["fine structure"]
    self._charge = config["advanced"]["particle charge"]
    self._wavelengths = config["advanced"]["wavelengths"]
    self._angle_grid = config["advanced"]["angles"]
    self._zgrid = config["advanced"]["z grid"]
    self.__particles = particle
    self.__track = track
    self.__em_cascade = em_cascade
    self.__hadron_cascade = hadron_cascade
    self._rstate = config["runtime"]["random state"]
    self._deltaL = config["advanced"]["track length"]
    self._track_interactions = config["simulation"]["track interactions"]
    # Building the functions
    _log.info("Building the necessary functions")
    self._track_builder()
    self._em_cascade_builder()
    self._hadron_cascade_builder()
    _log.debug("Finished a photon object.")