essreduce 25.2.0__tar.gz → 25.2.2__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.
- {essreduce-25.2.0 → essreduce-25.2.2}/.copier-answers.yml +1 -1
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/workflows/docs.yml +1 -1
- essreduce-25.2.2/.github/workflows/weekly_windows_macos.yml +42 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.gitignore +2 -1
- {essreduce-25.2.0 → essreduce-25.2.2}/.pre-commit-config.yaml +1 -1
- {essreduce-25.2.0/src/essreduce.egg-info → essreduce-25.2.2}/PKG-INFO +1 -1
- {essreduce-25.2.0 → essreduce-25.2.2}/pyproject.toml +1 -2
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/ci.txt +1 -1
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/docs.txt +3 -1
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/make_base.py +9 -6
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/nightly.in +4 -1
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/nightly.txt +7 -4
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/static.txt +2 -2
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/__init__.py +4 -4
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/live/raw.py +13 -2
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/live/roi.py +1 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/time_of_flight/__init__.py +1 -2
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/__init__.py +9 -10
- {essreduce-25.2.0 → essreduce-25.2.2/src/essreduce.egg-info}/PKG-INFO +1 -1
- {essreduce-25.2.0 → essreduce-25.2.2}/src/essreduce.egg-info/SOURCES.txt +1 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/live/raw_test.py +41 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/live/roi_test.py +8 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tox.ini +4 -1
- {essreduce-25.2.0 → essreduce-25.2.2}/.copier-answers.ess.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/ISSUE_TEMPLATE/blank.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/ISSUE_TEMPLATE/high-level-requirement.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/dependabot.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/workflows/ci.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/workflows/nightly_at_main.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/workflows/nightly_at_release.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/workflows/python-version-ci +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/workflows/release.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/workflows/test.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.github/workflows/unpinned.yml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/.python-version +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/CODE_OF_CONDUCT.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/CONTRIBUTING.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/LICENSE +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/MANIFEST.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/README.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/conda/meta.yaml +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/_static/anaconda-icon.js +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/_static/favicon.svg +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/_static/logo-dark.svg +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/_static/logo.svg +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/_templates/class-template.rst +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/_templates/doc_version.html +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/_templates/module-template.rst +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/about/index.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/api-reference/index.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/conf.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/developer/coding-conventions.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/developer/dependency-management.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/developer/getting-started.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/developer/gui.ipynb +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/developer/index.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/index.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/user-guide/index.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/user-guide/reduction-workflow-guidelines.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/user-guide/tof/dream.ipynb +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/user-guide/tof/frame-unwrapping.ipynb +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/user-guide/tof/index.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/user-guide/tof/wfm.ipynb +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/docs/user-guide/widget.md +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/base.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/base.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/basetest.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/basetest.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/ci.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/dev.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/dev.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/docs.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/mypy.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/mypy.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/static.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/test.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/test.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/wheels.in +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/requirements/wheels.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/resources/logo.svg +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/setup.cfg +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/data.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/live/__init__.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/live/workflow.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/logging.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/nexus/__init__.py +10 -10
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/nexus/_nexus_loader.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/nexus/json_generator.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/nexus/json_nexus.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/nexus/types.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/nexus/workflow.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/parameter.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/py.typed +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/scripts/grow_nexus.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/streaming.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/time_of_flight/fakes.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/time_of_flight/simulation.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/time_of_flight/to_events.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/time_of_flight/toa_to_tof.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/time_of_flight/types.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/ui.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/uncertainty.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_base.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_binedges_widget.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_bounds_widget.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_config.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_filename_widget.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_linspace_widget.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_optional_widget.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_spinner.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_string_widget.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_switchable_widget.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/widgets/_vector_widget.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/ess/reduce/workflow.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/essreduce.egg-info/dependency_links.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/essreduce.egg-info/entry_points.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/essreduce.egg-info/requires.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/src/essreduce.egg-info/top_level.txt +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_generator_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_nexus_examples/array_dataset.json +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_nexus_examples/dataset.json +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_nexus_examples/detector.json +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_nexus_examples/entry.json +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_nexus_examples/event_data.json +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_nexus_examples/instrument.json +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_nexus_examples/log.json +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/json_nexus_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/nexus_loader_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/nexus/workflow_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/package_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/scripts/test_grow_nexus.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/streaming_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/time_of_flight/to_events_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/time_of_flight/unwrap_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/time_of_flight/wfm_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/uncertainty_test.py +0 -0
- {essreduce-25.2.0 → essreduce-25.2.2}/tests/widget_test.py +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Windows and MacOS weekly tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
schedule:
|
|
6
|
+
- cron: '0 2 * * 1'
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
pytox:
|
|
10
|
+
name: Python and Tox env
|
|
11
|
+
runs-on: 'ubuntu-24.04'
|
|
12
|
+
outputs:
|
|
13
|
+
min_python: ${{ steps.vars.outputs.min_python }}
|
|
14
|
+
min_tox_env: ${{ steps.vars.outputs.min_tox_env }}
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- name: Get Python version for other CI jobs
|
|
18
|
+
id: vars
|
|
19
|
+
run: |
|
|
20
|
+
echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT
|
|
21
|
+
echo "min_tox_env=py$(cat .github/workflows/python-version-ci | sed 's/\.//g')" >> $GITHUB_OUTPUT
|
|
22
|
+
tests:
|
|
23
|
+
name: Tests
|
|
24
|
+
needs: pytox
|
|
25
|
+
strategy:
|
|
26
|
+
matrix:
|
|
27
|
+
os: ['macos-latest', 'windows-latest']
|
|
28
|
+
python:
|
|
29
|
+
- version: '${{needs.pytox.outputs.min_python}}'
|
|
30
|
+
tox-env: '${{needs.pytox.outputs.min_tox_env}}'
|
|
31
|
+
uses: ./.github/workflows/test.yml
|
|
32
|
+
with:
|
|
33
|
+
os-variant: ${{ matrix.os }}
|
|
34
|
+
python-version: ${{ matrix.python.version }}
|
|
35
|
+
tox-env: ${{ matrix.python.tox-env }}
|
|
36
|
+
|
|
37
|
+
docs:
|
|
38
|
+
needs: tests
|
|
39
|
+
uses: ./.github/workflows/docs.yml
|
|
40
|
+
with:
|
|
41
|
+
publish: false
|
|
42
|
+
branch: ${{ github.head_ref == '' && github.ref_name || github.head_ref }}
|
|
@@ -23,7 +23,7 @@ repos:
|
|
|
23
23
|
args: [ "--drop-empty-cells",
|
|
24
24
|
"--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ]
|
|
25
25
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
26
|
-
rev: v0.
|
|
26
|
+
rev: v0.8.0
|
|
27
27
|
hooks:
|
|
28
28
|
- id: ruff
|
|
29
29
|
args: [ --fix ]
|
|
@@ -88,13 +88,12 @@ ignore = [
|
|
|
88
88
|
# https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
|
|
89
89
|
"COM812", "COM819", "D206", "D300", "E111", "E114", "E117", "ISC001", "ISC002", "Q000", "Q001", "Q002", "Q003", "W191",
|
|
90
90
|
]
|
|
91
|
-
fixable = ["B010", "I001", "PT001"]
|
|
91
|
+
fixable = ["B010", "I001", "PT001", "RUF022"]
|
|
92
92
|
isort.known-first-party = ["ess.reduce"]
|
|
93
93
|
pydocstyle.convention = "numpy"
|
|
94
94
|
|
|
95
95
|
[tool.ruff.lint.per-file-ignores]
|
|
96
96
|
# those files have an increased risk of relying on import order
|
|
97
|
-
"__init__.py" = ["I"]
|
|
98
97
|
"tests/*" = [
|
|
99
98
|
"S101", # asserts are fine in tests
|
|
100
99
|
"B018", # 'useless expressions' are ok because some tests just check for exceptions
|
|
@@ -10,6 +10,8 @@ accessible-pygments==0.0.5
|
|
|
10
10
|
# via pydata-sphinx-theme
|
|
11
11
|
alabaster==1.0.0
|
|
12
12
|
# via sphinx
|
|
13
|
+
appnope==0.1.4
|
|
14
|
+
# via ipykernel
|
|
13
15
|
asttokens==3.0.0
|
|
14
16
|
# via stack-data
|
|
15
17
|
attrs==25.1.0
|
|
@@ -114,7 +116,7 @@ mdurl==0.1.2
|
|
|
114
116
|
# via markdown-it-py
|
|
115
117
|
mistune==3.1.1
|
|
116
118
|
# via nbconvert
|
|
117
|
-
myst-parser==4.0.
|
|
119
|
+
myst-parser==4.0.1
|
|
118
120
|
# via -r docs.in
|
|
119
121
|
nbclient==0.10.2
|
|
120
122
|
# via nbconvert
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import sys
|
|
2
1
|
from argparse import ArgumentParser
|
|
3
2
|
from pathlib import Path
|
|
4
3
|
|
|
@@ -58,11 +57,15 @@ def as_nightly(repo: str) -> str:
|
|
|
58
57
|
else:
|
|
59
58
|
org = "scipp"
|
|
60
59
|
if repo == "scipp":
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
# With the standard pip resolver index-url takes precedence over
|
|
61
|
+
# extra-index-url but with uv it's reversed, so if we move to tox-uv
|
|
62
|
+
# this needs to be reversed.
|
|
63
|
+
return (
|
|
64
|
+
"scipp\n"
|
|
65
|
+
"--index-url=https://pypi.anaconda.org/scipp-nightly-wheels/simple/\n"
|
|
66
|
+
"--extra-index-url=https://pypi.org/simple\n"
|
|
67
|
+
"--pre"
|
|
68
|
+
)
|
|
66
69
|
return f"{repo} @ git+https://github.com/{org}/{repo}@main"
|
|
67
70
|
|
|
68
71
|
|
|
@@ -6,7 +6,10 @@ pooch
|
|
|
6
6
|
pytest
|
|
7
7
|
scipy>=1.7.0
|
|
8
8
|
scippnexus @ git+https://github.com/scipp/scippnexus@main
|
|
9
|
-
scipp
|
|
9
|
+
scipp
|
|
10
|
+
--index-url=https://pypi.anaconda.org/scipp-nightly-wheels/simple/
|
|
11
|
+
--extra-index-url=https://pypi.org/simple
|
|
12
|
+
--pre
|
|
10
13
|
sciline @ git+https://github.com/scipp/sciline@main
|
|
11
14
|
cyclebane @ git+https://github.com/scipp/cyclebane@main
|
|
12
15
|
scippneutron @ git+https://github.com/scipp/scippneutron@main
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
# SHA1:
|
|
1
|
+
# SHA1:804c57e3756542ebfed032534ab086369b4c9b6c
|
|
2
2
|
#
|
|
3
3
|
# This file is autogenerated by pip-compile-multi
|
|
4
4
|
# To update, run:
|
|
5
5
|
#
|
|
6
6
|
# pip-compile-multi
|
|
7
7
|
#
|
|
8
|
+
--index-url https://pypi.anaconda.org/scipp-nightly-wheels/simple/
|
|
9
|
+
--extra-index-url https://pypi.org/simple
|
|
10
|
+
|
|
8
11
|
annotated-types==0.7.0
|
|
9
12
|
# via pydantic
|
|
10
13
|
asttokens==3.0.0
|
|
@@ -108,9 +111,9 @@ ptyprocess==0.7.0
|
|
|
108
111
|
# via pexpect
|
|
109
112
|
pure-eval==0.2.3
|
|
110
113
|
# via stack-data
|
|
111
|
-
pydantic==2.
|
|
114
|
+
pydantic==2.11.0a2
|
|
112
115
|
# via scippneutron
|
|
113
|
-
pydantic-core==2.
|
|
116
|
+
pydantic-core==2.29.0
|
|
114
117
|
# via pydantic
|
|
115
118
|
pygments==2.19.1
|
|
116
119
|
# via ipython
|
|
@@ -127,7 +130,7 @@ requests==2.32.3
|
|
|
127
130
|
# via pooch
|
|
128
131
|
sciline @ git+https://github.com/scipp/sciline@main
|
|
129
132
|
# via -r nightly.in
|
|
130
|
-
scipp
|
|
133
|
+
scipp==100.0.0.dev0
|
|
131
134
|
# via
|
|
132
135
|
# -r nightly.in
|
|
133
136
|
# scippneutron
|
|
@@ -11,7 +11,7 @@ distlib==0.3.9
|
|
|
11
11
|
# via virtualenv
|
|
12
12
|
filelock==3.17.0
|
|
13
13
|
# via virtualenv
|
|
14
|
-
identify==2.6.
|
|
14
|
+
identify==2.6.7
|
|
15
15
|
# via pre-commit
|
|
16
16
|
nodeenv==1.9.1
|
|
17
17
|
# via pre-commit
|
|
@@ -21,5 +21,5 @@ pre-commit==4.1.0
|
|
|
21
21
|
# via -r static.in
|
|
22
22
|
pyyaml==6.0.2
|
|
23
23
|
# via pre-commit
|
|
24
|
-
virtualenv==20.29.
|
|
24
|
+
virtualenv==20.29.2
|
|
25
25
|
# via pre-commit
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
-
# Copyright (c)
|
|
3
|
-
# ruff: noqa: E402, F401
|
|
2
|
+
# Copyright (c) 2025 Scipp contributors (https://github.com/scipp)
|
|
3
|
+
# ruff: noqa: E402, F401, I
|
|
4
4
|
|
|
5
5
|
import importlib.metadata
|
|
6
6
|
|
|
7
|
-
from . import nexus,
|
|
7
|
+
from . import nexus, time_of_flight, uncertainty
|
|
8
8
|
|
|
9
9
|
try:
|
|
10
10
|
__version__ = importlib.metadata.version("essreduce")
|
|
@@ -13,4 +13,4 @@ except importlib.metadata.PackageNotFoundError:
|
|
|
13
13
|
|
|
14
14
|
del importlib
|
|
15
15
|
|
|
16
|
-
__all__ = ["nexus", "
|
|
16
|
+
__all__ = ["nexus", "time_of_flight", "uncertainty"]
|
|
@@ -255,10 +255,19 @@ class RollingDetectorView(Detector):
|
|
|
255
255
|
self._projection = projection
|
|
256
256
|
self._window = window
|
|
257
257
|
self._current = 0
|
|
258
|
-
self._history: sc.DataArray
|
|
259
|
-
self._cache: sc.DataArray
|
|
258
|
+
self._history: sc.DataArray
|
|
259
|
+
self._cache: sc.DataArray
|
|
260
|
+
self._cumulative: sc.DataArray
|
|
260
261
|
self.clear_counts()
|
|
261
262
|
|
|
263
|
+
@property
|
|
264
|
+
def max_window(self) -> int:
|
|
265
|
+
return self._window
|
|
266
|
+
|
|
267
|
+
@property
|
|
268
|
+
def cumulative(self) -> sc.DataArray:
|
|
269
|
+
return self._cumulative
|
|
270
|
+
|
|
262
271
|
def clear_counts(self) -> None:
|
|
263
272
|
"""
|
|
264
273
|
Clear counts.
|
|
@@ -275,6 +284,7 @@ class RollingDetectorView(Detector):
|
|
|
275
284
|
.copy()
|
|
276
285
|
)
|
|
277
286
|
self._cache = self._history.sum('window')
|
|
287
|
+
self._cumulative = sc.zeros_like(self._cache)
|
|
278
288
|
|
|
279
289
|
def make_roi_filter(self) -> roi.ROIFilter:
|
|
280
290
|
"""Return a ROI filter operating via the projection plane of the view."""
|
|
@@ -494,6 +504,7 @@ class RollingDetectorView(Detector):
|
|
|
494
504
|
self._cache -= self._history['window', self._current]
|
|
495
505
|
self._history['window', self._current] = counts
|
|
496
506
|
self._cache += counts
|
|
507
|
+
self._cumulative += counts
|
|
497
508
|
self._current = (self._current + 1) % self._window
|
|
498
509
|
|
|
499
510
|
|
|
@@ -32,6 +32,7 @@ def select_indices_in_intervals(
|
|
|
32
32
|
for dim, bounds in intervals.items():
|
|
33
33
|
low, high = sorted(bounds)
|
|
34
34
|
indices = indices[dim, low:high]
|
|
35
|
+
indices = indices if isinstance(indices, sc.Variable) else indices.data
|
|
35
36
|
indices = indices.flatten(to=out_dim)
|
|
36
37
|
if indices.bins is None:
|
|
37
38
|
return indices
|
|
@@ -7,8 +7,8 @@ neutron time-of-arrival at the detectors.
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
from .simulation import simulate_beamline
|
|
10
|
-
from .toa_to_tof import default_parameters, resample_tof_data, providers
|
|
11
10
|
from .to_events import to_events
|
|
11
|
+
from .toa_to_tof import default_parameters, providers, resample_tof_data
|
|
12
12
|
from .types import (
|
|
13
13
|
DistanceResolution,
|
|
14
14
|
LookupTableRelativeErrorThreshold,
|
|
@@ -25,7 +25,6 @@ from .types import (
|
|
|
25
25
|
TofData,
|
|
26
26
|
)
|
|
27
27
|
|
|
28
|
-
|
|
29
28
|
__all__ = [
|
|
30
29
|
"DistanceResolution",
|
|
31
30
|
"LookupTableRelativeErrorThreshold",
|
|
@@ -7,29 +7,28 @@ from typing import Any, Protocol
|
|
|
7
7
|
import ipywidgets as widgets
|
|
8
8
|
|
|
9
9
|
from ..parameter import (
|
|
10
|
+
BinEdgesParameter,
|
|
10
11
|
BooleanParameter,
|
|
11
12
|
FilenameParameter,
|
|
12
13
|
MultiFilenameParameter,
|
|
13
14
|
MultiStringParameter,
|
|
14
|
-
ParamWithOptions,
|
|
15
|
-
StringParameter,
|
|
16
15
|
Parameter,
|
|
17
16
|
ParamWithBounds,
|
|
18
|
-
|
|
17
|
+
ParamWithOptions,
|
|
18
|
+
StringParameter,
|
|
19
19
|
Vector2dParameter,
|
|
20
20
|
Vector3dParameter,
|
|
21
21
|
)
|
|
22
|
-
from ._config import default_layout, default_style
|
|
23
|
-
|
|
24
22
|
from ._binedges_widget import BinEdgesWidget
|
|
23
|
+
from ._bounds_widget import BoundsWidget
|
|
24
|
+
from ._config import default_layout, default_style
|
|
25
25
|
from ._filename_widget import FilenameWidget, MultiFilenameWidget
|
|
26
26
|
from ._linspace_widget import LinspaceWidget
|
|
27
|
-
from ._vector_widget import VectorWidget
|
|
28
|
-
from ._bounds_widget import BoundsWidget
|
|
29
|
-
from ._string_widget import MultiStringWidget, StringWidget
|
|
30
|
-
from ._switchable_widget import SwitchWidget
|
|
31
27
|
from ._optional_widget import OptionalWidget
|
|
32
28
|
from ._spinner import Spinner
|
|
29
|
+
from ._string_widget import MultiStringWidget, StringWidget
|
|
30
|
+
from ._switchable_widget import SwitchWidget
|
|
31
|
+
from ._vector_widget import VectorWidget
|
|
33
32
|
|
|
34
33
|
|
|
35
34
|
class EssWidget(Protocol):
|
|
@@ -189,8 +188,8 @@ __all__ = [
|
|
|
189
188
|
'LinspaceWidget',
|
|
190
189
|
'MultiFilenameWidget',
|
|
191
190
|
'OptionalWidget',
|
|
191
|
+
'Spinner',
|
|
192
192
|
'SwitchWidget',
|
|
193
193
|
'VectorWidget',
|
|
194
194
|
'create_parameter_widget',
|
|
195
|
-
'Spinner',
|
|
196
195
|
]
|
|
@@ -53,6 +53,15 @@ def test_Detector_bincount_raises_if_detector_number_not_consecutive() -> None:
|
|
|
53
53
|
det.bincount([1])
|
|
54
54
|
|
|
55
55
|
|
|
56
|
+
@pytest.mark.parametrize('window', [1, 2, 33])
|
|
57
|
+
def test_RollingDetectorView_max_window_property_returns_configured(
|
|
58
|
+
window: int,
|
|
59
|
+
) -> None:
|
|
60
|
+
detector_number = sc.array(dims=['pixel'], values=[1, 2, 3], unit=None)
|
|
61
|
+
det = raw.RollingDetectorView(detector_number=detector_number, window=window)
|
|
62
|
+
assert det.max_window == window
|
|
63
|
+
|
|
64
|
+
|
|
56
65
|
def test_RollingDetectorView_full_window() -> None:
|
|
57
66
|
detector_number = sc.array(dims=['pixel'], values=[1, 2, 3], unit=None)
|
|
58
67
|
det = raw.RollingDetectorView(detector_number=detector_number, window=2)
|
|
@@ -69,6 +78,38 @@ def test_RollingDetectorView_full_window() -> None:
|
|
|
69
78
|
assert det.get().sum().value == 2
|
|
70
79
|
|
|
71
80
|
|
|
81
|
+
def test_RollingDetectorView_cumulative_returns_everything_since_clear() -> None:
|
|
82
|
+
detector_number = sc.array(dims=['pixel'], values=[1, 2, 3], unit=None)
|
|
83
|
+
det = raw.RollingDetectorView(detector_number=detector_number, window=2)
|
|
84
|
+
expected = sc.zeros_like(det.get())
|
|
85
|
+
assert sc.identical(det.cumulative, expected)
|
|
86
|
+
det.add_counts([1, 2, 3, 2])
|
|
87
|
+
delta1 = det.get(window=1)
|
|
88
|
+
expected += delta1
|
|
89
|
+
assert sc.identical(det.cumulative, expected)
|
|
90
|
+
det.add_counts([1, 3, 2])
|
|
91
|
+
delta2 = det.get(window=1)
|
|
92
|
+
expected += delta2
|
|
93
|
+
assert sc.identical(det.cumulative, expected)
|
|
94
|
+
assert sc.identical(det.cumulative, det.get()) # everything still in window
|
|
95
|
+
det.add_counts([1, 2])
|
|
96
|
+
delta3 = det.get(window=1)
|
|
97
|
+
expected += delta3
|
|
98
|
+
assert sc.identical(det.cumulative, expected)
|
|
99
|
+
assert not sc.identical(det.cumulative, det.get()) # delta1 fell out of window
|
|
100
|
+
det.add_counts([])
|
|
101
|
+
assert sc.identical(det.cumulative, expected)
|
|
102
|
+
# Reset
|
|
103
|
+
det.clear_counts()
|
|
104
|
+
expected = sc.zeros_like(expected)
|
|
105
|
+
assert sc.identical(det.cumulative, expected)
|
|
106
|
+
assert sc.identical(det.cumulative, expected)
|
|
107
|
+
det.add_counts([1, 2, 3, 2])
|
|
108
|
+
delta1 = det.get(window=1)
|
|
109
|
+
expected += delta1
|
|
110
|
+
assert sc.identical(det.cumulative, expected)
|
|
111
|
+
|
|
112
|
+
|
|
72
113
|
def test_RollingDetectorView_add_events_accepts_unsorted_detector_number() -> None:
|
|
73
114
|
detector_number = sc.array(dims=['detector_number'], values=[1, 3, 2], unit=None)
|
|
74
115
|
det = raw.RollingDetectorView(detector_number=detector_number, window=2)
|
|
@@ -64,6 +64,14 @@ def test_select_indices_fails_without_required_coords():
|
|
|
64
64
|
)
|
|
65
65
|
|
|
66
66
|
|
|
67
|
+
def test_select_indices_works_with_empty_selection(binned_indices):
|
|
68
|
+
selected = roi.select_indices_in_intervals(
|
|
69
|
+
intervals=sc.DataGroup(x=(1, 1)), indices=binned_indices
|
|
70
|
+
)
|
|
71
|
+
assert selected.dim == 'index'
|
|
72
|
+
assert selected.sizes[selected.dim] == 0
|
|
73
|
+
|
|
74
|
+
|
|
67
75
|
def test_apply_selection_empty_yields_empty_result():
|
|
68
76
|
selection = sc.array(dims=['index'], values=[], unit=None, dtype='int32')
|
|
69
77
|
data = sc.arange('detector_number', 12, dtype='int32')
|
|
@@ -10,6 +10,9 @@ commands = pytest {posargs}
|
|
|
10
10
|
|
|
11
11
|
[testenv:nightly]
|
|
12
12
|
deps = -r requirements/nightly.txt
|
|
13
|
+
setenv =
|
|
14
|
+
PIP_INDEX_URL = https://pypi.anaconda.org/scipp-nightly-wheels/simple
|
|
15
|
+
PIP_EXTRA_INDEX_URL = https://pypi.org/simple
|
|
13
16
|
commands = pytest {posargs}
|
|
14
17
|
|
|
15
18
|
[testenv:unpinned]
|
|
@@ -64,4 +67,4 @@ deps =
|
|
|
64
67
|
skip_install = true
|
|
65
68
|
changedir = requirements
|
|
66
69
|
commands = python ./make_base.py --nightly scippnexus,scipp,sciline,cyclebane,scippneutron,tof
|
|
67
|
-
pip-compile-multi -d . --backtracking
|
|
70
|
+
pip-compile-multi -d . --backtracking --annotate-index
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -13,23 +13,23 @@ The submodule :mod:`types` defines all domain types.
|
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
from . import types
|
|
16
|
-
from .workflow import GenericNeXusWorkflow
|
|
17
16
|
from ._nexus_loader import (
|
|
18
|
-
load_data,
|
|
19
|
-
group_event_data,
|
|
20
|
-
load_component,
|
|
21
|
-
load_all_components,
|
|
22
17
|
compute_component_position,
|
|
23
18
|
extract_signal_data_array,
|
|
19
|
+
group_event_data,
|
|
20
|
+
load_all_components,
|
|
21
|
+
load_component,
|
|
22
|
+
load_data,
|
|
24
23
|
)
|
|
24
|
+
from .workflow import GenericNeXusWorkflow
|
|
25
25
|
|
|
26
26
|
__all__ = [
|
|
27
|
-
'
|
|
27
|
+
'GenericNeXusWorkflow',
|
|
28
|
+
'compute_component_position',
|
|
29
|
+
'extract_signal_data_array',
|
|
28
30
|
'group_event_data',
|
|
29
31
|
'load_all_components',
|
|
30
|
-
'load_data',
|
|
31
32
|
'load_component',
|
|
32
|
-
'
|
|
33
|
-
'
|
|
34
|
-
'GenericNeXusWorkflow',
|
|
33
|
+
'load_data',
|
|
34
|
+
'types',
|
|
35
35
|
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|