Source code for est.core.process.pymca.normalization

"""wrapper to pymca `normalization` process"""

import logging
from importlib.metadata import version as get_version
from typing import Any
from typing import Callable
from typing import Dict
from typing import Optional
from typing import Sequence
from typing import Union

from PyMca5.PyMcaPhysics.xas.XASClass import XASClass

from ...types.spectrum import Spectrum
from ...types.xasobject import XASObject
from ..base import Process

_logger = logging.getLogger(__name__)


[docs] def process_spectr_norm( spectrum: Spectrum, configuration: Dict[str, Any], overwrite: bool = True, callbacks: Optional[Sequence[Callable[[], None]]] = None, ) -> Spectrum: """ :param spectrum: spectrum to process. :param configuration: configuration of the pymca normalization. :param overwrite: `False` if we want to return a new Spectrum instance. :param callbacks: callbacks to execute after processing. :return: processed spectrum. """ _logger.debug("start normalization on spectrum (%s, %s)", spectrum.x, spectrum.y) pymca_xas = XASClass() pymca_xas.setSpectrum(energy=spectrum.energy, mu=spectrum.mu) if configuration is not None: if "e0" in configuration: configuration["E0Value"] = configuration["e0"] configuration["E0Method"] = "Manual" pymca_xas.setConfiguration(configuration) res = pymca_xas.normalize() if not overwrite: spectrum = spectrum.model_copy(deep=True) spectrum.normalized_energy = res.get("NormalizedEnergy", None) spectrum.normalized_mu = res.get("NormalizedMu", None) spectrum.e0 = res.get("Edge", None) spectrum.pre_edge = res.get("NormalizedBackground", None) spectrum.post_edge = res.get("NormalizedSignal", None) if callbacks: for callback in callbacks: callback() return spectrum
[docs] def pymca_normalization( xas_obj: Union[XASObject, dict], **optional_inputs ) -> Optional[XASObject]: process = PyMca_normalization(inputs={"xas_obj": xas_obj, **optional_inputs}) process.run() return process.get_output_value("xas_obj", None)
[docs] class PyMca_normalization( Process, input_names=["xas_obj"], optional_input_names=["normalization"], output_names=["xas_obj"], ): """Pre- and post-edge normalization of XAS spectra."""
[docs] def set_properties(self, properties): if "_pymcaSettings" in properties: self._settings = properties["_pymcaSettings"]
[docs] def run(self): xas_obj = self.getXasObject(self.inputs.xas_obj) if xas_obj.energy is None: _logger.error("Energy not specified, unable to normalize spectra") return if self.inputs.normalization: self.setConfiguration(self.inputs.normalization) xas_obj.configuration["Normalization"] = self.inputs.normalization self.progress = 0.0 self._pool_process(xas_obj=xas_obj) self.progress = 100.0 if xas_obj.normalized_energy is None: raise ValueError("Fail to compute normalize energy") self.outputs.xas_obj = xas_obj
def _pool_process(self, xas_obj: XASObject): n_s = len(xas_obj.spectra.data.flat) for i_s, spectrum in enumerate(xas_obj.spectra.data.flat): process_spectr_norm( spectrum=spectrum, configuration=xas_obj.configuration, callbacks=self.callbacks, overwrite=True, ) self.progress = i_s / n_s * 100.0
[docs] def definition(self) -> str: return "Normalization of the spectrum"
[docs] def program_version(self) -> str: return get_version("PyMca5")
[docs] @staticmethod def program_name() -> str: return "pymca_normalization"