Source code for ewoksxrpd.tasks.sum_integrate

import logging

import h5py
import numpy
from silx.io.nxdata import NXdata
from silx.io.url import DataUrl

from ewoksxrpd.tasks.data_access import TaskWithDataAccess
from ewoksxrpd.tasks.subtract_pattern import get_opening_mode

from .utils import pyfai_utils
from .utils.data_utils import check_if_external_nxprocess_can_be_written
from .utils.data_utils import create_hdf5_link
from .utils.data_utils import split_hdf5_url_parent_data_path
from .utils.nexus_utils import get_radial_axis

_logger = logging.getLogger(__name__)


[docs] class SumIntegrationResults( TaskWithDataAccess, input_names=["nxdata_url", "output_nxprocess_url"], optional_input_names=["enabled", "external_nxprocess_url"], output_names=["nxdata_url"], ): """ """
[docs] def run(self): check_if_external_nxprocess_can_be_written() external_nxprocess_url = DataUrl( self.get_input_value( "external_nxprocess_url", self.inputs.output_nxprocess_url ) ) if not self.get_input_value("enabled", True): _logger.info( f"Task {self.__class__.__qualname__} is disabled: no pattern was summed" ) self.outputs.nxdata_url = self.inputs.nxdata_url return nxdata_url = DataUrl(self.inputs.nxdata_url) output_nxprocess_url = DataUrl(self.inputs.output_nxprocess_url) output_nxprocess_parent_url, output_nxprocess_name = ( split_hdf5_url_parent_data_path(output_nxprocess_url) ) mode = get_opening_mode( url_to_read=nxdata_url, url_to_write=external_nxprocess_url ) with self.open_h5item(self.inputs.nxdata_url, mode=mode) as nxdata_grp: if not isinstance(nxdata_grp, h5py.Group): raise TypeError( f"{self.inputs.nxdata_url} should point towards a NXData Group." ) # Keep only radial dimensions summed_intensity = numpy.zeros( nxdata_grp["intensity"].shape[-1], dtype=nxdata_grp["intensity"].dtype ) if "intensity_errors" in nxdata_grp: summed_intensity_errors = numpy.zeros( nxdata_grp["intensity_errors"].shape[-1], dtype=nxdata_grp["intensity_errors"].dtype, ) else: summed_intensity_errors = None nxdata = NXdata(nxdata_grp) intensities = nxdata.signal errors = nxdata.errors for i in range(len(intensities)): # Sum over azimuthal dimension if needed summed_intensity += numpy.sum(numpy.atleast_2d(intensities[i]), axis=0) if summed_intensity_errors is not None and errors is not None: summed_intensity_errors += numpy.sum( numpy.atleast_2d(errors[i]), axis=0 ) radial = get_radial_axis(nxdata) with self.open_h5item( external_nxprocess_url, create=True, mode="a" ) as external_process: output_nxdata = pyfai_utils.save_nexus_processed_pattern( external_process, summed_intensity, summed_intensity_errors, radial=radial.array, radial_name=radial.name, radial_units=radial.units, config=self.get_input_values(), ) if output_nxprocess_url != external_nxprocess_url: with self.open_h5item( output_nxprocess_parent_url, create=True, mode="a" ) as output_nxprocess_parent: create_hdf5_link( output_nxprocess_parent, output_nxprocess_name, external_process, ) self.outputs.nxdata_url = ( f"{output_nxdata.file.filename}::{output_nxdata.name}" )