# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2025 Scipp contributors (https://github.com/scipp)
import scipp as sc
from ..reflectometry.types import Filename, ReferenceRun, SampleRun
_version = "1"
def _make_pooch():
import pooch
return pooch.create(
path=pooch.os_cache("ess/estia"),
env="ESS_ESTIA_DATA_DIR",
base_url="https://public.esss.dk/groups/scipp/ess/estia/{version}/",
version=_version,
registry={
"218610_tof_detector_list.p.x.y.t.L.sx.sy": "md5:65145a26c36d12954a97d27d6e7f4ed9", # noqa: E501
"218611_tof_detector_list.p.x.y.t.L.sx.sy": "md5:4599e938568f3b73a72d6d48fe5160e7", # noqa: E501
"218612_tof_detector_list.p.x.y.t.L.sx.sy": "md5:6bacd1e4d922007c7f574f20378b28f2", # noqa: E501
"218613_tof_detector_list.p.x.y.t.L.sx.sy": "md5:7c17cb8a2fe38f4f0976de1254295636", # noqa: E501
"218614_tof_detector_list.p.x.y.t.L.sx.sy": "md5:78cf399dcedea2a2d4178e11b95c53f2", # noqa: E501
# McStas runs for the samples in the Estia McStas model at various angles
"examples/220573/mccode.h5": "md5:2f1ba298bd8a1a67082a41d2c3957fc7",
"examples/220574/mccode.h5": "md5:ecfcf72e936dd5345c1aededa7e9388b",
"examples/220575/mccode.h5": "md5:efb206cf7cf87bf587bca31dca5da39d",
"examples/220576/mccode.h5": "md5:f63664809a15331d055ab9746f7f7259",
"examples/220577/mccode.h5": "md5:e0915c1271ae1800deba7e8c4b7cbf3e",
"examples/220578/mccode.h5": "md5:c456c1bf7e30c09d3ab36f0a87721d49",
"examples/220579/mccode.h5": "md5:3fd9ce4eab6c54346ce7086055695552",
"examples/220580/mccode.h5": "md5:36ff5b178fef6eb5f3be97089c493574",
"examples/220581/mccode.h5": "md5:736aa90d3570a104ab1ca0f4090ea94e",
"examples/220582/mccode.h5": "md5:d01a1fa2e98f0086b3bc0e5dbc323bde",
"examples/220583/mccode.h5": "md5:4f243df1b2dac2cf6da408ee6afb9a37",
"examples/220584/mccode.h5": "md5:5d82b18156c3675a986ec2c02d96a45c",
"examples/220585/mccode.h5": "md5:09540bd8ccea696232b1fdaac978cb29",
# Ground truth reflectivity curves
"examples/NiTiML.ref": "md5:9769b884dfa09d34b6ae449b640463a1",
"examples/Si-SiO2.ref": "md5:436e2312e137b63bf31cc39064d28864",
"examples/Si-Ni.ref": "md5:76fcfc655635086060387163c9175ab4",
},
)
_pooch = _make_pooch()
[docs]
def estia_mcstas_reference_run() -> Filename[ReferenceRun]:
return Filename[ReferenceRun](
_pooch.fetch("218610_tof_detector_list.p.x.y.t.L.sx.sy")
)
[docs]
def estia_mcstas_sample_run(number: int | str) -> Filename[SampleRun]:
return Filename[SampleRun](
_pooch.fetch(f"2186{int(number):02d}_tof_detector_list.p.x.y.t.L.sx.sy")
)
[docs]
def estia_mcstas_example(name):
"""Returns a list of McStas files associated with the sample."""
if name == 'reference':
return _pooch.fetch("examples/220573/mccode.h5")
elif name == 'Ni/Ti-multilayer':
return list(
map(_pooch.fetch, [f"examples/2205{i}/mccode.h5" for i in range(74, 78)])
)
elif name == 'Ni-film on silicon':
return list(
map(_pooch.fetch, [f"examples/2205{i}/mccode.h5" for i in range(78, 82)])
)
elif name == 'Natural SiO2 on silicon':
return list(
map(_pooch.fetch, [f"examples/2205{i}/mccode.h5" for i in range(82, 86)])
)
raise ValueError(f'"{name}" is not a valid sample name')
[docs]
def estia_mcstas_groundtruth(name):
"""Returns the ground truth reflectivity curve for the sample."""
def parse(fname):
ds = sc.io.load_csv(fname, sep=' ')
if len(ds.keys()) == 3:
_, Qcol, Rcol = ds.keys()
else:
Qcol, Rcol = ds.keys()
return sc.DataArray(
sc.array(dims='Q', values=ds[Rcol].values),
coords={
'Q': sc.array(dims='Q', values=[0, *ds[Qcol].values], unit='1/angstrom')
},
)
if name == 'Ni/Ti-multilayer':
return parse(_pooch.fetch("examples/NiTiML.ref"))
elif name == 'Ni-film on silicon':
return parse(_pooch.fetch("examples/Si-Ni.ref"))
elif name == 'Natural SiO2 on silicon':
return parse(_pooch.fetch("examples/Si-SiO2.ref"))
raise ValueError(f'"{name}" is not a valid sample name')
__all__ = [
"estia_mcstas_example",
"estia_mcstas_reference_run",
"estia_mcstas_sample_run",
]