Source code for ewoksxrpd.tasks.utils.sum_utils

from __future__ import annotations

import h5py
import numpy


[docs] class ImageSum: def __init__(self, shape) -> None: self.shape = shape self.summed_image = numpy.zeros(shape) self.summed_monitor = None self.nb_images = 0
[docs] def add_to_sum(self, image: numpy.ndarray, monitor: int | None): self.summed_image += image if monitor is not None: if self.summed_monitor is None: self.summed_monitor = 0 self.summed_monitor += monitor self.nb_images += 1
[docs] def reset(self): self.summed_image = numpy.zeros(self.shape) self.summed_monitor = None self.nb_images = 0
[docs] def generate_range(start: int, end_arg: int | None, nitems: int) -> range: end = nitems if end_arg is None else end_arg + 1 if (end - start) > nitems: raise ValueError( f"Asked range ({start},{end}) is bigger than number of items ({nitems})" ) return range(start, end)
[docs] def save_sum( nxdata: h5py.Group, name: str, image_sum: ImageSum ) -> tuple[h5py.Dataset, h5py.Dataset | None]: nxdata.create_dataset(f"{name}_nb_images", data=image_sum.nb_images) image_dset = nxdata.create_dataset(name, data=image_sum.summed_image) if "signal" not in nxdata: nxdata.attrs["signal"] = name summed_monitor = image_sum.summed_monitor if summed_monitor is None: return image_dset, None monitor_dset = nxdata.create_dataset(f"{name}_monitor", data=summed_monitor) return image_dset, monitor_dset