Source code for snewpy.neutrino

# -*- coding: utf-8 -*-
"""This module implements basic neutrino properties that are used throughout SNEWPY."""

from enum import IntEnum
from astropy import units as u


[docs]class MassHierarchy(IntEnum): """Neutrino mass ordering: ``NORMAL`` or ``INVERTED``.""" NORMAL = 1 INVERTED = 2
[docs]class Flavor(IntEnum): """Enumeration of CCSN Neutrino flavors.""" NU_E = 2 NU_E_BAR = 1 NU_X = 3 NU_X_BAR = 0
[docs] def to_tex(self): """LaTeX-compatible string representations of flavor.""" if '_BAR' in self.name: return r'$\overline{{\nu}}_{0}$'.format(self.name[3].lower()) return r'$\{0}$'.format(self.name.lower())
@property def is_electron(self): """Return ``True`` for ``Flavor.NU_E`` and ``Flavor.NU_E_BAR``.""" return self.value in (Flavor.NU_E.value, Flavor.NU_E_BAR.value) @property def is_neutrino(self): """Return ``True`` for ``Flavor.NU_E`` and ``Flavor.NU_X``.""" return self.value in (Flavor.NU_E.value, Flavor.NU_X.value) @property def is_antineutrino(self): return self.value in (Flavor.NU_E_BAR.value, Flavor.NU_X_BAR.value)
[docs]class MixingParameters: """Mixing angles and mass differences, assuming three neutrino flavors. This class contains the default values used throughout SNEWPY, which are based on `NuFIT 5.0 <http://www.nu-fit.org>`_ results from July 2020, published in `JHEP 09 (2020) 178 <https://dx.doi.org/10.1007/JHEP09(2020)178>`_ [`arXiv:2007.14792 <https://arxiv.org/abs/2007.14792>`_]. Note that the best fit values vary between normal and inverted mass hierarchy. """ def __init__(self, mh=MassHierarchy.NORMAL): """Initialize the neutrino mixing parameters. Parameters ---------- mh : MassHierarchy Desired mass ordering: NORMAL or INVERTED. """ if type(mh) == MassHierarchy: self.mass_order = mh else: raise TypeError('mh must be of type MassHierarchy') # Values from JHEP 09 (2020) 178 [arXiv:2007.14792] and www.nu-fit.org. # The reported precision is not significant given current # uncertainties, but is useful for comparing to the table of # parameters presented on nu-fit.org. if self.mass_order == MassHierarchy.NORMAL: # Note: in NH, the mass splittings are: m1..m2..............m3. self.theta12 = 33.44 * u.deg self.theta13 = 8.57 * u.deg self.theta23 = 49.20 * u.deg self.deltaCP = 197 * u.deg self.dm21_2 = 7.42e-5 * u.eV**2 self.dm32_2 = 2.517e-3 * u.eV**2 else: # Note: in IH, the mass splittings are: m3..............m1..m2. self.theta12 = 33.45 * u.deg self.theta13 = 8.60 * u.deg self.theta23 = 49.30 * u.deg self.deltaCP = 282 * u.deg self.dm21_2 = 7.42e-5 * u.eV**2 self.dm31_2 = -2.498e-3 * u.eV**2
[docs] def get_mixing_angles(self): """Mixing angles of the PMNS matrix. Returns ------- tuple Angles theta12, theta13, theta23. """ return (self.theta12, self.theta13, self.theta23)