Source code for ewoksfluo.tasks.sum_detectors.sum_spectra

from typing import Sequence

import numpy
from ewokscore import Task
from ewoksdata.data.hdf5.config import guess_dataset_config

from ...io.hdf5 import split_h5uri
from .. import nexus_utils
from ..hdf5_utils import create_hdf5_link
from ..hdf5_utils import link_bliss_scan
from .sum_utils import sum_spectra_from_hdf5

DEFAULTS = {
    "xrf_spectra_uri_template": "instrument/{}/data",
    "detector_normalization_template": "1./<instrument/{}/live_time>",
    "output_detector_name": "mcasum",
}


[docs] class SumXrfSpectra( Task, input_names=[ "bliss_scan_uri", "detector_names", "output_root_uri", ], optional_input_names=[ "xrf_spectra_uri_template", "detector_normalization_template", "output_detector_name", ], output_names=[ "bliss_scan_uri", "detector_name", "xrf_spectra_uri_template", "output_root_uri", ], ): """Add single-scan XRF spectra from multiple detectors"""
[docs] def run(self): start_time = nexus_utils.now() params = {**DEFAULTS, **self.get_input_values()} bliss_scan_uri: str = params["bliss_scan_uri"] detector_names: Sequence[str] = params["detector_names"] xrf_spectra_uri_template: str = params["xrf_spectra_uri_template"] detector_normalization_template: str = params["detector_normalization_template"] output_root_uri: str = params["output_root_uri"] if len(detector_names) < 1: raise ValueError("Expected at least 1 detector to sum") _, scan_h5path = split_h5uri(bliss_scan_uri) sumdetector_name = params["output_detector_name"] with nexus_utils.save_in_ewoks_process( output_root_uri, start_time, process_config={ "detector_normalization_template": detector_normalization_template }, default_levels=(scan_h5path, "sumspectra"), ) as (process_group, already_existed): outentry = process_group.parent if not already_existed: sum_spectra: numpy.ndarray = sum_spectra_from_hdf5( bliss_scan_uri, xrf_spectra_uri_template, detector_normalization_template, detector_names, ) link_bliss_scan(outentry, bliss_scan_uri, retry_timeout=0) nxdata = nexus_utils.create_nxdata( process_group, "mcasum", signal="data" ) dataset_kwargs = guess_dataset_config( scan_shape=(sum_spectra.shape[0],), detector_shape=(sum_spectra.shape[1],), dtype=sum_spectra.dtype, ) dset = nxdata.create_dataset("data", data=sum_spectra, **dataset_kwargs) dset.attrs["interpretation"] = "spectrum" nxdetector = outentry["instrument"].create_group(sumdetector_name) nxdetector.attrs["NX_class"] = "NXdetector" create_hdf5_link(nxdetector, "data", dset) create_hdf5_link(outentry["measurement"], sumdetector_name, dset) output_root_uri = f"{outentry.file.filename}::{outentry.name}" self.outputs.bliss_scan_uri = output_root_uri self.outputs.detector_name = sumdetector_name self.outputs.xrf_spectra_uri_template = DEFAULTS["xrf_spectra_uri_template"] self.outputs.output_root_uri = output_root_uri