Source code for xpypact.nuclide
"""Nuclide specification in FISPACT JSON."""
from __future__ import annotations
import msgspec as ms
from mckit_nuclides import z
from mckit_nuclides.nuclides import get_nuclide_mass
Avogadro = 6.02214076e23
"""Mol-1, `CODATA <https://pml.nist.gov/cgi-bin/cuu/Value?na>`_."""
eV = 1.602176634e-19 # noqa: N816
"""J/eV, `CODATA <https://pml.nist.gov/cgi-bin/cuu/Value?evj>`_."""
MeV = 1e6 * eV
"""J/MeV."""
FLOAT_ZERO = 0.0
class _NuclideID(ms.Struct, order=True, frozen=True, gc=False):
"""The class organizes NuclideInfo equality and ordering on zai."""
zai: int
[docs]
class NuclideInfo(_NuclideID, frozen=True, gc=False):
"""Basic information on a nuclide.
This is extracted as a separate database entity to improve normalization.
"""
element: str
isotope: int
state: str = ""
half_life: float = 0.0
[docs]
class Nuclide(ms.Struct): # pylint: disable=too-many-instance-attributes
"""Nuclide properties from FISPACT JSON."""
element: str
isotope: int
state: str = ""
zai: int = 0 # Introduced in FISPACT-II v5: z*10000 + a*10 + (state? 1: 0)
half_life: float = 0.0
atoms: float = 0.0
grams: float = 0.0
activity: float = 0.0
alpha_activity: float = 0.0 # FISPACT 5.0
beta_activity: float = 0.0 # -/-
gamma_activity: float = 0.0 # -/-
heat: float = 0.0
alpha_heat: float = 0.0
beta_heat: float = 0.0
gamma_heat: float = 0.0
dose: float = 0.0
ingestion: float = 0.0
inhalation: float = 0.0
[docs]
def __post_init__(self) -> None:
"""Make the values consistent in data from old FISPACT."""
if self.zai == 0 or (
self.atoms == FLOAT_ZERO and self.grams > FLOAT_ZERO
): # pragma: no cover
_z = z(self.element)
if self.zai == 0:
self.zai = _z * 10000 + self.isotope * 10
if self.state:
self.zai += 1
if self.atoms == FLOAT_ZERO and self.grams > FLOAT_ZERO:
self.atoms = Avogadro * self.grams / get_nuclide_mass(_z, self.isotope)
@property
def a(self) -> int:
"""Synonym to mass number, isotope, A.
Returns:
A, mass number
"""
return self.isotope
@property
def info(self) -> NuclideInfo:
"""Extract a nuclide specific information.
Returns:
element, a, state, zai, half_life
"""
return NuclideInfo(self.zai, self.element, self.a, self.state, self.half_life)
__all__ = ["FLOAT_ZERO", "Avogadro", "MeV", "Nuclide", "NuclideInfo", "eV"]