Source code for ess.amor.data

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

_version = "2"


def _make_pooch():
    import pooch

    return pooch.create(
        path=pooch.os_cache("ess/amor"),
        env="ESS_AMOR_DATA_DIR",
        base_url="https://public.esss.dk/groups/scipp/ess/amor/{version}/",
        version=_version,
        registry={
            "reference.nxs": "md5:56d493c8051e1c5c86fb7a95f8ec643b",
            "sample.nxs": "md5:4e07ccc87b5c6549e190bc372c298e83",
            # Amor NeXus files
            # 608 to 611 are measurements on the same sample at different
            # sample rotations.
            # 612 and 613 are unknown to me.
            # 614 is a reference measurement on a super mirror.
            # The sample rotation values written in the files are wrong,
            # the real values are the following (all expressed in deg):
            #   608: 0.85,
            #   609: 2.25,
            #   610: 3.65,
            #   611: 5.05,
            #   612: 0.65,
            #   613: 0.65,
            #   614: 0.65,
            # The chopper phase offset value written in the files is wrong
            # the real value is -7.5 deg
            "amor2023n000608.hdf": "md5:e3a8b5b8495bb9ab2173848096df49d6",
            "amor2023n000609.hdf": "md5:d899d65f684cade2905f203f7d0fb326",
            "amor2023n000610.hdf": "md5:c9367d49079edcd17fa0b98e33326b05",
            "amor2023n000611.hdf": "md5:9da41177269faac0d936806393427837",
            "amor2023n000612.hdf": "md5:602f1bfcdbc1f618133c93a117d05f12",
            "amor2023n000613.hdf": "md5:ba0fbcbf0b45756a269eb3e943371ced",
            "amor2023n000614.hdf": "md5:18e8a755d6fd671758fe726de058e707",
            # Reflectivity curves obtained by applying Jochens Amor
            # software @ https://github.com/jochenstahn/amor.git
            # (repo commit hash 05e35ca4e05436d7c69ff6e19f32bc1915cbb5d0).
            # to the above files.
            "608.Rqz.ort": "md5:e7e7d63a1ac1e727e9b2f12dc78a77ce",
            "609.Rqz.ort": "md5:3cb3fd11a743594f52a10f71b122b71a",
            "610.Rqz.ort": "md5:66d43993e76801655a1d629cb976abde",
            "611.Rqz.ort": "md5:0c51e8ac5c00041434417673be186151",
            "612.Rqz.ort": "md5:d785d27151e7f1edc05e86d35bef6a63",
            "613.Rqz.ort": "md5:e999c85f7a47665c4ddd1538b19d402d",
            "amor2024n001632.hdf": "md5:2253f0ec6d2e96a986a6aa35d43a7480",
            "amor2024n001634.hdf": "md5:7cdd87bbd96fb3fb1e046800a9b1d77e",
            "amor2024n001635.hdf": "md5:fb9eb0e7b803c13f1804d085b3b0058f",
            "amor2024n001636.hdf": "md5:f7deb51d22652d1f5d0e4b51927af5a3",
            "amor2024n001637.hdf": "md5:06e5957d34d82035cfece40cbbf47d7a",
            "amor2024n001638.hdf": "md5:1193fe808af2afeb0f48d3b0022fe40b",
            "amor2024n001639.hdf": "md5:ff24e31a07c4020927aaa6df9f2ee05f",
            "amor2024n001640.hdf": "md5:051335fea1c369322a2328d530dedb77",
            "amor2024n001641.hdf": "md5:d543b5890b63707cf8d7f6666e8830a4",
            "amor2024n001642.hdf": "md5:b1474e32cc64371e1005f44f2c5b6ae7",
            "amor2024n004079.hdf": "md5:5bf1dabc2ff902a57ed7593903c8e1a5",
            "amor2024n004080.hdf": "md5:7dcaa5da00b7eedc178b9e55209bfbce",
            "amor2024n004081.hdf": "md5:2f4f46f0e56ab75aad0c2933060df504",
            "amor2024n004083.hdf": "md5:ffd13420e44cbf966b94bd532e293c1c",
            "amor2024n004084.hdf": "md5:5041a9486b3cd6407a9b9f44104c9b54",
            "amor2024n004085.hdf": "md5:152ac63bad6f3b2b5cf1c4e4c7df5e30",
            "amor2024n004152.hdf": "md5:244459be7a3caeac523c289815c5b7dc",
            "amor2024n004154.hdf": "md5:6184553f795fd2b230baab9a421da9e4",
        },
    )


_pooch = _make_pooch()


[docs] def amor_old_sample_run() -> str: return _pooch.fetch("sample.nxs")
[docs] def amor_old_reference_run() -> str: return _pooch.fetch("reference.nxs")
[docs] def amor_run(number: int | str) -> str: fnames = [ name for name in _pooch.registry.keys() if re.match(f'amor\\d{{4}}n{int(number):06d}.hdf', name) ] if len(fnames) != 1: raise ValueError(f'Expected exactly one matching file, found {len(fnames)}') return _pooch.fetch(fnames[0])
[docs] def amor_psi_software_result(number: int | str) -> str: return _pooch.fetch(f"{int(number):03d}.Rqz.ort")
__all__ = [ "amor_psi_software_result", "amor_run", ]