Source code for ewoksxrpd.tasks.utils.integrate_utils

from contextlib import ExitStack
from typing import Any
from typing import Optional
from typing import Tuple
from typing import Union

import h5py
import numpy
from ewoksdata.data.hdf5.dataset_writer import DatasetWriter
from pyFAI.containers import Integrate1dResult
from pyFAI.containers import Integrate2dResult

from . import pyfai_utils


[docs] def is_counter_name(value: Any) -> bool: return isinstance(value, str) and "://" not in value
[docs] def get_intensity_error( result: Union[Integrate1dResult, Integrate2dResult], ) -> numpy.ndarray: if result.sigma is None: return numpy.full_like(result.intensity, numpy.nan) sigma = result.sigma sigma[result.intensity <= 0] = numpy.nan return numpy.abs(sigma)
[docs] def save_result( result: Union[Integrate1dResult, Integrate2dResult], intensity_writer: Optional[DatasetWriter], error_writer: Optional[DatasetWriter], nxprocess: h5py.Group, stack: ExitStack, flush_period: Optional[float] = None, overwrite: bool = False, ) -> Tuple[Optional[DatasetWriter], Optional[DatasetWriter], bool]: if intensity_writer is None: radial_axis, azimuthal_axis = pyfai_utils.parse_pyfai_units(result.unit) nxdata = pyfai_utils.create_integration_results_nxdata( nxprocess, result.intensity.ndim + 1, # +1 for the scan dimension result.radial, radial_axis.to_str(), result.azimuthal if isinstance(result, Integrate2dResult) else None, azimuthal_axis.to_str() if isinstance(result, Integrate2dResult) else None, overwrite=overwrite, ) nxdata.attrs["signal"] = "intensity" intensity_writer = stack.enter_context( DatasetWriter( nxdata, "intensity", flush_period=flush_period, overwrite=overwrite ) ) if result.sigma is not None: error_writer = stack.enter_context( DatasetWriter( nxdata, "intensity_errors", flush_period=flush_period, overwrite=overwrite, ) ) flush = intensity_writer.add_point(result.intensity) if result.sigma is not None: flush |= error_writer.add_point(result.sigma) return intensity_writer, error_writer, flush