Source code for scippneutron.chopper.nexus_chopper
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2023 Scipp contributors (https://github.com/scipp)
from collections.abc import Mapping
from typing import Any
import scipp as sc
from .disk_chopper import DiskChopperType
[docs]
def extract_chopper_from_nexus(
chopper: Mapping[str, sc.Variable | sc.DataArray | sc.DataGroup],
) -> sc.DataGroup:
"""Convert loaded NeXus disk chopper data to the layout used by ScipNeutron.
This function extracts relevant time series from ``NXlog``.
The output may, however, still contain time-dependent fields which need to be
processed further.
See :ref:`disk_chopper-time_dependent_parameters`.
Parameters
----------
chopper:
The loaded NeXus disk chopper data.
Returns
-------
:
A new data group with processed fields in the layout expected by
:meth:`DiskChopper.from_nexus
<scippneutron.chopper.disk_chopper.DiskChopper.from_nexus>`.
"""
return sc.DataGroup(
{
"type": DiskChopperType(chopper.get("type", DiskChopperType.single)),
**{key: _parse_field(key, val) for key, val in chopper.items()},
}
)
def _parse_field(key: str, value: Any) -> Any:
if key == "top_dead_center":
return _parse_tdc(value)
return _parse_maybe_log(value)
def _parse_tdc(
tdc: sc.Variable | sc.DataArray | sc.DataGroup,
) -> sc.Variable | sc.DataArray:
if isinstance(tdc, sc.DataGroup):
# An NXlog without 'value'
return tdc["time"]
return tdc
def _parse_maybe_log(
x: sc.Variable | sc.DataArray | sc.DataGroup,
) -> sc.Variable | sc.DataArray:
if isinstance(x, sc.DataGroup) and "value" in x:
# An NXlog
return x["value"].squeeze()
return x