Add isotope lookup dictionary, so isotopes can be loaded from string in config.

This commit is contained in:
Pim Nelissen
2026-02-20 11:46:45 +01:00
parent 8f652875dc
commit 265d3b0111
4 changed files with 36 additions and 23 deletions

View File

@ -2,9 +2,8 @@
__ignore__ = ["logger"] __ignore__ = ["logger"]
from pg_rad.isotopes import isotope from pg_rad.isotopes import isotope
from pg_rad.isotopes import presets
from pg_rad.isotopes.isotope import (Isotope,) from pg_rad.isotopes.isotope import (CS137, Isotope, get_isotope,
from pg_rad.isotopes.presets import (CS137,) preset_isotopes,)
__all__ = ['CS137', 'Isotope', 'isotope', 'presets'] __all__ = ['CS137', 'Isotope', 'get_isotope', 'isotope', 'preset_isotopes']

View File

@ -1,3 +1,5 @@
from typing import Dict, Type
from pg_rad.physics.attenuation import get_mass_attenuation_coeff from pg_rad.physics.attenuation import get_mass_attenuation_coeff
@ -25,3 +27,24 @@ class Isotope:
self.E = E self.E = E
self.b = b self.b = b
self.mu_mass_air = get_mass_attenuation_coeff(E / 1000) self.mu_mass_air = get_mass_attenuation_coeff(E / 1000)
class CS137(Isotope):
def __init__(self):
super().__init__(
name="Cs-137",
E=661.66,
b=0.851
)
preset_isotopes: Dict[str, Type[Isotope]] = {
"CS137": CS137
}
def get_isotope(isotope_str: str) -> Isotope:
"""Lazy factory function to create isotope objects."""
if isotope_str not in preset_isotopes:
raise ValueError(f"Unknown isotope: {isotope_str}")
return preset_isotopes[isotope_str]()

View File

@ -1,10 +0,0 @@
from .isotope import Isotope
class CS137(Isotope):
def __init__(self):
super().__init__(
name="Cs-137",
E=661.66,
b=0.851
)

View File

@ -1,7 +1,7 @@
import logging import logging
from .objects import BaseObject from .objects import BaseObject
from pg_rad.isotopes.isotope import Isotope from pg_rad.isotopes.isotope import Isotope, get_isotope
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -11,16 +11,16 @@ class PointSource(BaseObject):
def __init__( def __init__(
self, self,
activity: int, activity_MBq: int,
isotope: Isotope, isotope: str,
pos: tuple[float, float, float] = (0, 0, 0), position: tuple[float, float, float] = (0, 0, 0),
name: str | None = None, name: str | None = None,
color: str = 'red' color: str = 'red'
): ):
"""A point source. """A point source.
Args: Args:
activity (int): Activity A in MBq. activity_MBq (int): Activity A in MBq.
isotope (Isotope): The isotope. isotope (Isotope): The isotope.
pos (tuple[float, float, float], optional): pos (tuple[float, float, float], optional):
Position of the PointSource. Position of the PointSource.
@ -37,16 +37,17 @@ class PointSource(BaseObject):
if name is None: if name is None:
name = f"Source {self.id}" name = f"Source {self.id}"
super().__init__(pos, name, color) super().__init__(position, name, color)
self.activity = activity self.activity = activity_MBq
self.isotope = isotope self.isotope: Isotope = get_isotope(isotope)
logger.debug(f"Source created: {self.name}") logger.debug(f"Source created: {self.name}")
def __repr__(self): def __repr__(self):
x, y, z = self.position
repr_str = (f"PointSource(name={self.name}, " repr_str = (f"PointSource(name={self.name}, "
+ f"pos={(self.x, self.y, self.z)}, " + f"pos={(x, y, z)}, "
+ f"A={self.activity} MBq), " + f"A={self.activity} MBq), "
+ f"isotope={self.isotope.name}.") + f"isotope={self.isotope.name}.")