essreduce 25.10.1__tar.gz → 25.11.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. {essreduce-25.10.1 → essreduce-25.11.0}/PKG-INFO +3 -3
  2. {essreduce-25.10.1 → essreduce-25.11.0}/docs/user-guide/reduction-workflow-guidelines.md +63 -0
  3. {essreduce-25.10.1 → essreduce-25.11.0}/docs/user-guide/tof/dream.ipynb +10 -22
  4. {essreduce-25.10.1 → essreduce-25.11.0}/docs/user-guide/tof/frame-unwrapping.ipynb +9 -27
  5. {essreduce-25.10.1 → essreduce-25.11.0}/docs/user-guide/tof/wfm.ipynb +6 -24
  6. {essreduce-25.10.1 → essreduce-25.11.0}/pyproject.toml +2 -2
  7. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/base.in +2 -2
  8. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/base.txt +21 -21
  9. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/basetest.txt +33 -31
  10. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/ci.txt +12 -18
  11. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/dev.txt +26 -22
  12. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/docs.txt +41 -43
  13. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/mypy.txt +1 -1
  14. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/nightly.txt +40 -46
  15. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/static.txt +7 -7
  16. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/wheels.txt +1 -3
  17. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/live/raw.py +5 -5
  18. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/nexus/__init__.py +4 -0
  19. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/nexus/_nexus_loader.py +119 -14
  20. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/nexus/types.py +25 -18
  21. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/nexus/workflow.py +20 -58
  22. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/__init__.py +4 -4
  23. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/eto_to_tof.py +37 -22
  24. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/lut.py +2 -2
  25. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/types.py +2 -2
  26. {essreduce-25.10.1 → essreduce-25.11.0}/src/essreduce.egg-info/PKG-INFO +3 -3
  27. {essreduce-25.10.1 → essreduce-25.11.0}/src/essreduce.egg-info/requires.txt +2 -2
  28. {essreduce-25.10.1 → essreduce-25.11.0}/tests/conftest.py +17 -0
  29. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/nexus_loader_test.py +12 -0
  30. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/workflow_test.py +39 -43
  31. {essreduce-25.10.1 → essreduce-25.11.0}/tests/time_of_flight/lut_test.py +5 -4
  32. {essreduce-25.10.1 → essreduce-25.11.0}/tests/time_of_flight/unwrap_test.py +19 -19
  33. {essreduce-25.10.1 → essreduce-25.11.0}/tests/time_of_flight/wfm_test.py +8 -8
  34. {essreduce-25.10.1 → essreduce-25.11.0}/tests/time_of_flight/workflow_test.py +24 -12
  35. {essreduce-25.10.1 → essreduce-25.11.0}/.copier-answers.ess.yml +0 -0
  36. {essreduce-25.10.1 → essreduce-25.11.0}/.copier-answers.yml +0 -0
  37. {essreduce-25.10.1 → essreduce-25.11.0}/.github/ISSUE_TEMPLATE/high-level-requirement.yml +0 -0
  38. {essreduce-25.10.1 → essreduce-25.11.0}/.github/dependabot.yml +0 -0
  39. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/ci.yml +0 -0
  40. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/docs.yml +0 -0
  41. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/nightly_at_main.yml +0 -0
  42. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/nightly_at_main_lower_bound.yml +0 -0
  43. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/nightly_at_release.yml +0 -0
  44. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/python-version-ci +0 -0
  45. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/release.yml +0 -0
  46. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/test.yml +0 -0
  47. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/unpinned.yml +0 -0
  48. {essreduce-25.10.1 → essreduce-25.11.0}/.github/workflows/weekly_windows_macos.yml +0 -0
  49. {essreduce-25.10.1 → essreduce-25.11.0}/.gitignore +0 -0
  50. {essreduce-25.10.1 → essreduce-25.11.0}/.pre-commit-config.yaml +0 -0
  51. {essreduce-25.10.1 → essreduce-25.11.0}/.python-version +0 -0
  52. {essreduce-25.10.1 → essreduce-25.11.0}/CODE_OF_CONDUCT.md +0 -0
  53. {essreduce-25.10.1 → essreduce-25.11.0}/CONTRIBUTING.md +0 -0
  54. {essreduce-25.10.1 → essreduce-25.11.0}/LICENSE +0 -0
  55. {essreduce-25.10.1 → essreduce-25.11.0}/MANIFEST.in +0 -0
  56. {essreduce-25.10.1 → essreduce-25.11.0}/README.md +0 -0
  57. {essreduce-25.10.1 → essreduce-25.11.0}/docs/_static/anaconda-icon.js +0 -0
  58. {essreduce-25.10.1 → essreduce-25.11.0}/docs/_static/favicon.svg +0 -0
  59. {essreduce-25.10.1 → essreduce-25.11.0}/docs/_static/logo-dark.svg +0 -0
  60. {essreduce-25.10.1 → essreduce-25.11.0}/docs/_static/logo.svg +0 -0
  61. {essreduce-25.10.1 → essreduce-25.11.0}/docs/_templates/class-template.rst +0 -0
  62. {essreduce-25.10.1 → essreduce-25.11.0}/docs/_templates/doc_version.html +0 -0
  63. {essreduce-25.10.1 → essreduce-25.11.0}/docs/_templates/module-template.rst +0 -0
  64. {essreduce-25.10.1 → essreduce-25.11.0}/docs/about/index.md +0 -0
  65. {essreduce-25.10.1 → essreduce-25.11.0}/docs/api-reference/index.md +0 -0
  66. {essreduce-25.10.1 → essreduce-25.11.0}/docs/conf.py +0 -0
  67. {essreduce-25.10.1 → essreduce-25.11.0}/docs/developer/coding-conventions.md +0 -0
  68. {essreduce-25.10.1 → essreduce-25.11.0}/docs/developer/dependency-management.md +0 -0
  69. {essreduce-25.10.1 → essreduce-25.11.0}/docs/developer/getting-started.md +0 -0
  70. {essreduce-25.10.1 → essreduce-25.11.0}/docs/developer/gui.ipynb +0 -0
  71. {essreduce-25.10.1 → essreduce-25.11.0}/docs/developer/index.md +0 -0
  72. {essreduce-25.10.1 → essreduce-25.11.0}/docs/index.md +0 -0
  73. {essreduce-25.10.1 → essreduce-25.11.0}/docs/user-guide/index.md +0 -0
  74. {essreduce-25.10.1 → essreduce-25.11.0}/docs/user-guide/installation.md +0 -0
  75. {essreduce-25.10.1 → essreduce-25.11.0}/docs/user-guide/tof/index.md +0 -0
  76. {essreduce-25.10.1 → essreduce-25.11.0}/docs/user-guide/widget.md +0 -0
  77. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/basetest.in +0 -0
  78. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/ci.in +0 -0
  79. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/dev.in +0 -0
  80. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/docs.in +0 -0
  81. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/make_base.py +0 -0
  82. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/mypy.in +0 -0
  83. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/nightly.in +0 -0
  84. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/static.in +0 -0
  85. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/test.in +0 -0
  86. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/test.txt +0 -0
  87. {essreduce-25.10.1 → essreduce-25.11.0}/requirements/wheels.in +0 -0
  88. {essreduce-25.10.1 → essreduce-25.11.0}/resources/logo.svg +0 -0
  89. {essreduce-25.10.1 → essreduce-25.11.0}/setup.cfg +0 -0
  90. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/__init__.py +0 -0
  91. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/data/__init__.py +0 -0
  92. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/data/_registry.py +0 -0
  93. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/live/__init__.py +0 -0
  94. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/live/roi.py +0 -0
  95. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/live/workflow.py +0 -0
  96. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/logging.py +0 -0
  97. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/nexus/json_generator.py +0 -0
  98. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/nexus/json_nexus.py +0 -0
  99. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/parameter.py +0 -0
  100. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/py.typed +0 -0
  101. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/scripts/grow_nexus.py +0 -0
  102. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/streaming.py +0 -0
  103. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/fakes.py +0 -0
  104. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/interpolator_numba.py +0 -0
  105. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/interpolator_scipy.py +0 -0
  106. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/resample.py +0 -0
  107. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/time_of_flight/workflow.py +0 -0
  108. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/ui.py +0 -0
  109. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/uncertainty.py +0 -0
  110. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/__init__.py +0 -0
  111. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_base.py +0 -0
  112. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_binedges_widget.py +0 -0
  113. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_bounds_widget.py +0 -0
  114. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_config.py +0 -0
  115. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_filename_widget.py +0 -0
  116. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_linspace_widget.py +0 -0
  117. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_optional_widget.py +0 -0
  118. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_spinner.py +0 -0
  119. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_string_widget.py +0 -0
  120. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_switchable_widget.py +0 -0
  121. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/widgets/_vector_widget.py +0 -0
  122. {essreduce-25.10.1 → essreduce-25.11.0}/src/ess/reduce/workflow.py +0 -0
  123. {essreduce-25.10.1 → essreduce-25.11.0}/src/essreduce.egg-info/SOURCES.txt +0 -0
  124. {essreduce-25.10.1 → essreduce-25.11.0}/src/essreduce.egg-info/dependency_links.txt +0 -0
  125. {essreduce-25.10.1 → essreduce-25.11.0}/src/essreduce.egg-info/entry_points.txt +0 -0
  126. {essreduce-25.10.1 → essreduce-25.11.0}/src/essreduce.egg-info/top_level.txt +0 -0
  127. {essreduce-25.10.1 → essreduce-25.11.0}/tests/accumulators_test.py +0 -0
  128. {essreduce-25.10.1 → essreduce-25.11.0}/tests/live/raw_test.py +0 -0
  129. {essreduce-25.10.1 → essreduce-25.11.0}/tests/live/roi_test.py +0 -0
  130. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_generator_test.py +0 -0
  131. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_nexus_examples/array_dataset.json +0 -0
  132. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_nexus_examples/dataset.json +0 -0
  133. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_nexus_examples/detector.json +0 -0
  134. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_nexus_examples/entry.json +0 -0
  135. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_nexus_examples/event_data.json +0 -0
  136. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_nexus_examples/instrument.json +0 -0
  137. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_nexus_examples/log.json +0 -0
  138. {essreduce-25.10.1 → essreduce-25.11.0}/tests/nexus/json_nexus_test.py +0 -0
  139. {essreduce-25.10.1 → essreduce-25.11.0}/tests/package_test.py +0 -0
  140. {essreduce-25.10.1 → essreduce-25.11.0}/tests/scripts/test_grow_nexus.py +0 -0
  141. {essreduce-25.10.1 → essreduce-25.11.0}/tests/streaming_test.py +0 -0
  142. {essreduce-25.10.1 → essreduce-25.11.0}/tests/time_of_flight/interpolator_test.py +0 -0
  143. {essreduce-25.10.1 → essreduce-25.11.0}/tests/time_of_flight/resample_tests.py +0 -0
  144. {essreduce-25.10.1 → essreduce-25.11.0}/tests/uncertainty_test.py +0 -0
  145. {essreduce-25.10.1 → essreduce-25.11.0}/tests/widget_test.py +0 -0
  146. {essreduce-25.10.1 → essreduce-25.11.0}/tools/shrink_nexus.py +0 -0
  147. {essreduce-25.10.1 → essreduce-25.11.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: essreduce
3
- Version: 25.10.1
3
+ Version: 25.11.0
4
4
  Summary: Common data reduction tools for the ESS facility
5
5
  Author: Scipp contributors
6
6
  License-Expression: BSD-3-Clause
@@ -20,10 +20,10 @@ Classifier: Typing :: Typed
20
20
  Requires-Python: >=3.11
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
- Requires-Dist: sciline>=25.05.1
23
+ Requires-Dist: sciline>=25.11.0
24
24
  Requires-Dist: scipp>=25.04.0
25
25
  Requires-Dist: scippneutron>=25.02.0
26
- Requires-Dist: scippnexus>=24.11.0
26
+ Requires-Dist: scippnexus>=25.06.0
27
27
  Provides-Extra: test
28
28
  Requires-Dist: ipywidgets>=8.1; extra == "test"
29
29
  Requires-Dist: numba>=0.59; extra == "test"
@@ -146,6 +146,69 @@ workflow.visualize(Result)
146
146
  workflow.compute(Result)
147
147
  ```
148
148
 
149
+ ### C.6: Domain types for data products
150
+
151
+ Data types that flow through the reduction workflow should follow a systematic naming convention that reflects their processing stage and coordinate space. This ensures consistency across instruments and techniques, making workflows more transferable and easier to understand.
152
+
153
+ **Type structure**
154
+
155
+ Domain types use a **prefix-suffix** pattern:
156
+ - **Prefix**: Describes the processing stage (e.g., `Raw`, `Tof`, `Corrected`, `Normalized`)
157
+ - **Suffix**: Describes the coordinate space or component (e.g., `Monitor`, `Detector`, `Q`, `Dspacing`, `Energy`)
158
+
159
+ **Monitor types**
160
+
161
+ Monitors follow a linear progression through processing stages:
162
+
163
+ ```
164
+ EmptyMonitor # Geometry only, calibrated
165
+ RawMonitor # With counts
166
+ TofMonitor # Time-of-flight domain
167
+ WavelengthMonitor # Wavelength domain (end of monitor chain)
168
+ ```
169
+
170
+ **Detector types**
171
+
172
+ Detectors progress through both processing stages and move from "detector space" (pixel space) to, e.g., Q-space:
173
+
174
+ ```
175
+ EmptyDetector # Geometry only, calibrated, pixel-masked
176
+ RawDetector # With counts
177
+ TofDetector # With added time-of-flight coord
178
+ WavelengthDetector # With added wavelength coord
179
+ CorrectedDetector # Corrections applied (masking, filtering, efficiency, Lorentz, absorption)
180
+ CorrectedQ # Transformed to Q-space, pixels reduced
181
+ NormalizedQ # Normalized (to monitor, proton charge)
182
+ IntensityQ # Absolute intensity, e.g., normalized to vanadium
183
+ ```
184
+
185
+ Alternative domain-specific names to, e.g., `IntensityQ` such as `ReflectivityQ` are also valid.
186
+
187
+ **Coordinate space variants**
188
+
189
+ The final coordinate space (`Q` in the example above) should be replaced with the appropriate space for the technique:
190
+ - `Dspacing` for d-spacing coordinates
191
+ - `EnergyTransfer` for energy transfer
192
+ - `TwoTheta` for scattering angle
193
+ - Multiple dimensions can be combined: `DspacingTwoTheta`
194
+
195
+ For example, a powder diffraction workflow might use:
196
+ ```
197
+ CorrectedDetector → CorrectedDspacing → NormalizedDspacing → IntensityDspacing
198
+ ```
199
+
200
+ **Guidelines**
201
+
202
+ 1. **Maintain the standard progression**: Keep processing stages separate unless there's a scientific reason to combine them (e.g., computational efficiency for a specific technique).
203
+
204
+ 2. **Prefix carries forward**: When transforming coordinate spaces without additional processing, the prefix carries forward (e.g., `CorrectedDetector` → `CorrectedQ`).
205
+
206
+ 3. **Skip only when appropriate**: Stages can be skipped if they don't exist for a particular technique, but avoid skipping for convenience alone.
207
+
208
+ 4. **Be explicit about the space**: Always include the coordinate space or component in the suffix to make the data's nature clear.
209
+
210
+ 5. **Consistency across instruments**: Use the same type names for equivalent processing stages across different instruments and techniques to facilitate knowledge transfer.
211
+
149
212
  ## D: Documentation
150
213
 
151
214
  ### D.1: Document math and references in docstrings
@@ -24,7 +24,7 @@
24
24
  "import plopp as pp\n",
25
25
  "import scipp as sc\n",
26
26
  "from scippneutron.chopper import DiskChopper\n",
27
- "from ess.reduce.nexus.types import DetectorData, SampleRun\n",
27
+ "from ess.reduce.nexus.types import AnyRun, RawDetector, SampleRun\n",
28
28
  "from ess.reduce.time_of_flight import *"
29
29
  ]
30
30
  },
@@ -300,10 +300,10 @@
300
300
  "source": [
301
301
  "wf = GenericTofWorkflow(run_types=[SampleRun], monitor_types=[])\n",
302
302
  "\n",
303
- "wf[DetectorData[SampleRun]] = raw_data\n",
303
+ "wf[RawDetector[SampleRun]] = raw_data\n",
304
304
  "wf[DetectorLtotal[SampleRun]] = Ltotal\n",
305
305
  "\n",
306
- "wf.visualize(DetectorTofData[SampleRun])"
306
+ "wf.visualize(TofDetector[SampleRun])"
307
307
  ]
308
308
  },
309
309
  {
@@ -340,7 +340,7 @@
340
340
  "outputs": [],
341
341
  "source": [
342
342
  "lut_wf = TofLookupTableWorkflow()\n",
343
- "lut_wf[DiskChoppers] = disk_choppers\n",
343
+ "lut_wf[DiskChoppers[AnyRun]] = disk_choppers\n",
344
344
  "lut_wf[SourcePosition] = source_position\n",
345
345
  "lut_wf[LtotalRange] = (\n",
346
346
  " sc.scalar(75.5, unit=\"m\"),\n",
@@ -436,7 +436,6 @@
436
436
  ]
437
437
  },
438
438
  {
439
- "attachments": {},
440
439
  "cell_type": "markdown",
441
440
  "id": "30",
442
441
  "metadata": {},
@@ -457,7 +456,7 @@
457
456
  "wf[TimeOfFlightLookupTable] = table\n",
458
457
  "\n",
459
458
  "# Compute time-of-flight of neutron events\n",
460
- "tofs = wf.compute(DetectorTofData[SampleRun])\n",
459
+ "tofs = wf.compute(TofDetector[SampleRun])\n",
461
460
  "tofs"
462
461
  ]
463
462
  },
@@ -616,11 +615,11 @@
616
615
  "outputs": [],
617
616
  "source": [
618
617
  "# Update workflow\n",
619
- "wf[DetectorData[SampleRun]] = raw_data\n",
618
+ "wf[RawDetector[SampleRun]] = raw_data\n",
620
619
  "wf[DetectorLtotal[SampleRun]] = Ltotal\n",
621
620
  "\n",
622
621
  "# Compute tofs and wavelengths\n",
623
- "tofs = wf.compute(DetectorTofData[SampleRun])\n",
622
+ "tofs = wf.compute(TofDetector[SampleRun])\n",
624
623
  "wav_wfm = tofs.transform_coords(\"wavelength\", graph=graph)\n",
625
624
  "\n",
626
625
  "# Compare in plot\n",
@@ -713,7 +712,7 @@
713
712
  "outputs": [],
714
713
  "source": [
715
714
  "# Update workflow\n",
716
- "lut_wf[DiskChoppers] = disk_choppers\n",
715
+ "lut_wf[DiskChoppers[AnyRun]] = disk_choppers\n",
717
716
  "\n",
718
717
  "sim = lut_wf.compute(SimulationResults)\n",
719
718
  "\n",
@@ -795,13 +794,13 @@
795
794
  "metadata": {},
796
795
  "outputs": [],
797
796
  "source": [
798
- "wf[DetectorData[SampleRun]] = ess_beamline.get_monitor(\"detector\")[0]\n",
797
+ "wf[RawDetector[SampleRun]] = ess_beamline.get_monitor(\"detector\")[0]\n",
799
798
  "wf[DetectorLtotal[SampleRun]] = Ltotal\n",
800
799
  "\n",
801
800
  "wf[TimeOfFlightLookupTable] = table\n",
802
801
  "\n",
803
802
  "# Compute time-of-flight\n",
804
- "tofs = wf.compute(DetectorTofData[SampleRun])\n",
803
+ "tofs = wf.compute(TofDetector[SampleRun])\n",
805
804
  "# Compute wavelength\n",
806
805
  "wav_wfm = tofs.transform_coords(\"wavelength\", graph=graph)\n",
807
806
  "\n",
@@ -823,17 +822,6 @@
823
822
  "display_name": "Python 3 (ipykernel)",
824
823
  "language": "python",
825
824
  "name": "python3"
826
- },
827
- "language_info": {
828
- "codemirror_mode": {
829
- "name": "ipython",
830
- "version": 3
831
- },
832
- "file_extension": ".py",
833
- "mimetype": "text/x-python",
834
- "name": "python",
835
- "nbconvert_exporter": "python",
836
- "pygments_lexer": "ipython3"
837
825
  }
838
826
  },
839
827
  "nbformat": 4,
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "cells": [
3
3
  {
4
- "attachments": {},
5
4
  "cell_type": "markdown",
6
5
  "id": "0",
7
6
  "metadata": {},
@@ -32,7 +31,7 @@
32
31
  "import plopp as pp\n",
33
32
  "import scipp as sc\n",
34
33
  "from scippneutron.chopper import DiskChopper\n",
35
- "from ess.reduce.nexus.types import DetectorData, SampleRun\n",
34
+ "from ess.reduce.nexus.types import AnyRun, RawDetector, SampleRun\n",
36
35
  "from ess.reduce.time_of_flight import *\n",
37
36
  "import tof\n",
38
37
  "\n",
@@ -161,10 +160,10 @@
161
160
  "source": [
162
161
  "wf = GenericTofWorkflow(run_types=[SampleRun], monitor_types=[])\n",
163
162
  "\n",
164
- "wf[DetectorData[SampleRun]] = nxevent_data\n",
163
+ "wf[RawDetector[SampleRun]] = nxevent_data\n",
165
164
  "wf[DetectorLtotal[SampleRun]] = nxevent_data.coords[\"Ltotal\"]\n",
166
165
  "\n",
167
- "wf.visualize(DetectorTofData[SampleRun])"
166
+ "wf.visualize(TofDetector[SampleRun])"
168
167
  ]
169
168
  },
170
169
  {
@@ -212,7 +211,7 @@
212
211
  "source": [
213
212
  "lut_wf = TofLookupTableWorkflow()\n",
214
213
  "lut_wf[LtotalRange] = detectors[0].distance, detectors[-1].distance\n",
215
- "lut_wf[DiskChoppers] = {\n",
214
+ "lut_wf[DiskChoppers[AnyRun]] = {\n",
216
215
  " \"chopper\": DiskChopper(\n",
217
216
  " frequency=-chopper.frequency,\n",
218
217
  " beam_position=sc.scalar(0.0, unit=\"deg\"),\n",
@@ -271,7 +270,7 @@
271
270
  "wf[TimeOfFlightLookupTable] = table\n",
272
271
  "\n",
273
272
  "# Compute neutron tofs\n",
274
- "tofs = wf.compute(DetectorTofData[SampleRun])\n",
273
+ "tofs = wf.compute(TofDetector[SampleRun])\n",
275
274
  "\n",
276
275
  "tof_hist = tofs.hist(tof=sc.scalar(500.0, unit=\"us\"))\n",
277
276
  "pp.plot({det.name: tof_hist[\"detector_number\", i] for i, det in enumerate(detectors)})"
@@ -399,7 +398,7 @@
399
398
  "lut_wf = TofLookupTableWorkflow()\n",
400
399
  "lut_wf[PulseStride] = 2\n",
401
400
  "lut_wf[LtotalRange] = detectors[0].distance, detectors[-1].distance\n",
402
- "lut_wf[DiskChoppers] = {\n",
401
+ "lut_wf[DiskChoppers[AnyRun]] = {\n",
403
402
  " ch.name: DiskChopper(\n",
404
403
  " frequency=-ch.frequency,\n",
405
404
  " beam_position=sc.scalar(0.0, unit=\"deg\"),\n",
@@ -456,11 +455,11 @@
456
455
  "# Reduction workflow\n",
457
456
  "wf = GenericTofWorkflow(run_types=[SampleRun], monitor_types=[])\n",
458
457
  "nxevent_data = results.to_nxevent_data()\n",
459
- "wf[DetectorData[SampleRun]] = nxevent_data\n",
458
+ "wf[RawDetector[SampleRun]] = nxevent_data\n",
460
459
  "wf[DetectorLtotal[SampleRun]] = nxevent_data.coords[\"Ltotal\"]\n",
461
460
  "wf[TimeOfFlightLookupTable] = table\n",
462
461
  "\n",
463
- "tofs = wf.compute(DetectorTofData[SampleRun])\n",
462
+ "tofs = wf.compute(TofDetector[SampleRun])\n",
464
463
  "\n",
465
464
  "tof_hist = tofs.hist(tof=sc.scalar(500.0, unit=\"us\"))\n",
466
465
  "pp.plot({det.name: tof_hist[\"detector_number\", i] for i, det in enumerate(detectors)})"
@@ -500,24 +499,7 @@
500
499
  ]
501
500
  }
502
501
  ],
503
- "metadata": {
504
- "kernelspec": {
505
- "display_name": "Python 3 (ipykernel)",
506
- "language": "python",
507
- "name": "python3"
508
- },
509
- "language_info": {
510
- "codemirror_mode": {
511
- "name": "ipython",
512
- "version": 3
513
- },
514
- "file_extension": ".py",
515
- "mimetype": "text/x-python",
516
- "name": "python",
517
- "nbconvert_exporter": "python",
518
- "pygments_lexer": "ipython3"
519
- }
520
- },
502
+ "metadata": {},
521
503
  "nbformat": 4,
522
504
  "nbformat_minor": 5
523
505
  }
@@ -25,7 +25,7 @@
25
25
  "import plopp as pp\n",
26
26
  "import scipp as sc\n",
27
27
  "from scippneutron.chopper import DiskChopper\n",
28
- "from ess.reduce.nexus.types import DetectorData, SampleRun\n",
28
+ "from ess.reduce.nexus.types import AnyRun, RawDetector, SampleRun\n",
29
29
  "from ess.reduce.time_of_flight import *"
30
30
  ]
31
31
  },
@@ -321,10 +321,10 @@
321
321
  "source": [
322
322
  "wf = GenericTofWorkflow(run_types=[SampleRun], monitor_types=[])\n",
323
323
  "\n",
324
- "wf[DetectorData[SampleRun]] = raw_data\n",
324
+ "wf[RawDetector[SampleRun]] = raw_data\n",
325
325
  "wf[DetectorLtotal[SampleRun]] = Ltotal\n",
326
326
  "\n",
327
- "wf.visualize(DetectorTofData[SampleRun])"
327
+ "wf.visualize(TofDetector[SampleRun])"
328
328
  ]
329
329
  },
330
330
  {
@@ -361,7 +361,7 @@
361
361
  "outputs": [],
362
362
  "source": [
363
363
  "lut_wf = TofLookupTableWorkflow()\n",
364
- "lut_wf[DiskChoppers] = disk_choppers\n",
364
+ "lut_wf[DiskChoppers[AnyRun]] = disk_choppers\n",
365
365
  "lut_wf[SourcePosition] = source_position\n",
366
366
  "lut_wf[LtotalRange] = Ltotal, Ltotal\n",
367
367
  "lut_wf[LookupTableRelativeErrorThreshold] = 0.1\n",
@@ -442,7 +442,6 @@
442
442
  ]
443
443
  },
444
444
  {
445
- "attachments": {},
446
445
  "cell_type": "markdown",
447
446
  "id": "27",
448
447
  "metadata": {},
@@ -466,7 +465,7 @@
466
465
  "source": [
467
466
  "wf[TimeOfFlightLookupTable] = table\n",
468
467
  "\n",
469
- "tofs = wf.compute(DetectorTofData[SampleRun])\n",
468
+ "tofs = wf.compute(TofDetector[SampleRun])\n",
470
469
  "tofs"
471
470
  ]
472
471
  },
@@ -549,24 +548,7 @@
549
548
  ]
550
549
  }
551
550
  ],
552
- "metadata": {
553
- "kernelspec": {
554
- "display_name": "Python 3 (ipykernel)",
555
- "language": "python",
556
- "name": "python3"
557
- },
558
- "language_info": {
559
- "codemirror_mode": {
560
- "name": "ipython",
561
- "version": 3
562
- },
563
- "file_extension": ".py",
564
- "mimetype": "text/x-python",
565
- "name": "python",
566
- "nbconvert_exporter": "python",
567
- "pygments_lexer": "ipython3"
568
- }
569
- },
551
+ "metadata": {},
570
552
  "nbformat": 4,
571
553
  "nbformat_minor": 5
572
554
  }
@@ -30,10 +30,10 @@ requires-python = ">=3.11"
30
30
  # Run 'tox -e deps' after making changes here. This will update requirement files.
31
31
  # Make sure to list one dependency per line.
32
32
  dependencies = [
33
- "sciline>=25.05.1",
33
+ "sciline>=25.11.0",
34
34
  "scipp>=25.04.0",
35
35
  "scippneutron>=25.02.0",
36
- "scippnexus>=24.11.0",
36
+ "scippnexus>=25.06.0",
37
37
  ]
38
38
 
39
39
  dynamic = ["version"]
@@ -2,7 +2,7 @@
2
2
  # will not be touched by ``make_base.py``
3
3
  # --- END OF CUSTOM SECTION ---
4
4
  # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY!
5
- sciline>=25.05.1
5
+ sciline>=25.11.0
6
6
  scipp>=25.04.0
7
7
  scippneutron>=25.02.0
8
- scippnexus>=24.11.0
8
+ scippnexus>=25.06.0
@@ -1,4 +1,4 @@
1
- # SHA1:b300915e3a524f201873bcdae539cb19309f1fa5
1
+ # SHA1:e86f9d2876cf304569910ff89826c8e5aac84bf8
2
2
  #
3
3
  # This file was generated by pip-compile-multi.
4
4
  # To update, run:
@@ -7,39 +7,39 @@
7
7
  #
8
8
  annotated-types==0.7.0
9
9
  # via pydantic
10
- contourpy==1.3.2
10
+ contourpy==1.3.3
11
11
  # via matplotlib
12
12
  cyclebane==24.10.0
13
13
  # via sciline
14
14
  cycler==0.12.1
15
15
  # via matplotlib
16
- dnspython==2.7.0
16
+ dnspython==2.8.0
17
17
  # via email-validator
18
- email-validator==2.2.0
18
+ email-validator==2.3.0
19
19
  # via scippneutron
20
- fonttools==4.59.0
20
+ fonttools==4.60.1
21
21
  # via matplotlib
22
- h5py==3.14.0
22
+ h5py==3.15.1
23
23
  # via
24
24
  # scippneutron
25
25
  # scippnexus
26
- idna==3.10
26
+ idna==3.11
27
27
  # via email-validator
28
- kiwisolver==1.4.8
28
+ kiwisolver==1.4.9
29
29
  # via matplotlib
30
30
  lazy-loader==0.4
31
31
  # via
32
32
  # plopp
33
33
  # scippneutron
34
- matplotlib==3.10.3
34
+ matplotlib==3.10.7
35
35
  # via
36
36
  # mpltoolbox
37
37
  # plopp
38
- mpltoolbox==25.5.0
38
+ mpltoolbox==25.10.0
39
39
  # via scippneutron
40
- networkx==3.4.2
40
+ networkx==3.5
41
41
  # via cyclebane
42
- numpy==2.2.6
42
+ numpy==2.3.4
43
43
  # via
44
44
  # contourpy
45
45
  # h5py
@@ -51,22 +51,22 @@ packaging==25.0
51
51
  # via
52
52
  # lazy-loader
53
53
  # matplotlib
54
- pillow==11.3.0
54
+ pillow==12.0.0
55
55
  # via matplotlib
56
- plopp==25.7.0
56
+ plopp==25.10.0
57
57
  # via scippneutron
58
- pydantic==2.11.7
58
+ pydantic==2.12.3
59
59
  # via scippneutron
60
- pydantic-core==2.33.2
60
+ pydantic-core==2.41.4
61
61
  # via pydantic
62
- pyparsing==3.2.3
62
+ pyparsing==3.2.5
63
63
  # via matplotlib
64
64
  python-dateutil==2.9.0.post0
65
65
  # via
66
66
  # matplotlib
67
67
  # scippneutron
68
68
  # scippnexus
69
- sciline==25.5.2
69
+ sciline==25.11.0
70
70
  # via -r base.in
71
71
  scipp==25.8.0
72
72
  # via
@@ -79,17 +79,17 @@ scippnexus==25.6.0
79
79
  # via
80
80
  # -r base.in
81
81
  # scippneutron
82
- scipy==1.15.3
82
+ scipy==1.16.3
83
83
  # via
84
84
  # scippneutron
85
85
  # scippnexus
86
86
  six==1.17.0
87
87
  # via python-dateutil
88
- typing-extensions==4.14.1
88
+ typing-extensions==4.15.0
89
89
  # via
90
90
  # pydantic
91
91
  # pydantic-core
92
92
  # sciline
93
93
  # typing-inspection
94
- typing-inspection==0.4.1
94
+ typing-inspection==0.4.2
95
95
  # via pydantic
@@ -7,49 +7,51 @@
7
7
  #
8
8
  asttokens==3.0.0
9
9
  # via stack-data
10
- certifi==2025.7.14
10
+ certifi==2025.10.5
11
11
  # via requests
12
- charset-normalizer==3.4.2
12
+ charset-normalizer==3.4.4
13
13
  # via requests
14
- comm==0.2.2
14
+ comm==0.2.3
15
15
  # via ipywidgets
16
- contourpy==1.3.2
16
+ contourpy==1.3.3
17
17
  # via matplotlib
18
18
  cycler==0.12.1
19
19
  # via matplotlib
20
20
  decorator==5.2.1
21
21
  # via ipython
22
- executing==2.2.0
22
+ executing==2.2.1
23
23
  # via stack-data
24
- fonttools==4.59.0
24
+ fonttools==4.60.1
25
25
  # via matplotlib
26
- idna==3.10
26
+ idna==3.11
27
27
  # via requests
28
- iniconfig==2.1.0
28
+ iniconfig==2.3.0
29
29
  # via pytest
30
- ipython==8.37.0
30
+ ipython==9.6.0
31
31
  # via ipywidgets
32
- ipywidgets==8.1.7
32
+ ipython-pygments-lexers==1.1.1
33
+ # via ipython
34
+ ipywidgets==8.1.8
33
35
  # via -r basetest.in
34
36
  jedi==0.19.2
35
37
  # via ipython
36
- jupyterlab-widgets==3.0.15
38
+ jupyterlab-widgets==3.0.16
37
39
  # via ipywidgets
38
- kiwisolver==1.4.8
40
+ kiwisolver==1.4.9
39
41
  # via matplotlib
40
42
  lazy-loader==0.4
41
43
  # via
42
44
  # plopp
43
45
  # tof
44
- llvmlite==0.44.0
46
+ llvmlite==0.45.1
45
47
  # via numba
46
- matplotlib==3.10.3
48
+ matplotlib==3.10.7
47
49
  # via plopp
48
- matplotlib-inline==0.1.7
50
+ matplotlib-inline==0.2.1
49
51
  # via ipython
50
- numba==0.61.2
52
+ numba==0.62.1
51
53
  # via -r basetest.in
52
- numpy==2.2.6
54
+ numpy==2.3.4
53
55
  # via
54
56
  # contourpy
55
57
  # matplotlib
@@ -62,21 +64,21 @@ packaging==25.0
62
64
  # matplotlib
63
65
  # pooch
64
66
  # pytest
65
- parso==0.8.4
67
+ parso==0.8.5
66
68
  # via jedi
67
69
  pexpect==4.9.0
68
70
  # via ipython
69
- pillow==11.3.0
71
+ pillow==12.0.0
70
72
  # via matplotlib
71
- platformdirs==4.3.8
73
+ platformdirs==4.5.0
72
74
  # via pooch
73
- plopp==25.7.0
75
+ plopp==25.10.0
74
76
  # via tof
75
77
  pluggy==1.6.0
76
78
  # via pytest
77
79
  pooch==1.8.2
78
80
  # via -r basetest.in
79
- prompt-toolkit==3.0.51
81
+ prompt-toolkit==3.0.52
80
82
  # via ipython
81
83
  ptyprocess==0.7.0
82
84
  # via pexpect
@@ -85,18 +87,19 @@ pure-eval==0.2.3
85
87
  pygments==2.19.2
86
88
  # via
87
89
  # ipython
90
+ # ipython-pygments-lexers
88
91
  # pytest
89
- pyparsing==3.2.3
92
+ pyparsing==3.2.5
90
93
  # via matplotlib
91
- pytest==8.4.1
94
+ pytest==8.4.2
92
95
  # via -r basetest.in
93
96
  python-dateutil==2.9.0.post0
94
97
  # via matplotlib
95
- requests==2.32.4
98
+ requests==2.32.5
96
99
  # via pooch
97
100
  scipp==25.8.0
98
101
  # via tof
99
- scipy==1.15.3
102
+ scipy==1.16.3
100
103
  # via
101
104
  # -r basetest.in
102
105
  # tof
@@ -104,19 +107,18 @@ six==1.17.0
104
107
  # via python-dateutil
105
108
  stack-data==0.6.3
106
109
  # via ipython
107
- tof==25.5.0
110
+ tof==25.10.1
108
111
  # via -r basetest.in
109
112
  traitlets==5.14.3
110
113
  # via
111
- # comm
112
114
  # ipython
113
115
  # ipywidgets
114
116
  # matplotlib-inline
115
- typing-extensions==4.14.1
117
+ typing-extensions==4.15.0
116
118
  # via ipython
117
119
  urllib3==2.5.0
118
120
  # via requests
119
- wcwidth==0.2.13
121
+ wcwidth==0.2.14
120
122
  # via prompt-toolkit
121
- widgetsnbextension==4.0.14
123
+ widgetsnbextension==4.0.15
122
124
  # via ipywidgets