Source code for ess.estia.workflow

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

import sciline
import scipp as sc

from ..reflectometry import providers as reflectometry_providers
from ..reflectometry import supermirror
from ..reflectometry.corrections import correct_by_proton_current
from ..reflectometry.types import (
    BeamDivergenceLimits,
    CorrectionsToApply,
    DetectorSpatialResolution,
    NeXusDetectorName,
    RunType,
    SampleRotationOffset,
)
from . import (
    beamline,
    conversions,
    corrections,
    load,
    maskings,
    mcstas,
    normalization,
    orso,
)

_general_providers = (
    *reflectometry_providers,
    *conversions.providers,
    *corrections.providers,
    *maskings.providers,
    *normalization.providers,
    *orso.providers,
    *load.providers,
)

mcstas_providers = (
    *_general_providers,
    *mcstas.providers,
)
"""List of providers for setting up a Sciline pipeline for McStas data.

This provides a default Estia workflow including providers for loadings files.
"""

providers = (*_general_providers,)
"""List of providers for setting up a Sciline pipeline data.

This provides a default Estia workflow including providers for loadings files.
"""


[docs] def mcstas_default_parameters() -> dict: """Return default parameters for the McStas Estia workflow.""" return { supermirror.MValue: sc.scalar(5, unit=sc.units.dimensionless), # The reference sample in the McStas simulation has R=1 everywhere supermirror.CriticalEdge: sc.scalar(float('inf'), unit='1/angstrom'), supermirror.Alpha: sc.scalar(0.25 / 0.088, unit=sc.units.angstrom), DetectorSpatialResolution: 0.0025 * sc.units.m, NeXusDetectorName: "detector", BeamDivergenceLimits: ( sc.scalar(-0.75, unit='deg'), sc.scalar(0.75, unit='deg'), ), SampleRotationOffset[RunType]: sc.scalar(0.0, unit='deg'), CorrectionsToApply: corrections.default_corrections - {correct_by_proton_current}, }
[docs] def default_parameters() -> dict: """Return default parameters for the NeXus Estia workflow.""" return { NeXusDetectorName: "multiblade_detector", SampleRotationOffset[RunType]: sc.scalar(0.0, unit='deg'), CorrectionsToApply: corrections.default_corrections, DetectorSpatialResolution: 0.0025 * sc.units.m, }
[docs] def EstiaMcStasWorkflow() -> sciline.Pipeline: """Workflow for reduction of McStas data for the Estia instrument.""" workflow = beamline.LoadNeXusWorkflow() for provider in mcstas_providers: workflow.insert(provider) for name, param in mcstas_default_parameters().items(): workflow[name] = param return workflow
[docs] def EstiaWorkflow() -> sciline.Pipeline: """Workflow for reduction of data for the Estia instrument.""" workflow = beamline.LoadNeXusWorkflow() for provider in providers: workflow.insert(provider) for name, param in default_parameters().items(): workflow[name] = param return workflow