Source code for xraylabtool.gui.services
"""Helper utilities for the GUI layer."""
from __future__ import annotations
from collections.abc import Callable, Iterable
from dataclasses import dataclass
import numpy as np
from xraylabtool.calculators.core import (
calculate_single_material_properties,
)
from xraylabtool.logging_utils import get_logger
logger = get_logger(__name__)
[docs]
@dataclass
class EnergyConfig:
start_kev: float = 8.0
end_kev: float = 12.0
points: int = 50
logspace: bool = False
[docs]
def to_array(self) -> np.ndarray:
start = float(self.start_kev)
end = float(self.end_kev)
pts = max(1, int(self.points))
if pts == 1 or start == end:
return np.array([start], dtype=float)
if self.logspace:
return np.logspace(np.log10(start), np.log10(end), pts)
return np.linspace(start, end, pts)
[docs]
def compute_single(formula: str, density: float, energy_cfg: EnergyConfig): # type: ignore[no-untyped-def]
energies = energy_cfg.to_array()
logger.info(
"Compute single material",
extra={
"formula": formula,
"density": density,
"points": len(energies),
"logspace": energy_cfg.logspace,
},
)
return calculate_single_material_properties(formula, energies, density)
[docs]
def compute_multiple( # type: ignore[no-untyped-def]
formulas: Iterable[str],
densities: Iterable[float],
energy_cfg: EnergyConfig,
progress_cb: Callable[[int], None] | None = None,
):
energies = energy_cfg.to_array()
formulas_list = list(formulas)
densities_list = list(densities)
total = max(len(formulas_list), 1)
logger.info(
"Compute multiple materials",
extra={
"count": len(formulas_list),
"points": len(energies),
"logspace": energy_cfg.logspace,
},
)
results = {}
for idx, (formula, density) in enumerate(
zip(formulas_list, densities_list, strict=False)
):
results[formula] = calculate_single_material_properties(
formula, energies, density
)
if progress_cb:
pct = int(((idx + 1) / total) * 100)
progress_cb(pct)
return results
[docs]
def linear_absorption_cm(inv_length_cm: float | None) -> float | None:
if inv_length_cm is None:
return None
if inv_length_cm == 0:
return 0.0
return 1.0 / inv_length_cm