Source code for ess.sans.io

# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2023 Scipp contributors (https://github.com/scipp)

import scipp as sc
import scippnexus as snx
from scippnexus.application_definitions import nxcansas

from .types import (
    BackgroundSubtractedIofQ,
    MaskedDetectorIDs,
    OutFilename,
    PixelMaskFilename,
    RunNumber,
    RunTitle,
)


[docs] def save_background_subtracted_iofq( *, iofq: BackgroundSubtractedIofQ, out_filename: OutFilename, run_number: RunNumber, run_title: RunTitle, ) -> None: """Save background-subtracted I(Q) histogram as an NXcanSAS file.""" if iofq.bins is None: da = iofq.copy(deep=False) else: da = iofq.hist() if da.coords.is_edges('Q'): da.coords['Q'] = sc.midpoints(da.coords['Q']) with snx.File(out_filename, 'w') as f: f['sasentry'] = nxcansas.SASentry(title=run_title, run=run_number) f['sasentry']['sasdata'] = nxcansas.SASdata(da, Q_variances='resolutions')
[docs] def read_xml_detector_masking(filename: PixelMaskFilename) -> MaskedDetectorIDs: """Read a pixel mask from an ISIS XML file. The format is as follows, where the detids are inclusive ranges of detector IDs: .. code-block:: xml <?xml version="1.0"?> <detector-masking> <group> <detids>1400203-1400218,1401199,1402190-1402223</detids> </group> </detector-masking> Parameters ---------- filename: Path to the XML file. """ import xml.etree.ElementTree as ET # nosec tree = ET.parse(filename) # noqa: S314 root = tree.getroot() masked_detids = [] for group in root.findall('group'): for detids in group.findall('detids'): for detid in detids.text.split(','): detid = detid.strip() if '-' in detid: start, stop = detid.split('-') masked_detids += list(range(int(start), int(stop) + 1)) else: masked_detids.append(int(detid)) return MaskedDetectorIDs( sc.array(dims=['detector_id'], values=masked_detids, unit=None, dtype='int32') )