Source code for mckit_nuclides.nuclides
"""Information on nuclides: masses, natural presence and more."""
from __future__ import annotations
from typing import TYPE_CHECKING, Final, cast
from pathlib import Path
import polars as pl
from mckit_nuclides.elements import z
if TYPE_CHECKING:
from mckit_nuclides.elements import TableValue
HERE = Path(__file__).parent
NUCLIDES_PARQUET: Final[Path] = HERE / "data/nuclides.parquet"
NUCLIDES_TABLE_PL: Final = pl.read_parquet(NUCLIDES_PARQUET)
[docs]
def get_property(z_or_symbol: int | str, mass_number: int, column: str) -> TableValue:
"""Retrieve mass of a nuclide by atomic and mass numbers, a.u.
Args:
z_or_symbol: Z or symbol of a nuclide
mass_number: A
column: name of column to extract value from
Raises:
KeyError: if cannot find the given nuclide.
Returns:
Value of a column for the given nuclide.
"""
_z = z(z_or_symbol) if isinstance(z_or_symbol, str) else z_or_symbol
try:
return cast(
"TableValue",
NUCLIDES_TABLE_PL.filter(
pl.col("atomic_number").eq(_z) & pl.col("mass_number").eq(mass_number)
)
.select(column)
.item(),
)
except pl.exceptions.ColumnNotFoundError as ex: # pragma: no cover
raise KeyError from ex
except ValueError as ex: # pragma: no cover
raise KeyError from ex
[docs]
def get_nuclide_mass(z_or_symbol: int | str, mass_number: int) -> float:
"""Retrieve mass of a nuclide by atomic and mass numbers, a.u.
Args:
z_or_symbol: Z or symbol of a nuclide
mass_number: A
Returns:
Mass of the Nuclide (a.u).
"""
return cast("float", get_property(z_or_symbol, mass_number, "molar_mass"))