Source code for ess.beer.workflow

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

import sciline as sl
import scipp as sc

from ess.powder import providers as powder_providers
from ess.powder.correction import RunNormalization, insert_run_normalization
from ess.powder.types import (
    BunkerMonitor,
    CaveMonitor,
    EmptyCanRun,
    RunType,
    SampleRun,
    VanadiumRun,
)
from ess.reduce.nexus.types import DetectorBankSizes, NeXusName
from ess.reduce.unwrap import GenericUnwrapWorkflow

from .clustering import providers as clustering_providers
from .conversions import convert_from_known_peaks_providers, convert_pulse_shaping
from .conversions import providers as conversion_providers
from .io import mcstas_modulation_period_from_mode, mcstas_providers
from .types import (
    PulseLength,
)

default_parameters = {
    PulseLength: sc.scalar(0.003, unit='s'),
}


[docs] def BeerModMcStasWorkflow(): """Workflow to process BEER (modulation regime) McStas files without a list of estimated peak positions.""" return sl.Pipeline( ( *mcstas_providers, mcstas_modulation_period_from_mode, *clustering_providers, *conversion_providers, ), params=default_parameters, constraints={RunType: (SampleRun,)}, )
[docs] def BeerModMcStasWorkflowKnownPeaks(): """Workflow to process BEER (modulation regime) McStas files using a list of estimated peak positions.""" return sl.Pipeline( ( *mcstas_providers, mcstas_modulation_period_from_mode, *convert_from_known_peaks_providers, ), params=default_parameters, constraints={RunType: (SampleRun,)}, )
[docs] def BeerMcStasWorkflowPulseShaping(): """Workflow to process BEER (pulse shaping modes) McStas files""" return sl.Pipeline( (*mcstas_providers, *convert_pulse_shaping), params=default_parameters, constraints={RunType: (SampleRun,)}, )
[docs] def BeerPowderWorkflow( *, run_norm: RunNormalization = RunNormalization.monitor_integrated, **kwargs ) -> sl.Pipeline: """ Beer powder workflow with default parameters. Parameters ---------- run_norm: Select how to normalize each run (sample, vanadium, etc.). kwargs: Additional keyword arguments are forwarded to the base :func:`GenericUnwrapWorkflow`. Returns ------- : A workflow object for BEER. """ wf = GenericUnwrapWorkflow( run_types=[SampleRun, VanadiumRun, EmptyCanRun], monitor_types=[BunkerMonitor, CaveMonitor], **kwargs, ) wf[DetectorBankSizes] = { 'south_detector': {'y': 200, 'x': 500}, 'north_detector': {'y': 200, 'x': 500}, } wf[NeXusName[CaveMonitor]] = "monitor_cave" for provider in itertools.chain(powder_providers, convert_pulse_shaping): wf.insert(provider) insert_run_normalization(wf, run_norm) for key, value in default_parameters.items(): wf[key] = value return wf
[docs] def BeerPowderMcStasWorkflow(**kwargs) -> sl.Pipeline: wf = BeerPowderWorkflow(**kwargs) for provider in mcstas_providers: wf.insert(provider) return wf