From 51469e98d0036ae72ff7eb3fc13acf9a5fb9127a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 3 Mar 2026 16:22:18 +0100 Subject: [PATCH 1/3] Add measurement metadata to CIF --- src/ess/dream/io/cif.py | 7 +++++++ src/ess/powder/types.py | 3 +++ 2 files changed, 10 insertions(+) diff --git a/src/ess/dream/io/cif.py b/src/ess/dream/io/cif.py index 050735a6..2bc4ebd0 100644 --- a/src/ess/dream/io/cif.py +++ b/src/ess/dream/io/cif.py @@ -12,6 +12,7 @@ CIFAuthors, EmptyCanSubtractedIntensityTof, IntensityTof, + Measurement, ReducedEmptyCanSubtractedTofCIF, ReducedTofCIF, ReducerSoftware, @@ -26,6 +27,7 @@ def prepare_reduced_tof_cif( authors: CIFAuthors, beamline: Beamline[SampleRun], source: Source[SampleRun], + measurement: Measurement[SampleRun], reducers: ReducerSoftware, calibration: OutputCalibrationData, ) -> ReducedTofCIF: @@ -61,6 +63,7 @@ def prepare_reduced_tof_cif( authors=authors, beamline=beamline, source=source, + measurement=measurement, reducers=reducers, calibration=calibration, ) @@ -72,6 +75,7 @@ def prepare_reduced_empty_can_subtracted_tof_cif( authors: CIFAuthors, beamline: Beamline[SampleRun], source: Source[SampleRun], + measurement: Measurement[SampleRun], reducers: ReducerSoftware, calibration: OutputCalibrationData, ) -> ReducedEmptyCanSubtractedTofCIF: @@ -107,6 +111,7 @@ def prepare_reduced_empty_can_subtracted_tof_cif( authors=authors, beamline=beamline, source=source, + measurement=measurement, reducers=reducers, calibration=calibration, ) @@ -118,12 +123,14 @@ def _prepare_reduced_tof_cif_impl( authors: CIFAuthors, beamline: Beamline[SampleRun], source: Source[SampleRun], + measurement: Measurement[SampleRun], reducers: ReducerSoftware, calibration: OutputCalibrationData, ) -> ReducedTofCIF: to_save = _prepare_data(da) return ReducedTofCIF( cif.CIF('reduced_tof') + .with_measurement(measurement) .with_reducers(*(reducer.compact_repr for reducer in reducers)) .with_authors(*authors) .with_beamline(beamline, source) diff --git a/src/ess/powder/types.py b/src/ess/powder/types.py index 5d34ffdd..aeace7df 100644 --- a/src/ess/powder/types.py +++ b/src/ess/powder/types.py @@ -215,6 +215,9 @@ class RawDataAndMetadata(sciline.Scope[RunType, sc.DataGroup], sc.DataGroup): Beamline = reduce_t.Beamline """Beamline metadata.""" +Measurement = reduce_t.Measurement +"""Measurement metadata.""" + ReducerSoftware = NewType('ReducerSoftware', list[Software]) """Pieces of software used to reduce the data.""" From ddca8e4ef8b819bd6d1805481765e59fc8a6e784 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 4 Mar 2026 10:06:36 +0100 Subject: [PATCH 2/3] Set Measurement metadata in geant4 pipeline --- src/ess/dream/workflows.py | 5 +++++ tests/dream/io/cif_test.py | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ess/dream/workflows.py b/src/ess/dream/workflows.py index b8742f05..b7a984fe 100644 --- a/src/ess/dream/workflows.py +++ b/src/ess/dream/workflows.py @@ -19,6 +19,7 @@ EmptyCanRun, KeepEvents, LookupTableRelativeErrorThreshold, + Measurement, PixelMaskFilename, Position, ReducerSoftware, @@ -211,6 +212,10 @@ def DreamGeant4Workflow(*, run_norm: RunNormalization, **kwargs) -> sciline.Pipe AccumulatedProtonCharge[EmptyCanRun]: charge, CaveMonitorPosition: sc.vector([0.0, 0.0, -4220.0], unit='mm'), LookupTableRelativeErrorThreshold: 0.02, + # The GEANT4 files do not encode measurement information + Measurement[SampleRun]: Measurement[SampleRun](title=None), + Measurement[VanadiumRun]: Measurement[VanadiumRun](title=None), + Measurement[EmptyCanRun]: Measurement[EmptyCanRun](title=None), } for key, value in additional_parameters.items(): wf[key] = value diff --git a/tests/dream/io/cif_test.py b/tests/dream/io/cif_test.py index 2a58b923..69420668 100644 --- a/tests/dream/io/cif_test.py +++ b/tests/dream/io/cif_test.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - +import datetime import io import pytest @@ -14,6 +14,7 @@ Beamline, CIFAuthors, IntensityTof, + Measurement, ReducerSoftware, Software, ) @@ -60,6 +61,10 @@ def test_save_reduced_tof(ioftof: IntensityTof, cal: OutputCalibrationData) -> N site="ESS", ), source=ESS_SOURCE, + measurement=Measurement( + title="Test measurement", + start_time=datetime.datetime(2026, 1, 2, 14, 58, 2, tzinfo=datetime.UTC), + ), reducers=ReducerSoftware( [ Software.from_package_metadata('ess.diffraction'), @@ -78,6 +83,8 @@ def test_save_reduced_tof(ioftof: IntensityTof, cal: OutputCalibrationData) -> N assert f"ess.dream {__version__}" in result assert f"ess.powder {__version__}" in result assert '_diffrn_source.beamline DREAM' in result + assert "_sc_meas.title 'Test measurement'" in result + assert "_pd_meas.datetime_initiated 2026-01-02T14:58:02" in result assert 'ZERO 0 0.2' in result assert 'DIFC 1 1.2' in result assert 'DIFA 2 -1.4' in result From 8a3c60af7db0a002d0bbef585e54916dd63e527a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 9 Mar 2026 17:54:44 +0100 Subject: [PATCH 3/3] Require scippneutron>=26.3.0 --- pyproject.toml | 2 +- requirements/base.in | 4 ++-- requirements/base.txt | 32 ++++++++++++++++---------------- requirements/basetest.txt | 10 +++++----- requirements/ci.txt | 24 ++++++++++++++---------- requirements/dev.txt | 8 ++++---- requirements/docs.txt | 10 +++++----- requirements/mypy.txt | 2 +- requirements/nightly.txt | 28 ++++++++++++++-------------- requirements/static.txt | 18 ++++++++++++------ 10 files changed, 74 insertions(+), 64 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d8805a4b..a8f70fb7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ dependencies = [ "pythreejs>=2.4.1", "sciline>=25.04.1", "scipp>=25.11.0", - "scippneutron>=25.02.0", + "scippneutron>=26.3.0", "scippnexus>=23.12.0", "tof>=25.12.0", "ncrystal[cif]>=4.1.0", diff --git a/requirements/base.in b/requirements/base.in index e6b4f5f0..c2e60849 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -10,8 +10,8 @@ plopp>=26.2.0 pythreejs>=2.4.1 sciline>=25.04.1 scipp>=25.11.0 -scippneutron>=25.02.0 +scippneutron>=26.3.0 scippnexus>=23.12.0 -tof>=25.11.1 +tof>=25.12.0 ncrystal[cif]>=4.1.0 spglib!=2.7 diff --git a/requirements/base.txt b/requirements/base.txt index 37d1b9d8..2c895c98 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:e8dc8a7c4338f6f02931f7cf0dd2408d0d0351db +# SHA1:81c10bea2bf8b09c721c1bb7b501d35596a04095 # # This file was generated by pip-compile-multi. # To update, run: @@ -11,9 +11,9 @@ ase==3.27.0 # via ncrystal asttokens==3.0.1 # via stack-data -certifi==2026.1.4 +certifi==2026.2.25 # via requests -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via requests click==8.3.1 # via dask @@ -35,19 +35,19 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==26.2.1 +essreduce==26.3.1 # via -r base.in executing==2.2.1 # via stack-data -fonttools==4.61.1 +fonttools==4.62.0 # via matplotlib fsspec==2026.2.0 # via dask -gemmi==0.7.4 +gemmi==0.7.5 # via ncrystal graphviz==0.21 # via -r base.in -h5py==3.15.1 +h5py==3.16.0 # via # scippneutron # scippnexus @@ -71,9 +71,9 @@ jedi==0.19.2 # via ipython jupyterlab-widgets==3.0.16 # via ipywidgets -kiwisolver==1.4.9 +kiwisolver==1.5.0 # via matplotlib -lazy-loader==0.4 +lazy-loader==0.5 # via # plopp # scippneutron @@ -87,7 +87,7 @@ matplotlib==3.10.8 # plopp matplotlib-inline==0.2.1 # via ipython -mpltoolbox==25.10.0 +mpltoolbox==26.2.0 # via scippneutron ncrystal[cif]==4.2.12 # via -r base.in @@ -97,7 +97,7 @@ ncrystal-python==4.2.12 # via ncrystal networkx==3.6.1 # via cyclebane -numpy==2.4.2 +numpy==2.4.3 # via # -r base.in # ase @@ -125,9 +125,9 @@ pexpect==4.9.0 # via ipython pillow==12.1.1 # via matplotlib -platformdirs==4.5.1 +platformdirs==4.9.4 # via pooch -plopp==26.2.0 +plopp==26.3.0 # via # -r base.in # scippneutron @@ -164,14 +164,14 @@ sciline==25.11.1 # via # -r base.in # essreduce -scipp==26.2.0 +scipp==26.3.0 # via # -r base.in # essreduce # scippneutron # scippnexus # tof -scippneutron==25.11.2 +scippneutron==26.3.0 # via # -r base.in # essreduce @@ -180,7 +180,7 @@ scippnexus==26.1.1 # -r base.in # essreduce # scippneutron -scipy==1.17.0 +scipy==1.17.1 # via # ase # scippneutron diff --git a/requirements/basetest.txt b/requirements/basetest.txt index 32695a75..4b147bc4 100644 --- a/requirements/basetest.txt +++ b/requirements/basetest.txt @@ -7,9 +7,9 @@ # asttokens==3.0.1 # via stack-data -certifi==2026.1.4 +certifi==2026.2.25 # via requests -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via requests comm==0.2.3 # via ipywidgets @@ -33,19 +33,19 @@ jupyterlab-widgets==3.0.16 # via ipywidgets matplotlib-inline==0.2.1 # via ipython -numpy==2.4.2 +numpy==2.4.3 # via pandas packaging==26.0 # via # pooch # pytest -pandas==3.0.0 +pandas==3.0.1 # via -r basetest.in parso==0.8.6 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.5.1 +platformdirs==4.9.4 # via pooch pluggy==1.6.0 # via pytest diff --git a/requirements/ci.txt b/requirements/ci.txt index fd69cd42..21b87c34 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -5,20 +5,19 @@ # # requirements upgrade # -cachetools==7.0.1 +cachetools==7.0.4 # via tox -certifi==2026.1.4 +certifi==2026.2.25 # via requests -chardet==5.2.0 - # via tox -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via requests colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.20.3 +filelock==3.25.0 # via + # python-discovery # tox # virtualenv gitdb==4.0.12 @@ -32,21 +31,26 @@ packaging==26.0 # -r ci.in # pyproject-api # tox -platformdirs==4.5.1 +platformdirs==4.9.4 # via + # python-discovery # tox # virtualenv pluggy==1.6.0 # via tox pyproject-api==1.10.0 # via tox +python-discovery==1.1.1 + # via virtualenv requests==2.32.5 # via -r ci.in -smmap==5.0.2 +smmap==5.0.3 # via gitdb -tox==4.34.1 +tomli-w==1.2.0 + # via tox +tox==4.49.0 # via -r ci.in urllib3==2.6.3 # via requests -virtualenv==20.36.1 +virtualenv==21.1.0 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index 1b6bda4c..c90cd996 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -22,13 +22,13 @@ argon2-cffi-bindings==25.1.0 # via argon2-cffi arrow==1.4.0 # via isoduration -async-lru==2.1.0 +async-lru==2.2.0 # via jupyterlab cffi==2.0.0 # via argon2-cffi-bindings -copier==9.11.3 +copier==9.13.1 # via -r dev.in -dunamai==1.25.0 +dunamai==1.26.0 # via copier fqdn==1.5.1 # via jsonschema @@ -65,7 +65,7 @@ jupyter-server==2.17.0 # notebook-shim jupyter-server-terminals==0.5.4 # via jupyter-server -jupyterlab==4.5.4 +jupyterlab==4.5.5 # via -r dev.in jupyterlab-server==2.28.0 # via jupyterlab diff --git a/requirements/docs.txt b/requirements/docs.txt index e1456dcc..d7da0669 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -40,7 +40,7 @@ docutils==0.22.4 # sphinxcontrib-bibtex fastjsonschema==2.21.2 # via nbformat -imagesize==1.4.1 +imagesize==2.0.0 # via sphinx ipykernel==7.2.0 # via -r docs.in @@ -100,13 +100,13 @@ nbsphinx==0.9.8 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel -pandas==3.0.0 +pandas==3.0.1 # via -r docs.in pandocfilters==1.5.1 # via nbconvert psutil==7.2.2 # via ipykernel -pyarrow==23.0.0 +pyarrow==23.0.1 # via -r docs.in pybtex==0.25.1 # via @@ -114,11 +114,11 @@ pybtex==0.25.1 # sphinxcontrib-bibtex pybtex-docutils==1.0.3 # via sphinxcontrib-bibtex -pydantic-settings==2.12.0 +pydantic-settings==2.13.1 # via autodoc-pydantic pydata-sphinx-theme==0.16.1 # via -r docs.in -python-dotenv==1.2.1 +python-dotenv==1.2.2 # via pydantic-settings pyzmq==27.1.0 # via diff --git a/requirements/mypy.txt b/requirements/mypy.txt index 0f22723e..f90f757a 100644 --- a/requirements/mypy.txt +++ b/requirements/mypy.txt @@ -6,7 +6,7 @@ # requirements upgrade # -r test.txt -librt==0.7.8 +librt==0.8.1 # via mypy mypy==1.19.1 # via -r mypy.in diff --git a/requirements/nightly.txt b/requirements/nightly.txt index c2a68ede..c8cc0026 100644 --- a/requirements/nightly.txt +++ b/requirements/nightly.txt @@ -14,9 +14,9 @@ ase==3.27.0 # via ncrystal asttokens==3.0.1 # via stack-data -certifi==2026.1.4 +certifi==2026.2.25 # via requests -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via requests click==8.3.1 # via dask @@ -42,15 +42,15 @@ essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in executing==2.2.1 # via stack-data -fonttools==4.61.1 +fonttools==4.62.0 # via matplotlib fsspec==2026.2.0 # via dask -gemmi==0.7.4 +gemmi==0.7.5 # via ncrystal graphviz==0.21 # via -r nightly.in -h5py==3.15.1 +h5py==3.16.0 # via # scippneutron # scippnexus @@ -77,9 +77,9 @@ jedi==0.19.2 # via ipython jupyterlab-widgets==3.0.16 # via ipywidgets -kiwisolver==1.4.10rc0 +kiwisolver==1.5.0 # via matplotlib -lazy-loader==0.4 +lazy-loader==0.5 # via # plopp # scippneutron @@ -93,7 +93,7 @@ matplotlib==3.10.8 # plopp matplotlib-inline==0.2.1 # via ipython -mpltoolbox==25.10.0 +mpltoolbox==26.2.0 # via scippneutron ncrystal[cif]==4.2.12 # via -r nightly.in @@ -103,7 +103,7 @@ ncrystal-python==4.2.12 # via ncrystal networkx==3.6.1 # via cyclebane -numpy==2.4.2 +numpy==2.4.3 # via # -r nightly.in # ase @@ -125,7 +125,7 @@ packaging==26.0 # matplotlib # pooch # pytest -pandas==3.0.0 +pandas==3.0.1 # via -r nightly.in parso==0.8.6 # via jedi @@ -135,7 +135,7 @@ pexpect==4.9.0 # via ipython pillow==12.1.1 # via matplotlib -platformdirs==4.5.1 +platformdirs==4.9.4 # via pooch plopp @ git+https://github.com/scipp/plopp@main # via @@ -154,9 +154,9 @@ ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pydantic==2.12.5 +pydantic==2.13.0b2 # via scippneutron -pydantic-core==2.41.5 +pydantic-core==2.42.0 # via pydantic pygments==2.19.2 # via @@ -198,7 +198,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.17.0 +scipy==1.17.1 # via # ase # scippneutron diff --git a/requirements/static.txt b/requirements/static.txt index 75cd3c9b..7f8cd35f 100644 --- a/requirements/static.txt +++ b/requirements/static.txt @@ -9,17 +9,23 @@ cfgv==3.5.0 # via pre-commit distlib==0.4.0 # via virtualenv -filelock==3.20.3 - # via virtualenv -identify==2.6.16 +filelock==3.25.0 + # via + # python-discovery + # virtualenv +identify==2.6.17 # via pre-commit nodeenv==1.10.0 # via pre-commit -platformdirs==4.5.1 - # via virtualenv +platformdirs==4.9.4 + # via + # python-discovery + # virtualenv pre-commit==4.5.1 # via -r static.in +python-discovery==1.1.1 + # via virtualenv pyyaml==6.0.3 # via pre-commit -virtualenv==20.36.1 +virtualenv==21.1.0 # via pre-commit