Source code for ess.bifrost.workflow
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2025 Scipp contributors (https://github.com/scipp)
"""BIFROST workflows."""
from typing import Any
import sciline
from ess.reduce import time_of_flight
from ess.spectroscopy.indirect.conversion import providers as conversion_providers
from ess.spectroscopy.indirect.kf import providers as kf_providers
from ess.spectroscopy.indirect.ki import providers as ki_providers
from ess.spectroscopy.indirect.normalization import providers as normalisation_providers
from ess.spectroscopy.indirect.time_of_flight import TofWorkflow
from ess.spectroscopy.types import (
DataGroupedByRotation,
FrameMonitor0,
FrameMonitor1,
FrameMonitor2,
FrameMonitor3,
NeXusDetectorName,
NeXusMonitorName,
PulsePeriod,
SampleRun,
)
from .cutting import providers as cutting_providers
from .detector import merge_triplets
from .detector import providers as detector_providers
from .io import mcstas, nexus
[docs]
def simulation_default_parameters() -> dict[type, Any]:
"""Default parameters for BifrostSimulationWorkflow."""
tof_params = time_of_flight.default_parameters()
return {
NeXusMonitorName[FrameMonitor0]: '007_frame_0',
NeXusMonitorName[FrameMonitor1]: '090_frame_1',
NeXusMonitorName[FrameMonitor2]: '097_frame_2',
NeXusMonitorName[FrameMonitor3]: '110_frame_3',
PulsePeriod: tof_params[PulsePeriod],
}
_SIMULATION_PROVIDERS = (
*nexus.providers,
*conversion_providers,
*detector_providers,
*mcstas.providers,
*cutting_providers,
*ki_providers,
*kf_providers,
*normalisation_providers,
)
[docs]
def BifrostSimulationWorkflow(
detector_names: list[NeXusDetectorName],
tof_lut_provider: time_of_flight.TofLutProvider = time_of_flight.TofLutProvider.FILE, # noqa: E501
) -> sciline.Pipeline:
"""Data reduction workflow for simulated BIFROST data.
Parameters
----------
detector_names:
Names of ``NXdetector`` groups in the input NeXus file.
tof_lut_provider:
Specifies how the time-of-flight lookup table is provided:
- FILE: Read from a file.
- TOF: Computed from chopper settings using the 'tof' package.
- MCSTAS: From McStas simulation (not implemented yet).
Returns
-------
:
A pipeline for reducing simulated BIFROST data.
"""
workflow = TofWorkflow(
run_types=(SampleRun,),
monitor_types=(FrameMonitor0, FrameMonitor1, FrameMonitor2, FrameMonitor3),
tof_lut_provider=tof_lut_provider,
)
for provider in _SIMULATION_PROVIDERS:
workflow.insert(provider)
for key, val in simulation_default_parameters().items():
workflow[key] = val
workflow[DataGroupedByRotation[SampleRun]] = (
workflow[DataGroupedByRotation[SampleRun]]
.map(_make_detector_name_mapping(detector_names))
.reduce(func=merge_triplets)
)
return workflow
def _make_detector_name_mapping(detector_names: list[NeXusDetectorName]) -> Any:
# Use Pandas if possible to label the index.
try:
import pandas
return pandas.DataFrame({NeXusDetectorName: detector_names}).rename_axis(
index='triplet'
)
except ModuleNotFoundError:
return {NeXusDetectorName: detector_names}