# 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