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

"""wrapper to pymca `k-weight` process"""

import logging
from PyMca5.PyMcaPhysics.xas.XASClass import XASClass, e2k
from est.core.process.process import Process
from est.core.process.pymca.exafs import process_spectr_exafs
from est.core.types import XASObject, Spectrum

_logger = logging.getLogger(__name__)


[docs]def process_spectr_k( spectrum, configuration, overwrite=True, callbacks=None, output=None, output_dict=None, ): """ :param spectrum: spectrum to process :type: :class:`.Spectrum` :param configuration: configuration of the pymca normalization :type: dict :param overwrite: False if we want to return a new Spectrum instance :type: bool :param callback: callback to execute. :param output: list to store the result, needed for pool processing :type: multiprocessing.manager.list :param output_dict: key is input spectrum, value is index in the output list. :type: dict :return: processed spectrum :rtype: tuple (configuration, spectrum) """ _logger.debug( "start k weight definition on spectrum (%s, %s)" % (spectrum.x, spectrum.y) ) assert spectrum is not None pymca_xas = XASClass() if spectrum.energy is None or spectrum.mu is None: raise ValueError( "Energy and or Mu is/are not specified, unable to " "compute exafs" ) pymca_xas.setSpectrum(energy=spectrum.energy, mu=spectrum.mu) if configuration is not None: if "KWeight" in configuration and configuration["KWeight"] is not None: configuration["FT"]["KWeight"] = configuration["KWeight"] configuration["EXAFS"]["KWeight"] = configuration["KWeight"] pymca_xas.setConfiguration(configuration) if not overwrite: spectrum = Spectrum.from_dict(spectrum.to_dict()) # we need to update EXAFSNormalized since we are overwriting it cf, exafs_res = process_spectr_exafs(spectrum=spectrum, configuration=configuration) if exafs_res is None: err = "Failed to process exafs." if spectrum.x is not None or spectrum.y is not None: err = ( err + "Spectrum (x, y) coords: " + ",".join((str(spectrum.x), str(spectrum.y))) ) raise ValueError(err) # update EXAFSNormalized e0 = pymca_xas.calculateE0() kValues = e2k(spectrum.energy - e0) exafs = exafs_res.pymca_dict["EXAFSNormalized"] if "KWeight" in configuration and configuration["KWeight"] is not None: exafs *= pow(kValues, configuration["KWeight"]) spectrum.pymca_dict["KWeight"] = configuration["KWeight"] spectrum.pymca_dict["EXAFSNormalized"] = exafs configuration_ = pymca_xas.getConfiguration() if callbacks: for callback in callbacks: callback() if output is not None: assert output_dict is not None output[output_dict[spectrum]] = spectrum return configuration_, spectrum
[docs]def pymca_k_weight(xas_obj, **optional_inputs): """ Set weight for exafs values :param xas_obj: object containing the configuration and spectra to process :type: Union[:class:`.XASObject`, dict] :return: spectra dict :rtype: :class:`.XASObject` """ process = PyMca_k_weight(inputs={"xas_obj": xas_obj, **optional_inputs}) process.run() return process.get_output_value("xas_obj", None)
[docs]class PyMca_k_weight( Process, name="k weight", input_names=["xas_obj"], output_names=["xas_obj"], optional_input_names=["k_weight"], ):
[docs] def set_properties(self, properties): if "_kWeightSetting" in properties: _properties = properties.copy() _properties["k_weight"] = _properties["_kWeightSetting"] del _properties["_kWeightSetting"] self.setConfiguration(_properties)
[docs] def run(self): """ :param xas_obj: object containing the configuration and spectra to process :type: Union[:class:`.XASObject`, dict] :return: spectra dict :rtype: :class:`.XASObject` """ xas_obj = self.inputs.xas_obj if xas_obj is None: raise ValueError("xas_obj should be provided") _xas_obj = self.getXasObject(xas_obj=xas_obj) if self.inputs.k_weight: self.setConfiguration({"k_weight": self.inputs.k_weight}) _xas_obj.configuration["SET_KWEIGHT"] = self.inputs.k_weight if "SET_KWEIGHT" not in _xas_obj.configuration: _logger.warning( "Missing configuration to know which value we should set " "to k weight, will be set to 0 by default" ) _xas_obj.configuration["SET_KWEIGHT"] = 0 for key in ("FT", "EXAFS", "Normalization"): if key not in _xas_obj.configuration: _xas_obj.configuration[key] = {} _xas_obj.configuration["KWeight"] = _xas_obj.configuration["SET_KWEIGHT"] _xas_obj.configuration["FT"]["KWeight"] = _xas_obj.configuration["SET_KWEIGHT"] _xas_obj.configuration["EXAFS"]["KWeight"] = _xas_obj.configuration[ "SET_KWEIGHT" ] _xas_obj.configuration["Normalization"]["KWeight"] = _xas_obj.configuration[ "SET_KWEIGHT" ] self._advancement.reset(max_=_xas_obj.n_spectrum) self.progress = 0.0 self._pool_process(xas_obj=_xas_obj) self.progress = 100.0 self.outputs.xas_obj = _xas_obj
def _pool_process(self, xas_obj): """process normalization from a pool""" assert isinstance(xas_obj, XASObject) assert "KWeight" in xas_obj.configuration n_s = len(xas_obj.spectra.data.flat) for i_s, spectrum in enumerate(xas_obj.spectra.data.flat): process_spectr_k( spectrum=spectrum, configuration=xas_obj.configuration, callbacks=self.callbacks, overwrite=True, ) assert "KWeight" in xas_obj.configuration self.progress = i_s / n_s * 100.0
[docs] def definition(self): return "Define k weight for xas treatment"
[docs] def program_version(self): import PyMca5 return PyMca5.version()
[docs] @staticmethod def program_name(): return "pymca_k_weight"