From 9a28d697ec753ae74faca32dace28a632a9fd143 Mon Sep 17 00:00:00 2001 From: YooSunyoung Date: Wed, 21 Feb 2024 14:48:24 +0100 Subject: [PATCH 001/330] ESSspectroscopy from ess template. --- .../essspectroscopy/.copier-answers.ess.yml | 3 + .../.github/ISSUE_TEMPLATE/blank.md | 8 ++ .../ISSUE_TEMPLATE/high-level-requirement.yml | 89 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 packages/essspectroscopy/.copier-answers.ess.yml create mode 100644 packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md create mode 100644 packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml diff --git a/packages/essspectroscopy/.copier-answers.ess.yml b/packages/essspectroscopy/.copier-answers.ess.yml new file mode 100644 index 000000000..1ab77e63d --- /dev/null +++ b/packages/essspectroscopy/.copier-answers.ess.yml @@ -0,0 +1,3 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 0951a4b +_src_path: https://github.com/scipp/ess_template.git diff --git a/packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md b/packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md new file mode 100644 index 000000000..22a75aeb0 --- /dev/null +++ b/packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md @@ -0,0 +1,8 @@ +--- +name: Blank +about: General issue that does not fit another category +title: '' +labels: '' +assignees: '' + +--- diff --git a/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml b/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml new file mode 100644 index 000000000..cedef1d90 --- /dev/null +++ b/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml @@ -0,0 +1,89 @@ +name: High-level requirement +description: Describe a high-level requirement +title: "[Requirement] " +labels: ["requirement"] +projects: [] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to provide as many details as possible for this requirement! + - type: input + id: summary + attributes: + label: Executive summary + description: Provide a short summary of the requirement + placeholder: "Example: We need to correct for X when processing Y." + validations: + required: true + - type: textarea + id: context + attributes: + label: Context and background knowledge + description: | + - What is the context of this requirement? + - What background knowledge is required to understand it? + - Does this depend on previous tasks? Provide links! + - Is there follow-up work? + placeholder: "Example: See summary on Wikipedia, or the following paper." + validations: + required: true + - type: textarea + id: inputs + attributes: + label: Inputs + description: | + Describe in detail all the input data and data properties that are known. + This is not about test data (see below), but about general properties of data that will be used in practice. + placeholder: "Example: A single 1-D spectrum with a known wavelength range." + validations: + required: true + - type: textarea + id: methodology + attributes: + label: Methodology + description: | + Describe, e.g., the computation to be performed. + When linking to references, please refer to the specific section, page, or equation. + placeholder: "Remember you can write equations such as $n\\lambda = 2d\\sin(\\theta)$ using LaTeX syntax, as well as other Markdown formatting." + validations: + required: true + - type: textarea + id: outputs + attributes: + label: Outputs + description: | + Describe in detail all the output data and data properties. + This is not about test data (see below), but about general properties of data that will be used in practice. + placeholder: "Example: The position of the peak in the spectrum." + validations: + required: true + - type: dropdown + id: interfaces + attributes: + label: Which interfaces are required? + multiple: true + options: + - Integrated into reduction workflow + - Python module / function + - Python script + - Jupyter notebook + - Other (please describe in comments) + default: 0 + validations: + required: true + - type: textarea + id: testcases + attributes: + label: Test cases + description: How can we test this requirement? Links to tests data and reference data, or other suggestions. + validations: + required: true + - type: textarea + id: comments + attributes: + label: Comments + description: Do you have other comments that do not fall in the above categories? + placeholder: "Example: Depends on issues #1234, blocked by #666." + validations: + required: false From 90d85d5e5f8830135cde8a8cd2179e52f49b35d7 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 22 Feb 2024 14:38:41 +0100 Subject: [PATCH 002/330] Add copier template --- packages/essspectroscopy/.copier-answers.yml | 13 + .../essspectroscopy/.github/dependabot.yml | 13 + .../essspectroscopy/.github/workflows/ci.yml | 59 ++++ .../.github/workflows/docs.yml | 75 ++++++ .../.github/workflows/nightly_at_main.yml | 36 +++ .../.github/workflows/nightly_at_release.yml | 43 +++ .../.github/workflows/python-version-ci | 1 + .../.github/workflows/release.yml | 116 ++++++++ .../.github/workflows/test.yml | 64 +++++ .../.github/workflows/unpinned.yml | 43 +++ packages/essspectroscopy/.gitignore | 40 +++ .../essspectroscopy/.pre-commit-config.yaml | 59 ++++ packages/essspectroscopy/CODE_OF_CONDUCT.md | 134 ++++++++++ packages/essspectroscopy/CONTRIBUTING.md | 20 ++ packages/essspectroscopy/LICENSE | 29 ++ packages/essspectroscopy/MANIFEST.in | 1 + packages/essspectroscopy/README.md | 16 ++ packages/essspectroscopy/conda/meta.yaml | 39 +++ .../docs/_static/anaconda-icon.js | 13 + .../docs/_templates/class-template.rst | 31 +++ .../docs/_templates/doc_version.html | 2 + .../docs/_templates/module-template.rst | 66 +++++ packages/essspectroscopy/docs/about/index.md | 26 ++ .../docs/api-reference/index.md | 29 ++ packages/essspectroscopy/docs/conf.py | 251 ++++++++++++++++++ .../docs/developer/coding-conventions.md | 117 ++++++++ .../docs/developer/dependency-management.md | 13 + .../docs/developer/getting-started.md | 91 +++++++ .../essspectroscopy/docs/developer/index.md | 16 ++ packages/essspectroscopy/docs/index.md | 16 ++ packages/essspectroscopy/pyproject.toml | 79 ++++++ packages/essspectroscopy/requirements/base.in | 4 + .../essspectroscopy/requirements/basetest.in | 4 + packages/essspectroscopy/requirements/ci.in | 4 + packages/essspectroscopy/requirements/dev.in | 11 + packages/essspectroscopy/requirements/docs.in | 10 + .../essspectroscopy/requirements/make_base.py | 70 +++++ packages/essspectroscopy/requirements/mypy.in | 2 + .../essspectroscopy/requirements/nightly.in | 3 + .../essspectroscopy/requirements/static.in | 1 + packages/essspectroscopy/requirements/test.in | 4 + .../essspectroscopy/requirements/wheels.in | 1 + packages/essspectroscopy/setup.cfg | 4 + .../src/ess/spectroscopy/__init__.py | 12 + .../src/ess/spectroscopy/py.typed | 0 .../essspectroscopy/tests/package_test.py | 7 + packages/essspectroscopy/tox.ini | 67 +++++ 47 files changed, 1755 insertions(+) create mode 100644 packages/essspectroscopy/.copier-answers.yml create mode 100644 packages/essspectroscopy/.github/dependabot.yml create mode 100644 packages/essspectroscopy/.github/workflows/ci.yml create mode 100644 packages/essspectroscopy/.github/workflows/docs.yml create mode 100644 packages/essspectroscopy/.github/workflows/nightly_at_main.yml create mode 100644 packages/essspectroscopy/.github/workflows/nightly_at_release.yml create mode 100644 packages/essspectroscopy/.github/workflows/python-version-ci create mode 100644 packages/essspectroscopy/.github/workflows/release.yml create mode 100644 packages/essspectroscopy/.github/workflows/test.yml create mode 100644 packages/essspectroscopy/.github/workflows/unpinned.yml create mode 100644 packages/essspectroscopy/.gitignore create mode 100644 packages/essspectroscopy/.pre-commit-config.yaml create mode 100644 packages/essspectroscopy/CODE_OF_CONDUCT.md create mode 100644 packages/essspectroscopy/CONTRIBUTING.md create mode 100644 packages/essspectroscopy/LICENSE create mode 100644 packages/essspectroscopy/MANIFEST.in create mode 100644 packages/essspectroscopy/README.md create mode 100644 packages/essspectroscopy/conda/meta.yaml create mode 100644 packages/essspectroscopy/docs/_static/anaconda-icon.js create mode 100644 packages/essspectroscopy/docs/_templates/class-template.rst create mode 100644 packages/essspectroscopy/docs/_templates/doc_version.html create mode 100644 packages/essspectroscopy/docs/_templates/module-template.rst create mode 100644 packages/essspectroscopy/docs/about/index.md create mode 100644 packages/essspectroscopy/docs/api-reference/index.md create mode 100644 packages/essspectroscopy/docs/conf.py create mode 100644 packages/essspectroscopy/docs/developer/coding-conventions.md create mode 100644 packages/essspectroscopy/docs/developer/dependency-management.md create mode 100644 packages/essspectroscopy/docs/developer/getting-started.md create mode 100644 packages/essspectroscopy/docs/developer/index.md create mode 100644 packages/essspectroscopy/docs/index.md create mode 100644 packages/essspectroscopy/pyproject.toml create mode 100644 packages/essspectroscopy/requirements/base.in create mode 100644 packages/essspectroscopy/requirements/basetest.in create mode 100644 packages/essspectroscopy/requirements/ci.in create mode 100644 packages/essspectroscopy/requirements/dev.in create mode 100644 packages/essspectroscopy/requirements/docs.in create mode 100644 packages/essspectroscopy/requirements/make_base.py create mode 100644 packages/essspectroscopy/requirements/mypy.in create mode 100644 packages/essspectroscopy/requirements/nightly.in create mode 100644 packages/essspectroscopy/requirements/static.in create mode 100644 packages/essspectroscopy/requirements/test.in create mode 100644 packages/essspectroscopy/requirements/wheels.in create mode 100644 packages/essspectroscopy/setup.cfg create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/__init__.py create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/py.typed create mode 100644 packages/essspectroscopy/tests/package_test.py create mode 100644 packages/essspectroscopy/tox.ini diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml new file mode 100644 index 000000000..e195d6df4 --- /dev/null +++ b/packages/essspectroscopy/.copier-answers.yml @@ -0,0 +1,13 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 6770edb +_src_path: gh:scipp/copier_template +description: 'Spectroscopy data reduction for the European Spallation Source ' +max_python: '3.12' +min_python: '3.10' +namespace_package: ess +nightly_deps: scipp,scippneutron,sciline,plopp,scippnexus +orgname: scipp +prettyname: ESSspectroscopy +projectname: essspectroscopy +related_projects: Scipp,ScippNeutron,ScippNexus,Plopp,Sciline +year: 2024 diff --git a/packages/essspectroscopy/.github/dependabot.yml b/packages/essspectroscopy/.github/dependabot.yml new file mode 100644 index 000000000..c8076bb1f --- /dev/null +++ b/packages/essspectroscopy/.github/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 +updates: + # Note: We are not listing package-ecosystem: "github-actions". This causes + # noise in all template instances. Instead dependabot.yml in scipp/copier_template + # triggers updates of github-actions in the *template*. We then use `copier update` + # in template instances. + - package-ecosystem: "pip" + directory: "/requirements" + schedule: + interval: "daily" + allow: + - dependency-name: "scipp" + dependency-type: "direct" diff --git a/packages/essspectroscopy/.github/workflows/ci.yml b/packages/essspectroscopy/.github/workflows/ci.yml new file mode 100644 index 000000000..497ab895e --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/ci.yml @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +name: CI + +on: + push: + branches: + - main + - release + pull_request: + +jobs: + formatting: + name: Formatting and static analysis + runs-on: 'ubuntu-22.04' + outputs: + min_python: ${{ steps.vars.outputs.min_python }} + min_tox_env: ${{ steps.vars.outputs.min_tox_env }} + steps: + - uses: actions/checkout@v4 + - name: Get Python version for other CI jobs + id: vars + run: | + echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT + echo "min_tox_env=py$(cat .github/workflows/python-version-ci | sed 's/\.//g')" >> $GITHUB_OUTPUT + - uses: actions/setup-python@v4 + with: + python-version-file: '.github/workflows/python-version-ci' + - uses: pre-commit/action@v3.0.1 + with: + extra_args: --all-files + - uses: pre-commit-ci/lite-action@v1.0.1 + if: always() + with: + msg: Apply automatic formatting + + tests: + name: Tests + needs: formatting + strategy: + matrix: + os: ['ubuntu-22.04'] + python: + - version: '${{needs.formatting.outputs.min_python}}' + tox-env: '${{needs.formatting.outputs.min_tox_env}}' + uses: ./.github/workflows/test.yml + with: + os-variant: ${{ matrix.os }} + python-version: ${{ matrix.python.version }} + tox-env: ${{ matrix.python.tox-env }} + + docs: + needs: tests + uses: ./.github/workflows/docs.yml + with: + publish: false + linkcheck: ${{ contains(matrix.variant.os, 'ubuntu') && github.ref == 'refs/heads/main' }} + branch: ${{ github.head_ref == '' && github.ref_name || github.head_ref }} diff --git a/packages/essspectroscopy/.github/workflows/docs.yml b/packages/essspectroscopy/.github/workflows/docs.yml new file mode 100644 index 000000000..5e189fb0b --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/docs.yml @@ -0,0 +1,75 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +name: Docs + +on: + workflow_dispatch: + inputs: + publish: + default: false + type: boolean + version: + default: '' + required: false + type: string + branch: + description: 'Branch/tag with documentation source. If not set, the current branch will be used.' + default: '' + required: false + type: string + workflow_call: + inputs: + publish: + default: false + type: boolean + version: + default: '' + required: false + type: string + branch: + description: 'Branch/tag with documentation source. If not set, the current branch will be used.' + default: '' + required: false + type: string + linkcheck: + description: 'Run the link checker. If not set the link checker will not be run.' + default: false + required: false + type: boolean + +env: + VERSION: ${{ inputs.version }} + +jobs: + docs: + name: Build documentation + runs-on: 'ubuntu-22.04' + steps: + - run: sudo apt install --yes graphviz pandoc + - uses: actions/checkout@v3 + with: + ref: ${{ inputs.branch == '' && github.ref_name || inputs.branch }} + fetch-depth: 0 # history required so cmake can determine version + - uses: actions/setup-python@v4 + with: + python-version-file: '.github/workflows/python-version-ci' + - run: python -m pip install --upgrade pip + - run: python -m pip install -r requirements/ci.txt + - run: tox -e releasedocs -- ${VERSION} + if: ${{ inputs.version != '' }} + - run: tox -e docs + if: ${{ inputs.version == '' }} + - run: tox -e linkcheck + if: ${{ inputs.linkcheck }} + - uses: actions/upload-artifact@v3 + with: + name: docs_html + path: html/ + + - uses: JamesIves/github-pages-deploy-action@v4.4.3 + if: ${{ inputs.publish }} + with: + branch: gh-pages + folder: html + single-commit: true diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml new file mode 100644 index 000000000..10730688b --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +name: Nightly test at main branch + +on: + workflow_dispatch: + schedule: + - cron: '30 1 * * 1-5' + +jobs: + setup: + name: Setup variables + runs-on: 'ubuntu-22.04' + outputs: + min_python: ${{ steps.vars.outputs.min_python }} + steps: + - uses: actions/checkout@v4 + - name: Get Python version for other CI jobs + id: vars + run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT + + tests: + name: Tests + needs: setup + strategy: + matrix: + os: ['ubuntu-22.04'] + python: + - version: '${{needs.setup.outputs.min_python}}' + tox-env: 'nightly' + uses: ./.github/workflows/test.yml + with: + os-variant: ${{ matrix.os }} + python-version: ${{ matrix.python.version }} + tox-env: ${{ matrix.python.tox-env }} diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml new file mode 100644 index 000000000..7f1653bba --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +name: Nightly tests at latest release + +on: + workflow_dispatch: + schedule: + - cron: '0 1 * * 1-5' + +jobs: + setup: + name: Setup variables + runs-on: 'ubuntu-22.04' + outputs: + min_python: ${{ steps.vars.outputs.min_python }} + release_tag: ${{ steps.release.outputs.release_tag }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # history required so we can determine latest release tag + - name: Get last release tag from git + id: release + run: echo "release_tag=$(git describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*')" >> $GITHUB_OUTPUT + - name: Get Python version for other CI jobs + id: vars + run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT + + tests: + name: Tests + needs: setup + strategy: + matrix: + os: ['ubuntu-22.04'] + python: + - version: '${{needs.setup.outputs.min_python}}' + tox-env: 'nightly' + uses: ./.github/workflows/test.yml + with: + os-variant: ${{ matrix.os }} + python-version: ${{ matrix.python.version }} + tox-env: ${{ matrix.python.tox-env }} + checkout_ref: ${{ needs.setup.outputs.release_tag }} diff --git a/packages/essspectroscopy/.github/workflows/python-version-ci b/packages/essspectroscopy/.github/workflows/python-version-ci new file mode 100644 index 000000000..c8cfe3959 --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/python-version-ci @@ -0,0 +1 @@ +3.10 diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml new file mode 100644 index 000000000..e492978a7 --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/release.yml @@ -0,0 +1,116 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +name: Release + +on: + release: + types: [published] + workflow_dispatch: + +defaults: + run: + shell: bash -l {0} # required for conda env + +jobs: + build_conda: + name: Conda build + runs-on: 'ubuntu-22.04' + + steps: + - uses: actions/checkout@v3 + with: + submodules: true + fetch-depth: 0 # history required so setuptools_scm can determine version + + - uses: mamba-org/setup-micromamba@v1 + with: + environment-name: build-env + create-args: >- + conda-build + boa + - run: conda mambabuild --channel conda-forge --channel scipp --no-anaconda-upload --override-channels --output-folder conda/package conda + + - uses: actions/upload-artifact@v3 + with: + name: conda-package-noarch + path: conda/package/noarch/*.tar.bz2 + + build_wheels: + name: Wheels + runs-on: 'ubuntu-22.04' + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # history required so setuptools_scm can determine version + + - uses: actions/setup-python@v4 + with: + python-version-file: '.github/workflows/python-version-ci' + + - run: python -m pip install --upgrade pip + - run: python -m pip install -r requirements/wheels.txt + + - name: Build wheels + run: python -m build + + - name: Upload wheels + uses: actions/upload-artifact@v3 + with: + name: dist + path: dist + + upload_pypi: + name: Deploy PyPI + needs: [build_wheels, build_conda] + runs-on: 'ubuntu-22.04' + environment: release + permissions: + id-token: write + if: github.event_name == 'release' && github.event.action == 'published' + steps: + - uses: actions/download-artifact@v3 + - uses: pypa/gh-action-pypi-publish@v1.8.10 + + upload_conda: + name: Deploy Conda + needs: [build_wheels, build_conda] + runs-on: 'ubuntu-22.04' + if: github.event_name == 'release' && github.event.action == 'published' + + steps: + - uses: actions/download-artifact@v3 + - uses: mamba-org/setup-micromamba@v1 + with: + environment-name: upload-env + # frozen python due to breaking removal of 'imp' in 3.12 + create-args: >- + anaconda-client + python=3.11 + - run: anaconda --token ${{ secrets.ANACONDATOKEN }} upload --user scipp --label main $(ls conda-package-noarch/*.tar.bz2) + + docs: + needs: [upload_conda, upload_pypi] + uses: ./.github/workflows/docs.yml + with: + publish: ${{ github.event_name == 'release' && github.event.action == 'published' }} + secrets: inherit + + assets: + name: Upload docs + needs: docs + runs-on: 'ubuntu-22.04' + permissions: + contents: write # This is needed so that the action can upload the asset + steps: + - uses: actions/download-artifact@v3 + - name: Zip documentation + run: | + mv docs_html documentation-${{ github.ref_name }} + zip -r documentation-${{ github.ref_name }}.zip documentation-${{ github.ref_name }} + - name: Upload release assets + uses: svenstaro/upload-release-action@v2 + with: + file: ./documentation-${{ github.ref_name }}.zip + overwrite: false diff --git a/packages/essspectroscopy/.github/workflows/test.yml b/packages/essspectroscopy/.github/workflows/test.yml new file mode 100644 index 000000000..3cfb75de8 --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/test.yml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +name: Test + +on: + workflow_dispatch: + inputs: + os-variant: + default: 'ubuntu-22.04' + type: string + python-version: + type: string + tox-env: + default: 'test' + type: string + pip-recipe: + default: 'requirements/ci.txt' + type: string + coverage-report: + default: false + type: boolean + checkout_ref: + default: '' + type: string + workflow_call: + inputs: + os-variant: + default: 'ubuntu-22.04' + type: string + python-version: + type: string + tox-env: + default: 'test' + type: string + pip-recipe: + default: 'requirements/ci.txt' + type: string + coverage-report: + default: false + type: boolean + checkout_ref: + default: '' + type: string + +jobs: + test: + runs-on: ${{ inputs.os-variant }} + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ inputs.checkout_ref }} + - uses: actions/setup-python@v3 + with: + python-version: ${{ inputs.python-version }} + - run: python -m pip install --upgrade pip + - run: python -m pip install -r ${{ inputs.pip-recipe }} + - run: tox -e ${{ inputs.tox-env }} + - uses: actions/upload-artifact@v3 + if: ${{ inputs.coverage-report }} + with: + name: CoverageReport + path: coverage_html/ diff --git a/packages/essspectroscopy/.github/workflows/unpinned.yml b/packages/essspectroscopy/.github/workflows/unpinned.yml new file mode 100644 index 000000000..853c1ec56 --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/unpinned.yml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +name: Unpinned tests at latest release + +on: + workflow_dispatch: + schedule: + - cron: '0 2 * * 1' + +jobs: + setup: + name: Setup variables + runs-on: 'ubuntu-22.04' + outputs: + min_python: ${{ steps.vars.outputs.min_python }} + release_tag: ${{ steps.release.outputs.release_tag }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # history required so we can determine latest release tag + - name: Get last release tag from git + id: release + run: echo "release_tag=$(git describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*')" >> $GITHUB_OUTPUT + - name: Get Python version for other CI jobs + id: vars + run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT + + tests: + name: Tests + needs: setup + strategy: + matrix: + os: ['ubuntu-22.04'] + python: + - version: '${{needs.setup.outputs.min_python}}' + tox-env: 'unpinned' + uses: ./.github/workflows/test.yml + with: + os-variant: ${{ matrix.os }} + python-version: ${{ matrix.python.version }} + tox-env: ${{ matrix.python.tox-env }} + checkout_ref: ${{ needs.setup.outputs.release_tag }} diff --git a/packages/essspectroscopy/.gitignore b/packages/essspectroscopy/.gitignore new file mode 100644 index 000000000..0f0541bc6 --- /dev/null +++ b/packages/essspectroscopy/.gitignore @@ -0,0 +1,40 @@ +# Build artifacts +build +dist +html +.tox +*.egg-info + +*.sw? + +# Environments +venv + +# Caches +.clangd/ +*.ipynb_checkpoints +__pycache__/ +.vs/ +.virtual_documents +.hypothesis +.pytest_cache +.mypy_cache +docs/generated/ + +# Editor settings +.idea/ +.vscode/ + +# Data files +*.data +*.dat +*.csv +*.xye +*.h5 +*.hdf5 +*.hdf +*.nxs +*.raw +*.cif +*.rcif +*.ort diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml new file mode 100644 index 000000000..19830db7b --- /dev/null +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -0,0 +1,59 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-added-large-files + - id: check-json + exclude: asv.conf.json + - id: check-merge-conflict + - id: check-toml + - id: check-yaml + exclude: conda/meta.yaml + - id: detect-private-key + - id: trailing-whitespace + args: [ --markdown-linebreak-ext=md ] + exclude: '\.svg' + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + name: isort (python) + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 23.11.0 + hooks: + - id: black + - repo: https://github.com/kynan/nbstripout + rev: 0.6.0 + hooks: + - id: nbstripout + types: [ "jupyter" ] + args: [ "--drop-empty-cells", + "--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ] + - repo: https://github.com/pycqa/flake8 + rev: 6.1.0 + hooks: + - id: flake8 + types: ["python"] + additional_dependencies: ["flake8-bugbear==23.9.16"] + - repo: https://github.com/pycqa/bandit + rev: 1.7.5 + hooks: + - id: bandit + additional_dependencies: ["bandit[toml]"] + args: ["-c", "pyproject.toml"] + - repo: https://github.com/codespell-project/codespell + rev: v2.2.6 + hooks: + - id: codespell + additional_dependencies: + - tomli + - repo: https://github.com/pre-commit/pygrep-hooks + rev: v1.10.0 + hooks: + - id: python-no-eval + - id: python-no-log-warn + - id: python-use-type-annotations + - id: rst-backticks + - id: rst-directive-colons + - id: rst-inline-touching-normal + - id: text-unicode-replacement-char diff --git a/packages/essspectroscopy/CODE_OF_CONDUCT.md b/packages/essspectroscopy/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..1c3746e41 --- /dev/null +++ b/packages/essspectroscopy/CODE_OF_CONDUCT.md @@ -0,0 +1,134 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +scipp[at]ess.eu. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations + diff --git a/packages/essspectroscopy/CONTRIBUTING.md b/packages/essspectroscopy/CONTRIBUTING.md new file mode 100644 index 000000000..daeb6f875 --- /dev/null +++ b/packages/essspectroscopy/CONTRIBUTING.md @@ -0,0 +1,20 @@ +## Contributing to ESSspectroscopy + +Welcome to the developer side of ESSspectroscopy! + +Contributions are always welcome. +This includes reporting bugs or other issues, submitting pull requests, requesting new features, etc. + +If you need help with using ESSspectroscopy or contributing to it, have a look at the GitHub [discussions](https://github.com/scipp/essspectroscopy/discussions) and start a new [Q&A discussion](https://github.com/scipp/essspectroscopy/discussions/categories/q-a) if you can't find what you are looking for. + +For bug reports and other problems, please open an [issue](https://github.com/scipp/essspectroscopy/issues/new) in GitHub. + +You are welcome to submit pull requests at any time. +But to avoid having to make large modifications during review or even have your PR rejected, please first open an issue first to discuss your idea! + +Check out the subsections of the [Developer documentation](https://scipp.github.io/essspectroscopy/developer/index.html) for details on how ESSspectroscopy is developed. + +## Code of conduct + +This project is a community effort, and everyone is welcome to contribute. +Everyone within the community is expected to abide by our [code of conduct](https://github.com/scipp/essspectroscopy/blob/main/CODE_OF_CONDUCT.md). diff --git a/packages/essspectroscopy/LICENSE b/packages/essspectroscopy/LICENSE new file mode 100644 index 000000000..54b3cf4d5 --- /dev/null +++ b/packages/essspectroscopy/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2024, Scipp contributors (https://github.com/scipp) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/essspectroscopy/MANIFEST.in b/packages/essspectroscopy/MANIFEST.in new file mode 100644 index 000000000..1aba38f67 --- /dev/null +++ b/packages/essspectroscopy/MANIFEST.in @@ -0,0 +1 @@ +include LICENSE diff --git a/packages/essspectroscopy/README.md b/packages/essspectroscopy/README.md new file mode 100644 index 000000000..fec606a71 --- /dev/null +++ b/packages/essspectroscopy/README.md @@ -0,0 +1,16 @@ +[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) +[![PyPI badge](http://img.shields.io/pypi/v/essspectroscopy.svg)](https://pypi.python.org/pypi/essspectroscopy) +[![Anaconda-Server Badge](https://anaconda.org/scipp/essspectroscopy/badges/version.svg)](https://anaconda.org/scipp/essspectroscopy) +[![License: BSD 3-Clause](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](LICENSE) + +# ESSspectroscopy + +## About + +Spectroscopy data reduction for the European Spallation Source + +## Installation + +```sh +python -m pip install essspectroscopy +``` diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml new file mode 100644 index 000000000..9ebd149c1 --- /dev/null +++ b/packages/essspectroscopy/conda/meta.yaml @@ -0,0 +1,39 @@ +package: + name: essspectroscopy + + version: {{ GIT_DESCRIBE_TAG }} + +source: + path: .. + +requirements: + build: + - setuptools + - setuptools_scm + run: + - python>=3.10 + +test: + imports: + - ess.spectroscopy + requires: + - pytest + source_files: + - pyproject.toml + - tests/ + commands: + # We ignore warnings during release package builds + - python -m pytest -Wignore tests + +build: + noarch: python + script: + - python -m pip install . + +about: + home: https://github.com/scipp/essspectroscopy + license: BSD-3-Clause + summary: Spectroscopy data reduction for the European Spallation Source + description: Spectroscopy data reduction for the European Spallation Source + dev_url: https://github.com/scipp/essspectroscopy + doc_url: https://scipp.github.io/essspectroscopy diff --git a/packages/essspectroscopy/docs/_static/anaconda-icon.js b/packages/essspectroscopy/docs/_static/anaconda-icon.js new file mode 100644 index 000000000..024350ec0 --- /dev/null +++ b/packages/essspectroscopy/docs/_static/anaconda-icon.js @@ -0,0 +1,13 @@ +FontAwesome.library.add( + (faListOldStyle = { + prefix: "fa-custom", + iconName: "anaconda", + icon: [ + 67.65, // viewBox width + 67.500267, // viewBox height + [], // ligature + "e001", // unicode codepoint - private use area + "M 33.900391 0 C 32.600392 0 31.299608 0.09921885 30.099609 0.19921875 A 39.81 39.81 0 0 1 35.199219 4.3007812 L 36.5 5.5 L 35.199219 6.8007812 A 34.65 34.65 0 0 0 32 10.199219 L 32 10.300781 A 6.12 6.12 0 0 0 31.5 10.900391 A 19.27 19.27 0 0 1 33.900391 10.800781 A 23 23 0 0 1 33.900391 56.800781 A 22.39 22.39 0 0 1 21.900391 53.400391 A 45.33 45.33 0 0 1 16.699219 53.699219 A 19.27 19.27 0 0 1 14.300781 53.599609 A 78.24 78.24 0 0 0 15 61.699219 A 33.26 33.26 0 0 0 33.900391 67.5 A 33.75 33.75 0 0 0 33.900391 0 z M 23 1.8007812 A 33.78 33.78 0 0 0 15.599609 5.4003906 A 47 47 0 0 1 20.699219 6.5996094 A 52.38 52.38 0 0 1 23 1.8007812 z M 26.5 2 A 41.8 41.8 0 0 0 23.699219 7.5996094 C 25.199217 8.1996088 26.69922 8.8000007 28.199219 9.5 C 28.799218 8.7000008 29.300391 8.0999999 29.400391 8 C 30.10039 7.2000008 30.800001 6.399218 31.5 5.6992188 A 58.59 58.59 0 0 0 26.5 2 z M 13.199219 8.1992188 A 48.47 48.47 0 0 0 13.099609 14.800781 A 44.05 44.05 0 0 1 18.300781 14.5 A 39.43 39.43 0 0 1 19.699219 9.5996094 A 46.94 46.94 0 0 0 13.199219 8.1992188 z M 10.099609 9.8007812 A 33.47 33.47 0 0 0 4.9003906 16.5 C 6.6003889 16 8.3992205 15.599218 10.199219 15.199219 C 10.099219 13.399221 10.099609 11.600779 10.099609 9.8007812 z M 22.599609 10.599609 C 22.19961 11.799608 21.8 13.100392 21.5 14.400391 A 29.18 29.18 0 0 1 26.199219 12.099609 A 27.49 27.49 0 0 0 22.599609 10.599609 z M 17.699219 17.5 C 16.19922 17.5 14.80078 17.599219 13.300781 17.699219 A 33.92 33.92 0 0 0 14.099609 22.099609 A 20.36 20.36 0 0 1 17.699219 17.5 z M 10.599609 17.900391 A 43.62 43.62 0 0 0 3.3007812 19.900391 L 3.0996094 20 L 3.1992188 20.199219 A 30.3 30.3 0 0 0 6.5 27.300781 L 6.5996094 27.5 L 6.8007812 27.400391 A 50.41 50.41 0 0 1 11.699219 24.300781 L 11.900391 24.199219 L 11.900391 24 A 38.39 38.39 0 0 1 10.800781 18.099609 L 10.800781 17.900391 L 10.599609 17.900391 z M 1.8007812 22.800781 L 1.5996094 23.400391 A 33.77 33.77 0 0 0 0 32.900391 L 0 33.5 L 0.40039062 33.099609 A 24.93 24.93 0 0 1 4.8007812 28.900391 L 5 28.800781 L 4.9003906 28.599609 A 54.49 54.49 0 0 1 2 23.300781 L 1.8007812 22.800781 z M 12.300781 26.300781 L 11.800781 26.599609 C 10.500783 27.399609 9.2003893 28.19961 7.9003906 29.099609 L 7.6992188 29.199219 L 8 29.400391 C 8.8999991 30.600389 9.8007822 31.900001 10.800781 33 L 11.099609 33.5 L 11.099609 32.900391 A 23.54 23.54 0 0 1 12.099609 26.900391 L 12.300781 26.300781 z M 6.0996094 30.5 L 5.9003906 30.699219 A 47 47 0 0 0 0.80078125 35.599609 L 0.59960938 35.800781 L 0.80078125 36 A 58.38 58.38 0 0 0 6.4003906 40.199219 L 6.5996094 40.300781 L 6.6992188 40.099609 A 45.3 45.3 0 0 1 9.6992188 35.5 L 9.8007812 35.300781 L 9.6992188 35.199219 A 52 52 0 0 1 6.1992188 30.800781 L 6.0996094 30.5 z M 11.300781 36.400391 L 11 36.900391 C 10.100001 38.200389 9.2003898 39.600001 8.4003906 41 L 8.3007812 41.199219 L 8.5 41.300781 C 9.8999986 42.10078 11.400392 42.800001 12.900391 43.5 L 13.400391 43.699219 L 13.199219 43.199219 A 23.11 23.11 0 0 1 11.400391 37 L 11.300781 36.400391 z M 0.099609375 37.699219 L 0.19921875 38.300781 A 31.56 31.56 0 0 0 2.9003906 47.699219 L 3.0996094 48.199219 L 3.3007812 47.699219 A 55.47 55.47 0 0 1 5.6992188 42.099609 L 5.8007812 41.800781 L 5.5996094 41.699219 A 57.36 57.36 0 0 1 0.59960938 38.099609 L 0.099609375 37.699219 z M 7.4003906 42.800781 L 7.3007812 43 A 53.76 53.76 0 0 0 4.5 50 L 4.4003906 50.199219 L 4.5996094 50.300781 A 39.14 39.14 0 0 0 12.199219 51.699219 L 12.5 51.699219 L 12.5 51.5 A 36.79 36.79 0 0 1 13 45.699219 L 13 45.5 L 12.800781 45.400391 A 49.67 49.67 0 0 1 7.5996094 42.900391 L 7.4003906 42.800781 z M 14.5 45.900391 L 14.5 46.199219 A 45.53 45.53 0 0 0 14.099609 51.5 L 14.099609 51.699219 L 14.300781 51.699219 C 15.10078 51.699219 15.89922 51.800781 16.699219 51.800781 A 12.19 12.19 0 0 0 19.400391 51.800781 L 20 51.800781 L 19.5 51.400391 A 20.73 20.73 0 0 1 14.900391 46.199219 L 14.900391 46.099609 L 14.5 45.900391 z M 5.1992188 52.099609 L 5.5 52.599609 A 34.87 34.87 0 0 0 12.599609 60.400391 L 13 60.800781 L 13 60.099609 A 51.43 51.43 0 0 1 12.5 53.5 L 12.5 53.300781 L 12.300781 53.300781 A 51.94 51.94 0 0 1 5.8007812 52.199219 L 5.1992188 52.099609 z" + ], + }) +); diff --git a/packages/essspectroscopy/docs/_templates/class-template.rst b/packages/essspectroscopy/docs/_templates/class-template.rst new file mode 100644 index 000000000..0200267d2 --- /dev/null +++ b/packages/essspectroscopy/docs/_templates/class-template.rst @@ -0,0 +1,31 @@ +{{ fullname | escape | underline }} + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + :members: + :special-members: __getitem__ + + {% block methods %} + .. automethod:: __init__ + + {% if methods %} + .. rubric:: {{ _('Methods') }} + + .. autosummary:: + {% for item in methods %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block attributes %} + {% if attributes %} + .. rubric:: {{ _('Attributes') }} + + .. autosummary:: + {% for item in attributes %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} diff --git a/packages/essspectroscopy/docs/_templates/doc_version.html b/packages/essspectroscopy/docs/_templates/doc_version.html new file mode 100644 index 000000000..a348e28c0 --- /dev/null +++ b/packages/essspectroscopy/docs/_templates/doc_version.html @@ -0,0 +1,2 @@ + +Current {{ project }} version: {{ version }} (older versions). diff --git a/packages/essspectroscopy/docs/_templates/module-template.rst b/packages/essspectroscopy/docs/_templates/module-template.rst new file mode 100644 index 000000000..6fee8d776 --- /dev/null +++ b/packages/essspectroscopy/docs/_templates/module-template.rst @@ -0,0 +1,66 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + + {% block attributes %} + {% if attributes %} + .. rubric:: {{ _('Module Attributes') }} + + .. autosummary:: + :toctree: + {% for item in attributes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block functions %} + {% if functions %} + .. rubric:: {{ _('Functions') }} + + .. autosummary:: + :toctree: + {% for item in functions %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block classes %} + {% if classes %} + .. rubric:: {{ _('Classes') }} + + .. autosummary:: + :toctree: + :template: class-template.rst + {% for item in classes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block exceptions %} + {% if exceptions %} + .. rubric:: {{ _('Exceptions') }} + + .. autosummary:: + :toctree: + {% for item in exceptions %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + +{% block modules %} +{% if modules %} +.. rubric:: Modules + +.. autosummary:: + :toctree: + :template: module-template.rst + :recursive: +{% for item in modules %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} diff --git a/packages/essspectroscopy/docs/about/index.md b/packages/essspectroscopy/docs/about/index.md new file mode 100644 index 000000000..fbe164476 --- /dev/null +++ b/packages/essspectroscopy/docs/about/index.md @@ -0,0 +1,26 @@ +# About + +## Development + +ESSspectroscopy is an open source project by the [European Spallation Source ERIC](https://europeanspallationsource.se/) (ESS). + +## License + +ESSspectroscopy is available as open source under the [BSD-3 license](https://opensource.org/licenses/BSD-3-Clause). + +## Citing ESSspectroscopy + +Please cite the following: + +[![DOI](https://zenodo.org/badge/FIXME.svg)](https://zenodo.org/doi/10.5281/zenodo.FIXME) + +To cite a specific version of ESSspectroscopy, select the desired version on Zenodo to get the corresponding DOI. + +## Older versions of the documentation + +Older versions of the documentation pages can be found under the assets of each [release](https://github.com/scipp/essspectroscopy/releases). +Simply download the archive, unzip and view locally in a web browser. + +## Source code and development + +ESSspectroscopy is hosted and developed [on GitHub](https://github.com/scipp/essspectroscopy). diff --git a/packages/essspectroscopy/docs/api-reference/index.md b/packages/essspectroscopy/docs/api-reference/index.md new file mode 100644 index 000000000..c150567cf --- /dev/null +++ b/packages/essspectroscopy/docs/api-reference/index.md @@ -0,0 +1,29 @@ +# API Reference + +## Classes + +```{eval-rst} +.. currentmodule:: ess.spectroscopy + +.. autosummary:: + :toctree: ../generated/classes + :template: class-template.rst + :recursive: +``` + +## Top-level functions + +```{eval-rst} +.. autosummary:: + :toctree: ../generated/functions + :recursive: +``` + +## Submodules + +```{eval-rst} +.. autosummary:: + :toctree: ../generated/modules + :template: module-template.rst + :recursive: +``` diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py new file mode 100644 index 000000000..820c7de99 --- /dev/null +++ b/packages/essspectroscopy/docs/conf.py @@ -0,0 +1,251 @@ +# -*- coding: utf-8 -*- + +import doctest +import os +import sys + +from ess import spectroscopy + +sys.path.insert(0, os.path.abspath('.')) + +# General information about the project. +project = u'ESSspectroscopy' +copyright = u'2024 Scipp contributors' +author = u'Scipp contributors' + +html_show_sourcelink = True + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.doctest', + 'sphinx.ext.githubpages', + 'sphinx.ext.intersphinx', + 'sphinx.ext.mathjax', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'sphinx_autodoc_typehints', + 'sphinx_copybutton', + 'sphinx_design', + 'nbsphinx', + 'myst_parser', +] +try: + import sciline.sphinxext.domain_types # noqa: F401 + extensions.append('sciline.sphinxext.domain_types') +except ModuleNotFoundError: + pass + +myst_enable_extensions = [ + "amsmath", + "colon_fence", + "deflist", + "dollarmath", + "fieldlist", + "html_admonition", + "html_image", + "replacements", + "smartquotes", + "strikethrough", + "substitution", + "tasklist", +] + +myst_heading_anchors = 3 + +autodoc_type_aliases = { + 'array_like': 'array_like', +} + +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), + 'numpy': ('https://numpy.org/doc/stable/', None), + 'scipp': ('https://scipp.github.io/', None), +} + +# autodocs includes everything, even irrelevant API internals. autosummary +# looks more suitable in the long run when the API grows. +# For a nice example see how xarray handles its API documentation. +autosummary_generate = True + +napoleon_google_docstring = False +napoleon_numpy_docstring = True +napoleon_use_param = True +napoleon_use_rtype = False +napoleon_preprocess_types = True +napoleon_type_aliases = { + # objects without namespace: numpy + "ndarray": "~numpy.ndarray", +} +typehints_defaults = 'comma' +typehints_use_rtype = False + +sciline_domain_types_prefix = 'ess.spectroscopy' +sciline_domain_types_aliases = { + 'scipp._scipp.core.DataArray': 'scipp.DataArray', + 'scipp._scipp.core.Dataset': 'scipp.Dataset', + 'scipp._scipp.core.DType': 'scipp.DType', + 'scipp._scipp.core.Unit': 'scipp.Unit', + 'scipp._scipp.core.Variable': 'scipp.Variable', + 'scipp.core.data_group.DataGroup': 'scipp.DataGroup', +} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = ['.rst', '.md'] +html_sourcelink_suffix = '' # Avoid .ipynb.txt extensions in sources + +# The master toctree document. +master_doc = 'index' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# + +# The short X.Y version. +version = spectroscopy.__version__ +# The full version, including alpha/beta/rc tags. +release = spectroscopy.__version__ + +warning_is_error = True + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = "en" + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '**.ipynb_checkpoints'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + +# -- Options for HTML output ---------------------------------------------- + +html_theme = "pydata_sphinx_theme" +html_theme_options = { + "primary_sidebar_end": ["edit-this-page", "sourcelink"], + "secondary_sidebar_items": [], + "navbar_persistent": ["search-button"], + "show_nav_level": 1, + # Adjust this to ensure external links are moved to "Move" menu + "header_links_before_dropdown": 4, + "pygment_light_style": "github-light-high-contrast", + "pygment_dark_style": "github-dark-high-contrast", + "logo": { + "image_light": "_static/logo.svg", + "image_dark": "_static/logo-dark.svg", + }, + "external_links": [ + {"name": "Plopp", "url": "https://scipp.github.io/plopp"}, + {"name": "Sciline", "url": "https://scipp.github.io/sciline"}, + {"name": "Scipp", "url": "https://scipp.github.io"}, + {"name": "ScippNeutron", "url": "https://scipp.github.io/scippneutron"}, + {"name": "ScippNexus", "url": "https://scipp.github.io/scippnexus"}, + ], + "icon_links": [ + { + "name": "GitHub", + "url": "https://github.com/scipp/essspectroscopy", + "icon": "fa-brands fa-github", + "type": "fontawesome", + }, + { + "name": "PyPI", + "url": "https://pypi.org/project/essspectroscopy/", + "icon": "fa-brands fa-python", + "type": "fontawesome", + }, + { + "name": "Conda", + "url": "https://anaconda.org/scipp/essspectroscopy", + "icon": "fa-custom fa-anaconda", + "type": "fontawesome", + }, + ], + "footer_start": ["copyright", "sphinx-version"], + "footer_end": ["doc_version", "theme-version"], +} +html_context = { + "doc_path": "docs", +} +html_sidebars = { + "**": ["sidebar-nav-bs", "page-toc"], +} + +html_title = "ESSspectroscopy" +html_logo = "_static/logo.svg" +html_favicon = "_static/favicon.ico" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = [] +html_js_files = ["anaconda-icon.js"] + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'essspectroscopydoc' + +# -- Options for Matplotlib in notebooks ---------------------------------- + +nbsphinx_execute_arguments = [ + "--Session.metadata=scipp_sphinx_build=True", +] + +# -- Options for doctest -------------------------------------------------- + +# sc.plot returns a Figure object and doctest compares that against the +# output written in the docstring. But we only want to show an image of the +# figure, not its `repr`. +# In addition, there is no need to make plots in doctest as the documentation +# build already tests if those plots can be made. +# So we simply disable plots in doctests. +doctest_global_setup = ''' +import numpy as np + +try: + import scipp as sc + + def do_not_plot(*args, **kwargs): + pass + + sc.plot = do_not_plot + sc.Variable.plot = do_not_plot + sc.DataArray.plot = do_not_plot + sc.DataGroup.plot = do_not_plot + sc.Dataset.plot = do_not_plot +except ImportError: + # Scipp is not needed by docs if it is not installed. + pass +''' + +# Using normalize whitespace because many __str__ functions in scipp produce +# extraneous empty lines and it would look strange to include them in the docs. +doctest_default_flags = ( + doctest.ELLIPSIS + | doctest.IGNORE_EXCEPTION_DETAIL + | doctest.DONT_ACCEPT_TRUE_FOR_1 + | doctest.NORMALIZE_WHITESPACE +) + +# -- Options for linkcheck ------------------------------------------------ + +linkcheck_ignore = [ + # Specific lines in Github blobs cannot be found by linkcheck. + r'https?://github\.com/.*?/blob/[a-f0-9]+/.+?#', +] diff --git a/packages/essspectroscopy/docs/developer/coding-conventions.md b/packages/essspectroscopy/docs/developer/coding-conventions.md new file mode 100644 index 000000000..b23c0eb42 --- /dev/null +++ b/packages/essspectroscopy/docs/developer/coding-conventions.md @@ -0,0 +1,117 @@ +# Coding conventions + +## Code formatting + +There are no explicit code formatting conventions since we use `black` to enforce a format. + +## Docstring format + +We use the [NumPy docstring format](https://www.sphinx-doc.org/en/master/usage/extensions/example_numpy.html). +We use `sphinx-autodocs-typehints` to automatically insert type hints into the docstrings. +Our format thus deviates from the default NumPy example given by the link above. +Docstrings should therefore be laid out as follows, including spacing and punctuation: + +```python + +def foo(x: int, y: float) -> float: + """Short description. + + Long description. + + With multiple paragraphs. + + Warning + ------- + Be careful! + + Parameters + ---------- + x: + First input. + y: + Second input. + + Returns + ------- + : + The result. + + Raises + ------ + ValueError + If the input is bad. + IndexError + If some lookup failed. + + See Also + -------- + scitacean.bar: + A bit less foo. + + Examples + -------- + This is how to use it: + + >>> foo(1, 2) + 3 + + And also: + + >>> foo(1, 3) + 6 + """ +``` + +The order of sections is fixed as shown in the example. + +- **Short description** (*required*) A single sentence describing the purpose of the function / class. +- **Long description** (*optional*) One or more paragraphs of detailed explanations. + Can include additional sections like `Warning` or `Hint`. +- **Parameters** (*required for functions*) List of all function arguments including their name but not their type. + Listing arguments like this can seem ridiculous if the explanation is as devoid of content as in the example. + But it is still required in order for sphinx to show the types. +- **Returns** (*required for functions*) Description of the return value. + Required for the same reason as the parameter list. + + For a single return value, neither a name nor type should be given. + But a colon is required as in the example above in order to produce proper formatting. + + For multiple return values, to produce proper formatting, + both name and type must be given even though the latter repeats the type annotation: + + ```python + + """ + Returns + ------- + n: int + The first return value. + z: float + The second return value. + """ + ``` + +- **Raises** (*optional*) We generally do not document what exceptions can be raised from a function. + But if there are some important cases, this section can list those exceptions with an explanation + of when the exception is raised. + The exception type is required. + Note that there are no colons here. +- **See Also** (*optional*) List of related functions and/or classes. + The function/class name should include the module it is in but without reST markup. + For simple cases, the explanation can be left out. + In this case, the colon should be omitted as well and multiple entries must be separated by commas. +- **Examples** (*optional*) Example code given using `>>>` as the Python prompt. + May include text before, after, and between code blocks. + Note the spacing in the example. + +Some functions can be sufficiently described by a single sentence. +In this case, the 'Parameters' and 'Returns' sections may be omitted and the docstring should be laid out on a single line. +If it does not fit on a single line, it is too complicated. +For example + +```python +def bar(self) -> int: + """Returns the number of dimensions.""" +``` + +Note that the argument types are not shown in the rendered documentation. diff --git a/packages/essspectroscopy/docs/developer/dependency-management.md b/packages/essspectroscopy/docs/developer/dependency-management.md new file mode 100644 index 000000000..7d9ddca08 --- /dev/null +++ b/packages/essspectroscopy/docs/developer/dependency-management.md @@ -0,0 +1,13 @@ +# Dependency management + +essspectroscopy is a library, so the package dependencies are never pinned. +Lower bounds are fine and individual versions can be excluded. +See, e.g., [Should You Use Upper Bound Version Constraints](https://iscinumpy.dev/post/bound-version-constraints/) for an explanation. + +Development dependencies (as opposed to dependencies of the deployed package that users need to install) are pinned to an exact version in order to ensure reproducibility. +This also includes dependencies used for the various CI builds. +This is done by specifying packages (and potential version constraints) in `requirements/*.in` files and locking those dependencies using [pip-compile-multi](https://pip-compile-multi.readthedocs.io/en/latest/index.html) to produce `requirements/*.txt` files. +Those files are then used by [tox](https://tox.wiki/en/latest/) to create isolated environments and run tests, build docs, etc. + +`tox` can be cumbersome to use for local development. +Therefore `requirements/dev.txt` can be used to create a virtual environment with all dependencies. diff --git a/packages/essspectroscopy/docs/developer/getting-started.md b/packages/essspectroscopy/docs/developer/getting-started.md new file mode 100644 index 000000000..a196f562b --- /dev/null +++ b/packages/essspectroscopy/docs/developer/getting-started.md @@ -0,0 +1,91 @@ +# Getting started + +## Setting up + +### Dependencies + +Development dependencies are specified in `requirements/dev.txt` and can be installed using (see [Dependency Management](./dependency-management.md) for more information) + +```sh +pip install -r requirements/dev.txt +``` + +Additionally, building the documentation requires [pandoc](https://pandoc.org/) which is not on PyPI and needs to be installed through other means, e.g. with your OS package manager. + +### Install the package + +Install the package in editable mode using + +```sh +pip install -e . +``` + +### Set up git hooks + +The CI pipeline runs a number of code formatting and static analysis tools. +If they fail, a build is rejected. +To avoid that, you can run the same tools locally. +This can be done conveniently using [pre-commit](https://pre-commit.com/): + +```sh +pre-commit install +``` + +Alternatively, if you want a different workflow, take a look at ``tox.ini`` or ``.pre-commit.yaml`` to see what tools are run and how. + +## Running tests + +`````{tab-set} +````{tab-item} tox +Run the tests using + +```sh +tox -e py310 +``` + +(or just `tox` if you want to run all environments). + +```` +````{tab-item} Manually +Run the tests using + +```sh +python -m pytest +``` +```` +````` + +## Building the docs + +`````{tab-set} +````{tab-item} tox +Build the documentation using + +```sh +tox -e docs +``` + +This builds the docs and also runs `doctest`. +`linkcheck` can be run separately using + +```sh +tox -e linkcheck +``` +```` + +````{tab-item} Manually + +Build the documentation using + +```sh +python -m sphinx -v -b html -d .tox/docs_doctrees docs html +``` + +Additionally, test the documentation using + +```sh +python -m sphinx -v -b doctest -d .tox/docs_doctrees docs html +python -m sphinx -v -b linkcheck -d .tox/docs_doctrees docs html +``` +```` +````` \ No newline at end of file diff --git a/packages/essspectroscopy/docs/developer/index.md b/packages/essspectroscopy/docs/developer/index.md new file mode 100644 index 000000000..23b55441b --- /dev/null +++ b/packages/essspectroscopy/docs/developer/index.md @@ -0,0 +1,16 @@ +# Developer documentation + +```{include} ../../CONTRIBUTING.md +``` + +## Table of contents + +```{toctree} +--- +maxdepth: 2 +--- + +getting-started +coding-conventions +dependency-management +``` diff --git a/packages/essspectroscopy/docs/index.md b/packages/essspectroscopy/docs/index.md new file mode 100644 index 000000000..2308fb4da --- /dev/null +++ b/packages/essspectroscopy/docs/index.md @@ -0,0 +1,16 @@ +# ESSspectroscopy + + + Spectroscopy data reduction for the European Spallation Source +

+
+ +```{toctree} +--- +hidden: +--- + +api-reference/index +developer/index +about/index +``` diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml new file mode 100644 index 000000000..14256f5b4 --- /dev/null +++ b/packages/essspectroscopy/pyproject.toml @@ -0,0 +1,79 @@ +[build-system] +requires = [ + "setuptools>=68", + "setuptools_scm[toml]>=8.0", +] +build-backend = "setuptools.build_meta" + +[project] +name = "essspectroscopy" +description = "Spectroscopy data reduction for the European Spallation Source " +authors = [{ name = "Scipp contributors" }] +license = { file = "LICENSE" } +readme = "README.md" +classifiers = [ + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering", + "Typing :: Typed", +] +requires-python = ">=3.10" + +# IMPORTANT: +# Run 'tox -e deps' after making changes here. This will update requirement files. +# Make sure to list one dependency per line. +dependencies = [ +] + +dynamic = ["version"] + +[project.urls] +"Bug Tracker" = "https://github.com/scipp/essspectroscopy/issues" +"Documentation" = "https://scipp.github.io/essspectroscopy" +"Source" = "https://github.com/scipp/essspectroscopy" + +[tool.setuptools_scm] + +[tool.pytest.ini_options] +minversion = "7.0" +addopts = """ +--strict-config +--strict-markers +--import-mode=importlib +-ra +-v +""" +testpaths = "tests" +filterwarnings = [ + "error", +] + +[tool.bandit] +# Excluding tests because bandit doesn't like `assert`. +exclude_dirs = ["docs/conf.py", "tests"] + +[tool.black] +skip-string-normalization = true + +[tool.isort] +skip_gitignore = true +profile = "black" +known_first_party = ["essspectroscopy"] + +[tool.mypy] +strict = true +ignore_missing_imports = true +enable_error_code = [ + "ignore-without-code", + "redundant-expr", + "truthy-bool", +] +show_error_codes = true +warn_unreachable = true diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in new file mode 100644 index 000000000..4329cd1b6 --- /dev/null +++ b/packages/essspectroscopy/requirements/base.in @@ -0,0 +1,4 @@ +# Anything above "--- END OF CUSTOM SECTION ---" +# will not be touched by ``make_base.py`` +# --- END OF CUSTOM SECTION --- +# The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! diff --git a/packages/essspectroscopy/requirements/basetest.in b/packages/essspectroscopy/requirements/basetest.in new file mode 100644 index 000000000..e4a48b292 --- /dev/null +++ b/packages/essspectroscopy/requirements/basetest.in @@ -0,0 +1,4 @@ +# Dependencies that are only used by tests. +# Do not make an environment from this file, use test.txt instead! + +pytest diff --git a/packages/essspectroscopy/requirements/ci.in b/packages/essspectroscopy/requirements/ci.in new file mode 100644 index 000000000..e5c3075aa --- /dev/null +++ b/packages/essspectroscopy/requirements/ci.in @@ -0,0 +1,4 @@ +gitpython +packaging +requests +tox diff --git a/packages/essspectroscopy/requirements/dev.in b/packages/essspectroscopy/requirements/dev.in new file mode 100644 index 000000000..53ddf47ed --- /dev/null +++ b/packages/essspectroscopy/requirements/dev.in @@ -0,0 +1,11 @@ +-r base.in +-r ci.in +-r docs.in +-r mypy.in +-r static.in +-r test.in +-r wheels.in +copier +jupyterlab +pip-compile-multi +pre-commit diff --git a/packages/essspectroscopy/requirements/docs.in b/packages/essspectroscopy/requirements/docs.in new file mode 100644 index 000000000..e542e53ba --- /dev/null +++ b/packages/essspectroscopy/requirements/docs.in @@ -0,0 +1,10 @@ +-r base.in +ipykernel +ipython!=8.7.0 # Breaks syntax highlighting in Jupyter code cells. +myst-parser +nbsphinx +pydata-sphinx-theme>=0.14 +sphinx +sphinx-autodoc-typehints +sphinx-copybutton +sphinx-design diff --git a/packages/essspectroscopy/requirements/make_base.py b/packages/essspectroscopy/requirements/make_base.py new file mode 100644 index 000000000..3b1dbabca --- /dev/null +++ b/packages/essspectroscopy/requirements/make_base.py @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +import sys +from argparse import ArgumentParser +from pathlib import Path +from typing import List + +import tomli + +parser = ArgumentParser() +parser.add_argument( + "--nightly", + default="", + help="List of dependencies to install from main branch for nightly tests, " + "separated by commas.", +) +args = parser.parse_args() + +CUSTOM_AUTO_SEPARATOR = """ +# --- END OF CUSTOM SECTION --- +# The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! +""" + + +def write_dependencies(dependency_name: str, dependencies: List[str]) -> None: + path = Path(f"{dependency_name}.in") + if path.exists(): + sections = path.read_text().split(CUSTOM_AUTO_SEPARATOR) + if len(sections) > 1: + custom = sections[0] + else: + custom = "" + else: + custom = "" + with path.open("w") as f: + f.write(custom) + f.write(CUSTOM_AUTO_SEPARATOR) + f.write("\n".join(dependencies)) + f.write("\n") + + +with open("../pyproject.toml", "rb") as toml_file: + pyproject = tomli.load(toml_file) + dependencies = pyproject["project"].get("dependencies") + if dependencies is None: + raise RuntimeError("No dependencies found in pyproject.toml") + dependencies = [dep.strip().strip('"') for dep in dependencies] + +write_dependencies("base", dependencies) + + +def as_nightly(repo: str) -> str: + if "/" in repo: + org, repo = repo.split("/") + else: + org = "scipp" + if repo == "scipp": + version = f"cp{sys.version_info.major}{sys.version_info.minor}" + base = "https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly" + suffix = "manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + return "-".join([base, version, version, suffix]) + return f"{repo} @ git+https://github.com/{org}/{repo}@main" + + +nightly = tuple(args.nightly.split(",") if args.nightly else []) +nightly_dependencies = [dep for dep in dependencies if not dep.startswith(nightly)] +nightly_dependencies += [as_nightly(arg) for arg in nightly] + +write_dependencies("nightly", nightly_dependencies) diff --git a/packages/essspectroscopy/requirements/mypy.in b/packages/essspectroscopy/requirements/mypy.in new file mode 100644 index 000000000..5027d8c3f --- /dev/null +++ b/packages/essspectroscopy/requirements/mypy.in @@ -0,0 +1,2 @@ +-r test.in +mypy diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in new file mode 100644 index 000000000..260e26897 --- /dev/null +++ b/packages/essspectroscopy/requirements/nightly.in @@ -0,0 +1,3 @@ +-r basetest.in +# --- END OF CUSTOM SECTION --- +# The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! diff --git a/packages/essspectroscopy/requirements/static.in b/packages/essspectroscopy/requirements/static.in new file mode 100644 index 000000000..416634f52 --- /dev/null +++ b/packages/essspectroscopy/requirements/static.in @@ -0,0 +1 @@ +pre-commit diff --git a/packages/essspectroscopy/requirements/test.in b/packages/essspectroscopy/requirements/test.in new file mode 100644 index 000000000..7b4097920 --- /dev/null +++ b/packages/essspectroscopy/requirements/test.in @@ -0,0 +1,4 @@ +# Add test dependencies in basetest.in + +-r base.in +-r basetest.in diff --git a/packages/essspectroscopy/requirements/wheels.in b/packages/essspectroscopy/requirements/wheels.in new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/packages/essspectroscopy/requirements/wheels.in @@ -0,0 +1 @@ +build diff --git a/packages/essspectroscopy/setup.cfg b/packages/essspectroscopy/setup.cfg new file mode 100644 index 000000000..1ba190c5d --- /dev/null +++ b/packages/essspectroscopy/setup.cfg @@ -0,0 +1,4 @@ +[flake8] +# See https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#line-length +max-line-length = 88 +extend-ignore = E203 diff --git a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py new file mode 100644 index 000000000..9da9479a2 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + +# flake8: noqa +import importlib.metadata + +try: + __version__ = importlib.metadata.version(__package__ or __name__) +except importlib.metadata.PackageNotFoundError: + __version__ = "0.0.0" + +del importlib diff --git a/packages/essspectroscopy/src/ess/spectroscopy/py.typed b/packages/essspectroscopy/src/ess/spectroscopy/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/packages/essspectroscopy/tests/package_test.py b/packages/essspectroscopy/tests/package_test.py new file mode 100644 index 000000000..5b756ad5c --- /dev/null +++ b/packages/essspectroscopy/tests/package_test.py @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +from ess import spectroscopy as pkg + + +def test_has_version(): + assert hasattr(pkg, '__version__') diff --git a/packages/essspectroscopy/tox.ini b/packages/essspectroscopy/tox.ini new file mode 100644 index 000000000..9c86a38db --- /dev/null +++ b/packages/essspectroscopy/tox.ini @@ -0,0 +1,67 @@ +[tox] +envlist = py310 +isolated_build = true + +[testenv] +deps = -r requirements/test.txt +setenv = + JUPYTER_PLATFORM_DIRS = 1 +commands = pytest {posargs} + +[testenv:nightly] +deps = -r requirements/nightly.txt +commands = pytest + +[testenv:unpinned] +description = Test with unpinned dependencies, as a user would install now. +deps = + -r requirements/basetest.txt + essspectroscopy +commands = pytest + +[testenv:docs] +description = invoke sphinx-build to build the HTML docs +deps = -r requirements/docs.txt +allowlist_externals=find +commands = python -m sphinx -j2 -v -b html -d {toxworkdir}/docs_doctrees docs html + python -m sphinx -j2 -v -b doctest -d {toxworkdir}/docs_doctrees docs html + find html -type f -name "*.ipynb" -not -path "html/_sources/*" -delete + +[testenv:releasedocs] +description = invoke sphinx-build to build the HTML docs from a released version +skip_install = true +deps = + essspectroscopy=={posargs} + {[testenv:docs]deps} +allowlist_externals={[testenv:docs]allowlist_externals} +commands = {[testenv:docs]commands} + +[testenv:linkcheck] +description = Run Sphinx linkcheck +deps = -r requirements/docs.txt +commands = python -m sphinx -j2 -v -b linkcheck -d {toxworkdir}/docs_doctrees docs html + +[testenv:static] +description = Code formatting and static analysis +skip_install = true +deps = -r requirements/static.txt +allowlist_externals = sh +# The first run of pre-commit may reformat files. If this happens, it returns 1 but this +# should not fail the job. So just run again if it fails. A second failure means that +# either the different formatters can't agree on a format or that static analysis failed. +commands = sh -c 'pre-commit run -a || (echo "" && pre-commit run -a)' + +[testenv:mypy] +description = Type checking (mypy) +deps = -r requirements/mypy.txt +commands = python -m mypy . + +[testenv:deps] +description = Update dependencies by running pip-compile-multi +deps = + pip-compile-multi + tomli +skip_install = true +changedir = requirements +commands = python ./make_base.py --nightly scipp,scippneutron,sciline,plopp,scippnexus + pip-compile-multi -d . --backtracking From e9a6e2ccb4157712bed19929a67df7d193398901 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 22 Feb 2024 14:41:58 +0100 Subject: [PATCH 003/330] Lock dependencies --- packages/essspectroscopy/requirements/base.in | 1 + .../essspectroscopy/requirements/base.txt | 8 + .../essspectroscopy/requirements/basetest.txt | 19 ++ packages/essspectroscopy/requirements/ci.txt | 56 +++++ packages/essspectroscopy/requirements/dev.txt | 137 ++++++++++ .../essspectroscopy/requirements/docs.txt | 235 ++++++++++++++++++ .../essspectroscopy/requirements/mypy.txt | 14 ++ .../essspectroscopy/requirements/nightly.in | 5 + .../essspectroscopy/requirements/nightly.txt | 73 ++++++ .../essspectroscopy/requirements/static.txt | 28 +++ .../essspectroscopy/requirements/test.txt | 9 + .../essspectroscopy/requirements/wheels.txt | 17 ++ 12 files changed, 602 insertions(+) create mode 100644 packages/essspectroscopy/requirements/base.txt create mode 100644 packages/essspectroscopy/requirements/basetest.txt create mode 100644 packages/essspectroscopy/requirements/ci.txt create mode 100644 packages/essspectroscopy/requirements/dev.txt create mode 100644 packages/essspectroscopy/requirements/docs.txt create mode 100644 packages/essspectroscopy/requirements/mypy.txt create mode 100644 packages/essspectroscopy/requirements/nightly.txt create mode 100644 packages/essspectroscopy/requirements/static.txt create mode 100644 packages/essspectroscopy/requirements/test.txt create mode 100644 packages/essspectroscopy/requirements/wheels.txt diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 4329cd1b6..b801db0e3 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,3 +2,4 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! + diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt new file mode 100644 index 000000000..c24fd27f7 --- /dev/null +++ b/packages/essspectroscopy/requirements/base.txt @@ -0,0 +1,8 @@ +# SHA1:da39a3ee5e6b4b0d3255bfef95601890afd80709 +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# + diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt new file mode 100644 index 000000000..bc93620f9 --- /dev/null +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -0,0 +1,19 @@ +# SHA1:0eaa389e1fdb3a1917c0f987514bd561be5718ee +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +exceptiongroup==1.2.0 + # via pytest +iniconfig==2.0.0 + # via pytest +packaging==23.2 + # via pytest +pluggy==1.4.0 + # via pytest +pytest==8.0.1 + # via -r basetest.in +tomli==2.0.1 + # via pytest diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt new file mode 100644 index 000000000..eeef86ea4 --- /dev/null +++ b/packages/essspectroscopy/requirements/ci.txt @@ -0,0 +1,56 @@ +# SHA1:6344d52635ea11dca331a3bc6eb1833c4c64d585 +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +cachetools==5.3.2 + # via tox +certifi==2024.2.2 + # via requests +chardet==5.2.0 + # via tox +charset-normalizer==3.3.2 + # via requests +colorama==0.4.6 + # via tox +distlib==0.3.8 + # via virtualenv +filelock==3.13.1 + # via + # tox + # virtualenv +gitdb==4.0.11 + # via gitpython +gitpython==3.1.42 + # via -r ci.in +idna==3.6 + # via requests +packaging==23.2 + # via + # -r ci.in + # pyproject-api + # tox +platformdirs==4.2.0 + # via + # tox + # virtualenv +pluggy==1.4.0 + # via tox +pyproject-api==1.6.1 + # via tox +requests==2.31.0 + # via -r ci.in +smmap==5.0.1 + # via gitdb +tomli==2.0.1 + # via + # pyproject-api + # tox +tox==4.13.0 + # via -r ci.in +urllib3==2.2.1 + # via requests +virtualenv==20.25.1 + # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt new file mode 100644 index 000000000..61cfd1bb9 --- /dev/null +++ b/packages/essspectroscopy/requirements/dev.txt @@ -0,0 +1,137 @@ +# SHA1:efd19a3a98c69fc3d6d6233ed855de7e4a208f74 +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +-r base.txt +-r ci.txt +-r docs.txt +-r mypy.txt +-r static.txt +-r test.txt +-r wheels.txt +annotated-types==0.6.0 + # via pydantic +anyio==4.3.0 + # via + # httpx + # jupyter-server +argon2-cffi==23.1.0 + # via jupyter-server +argon2-cffi-bindings==21.2.0 + # via argon2-cffi +arrow==1.3.0 + # via isoduration +async-lru==2.0.4 + # via jupyterlab +cffi==1.16.0 + # via argon2-cffi-bindings +click==8.1.7 + # via + # pip-compile-multi + # pip-tools +copier==9.1.1 + # via -r dev.in +dunamai==1.19.2 + # via copier +fqdn==1.5.1 + # via jsonschema +funcy==2.0 + # via copier +h11==0.14.0 + # via httpcore +httpcore==1.0.4 + # via httpx +httpx==0.27.0 + # via jupyterlab +isoduration==20.11.0 + # via jsonschema +jinja2-ansible-filters==1.3.2 + # via copier +json5==0.9.17 + # via jupyterlab-server +jsonpointer==2.4 + # via jsonschema +jsonschema[format-nongpl]==4.21.1 + # via + # jupyter-events + # jupyterlab-server + # nbformat +jupyter-events==0.9.0 + # via jupyter-server +jupyter-lsp==2.2.2 + # via jupyterlab +jupyter-server==2.12.5 + # via + # jupyter-lsp + # jupyterlab + # jupyterlab-server + # notebook-shim +jupyter-server-terminals==0.5.2 + # via jupyter-server +jupyterlab==4.1.2 + # via -r dev.in +jupyterlab-server==2.25.3 + # via jupyterlab +notebook-shim==0.2.4 + # via jupyterlab +overrides==7.7.0 + # via jupyter-server +pathspec==0.12.1 + # via copier +pip-compile-multi==2.6.3 + # via -r dev.in +pip-tools==7.4.0 + # via pip-compile-multi +plumbum==1.8.2 + # via copier +prometheus-client==0.20.0 + # via jupyter-server +pycparser==2.21 + # via cffi +pydantic==2.6.1 + # via copier +pydantic-core==2.16.2 + # via pydantic +python-json-logger==2.0.7 + # via jupyter-events +pyyaml-include==1.3.2 + # via copier +questionary==1.10.0 + # via copier +rfc3339-validator==0.1.4 + # via + # jsonschema + # jupyter-events +rfc3986-validator==0.1.1 + # via + # jsonschema + # jupyter-events +send2trash==1.8.2 + # via jupyter-server +sniffio==1.3.0 + # via + # anyio + # httpx +terminado==0.18.0 + # via + # jupyter-server + # jupyter-server-terminals +toposort==1.10 + # via pip-compile-multi +types-python-dateutil==2.8.19.20240106 + # via arrow +uri-template==1.3.0 + # via jsonschema +webcolors==1.13 + # via jsonschema +websocket-client==1.7.0 + # via jupyter-server +wheel==0.42.0 + # via pip-tools + +# The following packages are considered to be unsafe in a requirements file: +# pip +# setuptools diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt new file mode 100644 index 000000000..caed3661c --- /dev/null +++ b/packages/essspectroscopy/requirements/docs.txt @@ -0,0 +1,235 @@ +# SHA1:2175813590b5d31dc1cdf3e3c820f699647e9043 +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +-r base.txt +accessible-pygments==0.0.4 + # via pydata-sphinx-theme +alabaster==0.7.16 + # via sphinx +asttokens==2.4.1 + # via stack-data +attrs==23.2.0 + # via + # jsonschema + # referencing +babel==2.14.0 + # via + # pydata-sphinx-theme + # sphinx +beautifulsoup4==4.12.3 + # via + # nbconvert + # pydata-sphinx-theme +bleach==6.1.0 + # via nbconvert +certifi==2024.2.2 + # via requests +charset-normalizer==3.3.2 + # via requests +comm==0.2.1 + # via ipykernel +debugpy==1.8.1 + # via ipykernel +decorator==5.1.1 + # via ipython +defusedxml==0.7.1 + # via nbconvert +docutils==0.20.1 + # via + # myst-parser + # nbsphinx + # pydata-sphinx-theme + # sphinx +exceptiongroup==1.2.0 + # via ipython +executing==2.0.1 + # via stack-data +fastjsonschema==2.19.1 + # via nbformat +idna==3.6 + # via requests +imagesize==1.4.1 + # via sphinx +ipykernel==6.29.2 + # via -r docs.in +ipython==8.22.0 + # via + # -r docs.in + # ipykernel +jedi==0.19.1 + # via ipython +jinja2==3.1.3 + # via + # myst-parser + # nbconvert + # nbsphinx + # sphinx +jsonschema==4.21.1 + # via nbformat +jsonschema-specifications==2023.12.1 + # via jsonschema +jupyter-client==8.6.0 + # via + # ipykernel + # nbclient +jupyter-core==5.7.1 + # via + # ipykernel + # jupyter-client + # nbclient + # nbconvert + # nbformat +jupyterlab-pygments==0.3.0 + # via nbconvert +markdown-it-py==3.0.0 + # via + # mdit-py-plugins + # myst-parser +markupsafe==2.1.5 + # via + # jinja2 + # nbconvert +matplotlib-inline==0.1.6 + # via + # ipykernel + # ipython +mdit-py-plugins==0.4.0 + # via myst-parser +mdurl==0.1.2 + # via markdown-it-py +mistune==3.0.2 + # via nbconvert +myst-parser==2.0.0 + # via -r docs.in +nbclient==0.9.0 + # via nbconvert +nbconvert==7.16.1 + # via nbsphinx +nbformat==5.9.2 + # via + # nbclient + # nbconvert + # nbsphinx +nbsphinx==0.9.3 + # via -r docs.in +nest-asyncio==1.6.0 + # via ipykernel +packaging==23.2 + # via + # ipykernel + # nbconvert + # pydata-sphinx-theme + # sphinx +pandocfilters==1.5.1 + # via nbconvert +parso==0.8.3 + # via jedi +pexpect==4.9.0 + # via ipython +platformdirs==4.2.0 + # via jupyter-core +prompt-toolkit==3.0.43 + # via ipython +psutil==5.9.8 + # via ipykernel +ptyprocess==0.7.0 + # via pexpect +pure-eval==0.2.2 + # via stack-data +pydata-sphinx-theme==0.15.2 + # via -r docs.in +pygments==2.17.2 + # via + # accessible-pygments + # ipython + # nbconvert + # pydata-sphinx-theme + # sphinx +python-dateutil==2.8.2 + # via jupyter-client +pyyaml==6.0.1 + # via myst-parser +pyzmq==25.1.2 + # via + # ipykernel + # jupyter-client +referencing==0.33.0 + # via + # jsonschema + # jsonschema-specifications +requests==2.31.0 + # via sphinx +rpds-py==0.18.0 + # via + # jsonschema + # referencing +six==1.16.0 + # via + # asttokens + # bleach + # python-dateutil +snowballstemmer==2.2.0 + # via sphinx +soupsieve==2.5 + # via beautifulsoup4 +sphinx==7.2.6 + # via + # -r docs.in + # myst-parser + # nbsphinx + # pydata-sphinx-theme + # sphinx-autodoc-typehints + # sphinx-copybutton + # sphinx-design +sphinx-autodoc-typehints==2.0.0 + # via -r docs.in +sphinx-copybutton==0.5.2 + # via -r docs.in +sphinx-design==0.5.0 + # via -r docs.in +sphinxcontrib-applehelp==1.0.8 + # via sphinx +sphinxcontrib-devhelp==1.0.6 + # via sphinx +sphinxcontrib-htmlhelp==2.0.5 + # via sphinx +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==1.0.7 + # via sphinx +sphinxcontrib-serializinghtml==1.1.10 + # via sphinx +stack-data==0.6.3 + # via ipython +tinycss2==1.2.1 + # via nbconvert +tornado==6.4 + # via + # ipykernel + # jupyter-client +traitlets==5.14.1 + # via + # comm + # ipykernel + # ipython + # jupyter-client + # jupyter-core + # matplotlib-inline + # nbclient + # nbconvert + # nbformat + # nbsphinx +typing-extensions==4.9.0 + # via pydata-sphinx-theme +urllib3==2.2.1 + # via requests +wcwidth==0.2.13 + # via prompt-toolkit +webencodings==0.5.1 + # via + # bleach + # tinycss2 diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt new file mode 100644 index 000000000..ac2856867 --- /dev/null +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -0,0 +1,14 @@ +# SHA1:859ef9c15e5e57c6c91510133c01f5751feee941 +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +-r test.txt +mypy==1.8.0 + # via -r mypy.in +mypy-extensions==1.0.0 + # via mypy +typing-extensions==4.9.0 + # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 260e26897..9dbca9b22 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,3 +1,8 @@ -r basetest.in # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! +https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +scippneutron @ git+https://github.com/scipp/scippneutron@main +sciline @ git+https://github.com/scipp/sciline@main +plopp @ git+https://github.com/scipp/plopp@main +scippnexus @ git+https://github.com/scipp/scippnexus@main diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt new file mode 100644 index 000000000..9b6d7eb02 --- /dev/null +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -0,0 +1,73 @@ +# SHA1:3c386167be6103fb294aae066742247ee957de4f +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +-r basetest.txt +certifi==2024.2.2 + # via requests +charset-normalizer==3.3.2 + # via requests +contourpy==1.2.0 + # via matplotlib +cycler==0.12.1 + # via matplotlib +fonttools==4.49.0 + # via matplotlib +h5py==3.10.0 + # via + # scippneutron + # scippnexus +idna==3.6 + # via requests +kiwisolver==1.4.5 + # via matplotlib +matplotlib==3.8.3 + # via plopp +numpy==1.26.4 + # via + # contourpy + # h5py + # matplotlib + # scipp + # scippneutron + # scipy +pillow==10.2.0 + # via matplotlib +platformdirs==4.2.0 + # via pooch +plopp @ git+https://github.com/scipp/plopp@main + # via -r nightly.in +pooch==1.8.1 + # via scippneutron +pyparsing==3.1.1 + # via matplotlib +python-dateutil==2.8.2 + # via + # matplotlib + # scippnexus +requests==2.31.0 + # via pooch +sciline @ git+https://github.com/scipp/sciline@main + # via -r nightly.in +scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + # via + # -r nightly.in + # scippneutron + # scippnexus +scippneutron @ git+https://github.com/scipp/scippneutron@main + # via -r nightly.in +scippnexus @ git+https://github.com/scipp/scippnexus@main + # via + # -r nightly.in + # scippneutron +scipy==1.12.0 + # via + # scippneutron + # scippnexus +six==1.16.0 + # via python-dateutil +urllib3==2.2.1 + # via requests diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt new file mode 100644 index 000000000..0e3af8aca --- /dev/null +++ b/packages/essspectroscopy/requirements/static.txt @@ -0,0 +1,28 @@ +# SHA1:5a0b1bb22ae805d8aebba0f3bf05ab91aceae0d8 +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +cfgv==3.4.0 + # via pre-commit +distlib==0.3.8 + # via virtualenv +filelock==3.13.1 + # via virtualenv +identify==2.5.35 + # via pre-commit +nodeenv==1.8.0 + # via pre-commit +platformdirs==4.2.0 + # via virtualenv +pre-commit==3.6.2 + # via -r static.in +pyyaml==6.0.1 + # via pre-commit +virtualenv==20.25.1 + # via pre-commit + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/packages/essspectroscopy/requirements/test.txt b/packages/essspectroscopy/requirements/test.txt new file mode 100644 index 000000000..3c7454d8a --- /dev/null +++ b/packages/essspectroscopy/requirements/test.txt @@ -0,0 +1,9 @@ +# SHA1:ef2ee9576d8a9e65b44e2865a26887eed3fc49d1 +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +-r base.txt +-r basetest.txt diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt new file mode 100644 index 000000000..2e33cfa3b --- /dev/null +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -0,0 +1,17 @@ +# SHA1:80754af91bfb6d1073585b046fe0a474ce868509 +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +build==1.0.3 + # via -r wheels.in +packaging==23.2 + # via build +pyproject-hooks==1.0.0 + # via build +tomli==2.0.1 + # via + # build + # pyproject-hooks From 99a5eb30cb6046d50b9bfd622f44c7f5183b3c88 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 22 Feb 2024 14:46:50 +0100 Subject: [PATCH 004/330] Add logos --- .../essspectroscopy/docs/_static/favicon.svg | 59 +++++++++++ .../docs/_static/logo-dark.svg | 71 +++++++++++++ .../essspectroscopy/docs/_static/logo.svg | 71 +++++++++++++ packages/essspectroscopy/docs/conf.py | 2 +- packages/essspectroscopy/resources/logo.svg | 100 ++++++++++++++++++ 5 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 packages/essspectroscopy/docs/_static/favicon.svg create mode 100644 packages/essspectroscopy/docs/_static/logo-dark.svg create mode 100644 packages/essspectroscopy/docs/_static/logo.svg create mode 100644 packages/essspectroscopy/resources/logo.svg diff --git a/packages/essspectroscopy/docs/_static/favicon.svg b/packages/essspectroscopy/docs/_static/favicon.svg new file mode 100644 index 000000000..a6f9d9732 --- /dev/null +++ b/packages/essspectroscopy/docs/_static/favicon.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/packages/essspectroscopy/docs/_static/logo-dark.svg b/packages/essspectroscopy/docs/_static/logo-dark.svg new file mode 100644 index 000000000..a2a0be35e --- /dev/null +++ b/packages/essspectroscopy/docs/_static/logo-dark.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + essspectroscopy + + + + diff --git a/packages/essspectroscopy/docs/_static/logo.svg b/packages/essspectroscopy/docs/_static/logo.svg new file mode 100644 index 000000000..eafe115fe --- /dev/null +++ b/packages/essspectroscopy/docs/_static/logo.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + essspectroscopy + + + + diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 820c7de99..5ccb011b9 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -187,7 +187,7 @@ html_title = "ESSspectroscopy" html_logo = "_static/logo.svg" -html_favicon = "_static/favicon.ico" +html_favicon = "_static/favicon.svg" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, diff --git a/packages/essspectroscopy/resources/logo.svg b/packages/essspectroscopy/resources/logo.svg new file mode 100644 index 000000000..274920cb9 --- /dev/null +++ b/packages/essspectroscopy/resources/logo.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + essspectroscopy + + + + From 1672af799c0d639a479a782a91c70ea1dd0a0596 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 22 Feb 2024 14:49:53 +0100 Subject: [PATCH 005/330] Fix formatting --- packages/essspectroscopy/README.md | 2 +- packages/essspectroscopy/conda/meta.yaml | 4 ++-- packages/essspectroscopy/docs/conf.py | 9 +++++---- packages/essspectroscopy/docs/index.md | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/essspectroscopy/README.md b/packages/essspectroscopy/README.md index fec606a71..e22668035 100644 --- a/packages/essspectroscopy/README.md +++ b/packages/essspectroscopy/README.md @@ -7,7 +7,7 @@ ## About -Spectroscopy data reduction for the European Spallation Source +Spectroscopy data reduction for the European Spallation Source ## Installation diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml index 9ebd149c1..f0825e19d 100644 --- a/packages/essspectroscopy/conda/meta.yaml +++ b/packages/essspectroscopy/conda/meta.yaml @@ -33,7 +33,7 @@ build: about: home: https://github.com/scipp/essspectroscopy license: BSD-3-Clause - summary: Spectroscopy data reduction for the European Spallation Source - description: Spectroscopy data reduction for the European Spallation Source + summary: Spectroscopy data reduction for the European Spallation Source + description: Spectroscopy data reduction for the European Spallation Source dev_url: https://github.com/scipp/essspectroscopy doc_url: https://scipp.github.io/essspectroscopy diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 5ccb011b9..25229fe54 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -32,6 +32,7 @@ ] try: import sciline.sphinxext.domain_types # noqa: F401 + extensions.append('sciline.sphinxext.domain_types') except ModuleNotFoundError: pass @@ -150,10 +151,10 @@ }, "external_links": [ {"name": "Plopp", "url": "https://scipp.github.io/plopp"}, - {"name": "Sciline", "url": "https://scipp.github.io/sciline"}, - {"name": "Scipp", "url": "https://scipp.github.io"}, - {"name": "ScippNeutron", "url": "https://scipp.github.io/scippneutron"}, - {"name": "ScippNexus", "url": "https://scipp.github.io/scippnexus"}, + {"name": "Sciline", "url": "https://scipp.github.io/sciline"}, + {"name": "Scipp", "url": "https://scipp.github.io"}, + {"name": "ScippNeutron", "url": "https://scipp.github.io/scippneutron"}, + {"name": "ScippNexus", "url": "https://scipp.github.io/scippnexus"}, ], "icon_links": [ { diff --git a/packages/essspectroscopy/docs/index.md b/packages/essspectroscopy/docs/index.md index 2308fb4da..15605d644 100644 --- a/packages/essspectroscopy/docs/index.md +++ b/packages/essspectroscopy/docs/index.md @@ -1,7 +1,7 @@ # ESSspectroscopy - Spectroscopy data reduction for the European Spallation Source + Spectroscopy data reduction for the European Spallation Source

From 653149400967333d3ec468badb1a201a059b961c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 23 Feb 2024 10:35:20 +0100 Subject: [PATCH 006/330] Add basic dependencies --- packages/essspectroscopy/conda/meta.yaml | 4 ++ packages/essspectroscopy/pyproject.toml | 4 ++ packages/essspectroscopy/requirements/base.in | 5 +- .../essspectroscopy/requirements/base.txt | 50 ++++++++++++++++++- .../essspectroscopy/requirements/docs.txt | 27 +--------- 5 files changed, 61 insertions(+), 29 deletions(-) diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml index f0825e19d..e4dca67da 100644 --- a/packages/essspectroscopy/conda/meta.yaml +++ b/packages/essspectroscopy/conda/meta.yaml @@ -12,6 +12,10 @@ requirements: - setuptools_scm run: - python>=3.10 + - sciline>=24.02 + - scipp>=24.01 + - scippneutron>=24.01 + - scippnexus>=23.12 test: imports: diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 14256f5b4..23db7dfd9 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,6 +30,10 @@ requires-python = ">=3.10" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ + "sciline>=24.02", + "scipp>=24.01", + "scippneutron>=24.01", + "scippnexus>=23.12", ] dynamic = ["version"] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index b801db0e3..892d2c126 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,4 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! - +sciline>=24.02 +scipp>=24.01 +scippneutron>=24.01 +scippnexus>=23.12 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index c24fd27f7..5351a3b92 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,8 +1,54 @@ -# SHA1:da39a3ee5e6b4b0d3255bfef95601890afd80709 +# SHA1:1620711176981be9a0d7abe03b2b6ca1e2fc54b1 # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # - +certifi==2024.2.2 + # via requests +charset-normalizer==3.3.2 + # via requests +h5py==3.10.0 + # via + # scippneutron + # scippnexus +idna==3.6 + # via requests +numpy==1.26.4 + # via + # h5py + # scipp + # scippneutron + # scipy +packaging==23.2 + # via pooch +platformdirs==4.2.0 + # via pooch +pooch==1.8.1 + # via scippneutron +python-dateutil==2.8.2 + # via scippnexus +requests==2.31.0 + # via pooch +sciline==24.2.1 + # via -r base.in +scipp==24.2.0 + # via + # -r base.in + # scippneutron + # scippnexus +scippneutron==24.1.0 + # via -r base.in +scippnexus==23.12.1 + # via + # -r base.in + # scippneutron +scipy==1.12.0 + # via + # scippneutron + # scippnexus +six==1.16.0 + # via python-dateutil +urllib3==2.2.1 + # via requests diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index caed3661c..fc32cc1b2 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -26,10 +26,6 @@ beautifulsoup4==4.12.3 # pydata-sphinx-theme bleach==6.1.0 # via nbconvert -certifi==2024.2.2 - # via requests -charset-normalizer==3.3.2 - # via requests comm==0.2.1 # via ipykernel debugpy==1.8.1 @@ -50,13 +46,11 @@ executing==2.0.1 # via stack-data fastjsonschema==2.19.1 # via nbformat -idna==3.6 - # via requests imagesize==1.4.1 # via sphinx ipykernel==6.29.2 # via -r docs.in -ipython==8.22.0 +ipython==8.22.1 # via # -r docs.in # ipykernel @@ -118,20 +112,12 @@ nbsphinx==0.9.3 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel -packaging==23.2 - # via - # ipykernel - # nbconvert - # pydata-sphinx-theme - # sphinx pandocfilters==1.5.1 # via nbconvert parso==0.8.3 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.2.0 - # via jupyter-core prompt-toolkit==3.0.43 # via ipython psutil==5.9.8 @@ -149,8 +135,6 @@ pygments==2.17.2 # nbconvert # pydata-sphinx-theme # sphinx -python-dateutil==2.8.2 - # via jupyter-client pyyaml==6.0.1 # via myst-parser pyzmq==25.1.2 @@ -161,17 +145,10 @@ referencing==0.33.0 # via # jsonschema # jsonschema-specifications -requests==2.31.0 - # via sphinx rpds-py==0.18.0 # via # jsonschema # referencing -six==1.16.0 - # via - # asttokens - # bleach - # python-dateutil snowballstemmer==2.2.0 # via sphinx soupsieve==2.5 @@ -225,8 +202,6 @@ traitlets==5.14.1 # nbsphinx typing-extensions==4.9.0 # via pydata-sphinx-theme -urllib3==2.2.1 - # via requests wcwidth==0.2.13 # via prompt-toolkit webencodings==0.5.1 From 14026ef94f2aba33d39944545114e42a96c143e0 Mon Sep 17 00:00:00 2001 From: Greg Tucker Date: Thu, 14 Mar 2024 10:32:31 +0100 Subject: [PATCH 007/330] [Add] indirect submodule and some utilities Transforming detector position and detection time to (Q,E) requires determining the mangintude and direction of the incident and final wavevectors, ki and kf. Direct and indirect time-of-flight spectrometers define these differently, so need different utilities to extract them from their recorded NeXus files. This commit introduces an indirect submodule to contain the utilities required to define ki and kf for an indirect time-of-flight spectrometer. --- .../src/ess/spectroscopy/indirect/__init__.py | 0 .../src/ess/spectroscopy/indirect/kf.py | 96 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py new file mode 100644 index 000000000..8098c9ab5 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -0,0 +1,96 @@ +from scipp import Variable + + +def _norm(vector: Variable) -> Variable: + from scipp import sqrt, dot, DType + assert vector.dtype == DType.vector3 # "Vector operations require scipp.DType.vector3 elements!" + return sqrt(dot(vector, vector)) + + +def sample_analyzer_vector( + sample_position: Variable, + analyzer_position: Variable, + analyzer_orientation: Variable, + detector_position: Variable +) -> Variable: + """Determine the sample to analyzer-reflection-point vector per detector element + + :parameter sample_position: scipp.DType.vector3 + The (probably singular) sample position, typically (0, 0, 0) + :parameter analyzer_position: scipp.DType.vector3 + The nominal center of the central analyzer blade *surface* + :parameter analyzer_orientation: scipp.DType.rotate3 + The orienting quaternion of the analyzer, used to identify the crystal y-axis + :parameter detector_position: scipp.DType.vector3 + The position of the detector element + + :Note: + The shapes of the analyzer position and orientation should be self-consistent and will likely be 1:1. + There is expected to be multiple detector element positions per analyzer which can be represented as + an additional dimension compared to the analyzer shapes. + """ + from scipp import concat, vector, dot, sqrt, DType + + yhat = analyzer_orientation * vector([0, 1, 0]) + if analyzer_orientation.dtype != DType.rotation3: + # If the orientation provided is a Affine transformation we need to subtract the coordinate translation + yhat -= analyzer_orientation * vector([0, 0, 0]) + + sample_analyzer_center_vector = analyzer_position - sample_position + + sample_detector_vector = detector_position - sample_position + sd_out_of_plane = dot(sample_detector_vector, yhat) + # the sample-detector vector is the sum of sample-analyzer, analyzer-detector-center, the out-of-plane vector + analyzer_detector_center_vector = sample_detector_vector - sample_analyzer_center_vector - sd_out_of_plane * yhat + + # TODO Consider requiring that dot(analyzer_position - sample_position, yhat) is zero? + + sample_analyzer_center_distance = _norm(sample_analyzer_center_vector) + + analyzer_detector_center_distance = _norm(analyzer_detector_center_vector) + + # similar-triangles give the out-of-plane analyzer reflection point distance + sa_out_of_plane = sample_analyzer_center_distance / (sample_analyzer_center_distance + analyzer_detector_center_distance) * sd_out_of_plane + + return sample_analyzer_center_vector + sa_out_of_plane * yhat + + +def analyzer_detector_vector(sample_position: Variable, sample_analyzer_vec: Variable, detector_position: Variable) -> Variable: + return detector_position - (sample_position + sample_analyzer_vec) + + +def kf_hat(sample_analyzer_vec: Variable) -> Variable: + return sample_analyzer_vec / _norm(sample_analyzer_vec) + + +def kf_wavenumber(sample_analyzer_vec: Variable, analyzer_detector_vec: Variable, tau: Variable) -> Variable: + from scipp import sqrt, DType + if tau.dtype == DType.vector3: + tau = _norm(tau) + + # law of Cosines gives the scattering angle based on distances: + l_sa = _norm(sample_analyzer_vec) + l_ad = _norm(analyzer_detector_vec) + l_diff = _norm(sample_analyzer_vec - analyzer_detector_vec) + cos2theta = (l_sa * l_sa + l_ad * l_ad - l_diff * l_diff) / (2 * l_sa + l_ad) + + # law of Cosines gives the Bragg reflected wavevector magnitude + return tau / sqrt(2 - 2 * cos2theta) + + +def kf_vector(kf_direction: Variable, kf_magnitude: Variable) -> Variable: + return kf_direction * kf_magnitude + + +def secondary_flight_path_length(sample_analyzer_vec: Variable, analyzer_detector_vec: Variable) -> Variable: + return _norm(sample_analyzer_vec) + _norm(analyzer_detector_vec) + + +def secondary_flight_time(secondary_flight_distance: Variable, kf_magnitude: Variable) -> Variable: + from scipp.constants import hbar, neutron_mass + velocity = kf_magnitude * hbar / neutron_mass + return secondary_flight_distance / velocity + + +def sample_time(detector_time: Variable, secondary_time: Variable) -> Variable: + return detector_time - secondary_time From 21f8bcbd15f4bbbf580632901d1d363caba23898 Mon Sep 17 00:00:00 2001 From: Greg Tucker Date: Wed, 20 Mar 2024 12:01:18 +0100 Subject: [PATCH 008/330] [Refactor] add types for sciline --- .../src/ess/spectroscopy/indirect/kf.py | 72 ++++++++++++------- .../src/ess/spectroscopy/types.py | 26 +++++++ .../src/ess/spectroscopy/utils.py | 8 +++ 3 files changed, 79 insertions(+), 27 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/types.py create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/utils.py diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 8098c9ab5..b0d953654 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -1,18 +1,12 @@ -from scipp import Variable - - -def _norm(vector: Variable) -> Variable: - from scipp import sqrt, dot, DType - assert vector.dtype == DType.vector3 # "Vector operations require scipp.DType.vector3 elements!" - return sqrt(dot(vector, vector)) +from ess.spectroscopy.types import * def sample_analyzer_vector( - sample_position: Variable, - analyzer_position: Variable, - analyzer_orientation: Variable, - detector_position: Variable -) -> Variable: + sample_position: SamplePosition, + analyzer_position: AnalyzerPosition, + analyzer_orientation: AnalyzerOrientation, + detector_position: DetectorPosition +) -> SampleAnalyzerVector: """Determine the sample to analyzer-reflection-point vector per detector element :parameter sample_position: scipp.DType.vector3 @@ -30,6 +24,7 @@ def sample_analyzer_vector( an additional dimension compared to the analyzer shapes. """ from scipp import concat, vector, dot, sqrt, DType + from ess.spectroscopy.utils import norm yhat = analyzer_orientation * vector([0, 1, 0]) if analyzer_orientation.dtype != DType.rotation3: @@ -45,9 +40,9 @@ def sample_analyzer_vector( # TODO Consider requiring that dot(analyzer_position - sample_position, yhat) is zero? - sample_analyzer_center_distance = _norm(sample_analyzer_center_vector) + sample_analyzer_center_distance = norm(sample_analyzer_center_vector) - analyzer_detector_center_distance = _norm(analyzer_detector_center_vector) + analyzer_detector_center_distance = norm(analyzer_detector_center_vector) # similar-triangles give the out-of-plane analyzer reflection point distance sa_out_of_plane = sample_analyzer_center_distance / (sample_analyzer_center_distance + analyzer_detector_center_distance) * sd_out_of_plane @@ -55,42 +50,65 @@ def sample_analyzer_vector( return sample_analyzer_center_vector + sa_out_of_plane * yhat -def analyzer_detector_vector(sample_position: Variable, sample_analyzer_vec: Variable, detector_position: Variable) -> Variable: +def analyzer_detector_vector( + sample_position: SamplePosition, + sample_analyzer_vec: SampleAnalyzerVector, + detector_position: DetectorPosition +) -> AnalyzerDetectorVector: return detector_position - (sample_position + sample_analyzer_vec) -def kf_hat(sample_analyzer_vec: Variable) -> Variable: - return sample_analyzer_vec / _norm(sample_analyzer_vec) +def kf_hat(sample_analyzer_vec: SampleAnalyzerVector) -> SampleAnalyzerDirection: + from ess.spectroscopy.utils import norm + return sample_analyzer_vec / norm(sample_analyzer_vec) -def kf_wavenumber(sample_analyzer_vec: Variable, analyzer_detector_vec: Variable, tau: Variable) -> Variable: +def kf_wavenumber( + sample_analyzer_vec: SampleAnalyzerVector, + analyzer_detector_vec: AnalyzerDetectorVector, + tau: ReciprocalLatticeSpacing | ReciprocalLatticeVectorAbsolute +) -> Wavenumber: from scipp import sqrt, DType + from ess.spectroscopy.utils import norm if tau.dtype == DType.vector3: - tau = _norm(tau) + tau = norm(tau) # law of Cosines gives the scattering angle based on distances: - l_sa = _norm(sample_analyzer_vec) - l_ad = _norm(analyzer_detector_vec) - l_diff = _norm(sample_analyzer_vec - analyzer_detector_vec) + l_sa = norm(sample_analyzer_vec) + l_ad = norm(analyzer_detector_vec) + l_diff = norm(sample_analyzer_vec - analyzer_detector_vec) cos2theta = (l_sa * l_sa + l_ad * l_ad - l_diff * l_diff) / (2 * l_sa + l_ad) # law of Cosines gives the Bragg reflected wavevector magnitude return tau / sqrt(2 - 2 * cos2theta) -def kf_vector(kf_direction: Variable, kf_magnitude: Variable) -> Variable: +def kf_vector( + kf_direction: SampleAnalyzerDirection, + kf_magnitude: Wavenumber +) -> Wavevector: return kf_direction * kf_magnitude -def secondary_flight_path_length(sample_analyzer_vec: Variable, analyzer_detector_vec: Variable) -> Variable: - return _norm(sample_analyzer_vec) + _norm(analyzer_detector_vec) +def secondary_flight_path_length( + sample_analyzer_vec: SampleAnalyzerVector, + analyzer_detector_vec: AnalyzerDetectorVector +) -> SampleDetectorPathLength: + from ess.spectroscopy.utils import norm + return norm(sample_analyzer_vec) + norm(analyzer_detector_vec) -def secondary_flight_time(secondary_flight_distance: Variable, kf_magnitude: Variable) -> Variable: +def secondary_flight_time( + secondary_flight_distance: SampleDetectorPathLength, + kf_magnitude: Wavenumber +) -> SampleDetectorFlightTime: from scipp.constants import hbar, neutron_mass velocity = kf_magnitude * hbar / neutron_mass return secondary_flight_distance / velocity -def sample_time(detector_time: Variable, secondary_time: Variable) -> Variable: +def sample_time( + detector_time: DetectorTime, + secondary_time: SampleDetectorFlightTime +) -> SampleTime: return detector_time - secondary_time diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py new file mode 100644 index 000000000..a7efdf6a6 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -0,0 +1,26 @@ +from typing import Type +from scipp import Variable + + +def variable_type(named: str) -> Type[Variable]: + from typing import NewType + return NewType(named, Variable) + + +SamplePosition = variable_type('SamplePosition') +AnalyzerPosition = variable_type('AnalyzerPosition') +DetectorPosition = variable_type('DetectorPosition') +AnalyzerOrientation = variable_type('AnalyzerOrientation') +SampleAnalyzerVector = variable_type('SampleAnalyzerVector') +AnalyzerDetectorVector = variable_type('AnalyzerDetectorVector') +SampleAnalyzerDirection = variable_type('SampleAnalyzerDirection') +ReciprocalLatticeVectorAbsolute = variable_type('ReciprocalLatticeVectorAbsolute') +ReciprocalLatticeSpacing = variable_type('ReciprocalLatticeSpacing') +WavevectorDirection = variable_type('WavevectorDirection') +Wavenumber = variable_type('Wavenumber') +Wavevector = variable_type('Wavevector') +SampleDetectorPathLength = variable_type('SampleDetectorPathLength') +SampleDetectorFlightTime = variable_type('SampleDetectorFlightTime') +SampleTime = variable_type('SampleTime') +DetectorTime = variable_type('DetectorTime') +SourceTime = variable_type('SourceTime') diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py new file mode 100644 index 000000000..02ef4f9e4 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -0,0 +1,8 @@ +from scipp import Variable + + +def norm(vector: Variable) -> Variable: + from scipp import sqrt, dot, DType + assert vector.dtype == DType.vector3 # "Vector operations require scipp.DType.vector3 elements!" + return sqrt(dot(vector, vector)) + From ed001b443ab58988d2bfc3afaaad576881167442 Mon Sep 17 00:00:00 2001 From: Greg Tucker Date: Fri, 19 Apr 2024 15:06:32 +0200 Subject: [PATCH 009/330] [Fix] unit issue and cos 2theta mistake --- .../src/ess/spectroscopy/indirect/kf.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index b0d953654..a437f184e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -26,10 +26,13 @@ def sample_analyzer_vector( from scipp import concat, vector, dot, sqrt, DType from ess.spectroscopy.utils import norm - yhat = analyzer_orientation * vector([0, 1, 0]) - if analyzer_orientation.dtype != DType.rotation3: - # If the orientation provided is a Affine transformation we need to subtract the coordinate translation - yhat -= analyzer_orientation * vector([0, 0, 0]) + # Scipp does not distinguish between coordinates and directions, so we need to do some extra legwork + # to ensure we can apply the orientation transformation _and_ obtain a dimensionless direction vector + y = vector([0, 1, 0], unit=analyzer_orientation.unit) + + yhat = (analyzer_orientation * vector([0, 1, 0], unit=analyzer_orientation.unit) + - analyzer_orientation * vector([0, 0, 0], unit=analyzer_orientation.unit)) + yhat /= norm(yhat) sample_analyzer_center_vector = analyzer_position - sample_position @@ -77,7 +80,9 @@ def kf_wavenumber( l_sa = norm(sample_analyzer_vec) l_ad = norm(analyzer_detector_vec) l_diff = norm(sample_analyzer_vec - analyzer_detector_vec) - cos2theta = (l_sa * l_sa + l_ad * l_ad - l_diff * l_diff) / (2 * l_sa + l_ad) + # 2 theta is measured from the direction S-A, so the internal angle is (pi - 2 theta) + # and the normal law of Cosines is modified accordingly to be -cos(2 theta) instead of cos(pi - 2 theta) + cos2theta = (l_diff * l_diff - l_sa * l_sa - l_ad * l_ad) / (2 * l_sa * l_ad) # law of Cosines gives the Bragg reflected wavevector magnitude return tau / sqrt(2 - 2 * cos2theta) From 25164b2822724a58f1c8abaf5777c5aa4094ea5f Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Fri, 24 May 2024 17:05:59 +0200 Subject: [PATCH 010/330] [Add] primary path length calculation and new types --- .../src/ess/spectroscopy/indirect/kf.py | 8 ++-- .../src/ess/spectroscopy/indirect/ki.py | 45 +++++++++++++++++++ .../src/ess/spectroscopy/types.py | 17 ++++--- 3 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index a437f184e..600141a2b 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -70,7 +70,7 @@ def kf_wavenumber( sample_analyzer_vec: SampleAnalyzerVector, analyzer_detector_vec: AnalyzerDetectorVector, tau: ReciprocalLatticeSpacing | ReciprocalLatticeVectorAbsolute -) -> Wavenumber: +) -> FinalWavenumber: from scipp import sqrt, DType from ess.spectroscopy.utils import norm if tau.dtype == DType.vector3: @@ -90,8 +90,8 @@ def kf_wavenumber( def kf_vector( kf_direction: SampleAnalyzerDirection, - kf_magnitude: Wavenumber -) -> Wavevector: + kf_magnitude: FinalWavenumber +) -> FinalWavevector: return kf_direction * kf_magnitude @@ -105,7 +105,7 @@ def secondary_flight_path_length( def secondary_flight_time( secondary_flight_distance: SampleDetectorPathLength, - kf_magnitude: Wavenumber + kf_magnitude: FinalWavenumber ) -> SampleDetectorFlightTime: from scipp.constants import hbar, neutron_mass velocity = kf_magnitude * hbar / neutron_mass diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py new file mode 100644 index 000000000..1ee9b5cf0 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -0,0 +1,45 @@ +"""Utilities for the primary spectrometer of an indirect geometry time-of-flight spectrometer""" +#TODO move elsewhere since possibly (probably) too specific to BIFROST. + +from ess.spectroscopy.types import * + + +def source_position(file: NeXusFileName) -> SourcePosition: + from scippnexus import compute_positions, NXsource, NXmoderator, File + options = {} + with File(file) as data: + instrument = data['entry/instrument'] + for nx_type in (NXsource, NXmoderator): + options.update(instrument[nx_type]) + if len(options) == 0: + raise RuntimeError('No source position') + return compute_positions(list(options.values())[-1][...])['position'] + + +def sample_position(file: NeXusFileName) -> SamplePosition: + from scippnexus import compute_positions, NXsample, File + from scipp import vector + options = {} + with File(file) as data: + instrument = data['entry/instrument'] + options.update(instrument[NXsample]) + if len(options) == 0: + return vector(value=[0., 0., 0.], unit='m') + return compute_positions(list(options.values())[-1][...])['position'] + + +def primary_path_length(file: NeXusFileName, source: SourcePosition, sample: SamplePosition) -> SourceSamplePathLength: + """Compute the primary spectrometer path length + + Note: + This *requires* that the instrument group *is sorted* along the beam path. HDF5 group entries are sorted + alphabetically, so you should ensure that the NeXus file was constructed with this in mind. + """ + from scippnexus import compute_positions, NXguide, File + from scipp import dot, sqrt, sum, concat + with File(file) as data: + positions = [compute_positions(v[...])['position'] for v in data['entry/instrument'][NXguide].values()] + + positions = concat((source, *positions, sample), dim='path') + diff = positions['path', 1:] - positions['path', :-1] + return sum(sqrt(dot(diff, diff))) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index a7efdf6a6..f6cfea6c7 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,12 +1,14 @@ -from typing import Type +from typing import Type, NewType from scipp import Variable def variable_type(named: str) -> Type[Variable]: - from typing import NewType return NewType(named, Variable) +NeXusFileName = NewType('NeXusFileName', str) + +SourcePosition = variable_type('SourcePosition') SamplePosition = variable_type('SamplePosition') AnalyzerPosition = variable_type('AnalyzerPosition') DetectorPosition = variable_type('DetectorPosition') @@ -16,9 +18,14 @@ def variable_type(named: str) -> Type[Variable]: SampleAnalyzerDirection = variable_type('SampleAnalyzerDirection') ReciprocalLatticeVectorAbsolute = variable_type('ReciprocalLatticeVectorAbsolute') ReciprocalLatticeSpacing = variable_type('ReciprocalLatticeSpacing') -WavevectorDirection = variable_type('WavevectorDirection') -Wavenumber = variable_type('Wavenumber') -Wavevector = variable_type('Wavevector') +IncidentWavevectorDirection = variable_type('IncidentWavevectorDirection') +IncidentWavenumber = variable_type('IncidentWavenumber') +IncidentWavevector = variable_type('IncidentWavevector') +FinalWavevectorDirection = variable_type('FinalWavevectorDirection') +FinalWavenumber = variable_type('FinalWavenumber') +FinalWavevector = variable_type('FinalWavevector') +SourceSamplePathLength = variable_type('SourceSamplePathLength') +SourceSampleFlightTime = variable_type('SourceSampleFlightTime') SampleDetectorPathLength = variable_type('SampleDetectorPathLength') SampleDetectorFlightTime = variable_type('SampleDetectorFlightTime') SampleTime = variable_type('SampleTime') From c33af8b3f36a88aa511b9a70856363af196b7522 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Thu, 27 Jun 2024 20:43:30 +0200 Subject: [PATCH 011/330] [Add] wrong analyzer cculation as example With the restriction that the analyzer tau direction is known, it possible to calculate the analyzer reflection position as the intersection of three planes. This restriction is incorrect when aalyzer has finitsaic, as in the case of the prismatic analyzer setup at BIFROST. A method to calculate thintersection pthis restriction is added so as to avoid re-creating it later. [Add] simple tests for the analyzer reflection position Detailed tests investigating small O(1e-5) m discrepencies in analyzer-detector distances are still needed. --- .../src/ess/spectroscopy/indirect/kf.py | 91 ++++++++++- .../essspectroscopy/tests/indirect_test.py | 154 ++++++++++++++++++ 2 files changed, 241 insertions(+), 4 deletions(-) create mode 100644 packages/essspectroscopy/tests/indirect_test.py diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 600141a2b..a828ddc4d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -28,10 +28,9 @@ def sample_analyzer_vector( # Scipp does not distinguish between coordinates and directions, so we need to do some extra legwork # to ensure we can apply the orientation transformation _and_ obtain a dimensionless direction vector - y = vector([0, 1, 0], unit=analyzer_orientation.unit) - - yhat = (analyzer_orientation * vector([0, 1, 0], unit=analyzer_orientation.unit) - - analyzer_orientation * vector([0, 0, 0], unit=analyzer_orientation.unit)) + o = vector([0, 0, 0], unit=analyzer_orientation.unit) + y = vector([0, 1, 0], unit=analyzer_orientation.unit) # and y perpendicular to the scattering plane + yhat = analyzer_orientation * y - analyzer_orientation * o yhat /= norm(yhat) sample_analyzer_center_vector = analyzer_position - sample_position @@ -53,6 +52,90 @@ def sample_analyzer_vector( return sample_analyzer_center_vector + sa_out_of_plane * yhat +def fixed_tau_hat_sample_analyzer_vector( + sample_position: SamplePosition, + analyzer_position: AnalyzerPosition, + analyzer_orientation: AnalyzerOrientation, + detector_position: DetectorPosition +) -> SampleAnalyzerVector: + """Determine the sample to analyzer-reflection-point vector per detector element as the intersection of three planes + + :parameter sample_position: scipp.DType.vector3 + The (probably singular) sample position, typically (0, 0, 0) + :parameter analyzer_position: scipp.DType.vector3 + Any point on the central analyzer blade reflecting plane + :parameter analyzer_orientation: scipp.DType.rotate3 + The orienting quaternion of the analyzer, used to identify the crystal tau and y-axis + :parameter detector_position: scipp.DType.vector3 + The position of the detector element + + :Note: + The shapes of the analyzer position and orientation should be self-consistent and will likely be 1:1. + There is expected to be multiple detector element positions per analyzer which can be represented as + an additional dimension compared to the analyzer shapes. + + :Warning: + This function makes the incorrect assumption that the _direction_ of tau is known, but this breaks the + prismatic analyzer model for BIFROST. In reality, we rely on the finite mosaic spread of the analyzer to + scatter slightly different energies to the different detectors, so this method can not work. + """ + from uuid import uuid4 + from numpy.linalg import solve as linalg_solve, matrix_rank, lstsq as linalg_least_sqr + from scipp import any as sc_any, cross, concat, scalar, vector, dot, vectors + from ess.spectroscopy.utils import norm + + # Scipp does not distinguish between coordinates and directions, so we need to do some extra legwork + # to ensure we can apply the orientation transformation _and_ obtain a dimensionless direction vector + o = vector([0, 0, 0], unit=analyzer_orientation.unit) + x = vector([1, 0, 0], unit=analyzer_orientation.unit) # McStas defines x parallel to Bragg plane tau + y = vector([0, 1, 0], unit=analyzer_orientation.unit) # and y perpendicular to the scattering plane + # z is in the Bragg plane and in the scattering plane + + tau, yhat = [v / norm(v) for v in [(analyzer_orientation * ei - analyzer_orientation * o) for ei in (x, y)]] + + v_d = detector_position - sample_position + n_v_d = norm(v_d) + if sc_any(n_v_d == scalar(0., unit=sample_position.unit)): + bad = n_v_d == scalar(0., unit=sample_position.unit) + n_v_d.values[bad.values] = 1.0 + print(f"Some detector(s) are located at the detector?") + v_d /= n_v_d + + # collect the normal directions for the three planes + n_1, n_2, n_3 = cross(v_d, tau), tau, v_d # each (N_det, 3), or (3,) + # and collect the right-hand side of the three plane equations + b_1 = dot(sample_position, n_1).to(unit=sample_position.unit) # (N_sample, N_det) or (N_det,) + b_2 = dot(analyzer_position, n_2).to(unit=sample_position.unit) # (N_analyzer,) + b_3 = dot(0.5 * sample_position + 0.5 * detector_position, n_3).to(unit=sample_position.unit) + + if n_1.ndim > 0 or n_2.ndim > 0 or n_3.ndim > 0 or b_1.ndim > 0 or b_2.ndim > 0 or b_3.ndim > 0: + blob = 0 * (n_1 + n_2 + n_3) # broadcast to a common shape + n_1, n_2, n_3 = [x + blob for x in (n_1, n_2, n_3)] + blob = 0 * (b_1 + b_2 + b_3) # broadcast to a common shape + b_1, b_2, b_3 = [x + blob for x in (b_1, b_2, b_3)] + + new_dim = str(uuid4()) + a = concat([n_1, n_2, n_3], dim=new_dim).transpose(dims=n_1.dims + (new_dim,)).values # (..., 3, 3) + b = concat([b_1, b_2, b_3], dim=new_dim).transpose(dims=n_1.dims + (new_dim,)).values # (..., 3) + + # as of numpy 2.0, b must be (..., 3, 1) for broadcasting to work + # https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html + b = b[..., :, None] + # and we need to strip off this dimension after solving + x = linalg_solve(a, b).squeeze(-1) + + # if any of the n_1, n_2, or n_3 are zero (or, equivalently, a linear relationship exists between any two), + # numpy.linalg.solve will not have worked, and probably returned garbage. + if any((mr := matrix_rank(a)) < 3): + from numpy import ndenumerate + for i, m in ndenumerate(mr): + if m < 3: + x[i] = linalg_least_sqr(a[i], b[i][:, 0])[0] + + analyzer_point = vectors(values=x, dims=n_1.dims, unit=sample_position.unit) + return analyzer_point - sample_position + + def analyzer_detector_vector( sample_position: SamplePosition, sample_analyzer_vec: SampleAnalyzerVector, diff --git a/packages/essspectroscopy/tests/indirect_test.py b/packages/essspectroscopy/tests/indirect_test.py new file mode 100644 index 000000000..e9cb14e53 --- /dev/null +++ b/packages/essspectroscopy/tests/indirect_test.py @@ -0,0 +1,154 @@ +from ess.spectroscopy.indirect import kf as secondary +from ess.spectroscopy.indirect import ki as primary + +from scipp import vector, scalar, array, sqrt +from scipp.spatial import rotations_from_rotvecs +from ess.spectroscopy.utils import norm + +from ess.spectroscopy.types import ( + SamplePosition, + SampleAnalyzerVector, + DetectorPosition, + AnalyzerDetectorVector, + SampleAnalyzerDirection, + ReciprocalLatticeSpacing, + ReciprocalLatticeVectorAbsolute, + FinalWavenumber, + FinalWavevector, + SampleDetectorPathLength, + SampleDetectorFlightTime +) + + +def vectors_close(a, b, tol=None): + from scipp import dot, sqrt, scalar + if tol is None: + tol = scalar(1e-8, unit=a.unit) + difference = a - b + return sqrt(dot(difference, difference)) < tol + + +def all_vectors_close(a, b, tol=None): + if len(a.shape) > 1 and len(b.shape) > 1: + for d in a.dims: + if d not in b.dims: + return False + if a.sizes[d] != b.sizes[d]: + return False + if a.shape != b.shape: + return False + return all_vectors_close(a.flatten(to='one'), b.flatten(to='one'), tol) + if len(a.shape) and len(b.shape): + if a.shape != b.shape: + return False + for x, y in zip(a, b): + if not vectors_close(x, y, tol): + return False + elif len(a.shape): + for x in a: + if not vectors_close(x, b, tol): + return False + elif len(b.shape): + for y in b: + if not vectors_close(a, y, tol): + return False + else: + return vectors_close(a, b, tol) + return True + + +def test_back_scattering_sample_analyzer_vector(): + sample_position = vector([0.0, 0.0, 0.0], unit='m') + + # The analyzer orientation defines the scattering plane coordinate system: + analyzer_transform = rotations_from_rotvecs(vector([0., 0., 0.], unit='degree')) + + x = analyzer_transform * vector([1.0, 0.0, 0.0], unit='1') + y = analyzer_transform * vector([0.0, 1.0, 0.0], unit='1') + z = analyzer_transform * vector([0.0, 0.0, 1.0], unit='1') + # sample-analyzer-vector must be along the local z axis + sample_analyzer_vec = scalar(1.0, unit='m') * z + analyzer_position = sample_analyzer_vec + sample_position + + # analyzer orientation of 90 degrees -> scattering angle of 180 degrees: back scattering + analyzer_orientation = rotations_from_rotvecs(scalar(90.0, unit='degree') * y) + + detector_y = analyzer_orientation * analyzer_orientation * y + assert vectors_close(detector_y, y) + # The detector positions are defined in the coordinate system, then rotated around the analyzer position + tubes = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['tube']) * x + detector_positions = scalar(1.0, unit='m') * z + tubes + detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions + calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, detector_positions) + + # This would be 'right' for fixed tau direction, but we utilize the mosaic and insist on scattering from + # the center line of the analyzer + # offset = sample_analyzer_vec - tubes / 2.0 # minus because the detector has been rotated 180 degrees + assert all_vectors_close(calculated, sample_analyzer_vec) + + # Offsetting along the analyzer scattering plane normal moves the analyzer intersection point by half + wires = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['wire']) * y + detector_positions = scalar(1.0, unit='m') * z + wires + detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions + calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, detector_positions) + assert all_vectors_close(calculated, sample_analyzer_vec + wires / 2.0) + + # Offsetting in both transverse directions at once + detector_positions = scalar(1.0, unit='m') * z + wires + tubes + detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions + calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, detector_positions) + # as the x displacement increases, the y displacement should decrease + frac = wires / (1.0 + sqrt(1.0 + (norm(tubes) / scalar(1.0, unit='m'))**2)) + assert all_vectors_close(calculated, sample_analyzer_vec + frac) + + +def test_sample_analyzer_vector(): + # TODO Randomize the sample position + # TODO Randomize the analyzer transformation (a3 angle) + # TODO Randomize the analyzer distance + # TODO Randomize the detector positions + + from random import random + sample_position = vector([0.0, 0.0, 0.0], unit='m') + + # The analyzer orientation defines the scattering plane coordinate system: + analyzer_transform = rotations_from_rotvecs(vector([0., 0., 0.], unit='degree')) + + x = analyzer_transform * vector([1.0, 0.0, 0.0], unit='1') + y = analyzer_transform * vector([0.0, 1.0, 0.0], unit='1') + z = analyzer_transform * vector([0.0, 0.0, 1.0], unit='1') + # sample-analyzer-vector must be along the local z axis + sample_analyzer_vec = scalar(0.5 + random(), unit='m') * z + sample_analyzer_vec /= norm(sample_analyzer_vec).value + analyzer_position = sample_analyzer_vec + sample_position + + # Avoid sin(theta) values near 0 or 1 + # analyzer_orientation = rotations_from_rotvecs(scalar(random() * 70.0 + 5.0, unit='degree') * y) + analyzer_orientation = rotations_from_rotvecs(scalar(45.0, unit='degree') * y) + + detector_y = analyzer_orientation * analyzer_orientation * y + assert vectors_close(detector_y, y) + # The detector positions are defined in the coordinate system, then rotated around the analyzer position + tubes = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['tube']) * x + detector_positions = scalar(1.0, unit='m') * z + tubes + detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions + calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, detector_positions) + offset = calculated - sample_analyzer_vec + assert all_vectors_close(offset, 0 * tubes) + + # Offsetting along the analyzer scattering plane normal moves the analyzer intersection point by half + wires = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['wire']) * y + detector_positions = scalar(1.0, unit='m') * z + wires + detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions + calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, + detector_positions) + assert all_vectors_close(calculated, sample_analyzer_vec + wires / 2.0) + + # Offsetting in both transverse directions at once + detector_positions = scalar(1.0, unit='m') * z + wires + tubes + detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions + calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, + detector_positions) + # as the x displacement increases, the y displacement should decrease + frac = wires / (1.0 + sqrt(1.0 + (norm(tubes) / scalar(1.0, unit='m')) ** 2)) + assert all_vectors_close(calculated, sample_analyzer_vec + frac) From a091f6cada6aed3d490390d61975fac350fb116f Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Tue, 6 Aug 2024 14:11:54 +0200 Subject: [PATCH 012/330] [Add] lattice spacing function --- .../src/ess/spectroscopy/indirect/kf.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index a828ddc4d..2407db972 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -149,15 +149,18 @@ def kf_hat(sample_analyzer_vec: SampleAnalyzerVector) -> SampleAnalyzerDirection return sample_analyzer_vec / norm(sample_analyzer_vec) +def reciprocal_lattice_spacing(tau_vector: ReciprocalLatticeVectorAbsolute): + from ess.spectroscopy.utils import norm + return norm(tau_vector) + + def kf_wavenumber( sample_analyzer_vec: SampleAnalyzerVector, analyzer_detector_vec: AnalyzerDetectorVector, - tau: ReciprocalLatticeSpacing | ReciprocalLatticeVectorAbsolute + tau: ReciprocalLatticeSpacing ) -> FinalWavenumber: - from scipp import sqrt, DType + from scipp import sqrt from ess.spectroscopy.utils import norm - if tau.dtype == DType.vector3: - tau = norm(tau) # law of Cosines gives the scattering angle based on distances: l_sa = norm(sample_analyzer_vec) From 938be88419485ee715ecd9487dcab000907ae0d9 Mon Sep 17 00:00:00 2001 From: Mridul Seth Date: Fri, 3 May 2024 13:56:13 +0200 Subject: [PATCH 013/330] MAINT: Run copier update, tox -e deps --- packages/essspectroscopy/.copier-answers.yml | 2 +- .../essspectroscopy/.github/workflows/ci.yml | 7 +-- .../.github/workflows/docs.yml | 12 ++--- .../.github/workflows/nightly_at_main.yml | 3 -- .../.github/workflows/nightly_at_release.yml | 3 -- .../.github/workflows/release.yml | 21 ++++---- .../.github/workflows/test.yml | 9 ++-- .../.github/workflows/unpinned.yml | 3 -- .../essspectroscopy/.pre-commit-config.yaml | 29 +++-------- packages/essspectroscopy/conda/meta.yaml | 10 ++++ .../docs/_templates/doc_version.html | 2 +- packages/essspectroscopy/docs/conf.py | 19 +++---- .../docs/developer/coding-conventions.md | 2 +- .../essspectroscopy/docs/developer/index.md | 2 +- packages/essspectroscopy/pyproject.toml | 45 +++++++++++++---- .../essspectroscopy/requirements/base.txt | 18 +++---- .../essspectroscopy/requirements/basetest.txt | 8 +-- packages/essspectroscopy/requirements/ci.txt | 18 +++---- .../essspectroscopy/requirements/docs.txt | 50 +++++++++++-------- .../essspectroscopy/requirements/make_base.py | 3 -- .../essspectroscopy/requirements/static.txt | 10 ++-- .../essspectroscopy/requirements/wheels.txt | 10 ++-- packages/essspectroscopy/setup.cfg | 4 -- .../src/ess/spectroscopy/__init__.py | 2 +- packages/essspectroscopy/tox.ini | 4 +- 25 files changed, 148 insertions(+), 148 deletions(-) delete mode 100644 packages/essspectroscopy/setup.cfg diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index e195d6df4..7ae50047b 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 6770edb +_commit: afbe5c7 _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.12' diff --git a/packages/essspectroscopy/.github/workflows/ci.yml b/packages/essspectroscopy/.github/workflows/ci.yml index 497ab895e..44266a238 100644 --- a/packages/essspectroscopy/.github/workflows/ci.yml +++ b/packages/essspectroscopy/.github/workflows/ci.yml @@ -1,6 +1,3 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - name: CI on: @@ -24,13 +21,13 @@ jobs: run: | echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT echo "min_tox_env=py$(cat .github/workflows/python-version-ci | sed 's/\.//g')" >> $GITHUB_OUTPUT - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version-file: '.github/workflows/python-version-ci' - uses: pre-commit/action@v3.0.1 with: extra_args: --all-files - - uses: pre-commit-ci/lite-action@v1.0.1 + - uses: pre-commit-ci/lite-action@v1.0.2 if: always() with: msg: Apply automatic formatting diff --git a/packages/essspectroscopy/.github/workflows/docs.yml b/packages/essspectroscopy/.github/workflows/docs.yml index 5e189fb0b..7e5a7bc6d 100644 --- a/packages/essspectroscopy/.github/workflows/docs.yml +++ b/packages/essspectroscopy/.github/workflows/docs.yml @@ -1,6 +1,3 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - name: Docs on: @@ -47,11 +44,12 @@ jobs: runs-on: 'ubuntu-22.04' steps: - run: sudo apt install --yes graphviz pandoc - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ inputs.branch == '' && github.ref_name || inputs.branch }} + repository: ${{ github.event.pull_request.head.repo.full_name }} fetch-depth: 0 # history required so cmake can determine version - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version-file: '.github/workflows/python-version-ci' - run: python -m pip install --upgrade pip @@ -62,12 +60,12 @@ jobs: if: ${{ inputs.version == '' }} - run: tox -e linkcheck if: ${{ inputs.linkcheck }} - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: docs_html path: html/ - - uses: JamesIves/github-pages-deploy-action@v4.4.3 + - uses: JamesIves/github-pages-deploy-action@v4.6.0 if: ${{ inputs.publish }} with: branch: gh-pages diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml index 10730688b..08fdddd29 100644 --- a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml +++ b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml @@ -1,6 +1,3 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - name: Nightly test at main branch on: diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml index 7f1653bba..373c45463 100644 --- a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml +++ b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml @@ -1,6 +1,3 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - name: Nightly tests at latest release on: diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml index e492978a7..d1317a767 100644 --- a/packages/essspectroscopy/.github/workflows/release.yml +++ b/packages/essspectroscopy/.github/workflows/release.yml @@ -1,6 +1,3 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - name: Release on: @@ -18,7 +15,7 @@ jobs: runs-on: 'ubuntu-22.04' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true fetch-depth: 0 # history required so setuptools_scm can determine version @@ -31,7 +28,7 @@ jobs: boa - run: conda mambabuild --channel conda-forge --channel scipp --no-anaconda-upload --override-channels --output-folder conda/package conda - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: conda-package-noarch path: conda/package/noarch/*.tar.bz2 @@ -41,11 +38,11 @@ jobs: runs-on: 'ubuntu-22.04' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # history required so setuptools_scm can determine version - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version-file: '.github/workflows/python-version-ci' @@ -56,7 +53,7 @@ jobs: run: python -m build - name: Upload wheels - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: dist path: dist @@ -70,8 +67,8 @@ jobs: id-token: write if: github.event_name == 'release' && github.event.action == 'published' steps: - - uses: actions/download-artifact@v3 - - uses: pypa/gh-action-pypi-publish@v1.8.10 + - uses: actions/download-artifact@v4 + - uses: pypa/gh-action-pypi-publish@v1.8.14 upload_conda: name: Deploy Conda @@ -80,7 +77,7 @@ jobs: if: github.event_name == 'release' && github.event.action == 'published' steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 - uses: mamba-org/setup-micromamba@v1 with: environment-name: upload-env @@ -104,7 +101,7 @@ jobs: permissions: contents: write # This is needed so that the action can upload the asset steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 - name: Zip documentation run: | mv docs_html documentation-${{ github.ref_name }} diff --git a/packages/essspectroscopy/.github/workflows/test.yml b/packages/essspectroscopy/.github/workflows/test.yml index 3cfb75de8..5f56a069a 100644 --- a/packages/essspectroscopy/.github/workflows/test.yml +++ b/packages/essspectroscopy/.github/workflows/test.yml @@ -1,6 +1,3 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - name: Test on: @@ -48,16 +45,16 @@ jobs: runs-on: ${{ inputs.os-variant }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ inputs.checkout_ref }} - - uses: actions/setup-python@v3 + - uses: actions/setup-python@v5 with: python-version: ${{ inputs.python-version }} - run: python -m pip install --upgrade pip - run: python -m pip install -r ${{ inputs.pip-recipe }} - run: tox -e ${{ inputs.tox-env }} - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 if: ${{ inputs.coverage-report }} with: name: CoverageReport diff --git a/packages/essspectroscopy/.github/workflows/unpinned.yml b/packages/essspectroscopy/.github/workflows/unpinned.yml index 853c1ec56..46a84c1c7 100644 --- a/packages/essspectroscopy/.github/workflows/unpinned.yml +++ b/packages/essspectroscopy/.github/workflows/unpinned.yml @@ -1,6 +1,3 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - name: Unpinned tests at latest release on: diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml index 19830db7b..508073fe1 100644 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -13,15 +13,6 @@ repos: - id: trailing-whitespace args: [ --markdown-linebreak-ext=md ] exclude: '\.svg' - - repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort - name: isort (python) - - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.11.0 - hooks: - - id: black - repo: https://github.com/kynan/nbstripout rev: 0.6.0 hooks: @@ -29,18 +20,14 @@ repos: types: [ "jupyter" ] args: [ "--drop-empty-cells", "--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ] - - repo: https://github.com/pycqa/flake8 - rev: 6.1.0 - hooks: - - id: flake8 - types: ["python"] - additional_dependencies: ["flake8-bugbear==23.9.16"] - - repo: https://github.com/pycqa/bandit - rev: 1.7.5 - hooks: - - id: bandit - additional_dependencies: ["bandit[toml]"] - args: ["-c", "pyproject.toml"] + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.4.1 + hooks: + - id: ruff + args: [ --fix ] + types_or: [ python, pyi, jupyter ] + - id: ruff-format + types_or: [ python, pyi ] - repo: https://github.com/codespell-project/codespell rev: v2.2.6 hooks: diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml index e4dca67da..e63762b77 100644 --- a/packages/essspectroscopy/conda/meta.yaml +++ b/packages/essspectroscopy/conda/meta.yaml @@ -6,6 +6,11 @@ package: source: path: .. + +{% set pyproject = load_file_data('pyproject.toml') %} +{% set dependencies = pyproject.get('project', {}).get('dependencies', {}) %} + + requirements: build: - setuptools @@ -17,6 +22,11 @@ requirements: - scippneutron>=24.01 - scippnexus>=23.12 + {% for package in dependencies %} + - {% if package == "graphviz" %}python-graphviz{% else %}{{ package }}{% endif %} + {% endfor %} + + test: imports: - ess.spectroscopy diff --git a/packages/essspectroscopy/docs/_templates/doc_version.html b/packages/essspectroscopy/docs/_templates/doc_version.html index a348e28c0..48f9aacf1 100644 --- a/packages/essspectroscopy/docs/_templates/doc_version.html +++ b/packages/essspectroscopy/docs/_templates/doc_version.html @@ -1,2 +1,2 @@ -Current {{ project }} version: {{ version }} (older versions). +Current {{ project }} version: {{ version }} (older versions). diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 25229fe54..6cd80c06e 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -3,15 +3,14 @@ import doctest import os import sys - -from ess import spectroscopy +from importlib.metadata import version as get_version sys.path.insert(0, os.path.abspath('.')) # General information about the project. -project = u'ESSspectroscopy' -copyright = u'2024 Scipp contributors' -author = u'Scipp contributors' +project = 'ESSspectroscopy' +copyright = '2024 Scipp contributors' +author = 'Scipp contributors' html_show_sourcelink = True @@ -30,6 +29,7 @@ 'nbsphinx', 'myst_parser', ] + try: import sciline.sphinxext.domain_types # noqa: F401 @@ -37,6 +37,7 @@ except ModuleNotFoundError: pass + myst_enable_extensions = [ "amsmath", "colon_fence", @@ -81,6 +82,7 @@ typehints_defaults = 'comma' typehints_use_rtype = False + sciline_domain_types_prefix = 'ess.spectroscopy' sciline_domain_types_aliases = { 'scipp._scipp.core.DataArray': 'scipp.DataArray', @@ -91,6 +93,7 @@ 'scipp.core.data_group.DataGroup': 'scipp.DataGroup', } + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -108,10 +111,8 @@ # built documents. # -# The short X.Y version. -version = spectroscopy.__version__ -# The full version, including alpha/beta/rc tags. -release = spectroscopy.__version__ +release = get_version("essspectroscopy") +version = ".".join(release.split('.')[:3]) # CalVer warning_is_error = True diff --git a/packages/essspectroscopy/docs/developer/coding-conventions.md b/packages/essspectroscopy/docs/developer/coding-conventions.md index b23c0eb42..4fafc18db 100644 --- a/packages/essspectroscopy/docs/developer/coding-conventions.md +++ b/packages/essspectroscopy/docs/developer/coding-conventions.md @@ -2,7 +2,7 @@ ## Code formatting -There are no explicit code formatting conventions since we use `black` to enforce a format. +There are no explicit code formatting conventions since we use `ruff` to enforce a format. ## Docstring format diff --git a/packages/essspectroscopy/docs/developer/index.md b/packages/essspectroscopy/docs/developer/index.md index 23b55441b..9dc534a3b 100644 --- a/packages/essspectroscopy/docs/developer/index.md +++ b/packages/essspectroscopy/docs/developer/index.md @@ -1,4 +1,4 @@ -# Developer documentation +# Development ```{include} ../../CONTRIBUTING.md ``` diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 23db7dfd9..45092a66a 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -59,17 +59,43 @@ filterwarnings = [ "error", ] -[tool.bandit] -# Excluding tests because bandit doesn't like `assert`. -exclude_dirs = ["docs/conf.py", "tests"] +[tool.ruff] +line-length = 88 +extend-include = ["*.ipynb"] +extend-exclude = [ + ".*", "__pycache__", "build", "dist", "install", +] + +[tool.ruff.lint] +# See https://docs.astral.sh/ruff/rules/ +select = ["B", "C4", "DTZ", "E", "F", "G", "I", "PERF", "PGH", "PT", "PYI", "RUF", "S", "T20", "W"] +ignore = [ + # Conflict with ruff format, see + # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules + "COM812", "COM819", "D206", "D300", "E111", "E114", "E117", "ISC001", "ISC002", "Q000", "Q001", "Q002", "Q003", "W191", +] +fixable = ["I001", "B010"] +isort.known-first-party = ["essspectroscopy"] +pydocstyle.convention = "numpy" -[tool.black] -skip-string-normalization = true +[tool.ruff.lint.per-file-ignores] +# those files have an increased risk of relying on import order +"__init__.py" = ["I"] +"tests/*" = [ + "S101", # asserts are fine in tests + "B018", # 'useless expressions' are ok because some tests just check for exceptions +] +"*.ipynb" = [ + "E501", # longer lines are sometimes more readable + "F403", # *-imports used with domain types + "F405", # linter may fail to find names because of *-imports + "I", # we don't collect imports at the top + "S101", # asserts are used for demonstration and are safe in notebooks + "T201", # printing is ok for demonstration purposes +] -[tool.isort] -skip_gitignore = true -profile = "black" -known_first_party = ["essspectroscopy"] +[tool.ruff.format] +quote-style = "preserve" [tool.mypy] strict = true @@ -79,5 +105,4 @@ enable_error_code = [ "redundant-expr", "truthy-bool", ] -show_error_codes = true warn_unreachable = true diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 5351a3b92..00c19d3ee 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -9,11 +9,11 @@ certifi==2024.2.2 # via requests charset-normalizer==3.3.2 # via requests -h5py==3.10.0 +h5py==3.11.0 # via # scippneutron # scippnexus -idna==3.6 +idna==3.7 # via requests numpy==1.26.4 # via @@ -21,30 +21,30 @@ numpy==1.26.4 # scipp # scippneutron # scipy -packaging==23.2 +packaging==24.0 # via pooch -platformdirs==4.2.0 +platformdirs==4.2.1 # via pooch pooch==1.8.1 # via scippneutron -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via scippnexus requests==2.31.0 # via pooch -sciline==24.2.1 +sciline==24.4.1 # via -r base.in scipp==24.2.0 # via # -r base.in # scippneutron # scippnexus -scippneutron==24.1.0 +scippneutron==24.3.0 # via -r base.in -scippnexus==23.12.1 +scippnexus==24.3.1 # via # -r base.in # scippneutron -scipy==1.12.0 +scipy==1.13.0 # via # scippneutron # scippnexus diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index bc93620f9..b80ba202e 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,15 +5,15 @@ # # pip-compile-multi # -exceptiongroup==1.2.0 +exceptiongroup==1.2.1 # via pytest iniconfig==2.0.0 # via pytest -packaging==23.2 +packaging==24.0 # via pytest -pluggy==1.4.0 +pluggy==1.5.0 # via pytest -pytest==8.0.1 +pytest==8.2.0 # via -r basetest.in tomli==2.0.1 # via pytest diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index eeef86ea4..27b9c68fd 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,7 +5,7 @@ # # pip-compile-multi # -cachetools==5.3.2 +cachetools==5.3.3 # via tox certifi==2024.2.2 # via requests @@ -17,26 +17,26 @@ colorama==0.4.6 # via tox distlib==0.3.8 # via virtualenv -filelock==3.13.1 +filelock==3.14.0 # via # tox # virtualenv gitdb==4.0.11 # via gitpython -gitpython==3.1.42 +gitpython==3.1.43 # via -r ci.in -idna==3.6 +idna==3.7 # via requests -packaging==23.2 +packaging==24.0 # via # -r ci.in # pyproject-api # tox -platformdirs==4.2.0 +platformdirs==4.2.1 # via # tox # virtualenv -pluggy==1.4.0 +pluggy==1.5.0 # via tox pyproject-api==1.6.1 # via tox @@ -48,9 +48,9 @@ tomli==2.0.1 # via # pyproject-api # tox -tox==4.13.0 +tox==4.15.0 # via -r ci.in urllib3==2.2.1 # via requests -virtualenv==20.25.1 +virtualenv==20.26.1 # via tox diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index fc32cc1b2..eaee8a90a 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -10,6 +10,8 @@ accessible-pygments==0.0.4 # via pydata-sphinx-theme alabaster==0.7.16 # via sphinx +appnope==0.1.4 + # via ipykernel asttokens==2.4.1 # via stack-data attrs==23.2.0 @@ -26,7 +28,7 @@ beautifulsoup4==4.12.3 # pydata-sphinx-theme bleach==6.1.0 # via nbconvert -comm==0.2.1 +comm==0.2.2 # via ipykernel debugpy==1.8.1 # via ipykernel @@ -34,13 +36,13 @@ decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert -docutils==0.20.1 +docutils==0.21.2 # via # myst-parser # nbsphinx # pydata-sphinx-theme # sphinx -exceptiongroup==1.2.0 +exceptiongroup==1.2.1 # via ipython executing==2.0.1 # via stack-data @@ -48,9 +50,9 @@ fastjsonschema==2.19.1 # via nbformat imagesize==1.4.1 # via sphinx -ipykernel==6.29.2 +ipykernel==6.29.4 # via -r docs.in -ipython==8.22.1 +ipython==8.24.0 # via # -r docs.in # ipykernel @@ -62,15 +64,15 @@ jinja2==3.1.3 # nbconvert # nbsphinx # sphinx -jsonschema==4.21.1 +jsonschema==4.22.0 # via nbformat jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==8.6.0 +jupyter-client==8.6.1 # via # ipykernel # nbclient -jupyter-core==5.7.1 +jupyter-core==5.7.2 # via # ipykernel # jupyter-client @@ -87,7 +89,7 @@ markupsafe==2.1.5 # via # jinja2 # nbconvert -matplotlib-inline==0.1.6 +matplotlib-inline==0.1.7 # via # ipykernel # ipython @@ -97,13 +99,13 @@ mdurl==0.1.2 # via markdown-it-py mistune==3.0.2 # via nbconvert -myst-parser==2.0.0 +myst-parser==3.0.1 # via -r docs.in -nbclient==0.9.0 +nbclient==0.10.0 # via nbconvert -nbconvert==7.16.1 +nbconvert==7.16.4 # via nbsphinx -nbformat==5.9.2 +nbformat==5.10.4 # via # nbclient # nbconvert @@ -114,7 +116,7 @@ nest-asyncio==1.6.0 # via ipykernel pandocfilters==1.5.1 # via nbconvert -parso==0.8.3 +parso==0.8.4 # via jedi pexpect==4.9.0 # via ipython @@ -137,11 +139,11 @@ pygments==2.17.2 # sphinx pyyaml==6.0.1 # via myst-parser -pyzmq==25.1.2 +pyzmq==26.0.3 # via # ipykernel # jupyter-client -referencing==0.33.0 +referencing==0.35.1 # via # jsonschema # jsonschema-specifications @@ -153,7 +155,7 @@ snowballstemmer==2.2.0 # via sphinx soupsieve==2.5 # via beautifulsoup4 -sphinx==7.2.6 +sphinx==7.3.7 # via # -r docs.in # myst-parser @@ -162,7 +164,7 @@ sphinx==7.2.6 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==2.0.0 +sphinx-autodoc-typehints==2.1.0 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in @@ -182,13 +184,15 @@ sphinxcontrib-serializinghtml==1.1.10 # via sphinx stack-data==0.6.3 # via ipython -tinycss2==1.2.1 +tinycss2==1.3.0 # via nbconvert +tomli==2.0.1 + # via sphinx tornado==6.4 # via # ipykernel # jupyter-client -traitlets==5.14.1 +traitlets==5.14.3 # via # comm # ipykernel @@ -200,8 +204,10 @@ traitlets==5.14.1 # nbconvert # nbformat # nbsphinx -typing-extensions==4.9.0 - # via pydata-sphinx-theme +typing-extensions==4.11.0 + # via + # ipython + # pydata-sphinx-theme wcwidth==0.2.13 # via prompt-toolkit webencodings==0.5.1 diff --git a/packages/essspectroscopy/requirements/make_base.py b/packages/essspectroscopy/requirements/make_base.py index 3b1dbabca..1e1f48e3b 100644 --- a/packages/essspectroscopy/requirements/make_base.py +++ b/packages/essspectroscopy/requirements/make_base.py @@ -1,6 +1,3 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) - import sys from argparse import ArgumentParser from pathlib import Path diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 0e3af8aca..833a84eb0 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,19 +9,19 @@ cfgv==3.4.0 # via pre-commit distlib==0.3.8 # via virtualenv -filelock==3.13.1 +filelock==3.14.0 # via virtualenv -identify==2.5.35 +identify==2.5.36 # via pre-commit nodeenv==1.8.0 # via pre-commit -platformdirs==4.2.0 +platformdirs==4.2.1 # via virtualenv -pre-commit==3.6.2 +pre-commit==3.7.0 # via -r static.in pyyaml==6.0.1 # via pre-commit -virtualenv==20.25.1 +virtualenv==20.26.1 # via pre-commit # The following packages are considered to be unsafe in a requirements file: diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 2e33cfa3b..d1a95de4f 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -5,13 +5,11 @@ # # pip-compile-multi # -build==1.0.3 +build==1.2.1 # via -r wheels.in -packaging==23.2 +packaging==24.0 # via build -pyproject-hooks==1.0.0 +pyproject-hooks==1.1.0 # via build tomli==2.0.1 - # via - # build - # pyproject-hooks + # via build diff --git a/packages/essspectroscopy/setup.cfg b/packages/essspectroscopy/setup.cfg deleted file mode 100644 index 1ba190c5d..000000000 --- a/packages/essspectroscopy/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -# See https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#line-length -max-line-length = 88 -extend-ignore = E203 diff --git a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py index 9da9479a2..468061b74 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# ruff: noqa: E402, F401 -# flake8: noqa import importlib.metadata try: diff --git a/packages/essspectroscopy/tox.ini b/packages/essspectroscopy/tox.ini index 9c86a38db..5a33eea57 100644 --- a/packages/essspectroscopy/tox.ini +++ b/packages/essspectroscopy/tox.ini @@ -10,14 +10,14 @@ commands = pytest {posargs} [testenv:nightly] deps = -r requirements/nightly.txt -commands = pytest +commands = pytest {posargs} [testenv:unpinned] description = Test with unpinned dependencies, as a user would install now. deps = -r requirements/basetest.txt essspectroscopy -commands = pytest +commands = pytest {posargs} [testenv:docs] description = invoke sphinx-build to build the HTML docs From 63e363ffb7f331587df163c65d41fc54ac978ad3 Mon Sep 17 00:00:00 2001 From: Mridul Seth Date: Mon, 6 May 2024 10:37:00 +0200 Subject: [PATCH 014/330] clean up deps --- packages/essspectroscopy/conda/meta.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml index e63762b77..be17c2ada 100644 --- a/packages/essspectroscopy/conda/meta.yaml +++ b/packages/essspectroscopy/conda/meta.yaml @@ -17,10 +17,6 @@ requirements: - setuptools_scm run: - python>=3.10 - - sciline>=24.02 - - scipp>=24.01 - - scippneutron>=24.01 - - scippnexus>=23.12 {% for package in dependencies %} - {% if package == "graphviz" %}python-graphviz{% else %}{{ package }}{% endif %} From 08488ccc2c44fefb463fd207354583631c592dc9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 11:45:03 +0000 Subject: [PATCH 015/330] Bump scipp from 24.2.0 to 24.5.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 24.2.0 to 24.5.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/24.02.0...24.05.0) --- updated-dependencies: - dependency-name: scipp dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 00c19d3ee..d37f77839 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -33,7 +33,7 @@ requests==2.31.0 # via pooch sciline==24.4.1 # via -r base.in -scipp==24.2.0 +scipp==24.5.0 # via # -r base.in # scippneutron From 9ddecfa5f563fd537fe876c2527d193f9ea14401 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 11:48:18 +0000 Subject: [PATCH 016/330] Bump scipp from 24.5.0 to 24.5.1 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 24.5.0 to 24.5.1. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/24.05.0...24.05.1) --- updated-dependencies: - dependency-name: scipp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index d37f77839..bb02130b2 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -33,7 +33,7 @@ requests==2.31.0 # via pooch sciline==24.4.1 # via -r base.in -scipp==24.5.0 +scipp==24.5.1 # via # -r base.in # scippneutron From 0ac8e860dad8a3ac4ce7dbf904b8d803c365b204 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 11:19:32 +0000 Subject: [PATCH 017/330] Bump scipp from 24.5.1 to 24.6.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 24.5.1 to 24.6.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/24.05.1...24.06.0) --- updated-dependencies: - dependency-name: scipp dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index bb02130b2..704f8f376 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -33,7 +33,7 @@ requests==2.31.0 # via pooch sciline==24.4.1 # via -r base.in -scipp==24.5.1 +scipp==24.6.0 # via # -r base.in # scippneutron From 52b655cefd37b9926c854787361ec34e1b54f21e Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Thu, 8 Aug 2024 15:55:40 +0200 Subject: [PATCH 018/330] [Add] indirect ki tools --- packages/essspectroscopy/pyproject.toml | 1 + .../src/ess/spectroscopy/indirect/ki.py | 71 ++++++++++++++----- .../src/ess/spectroscopy/types.py | 7 ++ 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 45092a66a..d5ccffbc7 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -34,6 +34,7 @@ dependencies = [ "scipp>=24.01", "scippneutron>=24.01", "scippnexus>=23.12", + "choppera>=0.1.1", ] dynamic = ["version"] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 1ee9b5cf0..3d2abdfa6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -2,30 +2,44 @@ #TODO move elsewhere since possibly (probably) too specific to BIFROST. from ess.spectroscopy.types import * +from scippnexus import Group +def determine_name_with_type(instrument: Group, name: str | None, options: list, type_name: str) -> str: + if name is not None and name in instrument: + return name + foud = {x for x in instrument if type_name in x.lower()} + for option in options: + found.update(set(instrument[option])) + if len(found) != 1: + raise RuntimeError(f"Could not determine {type_name} name: {found}") + return list(found)[0] -def source_position(file: NeXusFileName) -> SourcePosition: - from scippnexus import compute_positions, NXsource, NXmoderator, File - options = {} + +def guess_source_name(file: NeXusFileName) -> SourceName: + from scippnexus import NXsource, NXmoderator, File with File(file) as data: instrument = data['entry/instrument'] - for nx_type in (NXsource, NXmoderator): - options.update(instrument[nx_type]) - if len(options) == 0: - raise RuntimeError('No source position') - return compute_positions(list(options.values())[-1][...])['position'] - + return determine_name_with_type(instrument, name, [NXsource, NXmoderator], 'source') -def sample_position(file: NeXusFileName) -> SamplePosition: - from scippnexus import compute_positions, NXsample, File - from scipp import vector - options = {} +def guess_sample_name(file: NeXusFileName) -> SampleName: + from scippnexus import NXsample, File with File(file) as data: instrument = data['entry/instrument'] - options.update(instrument[NXsample]) - if len(options) == 0: - return vector(value=[0., 0., 0.], unit='m') - return compute_positions(list(options.values())[-1][...])['position'] + return determine_name_with_type(instrument, name, [NXsample], 'sample') + + +def source_position(file: NeXusFileName, source: SourceName) -> SourcePosition: + from scippnexus import compute_positions, File + with File(file) as data: + source = data['entry/instrument'][source][...] + return compute_positions(source)['position'] + + +def sample_position(file: NeXusFileName, sample: SampleName) -> SamplePosition: + from scippnexus import compute_positions, File + with File(file) as data: + sample = data['entry/instrument'][sample][...] + return compute_positions(sample)['position'] def primary_path_length(file: NeXusFileName, source: SourcePosition, sample: SamplePosition) -> SourceSamplePathLength: @@ -43,3 +57,26 @@ def primary_path_length(file: NeXusFileName, source: SourcePosition, sample: Sam positions = concat((source, *positions, sample), dim='path') diff = positions['path', 1:] - positions['path', :-1] return sum(sqrt(dot(diff, diff))) + + +def primary_shortest_time(file: NeXusFileName, + source: SourceName, + sample: SampleName, + frequency: SourceFrequency, + duration: SourceDuration, + delay: SourceDelay, + velocities: SourceVelocities) -> SourceSampleFlightTime: + from scippnexus import File + from choppera.nexus import primary_shortest_time as choppera_primary_shortest_time + from choppera.nexus import primary_spectrometer + with File(file) as data: + instrument = data['entry/instrument'] + assert source in instrument, f"The source '{source}' is not in the instrument group" + assert sample in instrument, f"The sample '{sample}' is not in the instrument group" + primary = primary_spectrometer(instrument, source, sample, frequency, duration, delay, velocities) + return choppera_primary_shortest_time(primary) + + +def unwrap_sample_time(times: SampleFrameTime, frequency: SourceFrequency, least: SourceSampleFlightTime) -> SampleTime: + from choppera.nexus import unwrap as choppera_unwrap + return choppera_unwrap(times, frequency, least) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index f6cfea6c7..2ce62161a 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -31,3 +31,10 @@ def variable_type(named: str) -> Type[Variable]: SampleTime = variable_type('SampleTime') DetectorTime = variable_type('DetectorTime') SourceTime = variable_type('SourceTime') + +SourceName = NewType('SourceName', str) +SampleName = NewType('SampleName', str) +SourceFrequency = variable_type('SourceFrequency') +SourceDuration = variable_type('SourceDuration') +SourceDelay = variable_type('SourceDelay') +SourceVelocities = variable_type('SourceVelocities') \ No newline at end of file From 12ca2eda63a9b0d68ef9977e2c21048b89ec332c Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Thu, 8 Aug 2024 16:08:14 +0200 Subject: [PATCH 019/330] [Add] distinction between frame and normal time --- .../essspectroscopy/src/ess/spectroscopy/indirect/kf.py | 6 +++--- packages/essspectroscopy/src/ess/spectroscopy/types.py | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 2407db972..6db9e5aae 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -198,8 +198,8 @@ def secondary_flight_time( return secondary_flight_distance / velocity -def sample_time( - detector_time: DetectorTime, +def sample_frame_time( + detector_time: DetectorFrameTime, secondary_time: SampleDetectorFlightTime -) -> SampleTime: +) -> SampleFrameTime: return detector_time - secondary_time diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 2ce62161a..e005e1f0f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -28,7 +28,9 @@ def variable_type(named: str) -> Type[Variable]: SourceSampleFlightTime = variable_type('SourceSampleFlightTime') SampleDetectorPathLength = variable_type('SampleDetectorPathLength') SampleDetectorFlightTime = variable_type('SampleDetectorFlightTime') +SampleFrameTime = variable_type('SampleFrameTime') SampleTime = variable_type('SampleTime') +DetectorFrameTime = variable_type('DetectorFrameTime') DetectorTime = variable_type('DetectorTime') SourceTime = variable_type('SourceTime') From dfbf34e3dd1f7f33c4d987e266fbc6bc348c89a4 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Tue, 27 Aug 2024 22:26:22 +0200 Subject: [PATCH 020/330] [Add] ki, Q, E providers [Fix] kf calculation --- packages/essspectroscopy/pyproject.toml | 2 +- .../ess/spectroscopy/indirect/conservation.py | 43 +++++++++++++++++++ .../src/ess/spectroscopy/indirect/kf.py | 20 ++++++++- .../src/ess/spectroscopy/indirect/ki.py | 43 ++++++++++++++++--- .../src/ess/spectroscopy/types.py | 14 +++++- 5 files changed, 114 insertions(+), 8 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index d5ccffbc7..e5f617272 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -34,7 +34,7 @@ dependencies = [ "scipp>=24.01", "scippneutron>=24.01", "scippnexus>=23.12", - "choppera>=0.1.1", + "choppera>=0.1.3", ] dynamic = ["version"] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py new file mode 100644 index 000000000..ad4446aea --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -0,0 +1,43 @@ +from scipp import vector +from ess.spectroscopy.types import * +from .ki import providers as ki_providers +from .kf import providers as kf_providers + + +# scipp vectors are always float64 element type? +X, Y, Z = [vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])] + + +def lab_momentum_vector(ki: IncidentWavevector, kf: FinalWavevector) -> LabMomentumTransfer: + return kf - ki + + +def lab_momentum_x(q: LabMomentumTransfer) -> LabMomentumTransferX: + from scipp import dot + return dot(X, q) + + +def lab_momentum_y(q: LabMomentumTransfer) -> LabMomentumTransferY: + from scipp import dot + return dot(Y, q) + + +def lab_momentum_z(q: LabMomentumTransfer) -> LabMomentumTransferZ: + from scipp import dot + return dot(Z, q) + + +def energy(ei: IncidentEnergy, ef: FinalEnergy) -> EnergyTransfer: + return ei - ef + + + +providers = [ + *ki_providers, + *kf_providers, + lab_momentum_vector, + lab_momentum_x, + lab_momentum_y, + lab_momentum_z, + energy, +] \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 6db9e5aae..6ba22b4c1 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -165,7 +165,7 @@ def kf_wavenumber( # law of Cosines gives the scattering angle based on distances: l_sa = norm(sample_analyzer_vec) l_ad = norm(analyzer_detector_vec) - l_diff = norm(sample_analyzer_vec - analyzer_detector_vec) + l_diff = norm(sample_analyzer_vec + analyzer_detector_vec) # 2 theta is measured from the direction S-A, so the internal angle is (pi - 2 theta) # and the normal law of Cosines is modified accordingly to be -cos(2 theta) instead of cos(pi - 2 theta) cos2theta = (l_diff * l_diff - l_sa * l_sa - l_ad * l_ad) / (2 * l_sa * l_ad) @@ -174,6 +174,11 @@ def kf_wavenumber( return tau / sqrt(2 - 2 * cos2theta) +def ef(kf: FinalWavenumber) -> FinalEnergy: + from scipp.constants import hbar, neutron_mass + return ((hbar * hbar / 2 / neutron_mass) * kf * kf).to(unit='meV') + + def kf_vector( kf_direction: SampleAnalyzerDirection, kf_magnitude: FinalWavenumber @@ -203,3 +208,16 @@ def sample_frame_time( secondary_time: SampleDetectorFlightTime ) -> SampleFrameTime: return detector_time - secondary_time + + +providers = [ + sample_analyzer_vector, + analyzer_detector_vector, + kf_hat, + kf_wavenumber, + kf_vector, + secondary_flight_path_length, + secondary_flight_time, + sample_frame_time, + ef +] \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 3d2abdfa6..28612baa2 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -59,24 +59,57 @@ def primary_path_length(file: NeXusFileName, source: SourcePosition, sample: Sam return sum(sqrt(dot(diff, diff))) -def primary_shortest_time(file: NeXusFileName, +def primary_spectrometer(file: NeXusFileName, source: SourceName, sample: SampleName, frequency: SourceFrequency, duration: SourceDuration, delay: SourceDelay, - velocities: SourceVelocities) -> SourceSampleFlightTime: + velocities: SourceVelocities) -> PrimarySpectrometerObject: from scippnexus import File - from choppera.nexus import primary_shortest_time as choppera_primary_shortest_time from choppera.nexus import primary_spectrometer with File(file) as data: instrument = data['entry/instrument'] assert source in instrument, f"The source '{source}' is not in the instrument group" assert sample in instrument, f"The sample '{sample}' is not in the instrument group" - primary = primary_spectrometer(instrument, source, sample, frequency, duration, delay, velocities) - return choppera_primary_shortest_time(primary) + return primary_spectrometer(instrument, source, sample, frequency, duration, delay, velocities) + + +def primary_pivot_time(primary: PrimarySpectrometerObject) -> SourceSampleFlightTime: + from choppera.nexus import primary_pivot_time as primary_time + return primary_time(primary) def unwrap_sample_time(times: SampleFrameTime, frequency: SourceFrequency, least: SourceSampleFlightTime) -> SampleTime: from choppera.nexus import unwrap as choppera_unwrap return choppera_unwrap(times, frequency, least) + + +def ki_wavenumber(length: SourceSamplePathLength, time: SampleTime) -> IncidentWavenumber: + from scipp.constants import neutron_mass, hbar + velocity = length / time + k = neutron_mass * velocity / hbar + return k.to(unit='1/angstrom') + + +def ki_wavevector(ki_magnitude: IncidentWavenumber) -> IncidentWavevector: + from scipp import vector + z = vector([0, 0, 1.]) + return ki_magnitude * z + + +def ei(ki: IncidentWavenumber) -> IncidentEnergy: + from scipp.constants import hbar, neutron_mass + return ((hbar * hbar / 2 / neutron_mass) * ki * ki).to(unit='meV') + + +providers = [ + primary_pivot_time, + primary_path_length, + sample_position, + source_position, + guess_sample_name, + guess_source_name, + unwrap_sample_time, + primary_spectrometer, +] \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index e005e1f0f..7e3bb6925 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,5 +1,6 @@ from typing import Type, NewType from scipp import Variable +from choppera.primary import PrimarySpectrometer def variable_type(named: str) -> Type[Variable]: @@ -21,9 +22,11 @@ def variable_type(named: str) -> Type[Variable]: IncidentWavevectorDirection = variable_type('IncidentWavevectorDirection') IncidentWavenumber = variable_type('IncidentWavenumber') IncidentWavevector = variable_type('IncidentWavevector') +IncidentEnergy = variable_type('IncidentEnergy') FinalWavevectorDirection = variable_type('FinalWavevectorDirection') FinalWavenumber = variable_type('FinalWavenumber') FinalWavevector = variable_type('FinalWavevector') +FinalEnergy = variable_type('FinalEnergy') SourceSamplePathLength = variable_type('SourceSamplePathLength') SourceSampleFlightTime = variable_type('SourceSampleFlightTime') SampleDetectorPathLength = variable_type('SampleDetectorPathLength') @@ -39,4 +42,13 @@ def variable_type(named: str) -> Type[Variable]: SourceFrequency = variable_type('SourceFrequency') SourceDuration = variable_type('SourceDuration') SourceDelay = variable_type('SourceDelay') -SourceVelocities = variable_type('SourceVelocities') \ No newline at end of file +SourceVelocities = variable_type('SourceVelocities') + +PrimarySpectrometerObject = NewType('PrimarySpectrometerObject', PrimarySpectrometer) + +LabMomentumTransfer = variable_type('MonmentumTransfer') +LabMomentumTransferX = variable_type("LabMomentumTransferX") +LabMomentumTransferY = variable_type("LabMomentumTransferY") +LabMomentumTransferZ = variable_type("LabMomentumTransferZ") + +EnergyTransfer = variable_type('EnergyTransfer') \ No newline at end of file From 9afd5b1186716b53c99f65c50a9be2d2bbe9d66c Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Wed, 28 Aug 2024 08:21:08 +0200 Subject: [PATCH 021/330] [Add] start tracking workflow development issues encountered --- .../Screenshot from 2024-08-27 08-20-49.png | Bin 0 -> 38865 bytes .../Screenshot from 2024-08-27 08-23-41.png | Bin 0 -> 26265 bytes .../Screenshot from 2024-08-27 08-24-50.png | Bin 0 -> 55565 bytes .../Screenshot from 2024-08-27 10-54-08.png | Bin 0 -> 23863 bytes .../Screenshot from 2024-08-27 10-55-10.png | Bin 0 -> 41994 bytes .../Screenshot from 2024-08-27 10-56-40.png | Bin 0 -> 53476 bytes .../Screenshot from 2024-08-28 08-12-56.png | Bin 0 -> 32892 bytes .../docs/developer/encountered-issues.md | 53 ++++++++++++++++++ 8 files changed, 53 insertions(+) create mode 100644 packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-20-49.png create mode 100644 packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-23-41.png create mode 100644 packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-24-50.png create mode 100644 packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-54-08.png create mode 100644 packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-55-10.png create mode 100644 packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-56-40.png create mode 100644 packages/essspectroscopy/docs/developer/Screenshot from 2024-08-28 08-12-56.png create mode 100644 packages/essspectroscopy/docs/developer/encountered-issues.md diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-20-49.png b/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-20-49.png new file mode 100644 index 0000000000000000000000000000000000000000..37b9b82a7a0d9e12b28d064abed02c07c4a35d63 GIT binary patch literal 38865 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 EFDCsJP5=M^ literal 0 HcmV?d00001 diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-23-41.png b/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-23-41.png new file mode 100644 index 0000000000000000000000000000000000000000..1a80ee4ac474e95522fdaaf7b3e1662db363f229 GIT binary patch literal 26265 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 literal 0 HcmV?d00001 diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-24-50.png b/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-24-50.png new file mode 100644 index 0000000000000000000000000000000000000000..0c81ca9b89c8bbed586c751f6a64d29fb1cd76fc GIT binary patch literal 55565 zcmc$`WmJ`4^fijoAT3=Y0@B?jtw?tsy1N^c5TqrQ4(T{_BLdRh-5?;{&AFT3f4q0x zJI1}A-Vd*1I6T6`InT5AUUSVg*Iay6QjozwBSC|MgTwgnUQz`P?ztBn+_O>?B=D7N z+{!HQ4}y#M2Q?J%#}~yk4E&$iRZ7cM)xq4=!^qhT&cfco&Wzc`#M#Wu-o?_v^$5OA z1YE@ObdiL!nUSlNgZ(QtD?2kdH8-&kuyJs`V&fCw;1b|wdnG3SN1R7}!9K~p>9s-1%gdX!<;ls-eYiLeM!`=^ zOngZ|prWG_u2DiGBqTH|@pL7csXT3O^1Gj-;gI>V@~iMZ(kP z`+>!Sht5RkFdN9?G;Q9gqEO9KdTl$dkhh#Z0+=JB4iZY^4b@p}s2)mdN!h8XB5* zifFKEoMHRr_|HUO_bxnk^M5`)gAa>|xuS&Kt-uuA+_DEQslsA59XyEg{_}Arg)GA|S zM1>`E3`a~%{4+oQbW{TCTV^JuBlM^Zmca;ZiMzh`G&V75{8wBu+vLUwfnI&zSoq~9 zSij^>y437J$G{M7ztnWHlN;l_*^2}B>v|piunp#4XSdLOeX^lkq;|eL5enYx@jKLG zLZ0_qQqq?$V=6|*h`Yn)7*K!e`QNN@#T1j{E-oJqTRS z`;(rV!{#GTaG-X_^U(2VJoeYNfi{_V6*a3>@2iXwfPuzQOyFNg!j zEZG>Sg>Urbb#E?P|6ka)W97@uj6qEKNJF{U2{Ee!(7n zz~YIksNjA~X2}ClCv@6NeZD`3_o=3a%X}nb2&`paZ?9zyW9RW&C$Wex-=t}^bQFn{ zx;p;e43v(SH~ASnQfypYV7pMXqde{tElX^x&^Ak5AnHe^Yrpq9b zXe)}%wghy*aM1)CXQekj1l#U2g4cS26&DG3Lq!l~lL%ke*4ADSvHcEUdi^>OKt`zs zqq@2}nUH5}S{fNk<0dY^kOy)i5WX_tqkS&-vs+qP#$G{NTGGr0l1~1nI#hvNM}~t_%jTfHxGz?SZ~3cwAE z+}Q%m>FevuE-Wk*JLs}osB^kLHj<7c60^20hV9L?`gnlEDHBcBzU!JZv#0oPk4juC z5#L`6!9W!07DdS>L2h|W01MfLZBE-CUE7uhc~83t{V)ty2Wa@=>!s z7QuxG_Umym_Ivr1m5%vtUc2Et=*%5FPP#&x z{EVoMz&6Y(Vq?fg7u`GUwpN(vD( zG)ULJF$Db0Yv1O!on-@?1~>%zKZ^r0?!9;EJ=bQmgD)!e+p+y3XHGky4xRs+6EA$= znnhJ9yzyS7VYaowu0KQE_-%a=McOF6>95Sn6&+ z+NOUtb4y4XAgnnwS=RbZCt`TsYH8dA*$x85b(|Ji(JnH5)=I(F{aM;S0R<;~Gaw%& zYhu^2QLliEFa5o>H3LXt2}wzDNlDTg8XEB#+pYpm%}bWGIst|z)pJ^H{=xtxANQ*ce12GOHb8KBxU^8}XBcpI!0YVnOeEyV z2JmAjmA5(o=KlqgTvks{@Ao#+Xs!$vE*@S{Y3Un!`mYHI3Ff2`C{!2l(ASrL{yzUO_Z@}Ksv$E2GPyYGy zr@4<`qHNbw60@sc>Ry38deADQy$AS|*tg4C%0P|9v+VJCJ$MNy;_lk-=rW}YZ%iU3=H`}7H55~r?{q8RF znwnAo;NTDtNQYvQ?@X7Ge)#a=DgS)h*|A*qJ(CAVL}KNaU+TdgxTd=!1fAdanhmhC z7LdyTDR~0u^^FZu1TO$irt5#cGU+wMQp-fM8Fe7! z?(bWg&dUMa(Fa^2VM62Tgj%m$QWh^uj&z(3YDM4lk}C6D8K+K{VcE9>A;q{fxteAr zeMHlGdo>bfR7A#a7U(3gdtm}NtKp30hCR{bOgc4TK8KB=MXCiH4$Cd(tvw(Od4YBE zI&9p2O7L&N%CfV6Tk8yskB!By$bkN8K5QB=utzim8QOJsJcQe3`Wm{sP|wO~K4{n% zM{^I704-o-c^{KGJdamD&B)5h{jue#_PqfI$QcD4ePhvOWNR&y(tI>a4CH>N5#g(2 zK={DN3jrp6bCwB{1B+RqQ-;y)UW|l6A{j#=e7za3I9p|g{scmwktqykD~x)4hq-6; zB*3LwRi>!*%ifF%1@R!Mc1M$cG&VM_j*<@!yKUF{{-JNah`Zp?yOlL4f&$r&sMNsQ z8v4y$p3*56(jV3p(NZEILU>)f?YmtA{W6BsRCVIW0$D zJ)Mm#v7qPAzqPaoE!y(}r0;p56wEijKUdv1G_(bv(HyW%W^d^Fx-kO-Ls(RlUF_6L zF%`3rqm0iE8Nt=i5cI!{&3ZN?elW69AF^A03_=k#k3-2~JGY5izehL|O2je>e;qU% z*ce-{E+?h8e6Ujt?=Mw;;9y>XJ6P`cn@N*hLd2@NRq6p|c zxFIXHGg@-iVC=6qg^?L#q+jX^MOTTCiv*PnmDaT!T0M^G>oP}(P|c_C2qq<^KCj00>_ISmVte4zeHNKca$q z4$!ItC_0b-y{G%(;#}5w4+vUfL3bvCh>*!iHLy`4wso{EYiLyS6f*R_&IKHHwaO8 z3cLeYuEVbzT2N>UU9SegEjsm(t8i(AUH;iCLS42FEM!QnVo`7?M_+D%a&e$9Q8Fg=iAG&p*TePO=B?Xp4TkQE=UFNe4T!Ie|3OCHgnSD@p((p^UMQUmq8da8Kuk#f%qx(#)M@iLC#*n;(k2j3X z(CTP% z1i?3TIhgy5gg_LNlW`)apsD*{#v?&yrV@LC|2Rzt!>|0)Io0t5F3qYO<@3rP6}wUS zt^VJMkw#P~#KU4Iip3zRf{2@&o5ujXDvi6)03M93-h)}RYf;AQ$if$N>V{1AdIh7(7lW}W)y>S(2HtjPsX zWvZttu8~E*sls7J1OSmYPzu7A5A^qo7fe)o96|J0X4rcG1#Snp-#0Ko&B_`B zA`X!&iBLS44JxCptC=$4=?Fi%ExY5PzOj8yOY;%Y@E_dCQfh|$MC!j+jXzaXV#mF{z`ECyqj4eWiU%m{VJ;B)_kEX&4yuR!Ep;Czr2Aina!aaqnR zd=guq(9la*_TBY?s%(DQ73J!^Zo=+-)PUi{-sqk4mX_&|K>c5oVTF)kHO@yON3z;! z1&6@inx=PE^p^nzLJFbHkgS~=i8=pKl7#tBleX8hXI`r=&c8x5{R1YoeuZjwzguB6 zT8wwwgQX=NpP^mvIE;F|(W_HK9S*VF7H8-!DKGz<;d8h)t?K~vpge8T_RLaZPIES^ z@izglw3L*71F0m4hk{BHPkrWG(T?eNNt;*T{0kk|rI%(6h&dCa=GBuVG&_Q~0<{8c zX9P>Tvr>VnuZ2{8|*41FQjVvB%tp!44Es_nP~ zT}@NdWzH;FSzrGkz*C3UYT2MYeK0((PI)8$PQDYxX?e&Iz^$WwK;gf{p^Q`II1l5 zy25?Sax!D9)eLLMQKtIzW>iCSISWKJh&CPPwJOQX2CsqHDqWnH%eE)DiNC%5-@8;N<$)xp~&#%qH9np4aS4PN>rsH*|nh%RbJGE~<-~nLQ z|7mccdPHQvq3xj?Pf=)%HAl$%+>*j)pZ(Y4tqrZ*_fHTg9mwCzx^-*;kG`?u#jByLU1 z=V@psE>#-+RmB?YU}jrq`9Aw+sa71v{7ZI#GDU%eI%j&>*fgTGH??FQV}SIept-D4 zx$qV3mhws?Z^vAGqFX%WivPV2Z3g1*c4y2-1&4j{nrCHAJ40)Z$B%bMXTyR=j;p_) zp`oK|H#*ZCwVYvwVo}lpY&Yus!fyNr1xC%!PYm>)(QJti3JTI?8k~-+@46$2JAvTT z4%8^^T5J4xIz?JQno;p+4cUm`zVo}#PEAcMx=zUZ0=bO|((;`y!!yuoA|Hp8lu>k( zlpU-IP>DK#^woI19`Phxg0=7kS{IpsYZ$0WV zMK|Vol8;uiLn&U1imt%sV?=J>0;DzrTBlqZ-!~x4KB+Xt>LnEm2TGj!cg-sg(OzeN zl>tgj7OCCiaOk^&F?<6&|mpC3j>;(Pmq&tGbINB;xW)uFf18)-2SP- zX_V=70r5MvWzHB#n}g|s$v|LE4i88Bf<-x8Wi}8N15H)gnJmHs$ByS}*@txo;=>F` z9;to9=LLth)~#lJ&qXEwomsojIuS)d90yLg&+LqhvIDH|V*>7}6@@Qey8In{_Eby= z!S2sW^%~;>?l&k+&CJ+={*c71+ueyJI#{Tj+W^9CuEq-QNnix&@`;6J2USg!6&8j` zMG&yt&2s??(}B*~@_Vt-Wp}ocItU5Fnl0%`W&^1e5P>I^kcK7%R3}UX=ue*u#6UAZ zngEv&_5~&Elj5wVuI>bO9FMfb6xID;zH7PF=Ld%w8mGnZPm7U^xGoGDbqzC}vPyS| zx*7L&zoL-c-rEpX%D@ZO+F2zjlmW6LQ`?LDFH+?pmIXT8y&pe*JhSjm`PaBj!ura( zQcJ7BaSb)K1&fR?cB+JwUS)oq0kd;&BT+!V-E~ToYVY|dPwP(gkom?Bi;NQsDZov? z1D!Ql&l#0>#g`Kl7ioT%bGA!OiBE#;w{Pv?_>4qAtpp304Yurl4J+XH#>tZ^*d0T8 zgmnr6+iUZiOvC-@06R(4cRAX})8w|;^mKVp4U2#QGot>!?1qx3t+ z+31Pcb_lp5Eh;L~^S{~ROIHxNKb8O*+S>oT<9=mN!)ZSwDwe2p1T7AUw?0yN|L=|t zb&Wi(?r9IhW9H-L1$cN7s0`|HX`>tS0BE=bPp1gskl^Ctf-@cwFfYi@{{xitNSI{r z)e=rSxw*OVbI0C;a|hUY*3X~8^s4y?rYbfwl7F|h)?5Xifwl@AC+CC#JUcUUR9F}a zfQ6#+a{E&vkArzBZEa!@Yc%ZaIB-C70Dz!fZ%*R z8U^}Z+T!HTIa|yf+?O=vZZ_8O(ODk+*_YEyAtznO|t1FjxD@E$i z-y;@djvpi~b>Na+SBiSRi!oVQ*<lbgIK}=L@ zzPu$mdll*Pd|CvB)IiYK$s!=of|{C_$pc#kM;f4qHnIE1xRT4KF$E;ANo(${t*wS7`+zJ> z4UI1|dtHWX*YGNHhIryF6nT-|S0miNkf0iNp9t)&_z-o~kwOH2yQt}QP~iRER=yp{ zaEsz7BTZlSm(8!C3+185qWa?$VtS%#nj zQEwke`b#Bze!Bj^Z}!G%wUVv6Y9}M*)ff@;Gl*^u=i3#^D16sxVw?F|^4yFJ?1Kc; z(?3?#T1_|X6tl;7n9P3j3<|Lq)DCy|PdV321 zq}KytV+#O%ur{E})CYpCvp;gwPO&E= zVJ5QS@D>PCF@aW2o6Q-t<1J;KIex!3?p!UaJF=6K?|G37-+#&2LmhpRBAzCuCXzWq zxG$E5dU|$7%w>rU?$;1x&1Vr0XQ!u*%}a0S=#a?>eYEtg|Cblwwc1NULRDpDFP zcZz>CELh9ul<$yUq?fs>p@@dmnMLDj-C@lhhpU)+%#s((Jj&IO56k8$EQbb^2_^}k zbPK6*E|EeJ901*Wz+G;}VL*pBkg)ia0Yk>iNPedn%mohC{BLMz5Yv*6 zAXI;T^kBmiislIg^L<;qIPOQ3J)YikCW5{2OqW$$%7quQ=Jaj^b?m@n<9@}3uqVts z&u*R)g6Lvg62Ksy_F~Qx^lftvMu~r`#8(QY3_P2L2k-D5v(@Oh3?t^QMM+qd3Q`1)J}RJ#2M2-{6<`r#mRwbLx?wsp{^}IsHAbh= zD=&Z|=p>L1Wxl!xdaoLXu=_A{ndl$F5LsBv_coY;A`$ni^w>4{STdE|C$+(Hd zlS^j;F)#tZ?qJMc9z@?Z+lHVxJvHbPWu<^xIJ$Q+d*Ciap;!_627w_FtxO{Vv^F_7 zaD&=M1$gTSJGWho&Ybh!pTsUCM86bAh>*q5&RxwvGCU)djp|BpS?xf?{-L6I-QXWv z4-+&yfSkhZu#0@pC0tMV5IZBM#(>Yx&OXkmUgH44QX^nI=!YXSQ%cFbe!N|h2i1HVTRM416aKjrzABlKd7&AQxF zQqplZQZ{q**+j}?+I?BSL>Ommf)b86S4=TS#ouW}&kKIp_N0>YH2l|UQwGg5JB>9> z8I6J&2A#!D)4S6A3Yg(}71 zpj-z^D$*u8n~Sr)xfAJl`EtvN%kF#Cx84Le{GQ!FBZbmkFJ08SASGoj4|%U&95kh4 zwZq%g^USEH!Po`EkQbRt$hwcH+k>Bq!wqBJhb85yNOT{qCc)_27Y;`fqR4W=KF-(arFa=74^g>3uZIAd@8LQ)D@fFWM8T+Yqe!JH4?r$RoSovYS1V zstBc(+#4faEwx!)rgq%L-O_4zzrNi4y|>=nKH7#v;iB0-?UCr_%^DTw=A9$;jVXJGQw^X?m09GU#N4K`cX>RLeillF;|;=c&`9hFLmfCSvt8*(^Q7k|z$lFBg`? zOG%ICCUTu{iZ!~J$)WolXjSNp$2Y!W#1e@Eoic4?e>)1={+7cY#eXc#1zV*5oUgMQ zBX%Pewj=s3IGG6HhjfqVV@$(WDJXI=_JNbF@Nvs4K#bFrV9k7Yf$4dp5Jcqq2K(yQ z6{9w)`J=a(CdmLKn%bPUahk3}PNf9T`DE{$ozc^Nh(hG?f=wYt zlYb{@bra8K()_-|=bbnf5f^-2030kmyL6&tDQd6$%PF;rqGB4sk8*tRv{~gX6}ee< zCBOCUBJShnw$4b_?Cre%%4Y$AduKn%7e45@OKn+DlB< zR%U*Wa6dRDV+paPv~ z(1LvO8B9YBViw3}X}is<*+JJnE-ns;UXhfd8R>!^>la9m7RwDz)FwUAp!FG>lG5*Y zwG=vJZc{s=9mbh418*Swf;Hv~IpuT5>}^IQFCN~58*2>7KX2!RtgAe`-=ZGR6E{zE z@;0MupH4yQHj@y2__8JNkdoBcxZ~DbH6=dqygX8QJS^%v>|@azlPn|IJeaKvnkvzp zC{m>Z0*6uwyhFh8su;xYLLCWMUuiixuW98|B*nz^Q-6S#KX@H1ox29QdYhm;HwD$;e;%FoJnVJ8V%hc-Qobdf z+(C}^MiB7y3#giW|wmE&`aScuzaNmWzIDjqg+4jW5 z#9WIPCsNR}L|Me&pg82)E3Nhfh1)J@t<%PTjUweeowLZSH0{G>X+2i~tqR~8Fh5>x ze`+Rz>H-J?PyH&;MJ0rIeg@_QkT8Jn?5Pj8J5gZ5@#Fpq0Q-{7A$!Xfal4TLS=~sa z-uCQ3RHq=G1seM0s6t9vzf|HxP*)bU9^G8m^ye&BnYs9( zx2F%9+9on&uUv!U-`Pf%i9y3(=D9Sg=puDaFByx&Xmc(SP?5vUVb(n+sQ6h&21c;W3@un=Dh9&&8Q=|7SBsM zyB^m$Ylbpp5sQNURr#1uTHOo8;PqbyT^M!_W;E;UN^`Q}CcQw?g=|2n=4)bC^lfT& z=73R5Q{N3=r;K9}_)}uPeOrV1lszfgpi%vQE7{#Ry43>V~xe*0j@QedX z9N}Z%r@8xFSFR&_^t2{nRlN1kQgt#0w^b1T73!)gyB&pCH}z6Z&&}NFV7I$)F=fld z``Kwtxz#@KFa$x-FR=Tf!;}v43ft1EJ02#Lxo0btym}7=JCU-47;yD?vRI!+3Q8a1 zmzoZwd)rclL4yVmjeLdl@ODGEtkTjK)pLulIEjF7amf6Mz`$y>n4Zn-x(Y-}Q)`se zw$n!4g1#Z>w_X{jDk))C&?<#p_HJFQo$xTdtE4JOaBD{2&9J1MFU0Df4K6hE@P5nW z&~bRg`QZVBL`HGVTTk|rj2+UE#P#`b(^*$@Vy!QUuxWJQhXI;V8#?i(;C@iDd+z2X zf9G|8xs-qNl(uPn4X%N+PkE(q$%qQi$iNz>Cn!UbE6(uBA{xRg$4w21MKncE2!i7G7}TK{sARK zE_2$T#Da?il#H~3f`VDykOQ5T!9h9KCX<2^d0ISLRefy~z!9aX1>1x9l2$Oa=aMW; z9L>p$=3^fol!M_4dOk|kl15~k<-fSl!T9S)u8xmU?S)v!z;nn7u2EoiKGMij5j%zZ zenV~Rhb+=azTVVvZIP(JS-W?%I8||1Z5X40AlBQ8cLeO3jO7i1z+-kg$T?!j!)xoq z1$0!vjBjrDpbvtk)z#I&K!@J>1>?*ipNQM~rGftq4JfQ1yJt%@%EW;!2Xv}o!+KPb zXIh!69Xvm(?9@QI?taKCeLO&sDOGQ$P*6Hxtvh?j$jMsNEm6k9A&9$)Qq5JN@9G|D z73(`(s(Lm)659Jx+k;MrH-6iZ?|Q#_1b9ox_#8h0X;7nF54dg(dt<3Ujmy$@@2tl{ z2ox$)V6=N2r!%kq0oS(pfp^)H8k7Vo)QVx|8rla*uj_k`4>De7+}qL##w2k1y+`th z+50TL)N~}KP@l|@9LknXTR5iy9SNl?#4ru9qy)MbBNLP9zsaI!c3mLy(71_ts^{c@ zy2O(j^^vueYqjyo!wF=)H^8*_>B*u1d`yR}R}c_+PjVLUwNi_SEW^?i(gjW~7aUxG z(b*XYq{fw6PdEA`1dh*up`K212RU*vhvAd2u_f z`&>l}GQ_xIe)i9UKk_K~kMM>!Hr|+XHL*Gi)?EZ+kWLB9coy}1A$7ql1zWj<8D=Ra z-M269BB>i^pL1W-wIWkKO3n421Vm6VAj*-`;LRdE5d+|Oow61_b{(_ON)Q&bafUS#@wRn%@2?zG|44R3F;6v1|T!E4C4>bbm-7@Uo z^Ojp7g*=0cv5V_J#4=9?akyXe+P`x%_g8!NjbYMdoar;$CI-rglrZn_cA>V{|M1)A zT(c6e{Q1cyPinb>6eI$*>D#zp38x6M>_;o)iWexGSbt1qRgijk-d~%eVzilN81=s9 zll!ASOE7l$x-1>#y)%kxL((7u-bsFvo!8FU&2gP0n^(o3_HpRd$q@$f`)CeBR0ji9 z2W1>@+RV)1#S>xn(7n+@b+Rgf>mwK@l86`}rBa|wZfLI>n}_Yao*Ied8w3j0MO4MBK#P&UAku`vOumi( zDJ=Zrsl9f_m%*WPl|IUO;IEGyYBYP+!?T%iEaC1{vIuKS#jM&aX)WUrwsmWGTS%x> ztj0i3Jq0OLi=9=p`s#k7+Fv;0X1=`csqv-jSj-s{E+2=WUbp4h)xAs zHo4LzR;?>I0kgV);-Hr~$|c|VUq^@$vll$1P(ZO_>My338-@DIH*)E@H+(H=R;{@~ zDG`*1*}t!l6M676GF%q1n}}~)U~7!1mV$|!xb2pdLrCH6GP>>~BIRIU0}Gp3o{FP( zFxS)ii7)duM`+bIhp~DPREZS)oP*R?VjsQxnr^moxM3iAP*C`-POBiNAt%LGcR+q1 zJfD4s`_1=6`hU31@dq+L1wXUFsm0RV9qBGd=SbORj3Nrm@<@|&I>SEdj zO||wl!}?9@kfI^GP&*;m7G#<%x9_3P*~hOzm)(X)&diDoR8)6h^V3R1;wt`aHuD7@$x884~tXLXMf* zLpg?a&pn-xi&&@jR*tq;_H=)BYk$a#&q1?@SScu*bNbWWKjf95hU9<9_|u~2Rea^_wkLzD6}-68o3ip&tvu8lXVuG>!BLVIS{&e~{p zuceyQl{FDdVDdAUMrgLvn%jw1SR0kr_wC#)bsdAhh}QJ$XVcNtTP-J@{tU$==6Er` z4sUsRI9zV>3Ch&pO0t0|h2X*sx6Wkr)vd9L4eG7g5!jb~)*#_3PK~0azAq1Xk0Q02 zm~v}TyFm?EnxTeRWm7~KI>wPkS{=1-q#4@F7B)K9tRLxN@LlfHhj01*dKD~0l+nVu z`uLL73C!veEy~qmGfO=^0=dkO@$W57E$u}rnO`M-X)#!d5*Pjj+>xX#W(ML~5$rTK z*QYmGK>a}(X;>i&^PgvvJDbZz)?`+6_RxPqNTL}z`ki>WYc~q_lhhOKFdCI02k8tP z3^=76acrUUTzJa_%^zGAYF5EYad-tEdbQB(ls9k7YZ!DmUM%&(q}!@ z=!|nKa#w|UGld@_c*fbQSX6HwGK_yMYkTTIQ}wmlFC}Cn$6u36A(eVgvJBewRC#a)RJv}lB?>b8ZBcb#nhEdW6gv4yp1a*e{E`O%qn%CW; z(@j^wV}rRvq34srSelDkb4|FlNAA`;1?i$CDI@vq$PYm(jc#g$9W~bD#;@N;uxCu$ zppX3nW!w&G{Ug?63k9tZq380!Cj(fn+?vP|sq@T7bJnn@(JQWq;S<`pT#TVhZ;?#s zSe*&8kzQuB5MMSS;pO4z{zQ0j3h#X6EXr-3q|vC&eUGlsc!jPEr$qI-(tv9oA2|d5 zj!l2@d1i5fdgG;NKmP*NwQ^Xcdtf? zbBBxQoMc!w%KV)-7c&k#aVOXJphYXH<(J(w54gk=oY#Ur9~sg&xy}-rQE+Q9nTmQc zI%+9Cg;Tc^X*bh}ftb{uO}8)BgIwaPpPoQvX5D_SVJ^ihn|m0!q%EuM_Kg>-pUZ~- zlgtmTTx%{73$ZL0NzJi?a{7a8CXI` z#eoJeUCxk&kNJ+e-=6RfPp7^l*1&ln+DG0h4^KDowA-&@Qo%or@H;cqSrsxR;y)T} zHKpfcPlC>}Cy_>9I(0~DHu;UhMzTQpu4k+rS0PdvDyKP6>a?I7fOfUt*Z=Zx6UMOJ zj|E)LjFh@q9VHv9LtouKXN(}L^UPL>qatMPWAd-iw>r@f2{Hc{6D5Od>!JI`RSUC| z^U>5i0krgT1yp(ksQr9(6je9PMl}g+WhrlSDI{7)Dkl%$KnFk1%s4YrPBGx?xUI(g zcpp@*J!79y`aURn_#{7TsclJV@3(WLegh=A3IbgZ!(GKc3hCPJ=ub^J+X@90(ntn| zgIw&pBd-4vCrf=#L;))IE-usBqdYoEEt-6og;k3P<#NghBhTwnbxu7vdnjSD=FR*e zeWBsP+H_H3!9*cS3B8A^5@gAC%YOJJ;Qupesof?4JEZ&BHFgY%aZ}B1szWai*MFa} zAlv#8QiKIc!6#sl%A7SN+Cmyjw*}Sz6Mnn8{BViWh|z1sG6eqQwvf<|A*qD;VU*M+-w_&e7jD?^)882Gd+lq#F%t3q6Z@I2TcKUz)Bc;| zIAEH9gW9LeEQ)_M@e6nQh|x;r3;TC}ey#2&#qT|Jb1+_R2XO+9ge$%Vsb zZR}Q!D0;aFjk5IxVX4KtWsP3~LxCgNIsIGNKUK8R=gWeA>`DlH!)2}o!j(>m+?o!_ zj}CR4>?{SaVC$Q7K_5Bi!?abiyceTLoe(ZIWcTS|6 zswC=PHUY^m5a$iU|-N3~l53g<0kx`_jbQ zb+ulI5h)$Xgwb@Bj0G!EY;o(Kt52n7GdqvTB_sFzZ?AL{l1WNe@0MA8ig3pC(z$OV zpUy46xPP^&yF;V;_nsDr<$9zpvU7=01P$tDn&TZazsA!vuAInQ6A=pu1=Kd~&U_@m z)HPbZ?n-cYu7~?a9xBhcT+~Zw)REUYRn_`p>6To(E8_T|CnDYoM4^@CAC@WQ1#VhO zl)T(`YgkkhSlSm-87^k_+8>5mp7=ZmWoW&BQyK%fIpet+Xy5i(UgG&+ZJA5@=z-hj9j+c5ALkJVNzzwu2eM zsbHcN3{nBJf(591JzGDk3X$^Kn*u)v@MNi|sx}_|x~rJeDcC8*wiA=8T`>4KWISs0 zLeSluQLf~qzQWmC$GxAs{!hDyPdJ~__&IqU7*nd}AzLlO=*NnPPI3f!Xl!i!J|xyp zWEO}Whk+)@_8QHp>u6i8%qtpF_Ern5a%nh(?MK!e9^O&?ZT^a38>gNL9lhiK_Mg<_ zdXpYZ4JbsuKp`E>=ZTlud)@(iOiZf7uODC_;_AuhGL|dD3EH~T<@yl=>Q`7k8&SNc z!2QGtoJdKm1`5i`IPtXdIayi11LPGHFu`l_+_7WewR7H1_o#B+RiOaBYw4hmRFV>H zWHoX6Y9BH;-&f(v^)TN!LAHs!=_q|j>gn|;SdU<7J@e#Sa$Oy%}ZI{IT znef@e*D zh_i_*@QeC!OXeZk{G@`a2h`d!xoEBcS#GY@h7brRub4{hZ=Z%lo`#ixmbQ9!qxJug zYZ>07r6xCt z+#=nAv058VFq4LiN%nj1qRL`~f`fx&)EXY|8?ZVU0b>yGK^+#E?SIWaLr zp}^#5x%JsZn@mYz;VKwS+1%RtmYm!JIwHrOoAnA~{!%-&81AweVLf}DJ|qjatUGg` zjl^cXv~^{mE&W3{Hu#BChXjp^_0i_T?*uii{+Aa(LDl-aNUc~SRhwvx`Ew}Uu;6ynJHUl_*NORKq4np5&qxc%{H(Xguf%00TT|{RHGr41jhmI4_Qn?b!*)h6lsA zag^yFdgfk+;w7~jrC8oKj7d&@xJ7==Hf3aH#-@ClnW^1>s^e3+Ihz>U(rOnH-Nr!C zH&p3e6!NL`8ij>2_67GzFp3icv*fhg8pY6_29K%Qd+AF{D*VlmIA9{Kuv_4Hl3#%} z|H<(Nd|&MpN!Vq@{Ci8a!5DY4v#wb;)zakDogcylT5%bGSYfN)Gs0A;&Jg#y^MhT8 zGjmV%MQqd+&z7>9vY!sLx;ZPbRxt4uE44^qwsy8IOrcCAd!~1Ine&S*;#m6X-wV)> z?PoUugHNw!snM;d)L%661Zk#@m8hq>MMOsfe=vRSoAhjn67jU@)_>VsS@zNWwf z%}1U2ItiWtxMGbWzV^6Hf;Cs4hb@Qbf}i7kf~lCs>^s+Iy``#6nu!BJW%(HTK(kR^ z5{&f@OfpB7-S@4p4@0$}!O2g&(sX*xfFGQieU#Xr>yC%??#4)K7Wwu1TKLQ>27I{> zSySmd>I*f%A`1+Z;5QN&feD@SgM}GNwS(nW(pnvP;Qq0$O##ED0H~J?qx2qXy+N`8 z!?#t{)lSWO`8w7!>t^QWITN)<0ifOcXRC-Yh16;k$0;xx#X2#3IxSnZNWs3?PEice zCt9_>oZo7afr~q6!fL9F;?L$n@vP?L`ABU;N8jf-Ro1ZmiyOz8d+~ITG-3x$pjR#p zLJ4#Fo-HDElnfRJmmMZ`qJqSA3?3!;ZUj`tRoIYbzT@xg1m(WD`bhp%-1@2i^D6{y zR)eta1x=p;8Mv=;JL4m09Rb@Y$R(=U+I=$y0S7Bosi1QStdm4Mw%-FR4ncqH`gDL5 zjOSfhApO5=zT#mUd&#&TGy-pepQ+1y&IB42Md`6ud9ETTXIu zAzQ`9)_O5e0PcBHH}PuB(}i!h5~s}lh^YY~*U@jCj(=R`0Ug#D^C zX^f-aGCT5lo>@)a==iw*XL0(PHiCK9kPbr2>>$?Q=gdBMB(DsfBfK}Rdi69fL*BDc z#a-&;(I)za(P^D(E{=x(%2((-j5+gAq%yDhsQixEP!6kKe=++dgK=q@UUl~=Q6~t=QgFz z#m#*ZDtiAJIJ8ngKUJPuQG$9nEa$h^N7*7fkCRij<%*(rpO<>E6pPn$wzhHs1e{sn zX%oQnW(eTvb6A&~{H(3dY{Dee$c-Ln;`~7zFY03yE6F4+?4ACn#@FU06s5APF*$U3 zp$oi)?9MIMdgQBj8d8Od(7za-m(4~+i7@051Gk;a@E60!pSq25%6PNIAU-~V$-qJU zO1Bb-^DjGy>n0Qgqkt!tFs7#yOk)qhV+p-8GoyJjH5=THCnF_l!tS?4T^8)>od%fe zSHW%pq<-P)7fm#P(W=V1oSD1v(b4aEVdA|| zp839Udyh{F$^REkR~c1R7i|RzX{8&aOS(&1I;2~=JERd1kS^)&mhMuzTRNn>yWhUw zdv6TyAIAW_=j>Q(t{Iuoo|m1YDCxwO3p#{K)=~EyXTy|7d*_ulc1%?1KRzaLdp4=$ z{Wdjr&@`Q1Y-sVaUYLp-=dhso;V0PUzWPRh^inG2PPND#DWeT~SkwM-Y%StN`rME@ z0|5m>fpy^h#Py*ASbIS1JtUTTZ5#d@D1f0tWaBb;jSzaEkzQ#~5Zo;^t6vuMS%WJP zTTe0-;t|#LRc~Q87p8}j7*mA6)aoorRv*FQw@)rcXfF*l0T^c6QFo2-hLbWH;k==Q zRNI&+MCK(W_%#|X{4|b9nu_~hY~-Xa&%Aa2|fSmm+4_FHw&4o3f8pb*2R+a9AlPFPk9;*a5)_|w^ zIR<6z8+TvMmARFyU@fVFsHl;o-h69f)PD1;{wn;c)X%wvLq%~(s>X$6X2$N3XP*<& z-z5sMPL+|ceACd0={aLN4|=*2i!q3{Pokz8e+TQABgY3%{Q0ZL+fmbx&cXG-BmP>n=2`ru>|wTPP0;3hFJ=h~OO#n#L$~@p$dr z_z1JvWmQS4m&Q+>`EozVfG80kBjxQS9Ee?*I0JKSX_-fx19QzZ6sp&;SDR&@9a znVd{9Io0N6AJ^Jz;oFyZvoIfYEu(63Ayb6Me@3_WtD*|YtZVdNDLoAkKGDxwnw#el zapp3TH7;&%HQ9DL;I$-@Z5{7+DL4NSN_ z2?OG)!XW{|=YF33b@)lz=xxpsy=&iINze}qa9t`In?JM9he>m5QGpjnZqV9P9*<_p zx6!^@?2av;l>ABD6%IVWV4kWrc3oQ%B1U~o?Vz%Mh7`%NJtq>1=NOJcQY|y!KH? zMIp&MvJb-Ev@kahm;Ckjhd@xVOsdo;3GN}a<+-lw1iei+F-CY&L}=AJwSrA8bnNck zyy!2izehQ7G8--_|IxfhJd_x$Ug!F7cn!OEecScGsho_{_RuAkjR6~eub643sCIVW zH>*CsbzN2SH?X9aQFP-Petu+ zw?jGRnF!K3J3G6?rcBL+rVg?9n3`#jABO2ROA8HqL}|$c{h|A#aK>|9OhZG%BuVrc zw~!Sa`JD) z+xv7uK~(>SZ>@^$-vm>>S5~4&!&k83XuHIM*({Mi)uvp+BkMQLPi;vRC9ICB;T%}< zX|Q|cm0EbZlw^1Dylrfc!&o=oE69FFv}O=aJ{m-hivM%4+<(zCs{)Hy z03mH8!1ov3zopmSAEH%RvP&ajKlD$HkAJhDdP!Zpj+q_ri9L0i$Ahz$a%}ErmQ4C| z%3eNP!%WGwDVbfAU2UI(XD!Uh`$^T*X<n{6Gu?%}^dI;_8%` z{hvwJQ5{A8!!dE;--bV#4=|`F%UIk0Rne{XwxWOHPyAWk_{2)ICiJ0;G$x+qyfTsk z@uz8WvVecZiAIwC{=dNux{c;Bw|{7K&W&Cya(Y&I(9pYb(QHK9X|NrK{`9jHo=Qr& zuhnL@}tYH}mUmX9hO#HFn+sxxNiS2N?@VKZV9{qKhq#jJ~#b zc1D%Q@Ygz)gLBW|laSgQF^BAtD*XPM{En?zF|rV74_X1Lm&a2WK> zN)l^D7iMSwiJTE!Sy>s}rlS5t;mLyWTPdEWEGZ%G(8QbqFP%b+ooGW!NNsL@fBjBw z1lO4?6+ibxRTc(ZMKx0dcg@9%snx<6Wku6p8{M5A1h*5px$Ef!S^0wLA-~-rX#b)<9Q!!I+u1IDvPejt{iPiu@F$Wp4zHYAL3D$;_bF#eEAvq;5TbnK|*LVKbwhK&XliFHN_GM#t_PbPuN*Uwf)AZvweK zH<-6yT+Xe#EYD9R8$_%=YpWUfCf_EJk=lx{ty-$a^ITc{oxrOvR{=7bkXdDVNyl zN|$@U+wYSdBf6+E5&uI%%;<0xm4?8wD>fW-HZa~FDs9w|IHrA1llMte#w5mF$(Jd*1j3=)G}6sV$)!m#>^coS{H=&)kFGYV>7xMGbEmIvT4 zUFL+&g^b0wK4vzYDd|$TXT>Uhs4{<1hm-1NhDtD|r*qxPEDA+}7;&!u}4;&MVt=KE5)dWw*f49cewicur}@Nam3 z^i>>SR(iG1$)>;x|ErtTGXiv?A34~3mga<`Z~TA%B$ScGO9vP9qPE8#L4GSY=D`8) zov{`w8&dAYuMdt%G>+kVYSS`g`swOoa;agn^|jrtzs%pk^w;ClR7UB?ReU6!+B+9# zwc7huQbHr`m`3VYCV`!3((?iL`rbq8|k6SQ`{)#PddUq_iW%g^z(VB4A=+RU@ z(r*2v6@`VtKzbK_e(w04MqcCb=7KGns>1?NfFJ zw_G>XM}+>WL|OqKJUgM@BAi^?8AkBc#s+@B&Cj$3JDipWkENVG8C*RFZ&wcv)FS~Ef&n;-3C#bM)-#xF1`Cf-}Hg0?Or?9RK;nic@^R3>Y0`JI8d@3FG$o;g zj8QlXa{#V%p+v9?i>$#dceqX16BJ4kyt)mt{Xm~z{)&)KAgYNnGOz5Ywka@;*~vNI zGaX#>WXr@KjU^$m#+E5GoRhlF^^=q;rW#(CPHo}YyUT0r0CIg2mf@#3vF zpT;YS5>UB)bTaj@9hbd>tk!rKuZTUS7yHu$1urJuZ9Qb}=sL;Oxf6l*}H-}gEJPK!+P*E?!?`lN_F8~I{u!TYOp`3 zn9ParC>maEWH+A;IIbq{AdN3cE2NjIKP#-IkKUVC|cdoFVTz_u)Nhi zXa!!h92l$xk`}n`m61^goF6K7Ed6rja-q$6h?gCPLnxIB*283$nE%SHx6i9nwuqH} zdv0&NxH!Z{fRE5Um$-KcQ*`oU$9P+)@Jo2bXVnE=!4lYjeBNwUiJWBLOX5K0#(r{Gz?p2h1jjO6({2)IPTsrO*bC1US z!lCh0#^q^#x~}!kTuBuYU7!EQEU`f!fJEpV%oTiB4J_Jp4eBzOVdLPsC+>EeT$&my zO}&XMxx!Y#)Jb8Jgs~GcwUOhqvn5!FD406hIp&(|`pSicr|SOPHER6Tpe_k?B(p!R_@3=C*w`#sGhkYdjh0A*F zTao>aQdrzTp&^*Dfyogr`uk0u@_B2PhM*Z6tsn(*Q|R;Oy&)(^28lzd zS|S+}7${Sm`8dw+v9{glD|=#4%4yXVyh^_%pqxX0k9be6FnTWC7YfS5x zkC&)y#p2Y~TIo%jf?cRQbRmAO4?a-z-2s`oB4!}K6w@asKLZBrI~XXS<-BQm0a8zg zwLqNDK!^xr?GQe1aYe-r*b%vPbsUofw?Kz|8bI>+4MU#WZzsbu5_ni9Lp(}>Dv_YW zw?p_8xJGqBwAx1vtD_rHALSJk&>;4z57(44Mf|4Lf%bbyr$@8zYsfB_@O;0Qg=ROL zEaK3e&=s2mmBsve!=jgwYxc0Bw;#0oB128V^7DugL0`zgNR;bu#NJd~ytOrz0Ma1g zFg=mytL3A!n$i#6EBZu?B%pfadf!E)*THXmVpAQ16_1*jIkPe+o~w$raPL*7)j|E< zD%CpNSpw1iy-!QUk?ccPrLVkVye{yszdNm-z9sxEPz<7cK zvQr@|9LN@cqi8ko|AWZ+8Cwp)T;{XbrpmNmF2m*R#P-t|(>?ZKdC*Qf((;x4WO?P< z32k9dZngt6l=%CiBJMV*w3Sz(B@&c7F_AFFfgdZ%w=({w=v$PjV9jy6%R_0Wq#1d5 zTUA8u_uBePOPVne&4B|wHFL4kXjKqh2AXZRJ*%@FcZtjOYh%;>nL?AfJ8a(=u5Krd zW`C%NjGd#{;#7oEZVlf_Yh32@Wg$#}@UM<%58LKFs>}Ov8hhY)3(SRFbsosDboxXFkZjih>Ei20up{~ z294i9v9I9kyRR{Z9F`YcZDRjqmK}2ly9(nS3R8fOPtM%YEv(v(1-Few?O^6Ngp*g{ zYkw!ngkYi0d+2;ud~zvvL>!B_O953QOg3w2Y%6tt*#wJ)r4H>v^dua3kILoQoWu0j zz7J?y_&3L%0V}%KTNp?~-a`n{5V239t}7mKR50Ih zV?ap>T_o>54bYST-8y&(kSQn4@3N8-5hYBB(;QG#wzwV{0{U}I*5&UbF!7Wm&H8)E z!HzDTF(RoJ^nU;7W7*LcBm4n{@NTJ^^Sk@l$y$VS^y)-h@y)1QzCIOr?7PWaN;<9U zmTn*EucMaVsmGi-k)f6lc&*8Ry#mZ7-v`qJm*VeWI<^(6Kk`zP8@Uda=VlZzVF(Ni z1gkn82vE+uF%+WX<6*x|?TG=ePt?Aw3?bkTNfUZ`d6`9nC|`IHUH0#{Yg=0zIcj*L z4x^TqmbtBMK~qyQP(46o$i%;uojx!mqw{vaVR4w2HxFbK6EShdMVcr(YG@>I zyzje!#YzcsN5i`!n>sK1nV&^cBgIr@sD-MpuhpBbpUQXW3Kp+fg#1s;yVgS1TsZgr zHi!SSjgc;L~&6_Iy14mj!C@8_MD?`3zTSwcx8!v(0`ZGpeLDUM%$VMo-9UC6xPeE2hbYm&KNRCjID6i7notqo zbdp1}ZqIFQVZlRT1neuT7LUk(L99y{adhm3H|xM9m*&2m?C{{*8}a4svp3#!8~iy` zTz$ne?#v1-jv$IS61#vv#2c3*Tdnkf{2){8Ik$h8Jzr{##zP$NqWc??`|H0C)>Y?7 zEbmZ;Kz~N=W2#KCE*^FMc8^NF1PdT=O!5(h{eqA5av$m{}$?FiTVtH5v`{2l7vU%t1% zHT|z;gjdDX-g-t|IMT7&t_30CKa}wXG>=qLU(VgnI}|xFI{SP&wbw+v&c>56%)Qp5 z_CL+c6gMRgVRI>lWR*|8!h^p->`SwI!T7Y5zzw#U(Lyzvr$N zSt`9;JiJyk*x-1kgw@(mBk=3tZwMLo#+&jJIw^V{tq5N11QTMiJMvc!!;9evZ4|6E zzkByC!fwZ|Iqw5lP20LBX*Io8CS`(U;!wj9-oN~WD8dLht-krMbSWEF2gRAtMf_q@=WM*U0`q7r@-k4j5Okqjv*m+%w>- zgPIcU4aP^B&Cax(sVKs4x%cwofPV(CZr~(~)lpaf1nwJPm2;Riuq5>-q(R8ky;?mx zrnAvYc*bjDG}7C9Qv*3p;?;a!BGqsq2NCmLeoR2v`y{0=TSrw(2Iq*P{(*mXiA)H2Es zdwWq$Ol-uG{z3&jKiLQC@S1M?1Nk4zDKXk32fCxp{2m{@K>Y+Y*W^SEEKhMGFyauJ z0khz4K*6U|!S`Mn;#3U8a=y1+B*5a->&Qw!48|0qyiwP2fc?7U0AHBlL08f7%nMjd zj6hWsYWy#OL9-K5PsnjCi-F=0)Eqji8Wj?d!0d+^gr)6+s7M?~sJgmSljIazS!`aeh*`r(u- zgjY(4E5*Yxlx3!!zmV(qN`_)w$2@6FvWTA?Lw{%}Q_=Xs!A8J>{HU%D@2@A-O^wFW z{y&D-a8eX(K_M4ztcCr5WM+vm?({HWsz1PiKlQ|zc`aVToSe=zt*mAuGo~E-x08p^ zUc$*kQN+Ekgp6dvJxbN}h(qtS!F6J3*?Az~Y`BwT6d9sTdjZ_FJI&c49`1u*e#C&r(!p&D)rQy;O|P5bv_md38xC{r+= zq4xoZZ7Z+p9Z->YhCK>)wC8sYqweg~XV`shzZHlG^Ic7V-1#PCb_OD$+2~&fY zGHf+XAW>Uyj`!CU6}qOX1GQq;iI8I%oUMR2su>eqa`Xm~Z8-ks-T%TQeF_qE zZoY)ax(^80`pL<~Lq3)N>E|4|BZX0Z?${?81z)WzeEdr?JeGtXePNImDiJ=>?(tmB zos&Flhz*R`tP>Keb3QL_uSb+;&(6#8MyAFLSvUpDQ|yYp-~Q}Tb_s8ckM>rWb5{)U zuy{VvW>N;gYT-fiT(>%$J`rwNlu(eY-lJeD|fyR9X?momDe|?BZXOR+1R^8L2nLUYErMr;FP{2 zG#ac<9_9h4rkYk%CKq7Mf@U9ekGr{44#c3AY2rNLYih~Du%;Yu%ZlMkmAG=cWrKu+ zU664cS~L~p-SC@=7e(c?^@joUO~+!jna{?kADv)d%+1&JJG^t3%6}sSKj9fyh$#fX zRwh`b1fGrSB$~rVLjn=mnbCvVj zx1)bod?f(ri7k90uUSJ80f-xB;CP8m?XTp^mda_f4r!EuDo}o8Z?fy16k5K_TJwIk zuk8Su$pfzyT6*)*B79qfBJ-!zMge4&-5$wrPQ#Zvrk+RR-1|elvO;PI{dC?>!eEwC z!h6{!?p>I=ecH2-7k2VCkmk(~5t`JhB8Iq%QTjY?35$27Qhn#e^InyuuN!=C%O=W1 z2#}u6l7!cFR{<<{nW%Ad3;k4Fjb#GtAfJO*pxGVK+O6ob_K3W(7v zY*z?oNfi*ykaVAf6MmYV{k;<>x7Ck{`}3mbKw)QRx20ZT9ks~Y8>WYztn_7L*Mg_< zK0wD|ScO4?2!fe)>Gg$fD>0LS>JAGFD_AnxJdZn;m{9}v*UXc!o<4o+rRZ*%)b&35 z=Wiv@^wgunxp^yTHWh6U&70lzyoa@OSc}8!tdf0Fn>q6VX33wX z;w08|(vq*Z-x-_k^4Llo7cGYP3q}6z?*t`k%{skflH2)UF4^is0OD*0cX}!DYV@>A zK2q*8$4T=6Be0Dl2F|#}v`&Q>vBZR6;Em^D93Q~wb!NVd`r>5VkGHY$>GxDVkC8dW zcb!tdVchQ_D4!+OWtsA40;!gh^w}s?~ZwGDg(oKYG zN)r#Ry}mNZj#v}>$^lk*eC5Oll=NOH%ez0q??;>Owo^gNZU+2={?FnSxXcr}L*gf* z%pOxj@G<&ZI#5t-U$tHG>iAa$r8K~d5S(n)M(daJ4ETU!? z4vYZT;gzxzTcex1yDXki0Hb>~okd9HDoWQ;oO`y1UA6kp$#AV-x|Ls`fL|G&13|eu z6H4V~KrS+`WzgP~72@8Zg|`PjLQeVYr^F$JUmqM!Sj3e$rq0>BNJBKbA}&4%JXxFX zX7ewyo*j&bFffd5E{RjN*0pi$TQ=Ym6GAf+IAfai+EON3!gPB075@-MPbRkAQB=Wd zU=nC6p$=6FXzh61V#26FkLV`bTl1$zJ(}{o4jA=f|_h z@u5(uCHAML#wB094!w`1$%<|C8yo)@6e`7JFlkj-=S)6k$}h%!YyW2t<@9=|{E?c$ zomCI89RPl_&$q z5R80OK2NUc`LFhSOK88CscdkKj(?xe0Oe{PPEYc-WC4{@Sz1hAuYf>VxrLd21)9F% zpCXLCvs*B>pP*};*Z^jmJBK6}&c(g`k~!bznHzhGhmLl-n&sQsTfQtk*zG!Btd@$> zA&P{H&TR4EEuGbobMO2?>urlPXWpa4PB86dK=uBTtfr*WtWz9=ASW*IG@_=izHx*0 z410ZfIX*ot20Q}*=GDL83}_z`=m4PB2+u~^$zbG?(T@?_D_& zvi~=G$4P!ye_4efL&agkICHc=?cb_YWP7;X>uYDKo=Q*U-DMr-hhc_wx>R6_&%2?G z9xn!!ssy0nCQB1aWk)KXA13TxP=RC0_k#D>j$Z%Fx0y1bisNyslQJACF?@J*Ho1bs`w3F4>$V(3+X$8%YD{~aPbNcY#=mYlPq!DEg<;Z1JJP4Ha=~{HQ&RynsLA!q&&3U59)CY0w8;xG zMKJNzXJ@DSdMPTHWCRve!h9dX>E0sHk8a4C{u3L@z{&0$+`Nf#`k<|o(SyKt;cjb$ zQ8ifS()4s_`E`Pz>+Nqp$(-NAA_Sl02exY}?>w8C8|FqEBIz>6jcl!Vx9f2l#M{-U zqr(+ye~3s58h^_wo7_Q)W|I)U*R%WPYh%7SsxC+}bpX%2Pci7kT7)2z=G^?q-%y;q z(U+`>4GU)y3=0MLO@l_KcSNX(O#Q1fN4=KQ4qFcK8!M~EhSQ`c0P_=5f?F*I{AFO# zNJC3IA#q4e{@O1y7t^Pb*yE=2Bh&YUed7vQBSILgc)xB@cX_xbqt+<}musE}%{m`6 zWk-f02bFCMSSS{+_5(DU0NE}0!SM|Nf_-tQE?jTfS+9v+3=)oTC)mAU3PhD{O`dwo zb?L>>lJ#@gJ^LetZ*wEOC5SmVsG|+3x94flmaC;YO4Gjt-|=Bv9fGvdbKp`IQ)8;94hEDxWh%lE5Ndl+LRJ-R4{snp$RB8_v|{@ z(Vw7rehIJm@plwM@T$xV-Z*v62K%x7bZ|6KsgBPQMDGz8VJjFt8k^y2s$jS2NCEs1 zO`$A@fj&ULwKAUR`pThiXc5xj8cAosn7Bl*{?elkm&%+3kMVi(^I*-$5-j~IvByEiay04TrfczO89%f~k`JiIw)6txAW16|e`OE`!T0k=0;*}e)7L@F6? z2e0wU7D$77llIX1*={L<;DZ|47reY5i%e5X8zyE} zB%YokZ4z{6#p@;eLavG!6!JK-9xSFiaJ2kb^0!Wvg+roI)XcVFjA2TBp@W2x=^1$uLFKu|J33AJgy zw%?3+@rRG{e@GPC@Q~9IHyS?NJ0D+1hBZz$6*cZ;Q?~ zhV4Y-UW1-4a>9QYSAZwe;bFnYqbM{81PkP;`-^c6L`pCsmI_1@yV?1a1u#V(((k^ix=@`jaD*r(;0EFnNnwlToT>DTEvIy3n{fT~bA&=vTf!@?>YWEQp8< zzMI$-{7_T)ZY}(-=UrQaz%sE`T7U^A*c68-X6G;lhw(3afNr=I^+6~cJ4`9~gLTCA zCEV`$Ars3OV|7iIvlos>u6!OlpV1QD0Do#sb=sN2he!z_wOuqA^1d?Z)02-_$r*NA zeDsC#`|Wjr8Tqv>LyHcHS1F5PQ8q}hZZqq1gwg>SU@)ZG?3x;u{*@+;)`E`2M_B(- zjFoQTYkD%0in{!q7My+A|D=8x&d;nRG|rBN#)U{k1Yw-0(qsB;x1LslUK=blAEl8lQAOz-Splti-Z|PuQ#3Jn z+upQ-bxhjb)zFKxgSFvD#V}D}iWP3IUZ=C-^}k0G6CLkIc4r4}95`dZxDkGftE>=D zf#?vIj|;etkSV=*B%j({;_DDj>qWpV>#;B9UjYD>fG#muWadX#4mzsDPBMl#M?@$! zdO38f5~_Y2IWk|l0U*51w5pYZfTQp#*N4paVR7}dx_TeTB!tXV@4&YkgJfZWG%HA( z%++xh0r_H};BW2dY*_v7PcAZ+etz(zPZD1GVKae6MX1POj*On}HEWtv=n(?_&DLVX z=Hdq1PlwHEYc(~L46SJd5glm$Z~0i7Uhb|?@U<`b40LpkjT~Ku(=kRwtKu!cx<>f) zYsEQ+anLcaW4c`3&V;BDjB(-NPfHN1W4X;D2EhcUJPmu+TRP|4Uv9?P$?pa%l4;y* zQOO&%Qhc}#O#K~P>@}X~b4xvON@LO&J7Z=bumcj31fZ+470;82iHSe)>Usm$M~eXd zN=_Ky(}}rMtbWse0|kf*xxR1I+u+sPkzk!f7t0PkJ4*$HAkI-%4r**CUIgH-jcRJ3 zCmP|*$q}k1VS3Q=+1F94;fSo*lTc@6LGA|vy8_NS#7*8UEN z<^aKoyl15olD=eqtIgv#ZJq`<3&s`F8_Wi#e(|6b0mlRQMS#IMP>Bi=1=3wV2!saE zc#yae$+Mj#%IXR}AAL-52GQ$k zdN{CtWyr4qjY9eQ#@=wc|1gNa_8;&^CjLyd1t!A~u0vHp9AIIxPzhS?LuL*J`pahu z(un@w=Ciu;65+gw?EFKePro6>%cGA=73*6PN36@TIfaUv%mUsdAQBufOjEWDs91W-OMYZ$yen2RZcIa1E@9}BU7QljRAn}fZp8^4ma zuc&6Sya>6B#_;jK;#_OO4haQ5aG4M+8?F8J`3?Rd8}F{fT$ET`T7*%0SNmT7bruqJ z-{0*i9<5%iq45c2MSy3^?m{hCbardvTH9P?ffOJ6@R~I>HLYxU{@snyk)@LZs8KHa z6df;Nv1YthdR3$BNZ%GBYw|0p?q1(&YGd4c?@`87mvvilTYksAD%-rc3&P?2|y||zMHU9Hi)VBB> z&@CYXR>8}I@M~W!<+w_tfs#-z(ogAr*RaMZ>BY%^UhkgWyWcMJ5_@+r&dcyH;9U*! zf{3jQkNx8JuiF5~9}4D-M+yhVFSxQVIWP0Oe(y+A8Ou~lsLXT-LP5B zFaRrg;Hke=-mt>k?FX13@h4t8d=RlHuz3Rstw6QyS&M!l1`yk&Pya%>vh4MCn~dzf zwQ3IN%^Qd-uJ|hHfHombgwMl9!*Uqcg^WsfcUukf^G*&vTEVuKCNHJ&7!}F1XOiWQ zHKlq8#S{J>Bwi9)grx`f$=!_>+R+LF*I z0@=NrLoqhXrfV=t*ntf73Q}#?K|*S<{Wnz|onhdQ)(I4KVe&YudOr^;Ix-UVeUc%0 zyMUfEF*76K;&PRRu?O@}|It<;*{qP@Q;>bt1iZuDul}k-EW2YV-XX&^?dF7;TUl*D zrt5G4eh}UOBzRY~R1L-PbX<}&7Bv*-564Mx`-zob&`n%hNmoL?a&;$h#Q^Q{y$O(s zei_fVi*9P<539k(zR)y6>r>lWXD;;pxbn(F=?6?@Fu>Mp+#W->YHzMKu7`APrm5=L z`R-VOW;-iH#&IyrlJ}{9uj8o!oCoH(H59Y2{Q>D{{w;=y2I>RW5#8yQ?a8}4r z*u4F*e`61#Htj)nZH?28JfvVB95e)38VIyg?Vu0l2l*5rT!bDtg7Q0t+xc9i#@K)W zX$Wlva1m)CBqg=d_&9mq5Rl57@)20dK>`)H2~qXjx3Ee|OWnaQ=DFX^o!D~*LCfb? z6~5_cA0MNY6$G#X-V3C*aj;LucT|*8ubLVPCkLP%@b1~?k5ZV_V)DxB+~k)SGl`Nz zB|&O;qHh5=uJxZXPL9w}?**|GRpN=ty&u;`(%&ANh2yx!MaG$KU0hN})LvgJXQZce zq5HoA^t4}J?$bX}`M^APN%lp91Nz*YBZLfa$4kzg2H1;4*Q8 z&@a&XA6E)*0%Dd3;BJ9*1Z*nhqOW2Vvrd4{Rb#u%d;cJcVPG{=W&q-Vhf_G{V{LRm zObMV-KqP{0Z5UHlIV{j)`Y0W=-(7qW@BUriSYkB9r7<>;fPq?Rs%aH4*ZyFg{zfm-FNF07hVroRWm2_JgA0tTQZSR3z~q>gJifBp zNe=*e#*6!z?i-JIGqcmb?f~e|O%${4-Tc|0sJcz`x>8`Oom5oHBkEFfo z8`uNXn{IoZV3C0HO@uX)+sS6~{Z-Tgv8bbWY>nDCLxqhCYgd`VG8~PI*`7B(^YP(2 z%vu~D+8q8RV)@hZD%p;Q;8OW%i?z~Jg2wUYBka!*JDn)(j;`D_&J*yumMFl_ORkB~~*i6FHJIIaiih*(Py>1U`$ zN4xA(`t98XY<&e~&zQDH9jRRrHHb|YIHO0{u;-?srw57kAJ?lP`9EM$fq01bxX6I` zvU_sUcXE?kVo6a6vT2J-Lc7+4FvTJ64hIK(d54G2|1o0jkF?6w%4VLZaY3Hh9#k)e z6#RAU)9S%U78<-usU4C4T;+CGQ&i`4yjB*MgkbqePW>{<8sEND-Yv`CTbTYDJflHt zkJqd=-hv(vua&F?d@xn>v!_IX#8ey=VK!a#UA1GY@w&9C-$ACSmZQZoJbFG%=!_jL~^ z!Xf%ygt?=a7BuQ7(6M&^ZlRcxjqFL9zACaTN}D>K{9gH~lSE|~Ej(jD`@)?d%6FRi zy%kyOFTb$%zeVI+s0q%L$)@tD+Wo^curYBVdgxVsnw)(_7y}K#f{EpAf_jTf=(A5z zSmH|LzE+(nsYEP3wm|%4IsRTM1cj&jHMEcL551|%hL8OtV|Hr*@p(LsU_x*BO%d%V zyaG-|X*oF*aB9SSwg5a5U0q#pAHV|wAP6)9R+-zNK##nHhJ%KJ7-mD7h5qg%De81F z@I&Bg2uIdz1&r6)+FE;X_Zx9q3Fy-Xr`Wb?sh(Odq#jh| zNj7)SbiD-+Q5-}mOo`eNUIr!6keu=n`I#g9W%9bIBQv|kKf0K(&KOC{bVH+G27V40 z9blsX4RSj_U%QErYM|d>YgrLOauN~Johx}_d6DEbtAzL)_|-EZl*Ew}pADqv+5##n zrZpAvtse$mUCjR5u`=DIItpMDm|Y zX1J{*xSp&)wBB!NYcd>q@gO0%AaMNQ5oo=me!OP_*4TizYL4$-9F!NZ9%z5%nSJu0 zm9@74dOLDda3ZpzCJ8MqED`WHjM7%K3CMX{VFW5M8L~)9ia0~1>Y)Q}4cLGHxMZ6o zCE!GF;p1<;5a%;vVhAxj81S1XRf@GJsB0imA~osmg#F$Ks}Rzig`uexGct>fb+KO1 z1{O|4cE!gZBbeGnKvULQR~`?)THa$i$*&h^SPzgG6iBev%1wJ8 zBpVyNTz7DD4-7A@?z#h*?|exAIku0)Hw_fLsle_S9El3R#I;khNgX6Fg7~BaM%}?E zpG)#z&HHq~%jQ4hT-WP0m!0J6)?4pexp%EEeTsK#aT-$ej^z^VycIuSO|r*Mft=AZ zJ$pEAB(KX*w&`Ic4{%{dt8uH1fQG0nk-LO7_#!dEQ2rZzml!EMU3(U~qx73Wn9t6; z6z>3w%ie<9h$<9X;;BE;49k4?@^ts1h1xvueK>CnEl<@I;({!1J3lpxC=PtA5r_T3 zo|A?~N(j)1wKrJZo(r6u4;=qWx(3`oVqfM*m!dIdU8w=KgP*j@Zr~)BSdw@P1IeBT zpXPTBz@K*$L_BGy0d5fcN;{FD7xQMYwtE`qj~EHrfq^X0{?tg2wYjk&mdQ%_Z97Ix zf06zbh+(>U7KQq?I+1k^6l4G`VMvedDZE;K9OJ92<@H|j=skQ7|K{4+<95o|lFZ~j zM1-{704JS>xv;+%O+G1M+yx~NpBQF-db$e?VpiE zK>kW_$!QsY8~2SYIGJDDF<6NGGklGnbW)@i|GT&AWH_$O@6AHSRRFQ__d<%R;L5VV zW7QO%vg=O6(WH;n7k!Fvpp%@@@q$9ENEB61BSbN3r;aw} zT2|M-RwzW$Y6GpTqzwhpT-f^-^lG|mtG%X$>{8<9eG#;g3s*6ZHsRLiHJe9vcDT1N zetwoZfROQ%{vL1}m~%A3FjCSG#u= zdodvYErsU`dNAaFv{2f0crh&UR!6!F0yI-jj%&r$Jz=Hwk~Mq`JUHD2R2V|}H_%}6 z9`06ueFblRLa>BC0T6j7FajY_<;YuxQ`}{)swHy}bxt;Y?G$0D3%gY`ru5u)0$?=9Tanog6N`fBn3y@puYH z#ci*qtyQ0`IZde~CN=;EA73;!hTwQ&(arp0MhnrkEwuL9vvsCvFr1LSFLO>)yct{X zUqXItAUSs|dw4j3d7sCXP;s@HPpEpw8JV2XWu*w^m@*Q0XxCOv<-vx|y<3cy?q|Alr|BfB(8{ zexf(Qlp4sY7O$_X^T^u${%Q;iGTRUB)o`C=qmhpl(_LP}N1Mc#1$=M8;<)r7#){7~ zRp|=_0`WYwSk(6GkEdJuK$o-9h>*f{_;Q!RClUq4;BG(K#e9_4#XG(@J}#&0S=3r* zE$uqVz6T@xhBhJSZcR#6$LX;a;b>Nh%UBhRYy%Dnl>PkTfeXYiZN1T?+)76_%^O_m z-50ZI8O(*@T}lVZyCmDFOs@K40?dE!5_DJy@(|pkF5yiq7j)kFns7V{%3)C`W%XBe zY?jl|Ev9&CJg27rfKIEc{7#9bnbwr`CRe`m2>@hdoNm;$tdlbMe=-e6XxmFfr`sdrmr~X0iJw)r zwP=p80VZvYzCEA3mExFNYnl3S^}6>AksruckX-$u!}Vo&oAy9`Z#k`&|DRKy)yAp zpSWX~WOZdA)Pl!it%6_3@`;1}a}cmZu_9jmonUIV+2oZP6RLxhuSvUo#}~a!Ae33v z!31n$P+0aU2de=bAO0+O4QH(NaG!fXp91s4kY+ zksHp2c>J%w$ji(*tp^WBVgdwKO1yiE)g1#Wt$NJn6Ps&+o9Aaq0xfA7?Ubd|OMa55 zQ#W?GxVQvP>YXQ_Orx81E)rsqh@OB}3KTspX5!DBDsL1ADE^1Dw~neZ4c|sLqDXgl zm$XPpNJ>eAl%yaa4I(AE>23r8DG5PJO1eu0RHPIsrKP0n+gU7Vin;4o8lPeCu4$?D7Mj+Z^gnmvuEf^s09 z;M1g((r_hN4yT(S`xN)(bSzgbPVSmKt}qEbCUrCEAF)dHTQ(y;Xlmv4}UC9a+XWi<-6zRy9{6ua_?;3FNNS z1i0M5H!u>A_{nI8u0fplC*i^UfLaV%0^FGV=RH>a`}fXV9J0*9x*t=MP;9XBgp#%q z_k8^)W;}b9>oRWe^k9B+J0d-8!X1l!h1&AFq72dG+sB5Iw;49PQV%ya;PrG?BI?wnuid zq`Okr?ejhQiudz{p%YEM{unxV!&Az~4KidO{wbu;u6H~X=5QvF!V=@Dz9RYB;E%D> z{pp;wrfg#E{!Q`D^GzetG>xihduX%)%UhRJvNtfZgN~q#7ph*#qREo&8@?RIYdOtgLkEUUJ`L~ z(KH-Sjxv|+({v==rv=XUT3_+yrKlLjeo_xI;0r74QC5Zq^h6$gPu9jj5SgsUW?j_i zL*Xy{vk7+!`W7}0_c^k24EOW$b~CDm$LuKF)FKXtD5dnbCEP{Avu>R&iJk}w;1{{Z zY2|Qr>ApnBlQWXMQ4v}*%9#jF`PAKJ*zi1)n_HGu>V?=iC6BS_lqiI-V$=(%qq1^u8PN{({3SYya-kZr^3J-9%}c4qW&e}4 zGhO>K=S}(XHCpMrIted+*NneS;`X_Y&~iDjSn6^RJ}h8(s2Fogl3gv8Rmb9Tq_eMM ztC^^_4(oXH`MuwbvfHIx%ZAh(^26 z=RhDz_+9(iW^SJ>+R0aC-N%LoL@rmyS&U%G(L}p=0P&aviIgKm%h)|c$n8u(6TGJEU8F~R|UjHPxqBSNw6u|ylVa+G-XFhOv?H! z(D=hrJXK9mmx}QX`gTW7`fO3!jx1jFv(z~Ysy7c^bYQRDj!t&FQVd(z5X+6|WBbc( zbN6&a>PF*Cm zr>GgR=H=gr(&il~X3-Vk8;RUhxKkVJpuU>VO!h#PD#rdK%1}U@CTeC%?3Jqsck}g_ zH!EQ>UMC@jZ3l+l>`j^D?!0J-DaoG?_x>cP3_RyBSu7|<*}Az}@*PA!`!Qp@ObqfL z;10WP{i!5be#L4})?{ZW)Ie8BV4hK-J3sgGr0I#0UBgz!$P=`Cdd4fgBg%&Hj|w$?|9Qe_{o!Pk!VN63=qh z1mqh8(ndh?K?GR`WwWwmX`JglC2=%(YV#IHM$ag5vgfi|xzyp=(rm5mM^4pnSi*># zc=~LOn<)$Kklo%oS5~GM(Z&3K4^%J9UX2VG{9RYUvV`84n zS8>@Twt2HJZs&iUx8k_ORQa}+s?)kR5;gBl|HaTT$Ukc-4*z^%-^x+uJ0hbhySOrE z6v-zw&Wg4_i6+lqsF0xW%BbX?t;vm?rQC24T=ZM#s${NBD0 zcrBh4>FypCsLuE-B@exp#9`i8$LtVxUB^qMZ> z(OUx_(kDW>S;XYYwW`)1B}hK`S{C5zo<*R_JX)m9sQ9a8I*$VH_R{y;!q2w&!_nM{ zCn!_w@8x_#$D+wfnYB17s2CTwNbvA_MBuZgFSN{V|Jfe%1&;-#gR6)nm-)87uUd1Py^oU`RJBLgnl?ftf4Bwk;p@F$?3dXFFZS7% z>Y1yxHT-e;mqxTsXg*p7;lY4@O^Vg$GrPs?(!Ghma; zj;G_B)QW;6DpzI)?*ysS`l+8TjVvnBmer5D_~Bx^(_WLs|CQ0WSQvVTGTS~#!^a_^ z0*O|{gC4;_xEtOaQC=yg=Y$ss3|`~w>j82afn|@0Kk}&dhYT6zWNkE9XO1adc~>na z1+!UF6-EC$;7(p`L?S=Yy$oS>n&h5)*?Qt6&Ye}*{P?Trfe3+Vd#?Gva+9CcP5y3D zB3zwrnEku^G0#Ob5uZM5F+Z!Fj>>az%yH>NiezXG-L{;Ys%te`i@28<(U?8lX4-v^ zm!?T7h|ZoY*^FP8MDD|V6?&@omwWnDe1>i4ljruLhv|2Yd>3yr$;}`CB``O~koT}dY(Fx88! zF~S1$e3e@E&SiV~4wtoDuZ7+R`V|VyuQZxG?R@s#9(nYN_MvoFCuIh!u9#>uS*aN! zVy>?X^jEcf6;NMsJ!I9s?@LjdJp0zUdHdM;XbKQQPDiDSlov^~*I?Qtr2Ucf|Cg(Uyh^zNCySTmWUlsX7O;-iorP8)ROAGci z5Bdbetg|`f3W9CqF3=cSJvk{c#<+W>4s}hRB1*WpxVm6Uje_UV2U57i&40}xOKtJ_ zmAE0a6G5{6&*z*NU^ur1?&eGoum;v$KmbLI%3RU%xBVl2*ZhZ?Gfg#?`VRJO+mD_1 z8D1cvq)X@UZ1Yg&F2&W4NAc7fWyLCKv3;8hwyX}H=j7N}WTSe7uz*BIb)8PIp3B#; zoW4irVCSZ|sk8*1Il1U!=!HIbL>84ov3)~MeP)Y6?1SO`JQ4DN>FZPFa+4$V+J5wH zefx;s3#F8Qx;dXhQy%1BCE)fj8v7(5Eg6ehV-hnN*I8ZqqREGjUMu0S7vjp$`beysLd3;K__PXRK6m2Xa#t;v*#BHrG8?~r7#XQ>>` z$DQz0Ya}t3@qANH4%xpenU%9B;q5Ik&NmqVC4Q7N8kB@**oba%amg|gq8Mo<*a8(5 z73an9VHOD!Bb1YuSJBLj{&DT+-`{}UDK#UbXPaVM$ol<9`rHtn6zWoUrjWx(1_)J;;KDk|Y zm{s{Z*XxIh0n^Itmao%ue7HZ~(-~w{j_lrNS~lI0gpho}uF`wfB}!<>qvhxEmP=p^ z$f_~lxkL8R{x|d63GCbzO94uW7oRNzf^3Xn_}!KECcIi{fRny;E{unP?kGYd_U`P3 z9<)cHm0bGn9bg^qI5;@0R`*lwNNP>2hs^SS-u{%RcR}@J*Nb%7$5oQRJTbKIcPKxh z%-Ke306tp0e7g3;hCMs0$Twq2u{p{-ePcK_YhfzKeWiN&@=QfIWyrqXO|83pEgV7F zW@iTPw;B~*F1PJ;O%Vv)ckJFha2RccXM zgbC;Q(c@djIp{Jyd!{Nz7!PALBAd8}r2(o8Km;>SFv=_B%=_Y?5O+L_aQm!Q@4?Cj;m=prOP^|LO){5e7e==Q5741Pj32Gx38C_E)xZ#;%l!B z1=FKp`lbun)}~6s)C(HLBW@9gZ=8gWFS57|EXrqNjbo7hxH@{;Q842Y7YsS~kbo6`-&q3vrw~Rt)1P zi!9q`snG(pJ#YYgP4gidlS7Y%l#6v@>F$y*^~Z(karem+NFf1}v=GIS+xer}V|T42 z&kCi2akkaiL)H{U!eNE-AvIPvfXN?3GI9eieKJ4UqDU}88(yfU^xy=VQ1QR*seM|3 zbKR$6)+|JR;=6Pp@4z!>j_1`vo?p_FC7BKIs~E@|j}N<*Lga?!N>X(~?kgy=r9i74 zXZH&Qn_R>f-f=dcwr8L2Oo9fj^{1>m-oMixCT3^HJT!kn1|xpKrUBfA0kD?4K<}~y zXoS$8&I90}QPcg*chWSR&^k}TRFt&_?!OIT96dO5l{Kryz~ZJ_uNYr?TKvDU06*Vr zF)8qP&nw4~wIqmswWO9)2wGv9$wvq#EkDSUrh_K#qj%;_u1ui7IJGpn?kNEj0pw37 z-^E!V6=F~K-UNDvqd`iK@MD!{E*fuYf$`cZIk8mo7bzjY2QiLGiY+zB;^$aYfzDFTVt+$ z|H!1${HwF9*f}osf^hNdr74?_ur(+yU@CLBF)cpTbyxiN!jx1U#LF! zMqJH3jA}egUHU@Am3ikIuG4d@LR6;f<8Uo}_&VnSf@RZ>Q~ERh1g-&352H3qgi%Rn zpk{*{S4w9^%$2;gJ6Fuxew+E)q%s6$DcNq#^UPiXt`Q4IgOD-Hf04XjxUrf^&O)@+fIZwU6D$12XG-M+b2xNwPkorG zXZN%((YW@f4HLIRZcM=?u=xhZ3_G*HLZC9wx_5U&?F3%TQ`gwXsnxjOuzg=LFZKlm ztMbi>GQKyxJ19IQi7wKxQ9Ew0JRalnQn@hk9{ZY!5{u%fhjh^J1Z#Z0YObhxoG5SP6!1$4LlYf5i-HF%8B-`Nr3JBobmWp@~K|M>`53?EN z2Iu8nl9W4MKEviL>h1{LJq|tYS?QbFc|iv6#MRt5o6CW!EVmEC+`e*AC;xW@h4l5~ zSzB_6>|lNaG>#6?Y`(AKoQy$*#jVVvHyopHn?qc98yCE>#Df!Y{$I!w>#sNB;u5=J zZxS@}W2Rf~{3sa^DC9hOWsroC<;~0#Vv!ka(ud=E;bQ5|*UsbIOEEw_w!R+tEYy-x z{gdXVNs3Vv=~yw^oAa^0O!UFBD*C7j_6ULra#2zp@}*j00r5#zPh}*oFYRby|9V&8 zhzSzEm_&6CqeeKCcnyQ?adPm9%gzIp+gWsTXw6ma)qdA@2s(-X)i2%FeoXGgw{mZ0 z*TcGL3nS`9JLAm+eojwHWFo!y#bTDFn#vsG{%*n@J4dx%gGb`TVJl~(}8V(yv?{e2l3yhh~ z1+JfYxa@+VH_+1?^oiw8gJ382(qMYcyq6+`dYf$g&4GQpXQvA|I(^EHkd9(OF&LSM z#$od^fbKAc9KKZWC35TQYSmv;K?%GvSP-6D(FTq>>BX{tSpWK<)0)1&pFk*UpC)v^ zbvPs!G0qEbDWg&x8dUp^JD4BCT3KDG=SBPUUOn5l{>RGE_@WO!%f&}&G$$X6uuURI z?w4TEVK9YKqu=ArkYgfwBBA&K-fuEGqVz%5G&J>$WpEcJBr#nj!LE4!$DNN_ebiNU;So#+ruxy zhUX>LindxPz)}Bsy+3AF74pbC1qp?THHliu_c57R`?c6y2*t;jk+U*8CA-9Tu$NiO z^HUWY%d1N&Zv0BG@BD*>Kp2KoC4Oyl=fX)(mS7gba-jMs!A6N8P;R3GVra?iAoQ3$(p2@&h1&J!`~%-tj0_J7FaNokq7jCW0P)cW9iA>{jL2y%17 zAa(1_M$M@7D%Gr=<#d**fC?tttkFHX&vYCcq+_>OI_@VE%3-iz;J)7*>*gF07!;0L zIY@)OIe+m&|M=Vvopx?)u6`dUIq`M0I@|n4GCS?tx*nQ&X7?*P!F%3T_w$W#dJqhU z^T)bdMu+M3^9(JTuPep{UndaRH%B?JZdlb(t6(zK+$%|4ba}2GV!+f+=Zd<_vtbiU zm%FbBXBye*65VW{=uEHo_gq~P-GAzooR<7!UG z@-j?4*WMp^Q#e?G7ic=Os!;fIcC9*s^3IfGb@PjRv;Mk)T0eG)X;t9;FOFgYIUdq#3w@J>R1E0Nrw1=KO92*snanl{_{Qv|eK z@I2m$<=&i3kFaGewfHioq7EM!&N#4SS4r2ZTuz_5oP_2U5WuWHqdU|arF8Sv+|*RZ z_Y^8cl|hldKaxLQDcnhZ@3|U6C|4lMjirA*gqA-`Y8+Neh$j^7CAOPL#M6puY~da+ z#!pm9(7{UR>ZL6l%O{k>B;smL?SmqFaKl8ZZHeY;A_7kT%{WtRm08RGx@NWh87|*D zEA$mAyK4D6Eti6+Upa1EP^c)?OSbZF4{+nGJLT2|CV`_B$9kU{#^;RFd4F2~n+ch? zYDtB$hC%k2*llZ@$Xu5~=(Rr@zMp18=bv3`{|2H-^}$%>wPr zSt6C4NWC^8=7bvvFupyy2Ld@xsj0))DQgkaREImwS!hq$<`evXC&412K}mE3suo0f zJ}+Mz+~dQ#X!Lb@Xr#cdAUxH!bF9Jp!j|R^(YElr}al1RRUkQ^5`6_BPx%EM|$O5oiDS+ZPWD80O^l=Z(d~P^DUnw8^zm}L_ z#sI(7%%x-&C@%kRB_?{QXbS<6KMDN>YWFiOzei|zI?H?y!e}|FFekyGOve&Uf`-V> z&6a6%j-+cJ^g2@+KCmt$_NF9r)G(Qfwp-Eg`JHd|pPiK>@fH15<^X(uE!=WvIYrY7 zLg=Q$nWwujr$ntOeZu8`>eX)U$GxPNTB6editExGB-VXKzNheczik1dCz;gRF9PPX~Ajc z1<|}WZH1$vjhg6$k{l)zQP+Nu%piD;W>!{K z8Pny3_Y=Z<7J^28cMqj-z??=bQ1Hl>N!Cwaq8OUmUz}MqMo2txfm$MW8a9eLku-X2 z&+`9N%%RuhpRwp|vc4nIB*7{##1(^?Q0b%=!Fk|5*ML8u};79XV9RLq5a#8k?%* zqG>!9h#M1lGL`(=dHZ(>8M81vEfe^X?H_*hhiQ$Awc2HJ5$KWPLr^e5sQ@u0Deu5o z3_4U!?wPQ~LpiGQdjrK(;vu$~pW>*6!0U#FhW}F~CFk$omhJwK8#ogBdw)jr7?M_0 zeMkRdL3`x2*vM$Y`UOfsNw15Fu0w@2LV-AIUdz}RJKZKJB?Uc7A*8!o&hh65 zvfz6wx|zTWIXE=5R{L<<)3}n{c&p4ILXR6yhMY*Law6`*&8J#UZY-kOp>|&3g7(W= zimt}Wy`}0wf)rY-Vev>pIpx%-zgzxLHY`w#K}{c?gX!t6w(OD6|LN}TF7SAe5LL7I ziZu;})ACD^%9ukvR0UBi&Zc}6URyI{&dH_*2H^|=$7m?(#gdd}tNj7GV#9-7BLC+F zH|7vI@s5pE=X!yyaDZ^jb4d<@i*$!~Iw;7k{JrG9(Wiiw7pEwAy9{(M^2eYawgXe- z%!HWp9ak4F#~!GYZCu&^ziSG>G1pt1VHOR{(WC%&?gf+GGtme&g~cyw{7}}t1>4k8 zBzqUerg|JjmSBK@^jShHY86af1_;tBz1QCC4hltyez#knlK7ooCeA5*|GD{ektxgf zIWhc%0B=kU&Y8u`_-jiER87sq^SoU z%&DMgVr4GYGzUL@>dU)2e}b}z?k8pF7**}3fOkE2lRTWV1|7OgaS!%O04%fI(Wj+h z9_?SlVIDjR)ZSA_A)(K6<+Ewtx(lM9a=Ain7a2H~hZ%FN|98Yhwg#8>#U& zQd;Q7JZv=i-vtFHPYF7dK4<;YNqjBOaksM*aY!NAj+;N@za1f%`*y@Sw1rd9G>6tG z6UjJ$uKlyiYnV6iXAFfiZ46`&vTQM3QchBwPdy9zenU=9D3K}yYzBI`c4XrtE6-G^is-UPuAm#yN5=4}!t_Es=n8fgE**r${n5#E@~U}4VMS6=Pl zBUy8WPXx*Rpe*7I?!vHm7iRzaA~_eO>kRQ%Mn?%G0B zr-AiS_*7<{J%azoHQVhd^7mqA9q)~v?9adb!Y(Y{x^tu1Ln2W~3*W$4>&eEMj&Bid zY4z*YX*S4B3FQ<*k|l|R9G07w&P@ThP+Hs6Q)lcq@)zqpT?67>c4Cxzq4C(RIW*?3 zcjd^N9c~;2_CDt@Mj&+e)kEmLc5a9Ppo~|80UCN;?Ry4YR%?R{%iS{1VZo8fl1WxG zpOq!rWc3=FPG7Cow*V}H_}lnXYFaLxbS#c?h=y4>v{?*!Qas|6H8DSFJ6GjKaW$)o zmRjfyOjcOIhrGD2lB@jSlV})$8bFbDZu;dd=h(S-E>Q&N^n;;fwU;MrT*Md%+AJ{v zCsKGDnIn;u^g8^Ve4ez~^_F?>-1{nR@_Hi!aH~i~_$UA=Y5jBKH*5JhkZt)a!Z>|3 zRY!UBfb_o1PtmuCus>RTPNTbjcIdkdOLSH92`v(=HSzU~tLvK300;qDzn1)CxT?^s zCbP0Zs_C|1X*ywxms+}}X|amQ5T-wQBrJ#Wtu! zWobUDmaO3PlzVDMtBVbY^G-celN@QWw){2rX-HG-?VHn4`2>imb>4-Jc{9V7R{s;4 ze0|Io1{d`=XjtV_zev14pnwspX$VAu%v8(oe^q7(vmE?ZNoh|bQ8cl=@gO$etpGu8 zGV40zqc5;~m?7J>3Nq#+I``acuJuE|_?xn_gE7B*vn%SglWI%+O<6An7bOUoD%JGZ zI}>jVj%pov+(G}&-6`toq*)uwT|}doSo81g1GsCtHsZ)BUR{sGBK>*gO1ua7npMfK zWd3sY{emo&yo3NPo}w>5$cy1hE7T#TWz@WJ#rrn(On(G)ua&RQSWjs;sNl()gw=ju zT)WhYQo#QBg8caE5M2!)$@km^eea2)s0C_q@!5Qs)9v+S=Nh^?P)D7AYH90HJEO>z zVGQ{bJNw3&MSM{f^5H~MUe94Iq4$?9(E)chc!sjz*S+s_E{vG%@^1vCZ=p#954f;xq-NgX5&xlDEYr@5qrdkBSJf^}C(`D(#Kddd zMjb5oR*R7#=q?@S4__iBC`&0fmzu4g1daEoXdt7>Q)=jRHn8>9td)!G){<-QtdOF|u@jzH=MH0KLzoMh(0 z(_{jgQuyu*fekXPTfKD*1c>DK*rmU_{{lMBoG}tHz``OM#$@}bBi_R=F8ln>|g1H5G2mTM$GxL9h7KH#19E{a@N`mUa!YJ`Z(Al z7ED91ecX)7*_{~1!zEz{F@eD}m951XZlG$o`k@=oz|Ff5ib;2JjTVex_t{S!+zS)> zxc3ikI%rLdnE7ZrN{57|ks~_ahp-l{o(9T^>JZ;?FI`R^yD9m>rI7drHr1^u%)9Wx zi}F>Nf^WwEhUIN!EjPbFb2a7cX*y`#+!^Gp0dxiA?C;^v8+hi!4Yy^7WN@ZoPB(2 z;ri~ssFaWvH;vFFm<-RxeUh!GrOX!6=f@7XN_z}8D6m4| z0E&yg72Z;3Yc)GUMNC@}z(-5ek*#N)T)U;A*=8i<`4u%*iCL0Yrygi&n`*ZI5`e6_M7cYU5 z5#jRgeNP!Fy$E@IgX;xa!JgjeuHNVcRbHr1#$fXiv~w}KP5XipkDVOQtqVOQfGnL~ zk?^ZJJ!RV<)f(>Af4LcHNg4ZDfKidbIR5g@d#vA|K1a&@?NY_zHkQ+uuQ%l${`w8& zSLCa(1%nhk50+QSfQJ++}~=eECwFqM%eOCh-c7drc* z0nz^V=q@VUqV3JbOXOq!O=f9M;aw5`~g9N>14Jv6u+KI9o4x_)HM$heog zjudzg`XkQX?&v-!b$Mh|Nb*U;d{kv_@~M1=*Sf;|9z{^n!)Mv6FMLbMucW501t!X8 zX+*0O^E3S(D@mOKbH2v1T_s!7mj#fd0xLQ+q{h0 zlljH`KYZDn{4{AHdO+h%T;Np|=s}!ETaGtc`ohmed^n3a(2j|iGF%pV9{mjpeox%c z@gJJB9A4K0#PVU;`lI{rY Gjz3({Z%WU_ehJr-d%lH<$Id1;`f9%HK@by3qW$PW z8C+46tlOjiGCm;O&mXtj$>=!0p-}>4n3rOZ)R=iM04cUozWnBGtdYgO?EZzEZSLLm zcT09&NPNEY(T~@PsC%0!wmnHaVo^b_+H8IdhbTj^PQTUT4`>beCE+nT?+X}gygooF zzH5P+21@t{g#Yu}8!7whoXUR_?No|7i#5?H&arnI559TSBkty2i{D<|y}V^&y0ATq zbY!t5XJ_8cl>9ejPk^v?kw}x|Mx~F{ZdYdUgmQyaz0Z=5poaB2KOYThKs}JHb=L9} z>2LuIB>L=c3&DRmBlFyM+MnZGHilw%Xs+hW!=V3xk%sHgENolut@ebVt6GmP_o{-D zW47E2@}8!zPPXuzU({g>GC$zgO1-fDerxw=mcw%B?#mia}mp_7zj`Z`P&&UUu~e5QR*p9oM|)J=D~{nRvZ6{CfuabXq&L>Vb#=jKo5 z5>*U~*n0b=TmSwD2;k$Rx9!he`UJfqK=Gk*`)u;&=l%V|HGSMr(X4i3JEiB@@v`fq zj9CsL14$OAPE)Mc$A>nY?Jva7o1f0`txjzmXE)%0clr|7q_Ow84+U)jDF$rv7{yhs zMYD93IGz;aRRL7BV&{yeA3#i4E`cWTDW5*muS^?z^Ohg8iute!tIISHmBQKDs5m=? z=mwYGEoYgHmDRJnAB91ol=k<|z&5`RR0pD<mo{55jA@`)G7O$c!!2s3b_|`==|TG$O4r6;wW60{j1= zp5!?S~H|pnj&|cc4)+;gCO(>)^+frfR*%%0~p~316cc^>`fx@I8x< zOgpwZfc<0#^l$R>^O;POW?Ox3OVShAetv~jEYxsR2iAcJ>B;dfrFGW11rNmSo8Un0 z0-yC_oakI95RA}#%#&dN+I+p2EJ(ujU@ANWf|5=}K~_&r`A75yE7XYQ+m7bsVV48K zj1PE8Xo06i98`MZkjU%#J@6*5KbcK)DK`-S(eegznlSuOc#Vm*eDMRSF$VF1q4xj! z58?K^J>e(WAI$XaO5g=zCa&?k- z^&$-PQO#*PmFqFUQgu$sL>+|*z z3l|rb&`Vr6X! zTqZU)ww9LGy))xkz)L;0v9aupB>E?{21{R5RAd1X^Y5kJ;EmM6hh+-csP-P^4-ki2 zLS0|r#p%DyDGH67{QtAp(oj3>|9jIx!AC*km00lq92>aFCeYT>($)^{3J`ho<_*TE z^cfH8n1yx))mRT$ZO^sIMX+UVcU;j!)w8F`Z3&)lVqRWC1iddNP@l*}u$SfqoMNGV z2#ChlU)K_|vZ866o6rD|d7qJxP(o6B=j`J6?AH~3;dtc6yB7Skv@}@Q$l+nt^Yw=v z*LnnU_(1Zb$8Woh!_zy&J}>likR^c;itf~L7(EdL1Hkgb=4lsV@8r}61br>%=9ZKg zzHRhS%FG{QI*j~07K8j`+e7#K2U^}}gv|K@0rbX3CHHX+Dhz`G3d_jCBEL#_L)XkK z9>j^{%Jd3KOYO!Q#g0bIRmgXn@L+?*I8jBB9W=^{az{A@E#KES^MyR9g&MQaeDa zA6~Ljs#nfeCv!6edI_jg#G&!3(>g&a90(Io;7*5nY`QE9II?DbTX#UwaOatGBMo5X zdH`V;3Y=cp)W4>+k~xS``W+ygwtG11g4$Gx%B)&tdfq!-H{CX;1T#PVkdfDCZpnd??DU z7*t^x#l}S$PQ)Xf4{}fb0A@o~LuCS`e>gXy4u^$+1-wNVzq)d42MWBeo0=$r9Z@bI zpnZ%fDg+Q^09CyEXcCN!d<6ai$i9(ZP)ZuVBa1@8aKX4J!Cy`JTYxpopWLWRA9uLuV}2ZO*QZ;9uJVAPg6Cdg^N$cyS;X;b8zdqXIlskU*1oHuinZQ&~kt z7Eqb3W>v3uiQE8%3-5^-x1;@+f-4puI=UhczYIKyQsC&ybW8BpvAAq(Y>uHs4P7GD zk?(YyKblDZQHlbvOZkaFCr`}o7p_>21}O!FJaZC?Fe%KeDq`BPf3Yt{8}O!{-USN> zzPmt(%m|H}j^jRlB>qYT#?jm0NRUmk6VBqZE&~NHAQsYpqTC3)!8>q=h1J!BuvX*} zv|UmM-*iFhl7kQzL(ppzR7;PSn*M!J3&U3v07_BwfD^Xik&znzlRZBD`7Y%$y+t6$ zl@ADz4#%g9o|!R5NlP9BQx;y!&v+A;HvLt?La=Xz@YDdE3y?sZ>VOO1)U-590EPo+ z?Ep$L&6;F3d7;vzaWVSVyC7&&NW7{8^Oi{YeP$*as@DZzAE2kx9ZAH3GO9q8Nq|C^ z!|rYc_v;OSdI)e)d>8rhB)yjxXJA0^)pI4OR`LR+fp|6y-UF`Mu-ZblWP@EjGYH5) zP-;IYemD#pp^y8LdwY8*2g3sE1xLZQjtbONJAq4E!0*rzwo2;gN)P-WY!KI<&nB_x zG^%jt4sep}tEO&*c4KK zX#qp>;@?;3-*f{vS4dVCb-sLz1gz24Y$MRkk$J3q4x4ZY`(ztBxe*2%}Tb+*rD-rkRd+nT9=x(k{tmP5&GO{eQ` znKDM;IeWs_CZ?x{!ve!MGfGK4T1_k%c5W<$j3Qgqr5|WTTKwDFRu+Lm?nYEXBmm$Q z%*@Oh^B6w*8IK$Mes5ek)&2sAJ7on^WvLtrCrWx1`GXQZYa42xwMMt$U$(5Ft-UBw&SS9Nw3BgQOcJ@UO%jp3W zELHov=4LA3dc5c4#7pnLBdeY%AUj6cSJ2Qv4*oxU=&_uaSHswX!Xv-CFCVpdp`0n8 z_4zVzBJkRQS3%>V}X9CLiyRb{p=6pAJQDY5|hu&+V+JloW z;5b#C=`%@)WmZM;E8vV5vQxL^K_UpgEr9K`w4$PSb-XYsBSW;b+|Z@{gdN4bgYvv! zk@{dacIS3(G-R+xK4_F1B5oU zLGh>k9c+HT!%Y-)9{}YTHv7L&PBHNGYo37Hq5?1!=D&M~k22N6!^1m(RwWp|@K#Y# zLEQ&RGY_5uI!cff<$O_4hOciP^uP_F?j11IG@{NZsKXnL9BxmswgHlHv4C^2D-^|y zrn>raN^+sT~}Ls z{CgyW;6q1E$&y$+KOf&8mBM&8;ul#=+!YM z)T9y#yZSu=%FW4(!QbvET0&F;w{a~PffCL1-y7mUkskS;`<6p6ukfFbA$w?w)@GKV zlEQ8YE?+Lsbu=)SCsa_kEu z%R?zOfmZ>jmL)t3sQ@W`NG}Ss^!39)?+YESrK;_aS}C433WQv737D)2@sUsh;xHL;y<(sFe}Pe8W2of#8chIKz)pe%Ump+0N2jH z8HtA7wNI)FeI)5oGGPGp-z9+dHxq0uL2y}w`XFX^mfdBAyZ7nf0d;b}2=Ruwm z$tf%%Qczs{-zJAx1g}`fr+@b3B0vBay-Zl-%3tNbI2T}%h)#$qP~w+7JhWqH6KkH7 z;_j@`F)`MMD+^CaYLI%kUK~t5Kgohyg|wAIA_pHR zk7YKj$J}|D6kNd|bwVx^{wZ73dZJt(;-x0I`x@A_Kio%nQPK=3z9!T+qh_K|>5D&n zT+_wjY!ZOadwUg7ZVR;a7?ySvbTY8x=n(dMgxg4uxToFEDt0HqeR9syJg?h3&b z-$*@*i`sRFEn^@V~X$n>`Q>_a;8`Bdy5c?=^Fp2&8?`j~_ zV!C^mMpNp56xHNMWuD-LJ7HgR3gBMCUCqNV0}79@KJm88jrMz$c>*jjK5Bq3Q_$Mi zUjwC*r>ds53l#W^5c2iyEc5^z0m9Nz?=wgVz}e34jqndZco_+-o(yjvR`s`Rx5q$f zpu((;8oWRksLv)QCI&&!#DJ)Nwqa0V+Dr`A-W#Ik1@~rDXoVt^^oG-wl$ZAlW7}z+v2t#FXB`f)nR-s(Hww1G=FsFw%Cj1-8LsJ zL(UYc4L;{{&RwRIAy-rY45*7Mm+d*ZtiL^o_`t@AS0aplR5L)+0Vs+_519< zN84`?{P_Z}u5y3%V9f4c<@9GnjKBz(`|n{gUq8Qy7v@brongPPt*}W;h=edfW&>e%}*5a?e@vu-rj0(2giGQt&fL@5kTRq z^x}mSSTY1IK7MjqnxdPVU{_Zc0Gc2@L4x?p>(@cB?R9i@?Oj|}z_+|_Y%DZ*TLyDb zz@G|69Q-u`QrA~fe(7)~^2mK4q=2!^pUzKUkMkH-BibEXkLinbhO+KF6?2_OaHmBl zCKAE`m8O;!A(&@&5s`E_Ex_aoLI{0po?n0){o?FMF#8j&Ou&!ErddZ3kIQo(NV)(_ zH(Dx_P+H0f?&Ka!=OK(M(_t6y{9DtlFt`PiBT$0|d`%ym0pN;^l*yUgD6XqZnVU2F z=X(*k0k;K-3X0g+JbQNQ4}^K`lQ@u+N5mu~_bX`XX1Db8^jr_t^-;l$L=K{; zxOjYedaZ?DLLv)xTu5jr8YT`-kA=YT8yPgf?=37WysxhxpPh~AS%BJdFj%YP6)4vN?eS&j=+SkYv&6ex@xKoc>pJ-$4!QS?5}QG-PH7zOK7-R)e{K#{7?Ty<>u1E zz5!8I_$^{$Vt=13b$0lI2M-=t53@-~_)aCnm{r{``8qx^5vEkg#LXQIB(A8W6ZA<{ zpg?OOaDDj&;iBeiEl#*X`L`1~`ucaQw#s$NSf!-{3{3(9WuE{2VF{rQSg`5;wP9lY zj4QpSPE-E=b^ax;4Kp@2)3r7z631g@qw=Uj&!n ze}0@~(&+34)|E)m!^4A$mX?*1)9zcdf6J@^6ayf5Xf{PWe*AcT*IUf*kO$7X(%T8E zx@mApy$<#9yL5z$qk{HdSb+jJd|(M|>bd9R&s$!)Mn*#`qj?v(<%-dgOuY&a*bhKV zZrJEd2cvMM6AqBqLG7|#Zuu7`K0Z4uD-!amU zn>V2()wQ(idU5&;9y3fWA6CkI9vaH8u1*9e1(#4|*0u--2+9p-i!XA@l#0OJw4iq&(p0#?~ zv1i6fgocTU=|{`+guWOGkH0^};p9M~L@Vh{2zLw45yD?u^0#noARR+h!#GL*_Z7Yr zw8nsa{iDeZz0x2CBy-`hOG0eSNP{{GFi#EuO&u+*&JWKvKm--+gszE+nyM-`*wrga zREYx_5dlu>=HI!t7`gn;$3jHZ)TdSZXWZ=U;T@N!F)a7vt07B;m?$bX7EWFm6c8Y; zy0IHMF#TJ+zJAZw*YX?sMBkDxEqwk7t+wqyGGZ2MWMtfGg}Ig8&+?JTu4ActP#QRIS??CcxOZxw~ASnVA{b+MN6K_4Uob z11bZ1jW`tRbX&itr!E7|&EE%}Mf(6aQeji^p#ix56}T+&{q=Z*pQm4cee|(nN9AX= z<^J>2fcpWTJbA*RvrpiV{il9$CytNptALl&o0?7qHmojRzb?LE2fw^s3b4}(Oas6| zRB*!%r;dvgC)y~sNHF&wZ$AF`=fki0=B+*Ez>Cj;H_!k}n}??puM`#*GM?VPetrM5 zXKBBF{Q_>?1rBKg>k($5XpV>Wnx9$(lBQHuRe=Vyf&HZ)@4n8MApvX@?yp|cDd6-c z98~Xg1QzYSyJg$9OV_S_yZahAusivrinVX6z<+I!c3_LY&iQfiLEv&#V1Glxxc|5^ zFueoWN8UfXx;nf_ViSaO=xy2OUthC literal 0 HcmV?d00001 diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-54-08.png b/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-54-08.png new file mode 100644 index 0000000000000000000000000000000000000000..79a010d14cb55ac009dc38701f92d4d8a13cf024 GIT binary patch literal 23863 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 literal 0 HcmV?d00001 diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-55-10.png b/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-55-10.png new file mode 100644 index 0000000000000000000000000000000000000000..917cf2446dd8c7ebb1cdbd2123949878f2a20cb5 GIT binary patch literal 41994 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 literal 0 HcmV?d00001 diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-56-40.png b/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-56-40.png new file mode 100644 index 0000000000000000000000000000000000000000..17420060d6918cb30c55f651da78a66ddc9e1090 GIT binary patch literal 53476 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Μ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ℜ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 M;__mJBKjZxAFps(@&Et; literal 0 HcmV?d00001 diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-28 08-12-56.png b/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-28 08-12-56.png new file mode 100644 index 0000000000000000000000000000000000000000..c47bbf3d098fddb8e339280a8d629d8b992f09d2 GIT binary patch literal 32892 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 Date: Thu, 29 Aug 2024 17:11:47 +0200 Subject: [PATCH 022/330] [Add] energy transfer utilities --- .../ess/spectroscopy/indirect/conservation.py | 8 +- .../src/ess/spectroscopy/indirect/ki.py | 76 ++++++++++++++++--- .../src/ess/spectroscopy/types.py | 5 ++ .../src/ess/spectroscopy/utils.py | 19 +++++ 4 files changed, 96 insertions(+), 12 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index ad4446aea..bf861683c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -27,8 +27,12 @@ def lab_momentum_z(q: LabMomentumTransfer) -> LabMomentumTransferZ: return dot(Z, q) -def energy(ei: IncidentEnergy, ef: FinalEnergy) -> EnergyTransfer: - return ei - ef +# def energy(ei: IncidentEnergy, ef: FinalEnergy) -> EnergyTransfer: +# return ei - ef + +def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: + from scipp.constants import hbar, neutron_mass + return hbar * hbar * (ki * ki - kf * kf) / 2 / neutron_mass diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 28612baa2..4424724bf 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -21,6 +21,7 @@ def guess_source_name(file: NeXusFileName) -> SourceName: instrument = data['entry/instrument'] return determine_name_with_type(instrument, name, [NXsource, NXmoderator], 'source') + def guess_sample_name(file: NeXusFileName) -> SampleName: from scippnexus import NXsample, File with File(file) as data: @@ -28,18 +29,66 @@ def guess_sample_name(file: NeXusFileName) -> SampleName: return determine_name_with_type(instrument, name, [NXsample], 'sample') +def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: + """Guess the names of the components which define the focus distance of a Primary Spectrometer + + Note + ---- + The order of components in the NeXus file must be consistent with the order of components along the beamline. + This assumes that only NXdisk_chopper are used to define a focus distance, and that the first chopper + or choppers along the beamline, within a fixed small distance, can define the focus distance. + The component type, primacy, and allowed distance range could be user configurable inputs + """ + from scipp import scalar + from scippnexus import NXdisk_chopper, File, compute_positions + from ..utils import norm + allowance = scalar(0.5, unit='m') + + with File(file) as data: + instrument = data['entry/instrument'] + choppers = {k: compute_positions(v[...])['position'] for k, v in instrument[NXdisk_chopper].items()} + + names = list(choppers.keys()) + focus_names = [FocusComponentName(names[0])] + last = choppers[names[0]]['position'] + distance = 0 * allowance + for name in names[1:]: + x = choppers[name]['position'] + distance += norm(x - last) + last = x + if distance <= allowance: + focus_names.append(FocusComponentName(name)) + else: + break + return FocusComponentNames(focus_names) + + def source_position(file: NeXusFileName, source: SourceName) -> SourcePosition: from scippnexus import compute_positions, File with File(file) as data: - source = data['entry/instrument'][source][...] - return compute_positions(source)['position'] + return compute_positions(data['entry/instrument'][source][...])['position'] def sample_position(file: NeXusFileName, sample: SampleName) -> SamplePosition: from scippnexus import compute_positions, File with File(file) as data: - sample = data['entry/instrument'][sample][...] - return compute_positions(sample)['position'] + return compute_positions(data['entry/instrument'][sample][...])['position'] + + +def focus_distance(file: NeXusFileName, origin: SourcePosition ,names: FocusComponentNames) -> PrimaryFocusDistance: + from scippnexus import compute_positions, File + from ..utils import norm + pos = 0 * origin + with File(file) as data: + for name in names: + pos += compute_positions(data['entry/instrument'][name][...])['position'] + pos /= len(names) + return norm(pos - origin) + + +def focus_time(primary: PrimarySpectrometerObject, distance: PrimaryFocusDistance) -> PrimaryFocusTime: + from choppera.nexus import primary_focus_time + return primary_focus_time(primary, distance) def primary_path_length(file: NeXusFileName, source: SourcePosition, sample: SamplePosition) -> SourceSamplePathLength: @@ -85,9 +134,13 @@ def unwrap_sample_time(times: SampleFrameTime, frequency: SourceFrequency, least return choppera_unwrap(times, frequency, least) -def ki_wavenumber(length: SourceSamplePathLength, time: SampleTime) -> IncidentWavenumber: +def ki_wavenumber(length: SourceSamplePathLength, time: SampleTime, + focus_distance: PrimaryFocusDistance, focus_time: PrimaryFocusTime) -> IncidentWavenumber: from scipp.constants import neutron_mass, hbar - velocity = length / time + from ..utils import in_same_unit + # when different wavelengths were likely to have left the source could be wavelength dependent + tof = time - in_same_unit(focus_time, to=time) + velocity = (length - focus_distance) / tof k = neutron_mass * velocity / hbar return k.to(unit='1/angstrom') @@ -104,12 +157,15 @@ def ei(ki: IncidentWavenumber) -> IncidentEnergy: providers = [ - primary_pivot_time, - primary_path_length, sample_position, source_position, guess_sample_name, guess_source_name, - unwrap_sample_time, + primary_path_length, primary_spectrometer, -] \ No newline at end of file + primary_pivot_time, + unwrap_sample_time, + ki_wavenumber, + ki_wavevector, + ei, +] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 7e3bb6925..93b7a524b 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -46,6 +46,11 @@ def variable_type(named: str) -> Type[Variable]: PrimarySpectrometerObject = NewType('PrimarySpectrometerObject', PrimarySpectrometer) +FocusComponentName = NewType('FocusComponentName', str) +FocusComponentNames = NewType('FocusComponentNames', list[FocusComponentName]) +PrimaryFocusDistance = variable_type('PrimaryFocusDistance') +PrimaryFocusTime = variable_type('PrimaryFocusTime') + LabMomentumTransfer = variable_type('MonmentumTransfer') LabMomentumTransferX = variable_type("LabMomentumTransferX") LabMomentumTransferY = variable_type("LabMomentumTransferY") diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py index 02ef4f9e4..fbf8f3483 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -6,3 +6,22 @@ def norm(vector: Variable) -> Variable: assert vector.dtype == DType.vector3 # "Vector operations require scipp.DType.vector3 elements!" return sqrt(dot(vector, vector)) + +def in_same_unit(b: Variable, to: Variable | None = None) -> Variable: + def unit(x): + if x.bins is not None: + return x.bins.unit + return x.unit + + if to is None: + raise ValueError("The to unit-full object must be specified") + + a_unit = unit(to) + b_unit = unit(b) + if a_unit is None and b_unit is None: + return b + if a_unit is None or b_unit is None: + raise ValueError(f"Can not find the units to use for {b} from {to}") + if a_unit != b_unit: + b = b.to(unit=a_unit) + return b From 3ba9b11a5d97d28abc5342350d8d7fc00a0b8da9 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Fri, 30 Aug 2024 16:56:15 +0200 Subject: [PATCH 023/330] [Add] monitor normalization functions, workflow from development notebooks --- .../src/ess/spectroscopy/indirect/ki.py | 46 ++-- .../spectroscopy/indirect/normalisation.py | 72 ++++++ .../src/ess/spectroscopy/indirect/workflow.py | 207 ++++++++++++++++++ .../src/ess/spectroscopy/types.py | 28 ++- 4 files changed, 332 insertions(+), 21 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 4424724bf..379b61330 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -134,24 +134,34 @@ def unwrap_sample_time(times: SampleFrameTime, frequency: SourceFrequency, least return choppera_unwrap(times, frequency, least) -def ki_wavenumber(length: SourceSamplePathLength, time: SampleTime, - focus_distance: PrimaryFocusDistance, focus_time: PrimaryFocusTime) -> IncidentWavenumber: - from scipp.constants import neutron_mass, hbar +def incident_slowness(length: SourceSamplePathLength, time: SampleTime, + distance: PrimaryFocusDistance, focus: PrimaryFocusTime) -> IncidentSlowness: from ..utils import in_same_unit - # when different wavelengths were likely to have left the source could be wavelength dependent - tof = time - in_same_unit(focus_time, to=time) - velocity = (length - focus_distance) / tof - k = neutron_mass * velocity / hbar - return k.to(unit='1/angstrom') + tof = time - in_same_unit(focus, to=time) + slowness = tof / (length - distance) # slowness _is_ inverse velocity + return slowness + + +def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: + from scipp.constants import neutron_mass, Planck + return (slowness * Planck / neutron_mass).to(unit='angstrom') + + +def incident_wavenumber(slowness: IncidentSlowness) -> IncidentWavenumber: + from scipp.constants import neutron_mass, hbar + return (neutron_mass / hbar / slowness).to(unit='1/angstrom') -def ki_wavevector(ki_magnitude: IncidentWavenumber) -> IncidentWavevector: +def incident_direction() -> IncidentDirection: from scipp import vector - z = vector([0, 0, 1.]) - return ki_magnitude * z + return vector([0, 0, 1.]) + + +def incident_wavevector(ki_magnitude: IncidentWavenumber, direction: IncidentDirection) -> IncidentWavevector: + return ki_magnitude * direction -def ei(ki: IncidentWavenumber) -> IncidentEnergy: +def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: from scipp.constants import hbar, neutron_mass return ((hbar * hbar / 2 / neutron_mass) * ki * ki).to(unit='meV') @@ -161,11 +171,17 @@ def ei(ki: IncidentWavenumber) -> IncidentEnergy: source_position, guess_sample_name, guess_source_name, + guess_focus_component_names, + focus_distance, + focus_time, primary_path_length, primary_spectrometer, primary_pivot_time, unwrap_sample_time, - ki_wavenumber, - ki_wavevector, - ei, + incident_direction, + incident_slowness, + incident_wavelength, + incident_wavenumber, + incident_wavevector, + incident_energy, ] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py new file mode 100644 index 000000000..1afc3342d --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -0,0 +1,72 @@ +from ess.spectroscopy.types import * + + +def incident_monitor_normalization(slowness: IncidentSlowness, monitor: SlownessMonitor) -> MonitorNormalisation: + """For the incident slowness of each event, return the corresponding monitor intensity""" + from scipp import lookup + coords = list(monitor.coords) + if len(coords) != 1: + raise ValueError(f'Monitor expected to have exactly 1 coordinate, has {coords}') + return lookup(monitor, dim=coords[0])[slowness] + + +def monitor_pivot_time(primary: PrimarySpectrometerObject, length: SourceMonitorPathLength) -> SourceMonitorFlightTime: + from choppera.nexus import primary_pivot_time_at + return primary_pivot_time_at(primary, length) + + +def monitor_wall_time(monitor: FrameTimeMonitor, frequency: SourceFrequency, least: SourceMonitorFlightTime) -> WallTimeMonitor: + """Convert the independent 'frame_time' coordinate of a histogram DataArray to the equivalent unwrapped 'wall_time' + + Parameters + ---------- + monitor: A histogram beam monitor which has with recorded 'frame time' relative to the most-recent source pulse + frequency: The source repetition frequency + least: The minimum wall time between source pulse and arrival at the monitor position + + Returns + ------- + The same intensities with independent axis converted to the likely time since neutron-producing proton pulse + """ + from choppera.nexus import unwrap + coords = list(monitor.coords) + if len(coords) != 1: + raise ValueError(f'Monitor expected to have exactly 1 coordinate, has {coords}') + frame = coords[0] + wall = 'wall_time' + names = {frame: wall} + return DataArray(monitor.data.rename(names), coords={wall: unwrap(monitor.coords[frame], frequency, least).rename(names)}) + + +def monitor_slowness(monitor: WallTimeMonitor, length: SourceMonitorPathLength, + distance: PrimaryFocusDistance, focus: PrimaryFocusTime) -> SlownessMonitor: + """Convert the independent 'wall_time' coordinate of a histogram DataArray to the equivalent slowness + + Parameters + ---------- + monitor: A histogram beam monitor which has been converted from recorded 'frame time' to time since producing proton pulse + length: The path length from the source to the monitor + distance: The distance from the source to the time-of-flight defining (chopper) position + focus: The (mean) time from proton pulse to when all neutrons passed the tof defining point + + Returns + ------- + The same intensities with independent axis converted to the inverse velocity of the neutrons, which scales + linearly with wall time + """ + coords = list(monitor.coords) + if len(coords) != 1: + raise ValueError(f'Monitor expected to have exactly 1 coordinate, has {coords}') + wall = coords[0] + slow = 'slowness' + names = {wall: slow} + slowness = ((monitor.coords[wall] - focus) / (length - distance)).rename(names).to(unit='s/m') + return DataArray(monitor.data.rename(names), coords={slow: slowness}) + + +providers = [ + incident_monitor_normalization, + monitor_pivot_time, + monitor_wall_time, + monitor_slowness, +] \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py new file mode 100644 index 000000000..36f6c6092 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -0,0 +1,207 @@ +from __future__ import annotations + +from .ki import incident_energy +from ..types import * + + +def load_all(group, obj_type): + return {name: obj[...] for name, obj in group[obj_type].items()} + + +def ess_source_frequency(): + from scipp import scalar + return scalar(14.0, unit='Hz') + + +def ess_source_period(): + return (1 / ess_source_frequency()).to(unit='ns') + + +def ess_source_delay(): + from scipp import array + return array(values=[0, 0.], dims=['wavelength'], unit='sec', dtype='float64') + + +def ess_source_duration(): + from scipp import scalar + return scalar(3.0, unit='msec').to(unit='sec') + + +def ess_source_velocities(): + from scipp import array + return array(values=[100, 1e4], dims=['wavelength'], unit='m/s') # ~53 ueV to 530 meV + + +def convert_simulated_time_to_frame_time(data): + graph = {'frame_time': lambda event_time_offset: event_time_offset % ess_source_period()} + return data.transform_coords('frame_time', graph=graph, rename_dims=False, keep_intermediate=False) + + +def analyzer_per_detector(analyzers, triplets): + """Find the right analyzer name for each detector""" + # TODO Update this function if the NeXus group naming changes, or components are added/removed. + def correct_index(d, a): + detector_index = int(d.split('_', 1)[0]) + analyzer_index = detector_index - 2 + return a.startswith(str(analyzer_index)) + + return {d: [x for x in analyzers.keys() if correct_index(d, x)][0] for d in list(triplets.keys())} + + +def detector_per_pixel(triplets): + """Find the right detector name for every pixel index""" + return {i: name for name, det in triplets.items() for i in det['data'].coords['detector_number'].values.flatten()} + + +def combine_analyzers(analyzers, triplets): + """Combine needed analyzer properties into a single array, duplicating information, to have per-pixel data""" + from scippnexus import compute_positions + from scipp import Dataset, concat, array + def analyzer_extract(obj): + obj = compute_positions(obj, store_transform='transform') + return Dataset(data={k: obj[k] for k in ('position', 'transform', 'd_spacing')}) + + extracted = {k: analyzer_extract(v) for k, v in analyzers.items()} + d2a = analyzer_per_detector(analyzers, triplets) + p2d = detector_per_pixel(triplets) + + p2a = {k: extracted[d2a[v]] for k, v in p2d.items()} + pixels = sorted(p2a) + data = concat([p2a[p] for p in pixels], dim='event_id') + data['event_id'] = array(values=pixels, dims=['event_id'], unit=None) + return data + +def combine_detectors(triplets): + from scipp import Dataset, concat + def extract(obj): + pixels = obj['data'].coords['detector_number'] + midpoints = obj['data'].coords['position'] + return Dataset(data={'event_id': pixels, 'position': midpoints}) + + data = concat([extract(v) for v in triplets.values()], dim='arm') + data = Dataset({k: v.flatten(to='event_id') for k, v in data.items()}) + return data + + +def find_sample_detector_flight_time(sample, analyzers, detectors): + from sciline import Pipeline + import numpy as np + from .kf import providers as kf_providers + params = { + SamplePosition: sample['position'], + AnalyzerPosition: analyzers['position'].data, + DetectorPosition: detectors['position'].data, + AnalyzerOrientation: analyzers['transform'].data, + ReciprocalLatticeSpacing: 2 * np.pi / analyzers['d_spacing'].data, + } + return params, Pipeline(kf_providers, params=params).get(SampleDetectorFlightTime).compute().to(unit='ms') + + +def get_triplet_events(triplets): + from scipp import concat, sort + events = concat([x['data'] for x in triplets.values()], dim='arm').flatten(to='event_id') + events = sort(events, events.coords['detector_number']) + return events + + +def get_sample_events(triplet_events, sample_detector_flight_times): + events = triplet_events.copy() + for coord in ('position', 'x_pixel_offset', 'y_pixel_offset'): + del events.coords[coord] + events.bins.coords['frame_time'] -= sample_detector_flight_times.to(unit='ns') + events.bins.coords['frame_time'] %= ess_source_period() + return events + + +def get_unwrapped_events(filename, source_name, sample_name, sample_events, focus_components): + from sciline import Pipeline + from .ki import providers as ki_providers + params = { + NeXusFileName: filename, + SampleName: sample_name, + SourceName: source_name, + SourceDelay: ess_source_delay(), + SourceDuration: ess_source_duration(), + SourceFrequency: ess_source_frequency(), + SampleFrameTime: sample_events.data.bins.coords['frame_time'], + FocusComponentNames: focus_components + } + pipeline = Pipeline(ki_providers, params=params) + primary = pipeline.get(PrimarySpectrometerObject).compute() + + events = sample_events.copy() + events.bins.coords['frame_time'] = primary.get(SampleTime).compute() + return params, events, primary + + +def get_normalization_monitor(monitors, monitor_component): + # This is very specialized to how the simulated scans are done, it needs to be generalized + normalization = monitors[monitor_component]['data'].sum(dim='time') + # rescale the frame_time axis. Why does it need to be done this way? + return normalization.transform_coords(['frame_time'], graph={'frame_time': lambda t: t.to(unit='nanosecond')}) + + +def get_energy_axes(ki_params, kf_params): + from sciline import Pipeline + from .conservation import providers + params = {} + params.update(ki_params) + params.update(kf_params) + pipeline = Pipeline(providers, params=params) + ei = pipeline.get(IncidentEnergy).compute() + en = pipeline.get(EnergyTransfer).compute() + ef = pipeline.get(FinalEnergy).compute() + return ei, en, ef + +def bifrost(filename: NeXusFileName, + source_component: str | None = None, + sample_component: str | None = None, + focus_components: list[str] | None = None, + monitor_component: str | None = None, + is_simulated: bool=False): + import scippnexus as snx + if source_component is None and is_simulated: + source_component = '001_ESS_source' + if sample_component is None and is_simulated: + sample_component = '114_sample_stack' + if focus_components is None and is_simulated: + focus_components = [FocusComponentName('005_PulseShapingChopper'), FocusComponentName('006_PulseShapingChopper2')] + if monitor_component is None and is_simulated: + monitor_component = '110_frame_3' + + + with snx.File(filename) as data: + group = data['entry/instrument'] + if source_component not in group: + raise ValueError(f'Missing source component {source_component} for path-length calculations') + if sample_component not in group: + raise ValueError(f'Missing sample component {sample_component} for origin identification') + sample = snx.compute_positions(group[sample_component][...], store_transform='transform') + triplets = load_all(group, snx.NXdetector) + analyzers = load_all(group, snx.NXcrystal) + choppers = load_all(group, snx.NXdisk_chopper) + monitors = load_all(group, snx.NXmonitor) + + + if is_simulated: + for name in triplets: + triplets[name]['data'] = convert_simulated_time_to_frame_time(triplets[name]['data']) + + for name in triplets: + triplets[name] = snx.compute_positions(triplets[name], store_transform='transform') + + analyzers = combine_analyzers(analyzers, triplets) + detectors = combine_detectors(triplets) + + kf_params, sample_detector_flight_time = find_sample_detector_flight_time(sample, analyzers, detectors) + + triplet_events = get_triplet_events(triplets) + sample_events = get_sample_events(triplet_events, sample_detector_flight_time) + + ki_params, unwrapped_events, primary = get_unwrapped_events(filename, source_component, sample_component, sample_events, focus_components) + + norm_monitor = get_normalization_monitor(monitors, monitor_component) + + ei, en, ef = get_energy_axes(ki_params, kf_params) + + return triplet_events, sample_events, unwrapped_events, norm_monitor, ei, en, ef \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 93b7a524b..45381c2f4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,10 +1,14 @@ from typing import Type, NewType -from scipp import Variable +from scipp import Variable, DataArray from choppera.primary import PrimarySpectrometer +def make_scipp_named_typer(scipp_type): + def typer(named: str) -> Type[scipp_type]: + return NewType(named, scipp_type) + return typer -def variable_type(named: str) -> Type[Variable]: - return NewType(named, Variable) +variable_type = make_scipp_named_typer(Variable) +data_array_type = make_scipp_named_typer(DataArray) NeXusFileName = NewType('NeXusFileName', str) @@ -19,11 +23,15 @@ def variable_type(named: str) -> Type[Variable]: SampleAnalyzerDirection = variable_type('SampleAnalyzerDirection') ReciprocalLatticeVectorAbsolute = variable_type('ReciprocalLatticeVectorAbsolute') ReciprocalLatticeSpacing = variable_type('ReciprocalLatticeSpacing') -IncidentWavevectorDirection = variable_type('IncidentWavevectorDirection') +IncidentDirection = variable_type('IncidentDirection') +IncidentSlowness = variable_type('IncidentSlowness') +IncidentWavelength = variable_type('IncidentWavelength') IncidentWavenumber = variable_type('IncidentWavenumber') IncidentWavevector = variable_type('IncidentWavevector') IncidentEnergy = variable_type('IncidentEnergy') -FinalWavevectorDirection = variable_type('FinalWavevectorDirection') +FinalDirection = variable_type('FinalDirection') +FinalSlowness = variable_type('FinalSlowness') +FinalWavelength = variable_type('FinalWavelength') FinalWavenumber = variable_type('FinalWavenumber') FinalWavevector = variable_type('FinalWavevector') FinalEnergy = variable_type('FinalEnergy') @@ -51,7 +59,15 @@ def variable_type(named: str) -> Type[Variable]: PrimaryFocusDistance = variable_type('PrimaryFocusDistance') PrimaryFocusTime = variable_type('PrimaryFocusTime') -LabMomentumTransfer = variable_type('MonmentumTransfer') +SourceMonitorPathLength = variable_type('SourceMonitorPathLength') +SourceMonitorFlightTime = variable_type('SourceMonitorFlightTime') +FrameTimeMonitor = data_array_type('FrameTimeMonitor') +WallTimeMonitor = data_array_type('WallTimeMonitor') +SlownessMonitor = data_array_type('SlownessMonitor') + +MonitorNormalisation = variable_type('MonitorNormalisation') + +LabMomentumTransfer = variable_type('LabMomentumTransfer') LabMomentumTransferX = variable_type("LabMomentumTransferX") LabMomentumTransferY = variable_type("LabMomentumTransferY") LabMomentumTransferZ = variable_type("LabMomentumTransferZ") From 9f954653012d43033619a80eba1965ab0c9d75d2 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 2 Sep 2024 09:51:18 +0200 Subject: [PATCH 024/330] [Fix] missing workflow parameter, [Refactor] rename functions --- .../src/ess/spectroscopy/indirect/kf.py | 12 ++++++------ .../src/ess/spectroscopy/indirect/workflow.py | 12 ++++++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 6ba22b4c1..77bbbb7dc 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -154,7 +154,7 @@ def reciprocal_lattice_spacing(tau_vector: ReciprocalLatticeVectorAbsolute): return norm(tau_vector) -def kf_wavenumber( +def final_wavenumber( sample_analyzer_vec: SampleAnalyzerVector, analyzer_detector_vec: AnalyzerDetectorVector, tau: ReciprocalLatticeSpacing @@ -174,12 +174,12 @@ def kf_wavenumber( return tau / sqrt(2 - 2 * cos2theta) -def ef(kf: FinalWavenumber) -> FinalEnergy: +def final_energy(kf: FinalWavenumber) -> FinalEnergy: from scipp.constants import hbar, neutron_mass return ((hbar * hbar / 2 / neutron_mass) * kf * kf).to(unit='meV') -def kf_vector( +def final_wavevector( kf_direction: SampleAnalyzerDirection, kf_magnitude: FinalWavenumber ) -> FinalWavevector: @@ -214,10 +214,10 @@ def sample_frame_time( sample_analyzer_vector, analyzer_detector_vector, kf_hat, - kf_wavenumber, - kf_vector, + final_wavenumber, + final_wavevector, secondary_flight_path_length, secondary_flight_time, sample_frame_time, - ef + final_energy ] \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 36f6c6092..fbb53f66d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -1,6 +1,4 @@ from __future__ import annotations - -from .ki import incident_energy from ..types import * @@ -123,6 +121,7 @@ def get_unwrapped_events(filename, source_name, sample_name, sample_events, focu SourceDelay: ess_source_delay(), SourceDuration: ess_source_duration(), SourceFrequency: ess_source_frequency(), + SourceVelocities: ess_source_velocities(), SampleFrameTime: sample_events.data.bins.coords['frame_time'], FocusComponentNames: focus_components } @@ -130,7 +129,7 @@ def get_unwrapped_events(filename, source_name, sample_name, sample_events, focu primary = pipeline.get(PrimarySpectrometerObject).compute() events = sample_events.copy() - events.bins.coords['frame_time'] = primary.get(SampleTime).compute() + events.bins.coords['frame_time'] = pipeline.get(SampleTime).compute() return params, events, primary @@ -204,4 +203,9 @@ def bifrost(filename: NeXusFileName, ei, en, ef = get_energy_axes(ki_params, kf_params) - return triplet_events, sample_events, unwrapped_events, norm_monitor, ei, en, ef \ No newline at end of file + energy_events = sample_events.copy() + energy_events.bins.coords['energy_transfer'] = en.to(unit='meV') + energy_events.bins.coords['incident_energy'] = ei + energy_events.coords['final_energy'] = ef + + return triplet_events, sample_events, unwrapped_events, norm_monitor, energy_events \ No newline at end of file From a5a2fab03d0f5e84c6cbf0f00aa1784b0ad05e47 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 2 Sep 2024 11:19:53 +0200 Subject: [PATCH 025/330] [Fix] combined detectors must be sorted by pixel number --- .../src/ess/spectroscopy/indirect/ki.py | 10 +++++++--- .../src/ess/spectroscopy/indirect/workflow.py | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 379b61330..f89a3f2b6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -1,4 +1,6 @@ """Utilities for the primary spectrometer of an indirect geometry time-of-flight spectrometer""" +from __future__ import annotations + #TODO move elsewhere since possibly (probably) too specific to BIFROST. from ess.spectroscopy.types import * @@ -7,7 +9,7 @@ def determine_name_with_type(instrument: Group, name: str | None, options: list, type_name: str) -> str: if name is not None and name in instrument: return name - foud = {x for x in instrument if type_name in x.lower()} + found = {x for x in instrument if type_name in x.lower()} for option in options: found.update(set(instrument[option])) if len(found) != 1: @@ -19,14 +21,16 @@ def guess_source_name(file: NeXusFileName) -> SourceName: from scippnexus import NXsource, NXmoderator, File with File(file) as data: instrument = data['entry/instrument'] - return determine_name_with_type(instrument, name, [NXsource, NXmoderator], 'source') + name = determine_name_with_type(instrument, None, [NXsource, NXmoderator], 'source') + return SourceName(name) def guess_sample_name(file: NeXusFileName) -> SampleName: from scippnexus import NXsample, File with File(file) as data: instrument = data['entry/instrument'] - return determine_name_with_type(instrument, name, [NXsample], 'sample') + name = determine_name_with_type(instrument, None, [NXsample], 'sample') + return SampleName(name) def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index fbb53f66d..97f283ad3 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -1,4 +1,6 @@ from __future__ import annotations + +from .conservation import energy from ..types import * @@ -70,7 +72,7 @@ def analyzer_extract(obj): return data def combine_detectors(triplets): - from scipp import Dataset, concat + from scipp import Dataset, concat, sort def extract(obj): pixels = obj['data'].coords['detector_number'] midpoints = obj['data'].coords['position'] @@ -78,7 +80,7 @@ def extract(obj): data = concat([extract(v) for v in triplets.values()], dim='arm') data = Dataset({k: v.flatten(to='event_id') for k, v in data.items()}) - return data + return sort(data, data['event_id'].data) def find_sample_detector_flight_time(sample, analyzers, detectors): @@ -208,4 +210,14 @@ def bifrost(filename: NeXusFileName, energy_events.bins.coords['incident_energy'] = ei energy_events.coords['final_energy'] = ef - return triplet_events, sample_events, unwrapped_events, norm_monitor, energy_events \ No newline at end of file + #return triplet_events, sample_events, unwrapped_events, norm_monitor, energy_events, sample_detector_flight_time, analyzers, detectors + return { + 'triplet_events': triplet_events, + 'sample_events': sample_events, + 'unwrapped_events': unwrapped_events, + 'norm_monitor': norm_monitor, + 'energy_events': energy_events, + 'sample_detector_flight_time': sample_detector_flight_time, + 'analyzers': analyzers, + 'detectors': detectors, + } \ No newline at end of file From 7e3261d4cb1f6362a381101d173114a47cda8f3c Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Sat, 14 Sep 2024 21:30:31 +0200 Subject: [PATCH 026/330] [Add] functionality for separating (a3, a4) settings --- .../src/ess/spectroscopy/indirect/__init__.py | 6 + .../src/ess/spectroscopy/indirect/kf.py | 12 +- .../src/ess/spectroscopy/indirect/workflow.py | 293 +++++++++++++++--- .../src/ess/spectroscopy/types.py | 16 +- .../src/ess/spectroscopy/utils.py | 80 ++++- 5 files changed, 364 insertions(+), 43 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py index e69de29bb..50b94a6a8 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py @@ -0,0 +1,6 @@ +from .workflow import bifrost, bifrost_single + +__all__ = [ + "bifrost", + "bifrost_single", +] \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 77bbbb7dc..941cdf8e5 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -23,7 +23,7 @@ def sample_analyzer_vector( There is expected to be multiple detector element positions per analyzer which can be represented as an additional dimension compared to the analyzer shapes. """ - from scipp import concat, vector, dot, sqrt, DType + from scipp import vector, dot from ess.spectroscopy.utils import norm # Scipp does not distinguish between coordinates and directions, so we need to do some extra legwork @@ -52,6 +52,13 @@ def sample_analyzer_vector( return sample_analyzer_center_vector + sa_out_of_plane * yhat +def detector_geometric_a4(vec: SampleAnalyzerVector) -> DetectorGeometricA4: + from scipp import vector, dot, atan2 + lab_x = vector([1, 0, 0]) # perpendicular to the incident beam, in the horizontal plane + lab_z = vector([0, 0, 1]) # along the incident beam direction + return atan2(y=dot(lab_x, vec), x=dot(lab_z, vec)).to(unit='deg') + + def fixed_tau_hat_sample_analyzer_vector( sample_position: SamplePosition, analyzer_position: AnalyzerPosition, @@ -219,5 +226,6 @@ def sample_frame_time( secondary_flight_path_length, secondary_flight_time, sample_frame_time, - final_energy + final_energy, + detector_geometric_a4, ] \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 97f283ad3..13fca1d7d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -1,6 +1,18 @@ from __future__ import annotations -from .conservation import energy +from loguru import logger +import sys + +logger_format = ( + "{time:YYYY-MM-DD HH:mm:ss.SSS} | " + "{level: <8} | " + "{name}:{function}:{line} | " + "{elapsed} {message}" +) +logger.configure(extra={"ip": "", "user": ""}) # Default values +logger.remove() +logger.add(sys.stderr, format=logger_format) + from ..types import * @@ -8,6 +20,10 @@ def load_all(group, obj_type): return {name: obj[...] for name, obj in group[obj_type].items()} +def load_named(group, obj_type, names): + return {name: obj[...] for name, obj in group[obj_type].items() if name in names} + + def ess_source_frequency(): from scipp import scalar return scalar(14.0, unit='Hz') @@ -83,14 +99,14 @@ def extract(obj): return sort(data, data['event_id'].data) -def find_sample_detector_flight_time(sample, analyzers, detectors): +def find_sample_detector_flight_time(sample, analyzers, detector_positions): from sciline import Pipeline import numpy as np from .kf import providers as kf_providers params = { SamplePosition: sample['position'], AnalyzerPosition: analyzers['position'].data, - DetectorPosition: detectors['position'].data, + DetectorPosition: detector_positions, # detectors['position'].data, AnalyzerOrientation: analyzers['transform'].data, ReciprocalLatticeSpacing: 2 * np.pi / analyzers['d_spacing'].data, } @@ -135,9 +151,11 @@ def get_unwrapped_events(filename, source_name, sample_name, sample_events, focu return params, events, primary -def get_normalization_monitor(monitors, monitor_component): - # This is very specialized to how the simulated scans are done, it needs to be generalized - normalization = monitors[monitor_component]['data'].sum(dim='time') +def get_normalization_monitor(monitors, monitor_component, collapse: bool = False): + normalization = monitors[monitor_component]['data'] + if collapse: + # This is very specialized to how the simulated scans are done, it needs to be generalized + normalization = normalization.sum(dim='time') # rescale the frame_time axis. Why does it need to be done this way? return normalization.transform_coords(['frame_time'], graph={'frame_time': lambda t: t.to(unit='nanosecond')}) @@ -149,28 +167,109 @@ def get_energy_axes(ki_params, kf_params): params.update(ki_params) params.update(kf_params) pipeline = Pipeline(providers, params=params) + pipeline[IncidentWavenumber] = pipeline.get(IncidentWavenumber).compute() + pipeline[FinalWavenumber] = pipeline.get(FinalWavenumber).compute() ei = pipeline.get(IncidentEnergy).compute() en = pipeline.get(EnergyTransfer).compute() ef = pipeline.get(FinalEnergy).compute() return ei, en, ef -def bifrost(filename: NeXusFileName, - source_component: str | None = None, - sample_component: str | None = None, - focus_components: list[str] | None = None, - monitor_component: str | None = None, - is_simulated: bool=False): - import scippnexus as snx - if source_component is None and is_simulated: - source_component = '001_ESS_source' - if sample_component is None and is_simulated: - sample_component = '114_sample_stack' - if focus_components is None and is_simulated: - focus_components = [FocusComponentName('005_PulseShapingChopper'), FocusComponentName('006_PulseShapingChopper2')] - if monitor_component is None and is_simulated: - monitor_component = '110_frame_3' + +def add_momentum_axes(ki_params, kf_params, events, a3: Variable): + from sciline import Pipeline + from .conservation import providers + if a3.size != 1: + raise ValueError(f'Expected a3 to have 1-entry, not {a3.size}') + + params = {} + # First we must add the lab momentum vector, since it is not a3 dependent + params.update(ki_params) + params.update(kf_params) + params[SampleTableAngle] = a3 + + pipeline = Pipeline(providers, params=params) + pipeline[LabMomentumTransfer] = pipeline.get(LabMomentumTransfer).compute() + + events.bins.coords['lab_momentum_x'] = pipeline.get(LabMomentumTransferX).compute() + # events.bins.coords['lab_momentum_y'] = pipeline.get(LabMomentumTransferY).compute() + events.bins.coords['lab_momentum_z'] = pipeline.get(LabMomentumTransferZ).compute() + + pipeline[TableMomentumTransfer] = pipeline.get(TableMomentumTransfer).compute() + events.bins.coords['table_momentum_x'] = pipeline.get(TableMomentumTransferX).compute().transpose(events.dims) + # events.bins.coords['table_momentum_y'] = pipeline.get(TableMomentumTransferY).compute().transpose(events.dims) + events.bins.coords['table_momentum_z'] = pipeline.get(TableMomentumTransferZ).compute().transpose(events.dims) + return events +def split(triplets, analyzers, monitors, logs, a3_name: str | None = None, a4_name: str | None = None): + """Use the (a3, a4) logged value pairs to split triplet, analyzer, and monitor data into single-setting sets + + Parameters + ---------- + triplets: DataArray + The triplet positions _should_ change with a4 (if simulated, this is certainly not implemented correctly yet) + The event data they contain depends on (a3, a4) [plus any other time-dependent parameter] so must be split. + analyzers: Dataset? + The analyzer position _should_ change with a4 (if simulated, this is certainly not implemented correctly yet) + monitors: DataArray + The histogram (simulated, or real current beam monitor) or event (real fission monitor, etc.?) data is + time-dependent and used to normalize the detector data. It must therefore be split into (a3, a4) sets + logs: DataGroup + Entries built from NXlogs in the real or simulated instrument + a3_name: str + The name of the sample table angle log entry in `logs` -- 'a3' for simulated data + a4_name: str + The name of the detector tank angle log entry in `logs` -- 'a4' for simulated data + + Returns + ------- + A list[[triplet, analyzer, monitor]] of individual (a3, a4) setting(s) + """ + from scipp import lookup + from ..utils import is_in_coords, split_setting + if a3_name is None: + a3_name = 'a3' + if a4_name is None: + a4_name = 'a4' + + if a3_name not in logs or a4_name not in logs: + logger.warning('Missing a3 or a4, so split performed') + return [[triplets, analyzers, monitors]] + + a3 = lookup(logs[a3_name]['value'], 'time') + a4 = lookup(logs[a4_name]['value'], 'time') + + event_graph = {'a3': lambda event_time_zero: a3[event_time_zero], 'a4': lambda event_time_zero: a4[event_time_zero]} + histogram_graph = {'a3': lambda time: a3[time], 'a4': lambda time: a4[time]} + + def do_split(x, time_name): + graph = event_graph if 'event_time_zero' == time_name else histogram_graph + if is_in_coords(x, time_name): + x = x.transform_coords(('a3', 'a4'), graph=graph) + if x.bins is not None: + x = x.group('a3', 'a4') + return x + + vals = [do_split(x, t) for x, t in ((triplets, 'event_time_zero'), (analyzers, 'time'), (monitors, 'time'))] + + # FIXME this only works because v.sizes['a4'] is always 1 at the moment + vals = [v.flatten(['a3', 'a4'], to='time') if 'a3' in v.dims and 'a4' in v.dims else v for v in vals] + + n_time = [v.sizes['time'] for v in vals if 'time' in v.dims] + if len(n_time): + assert all(n == n_time[0] for n in n_time) + n_time = n_time[0] + vals = [[v['time', i] if 'time' in v.dims else v for v in vals] for i in range(n_time)] + else: + vals = [vals] + + return vals + + +def load_everything(filename, named_components): + import scippnexus as snx + source_component = named_components['source'] + sample_component = named_components['sample'] with snx.File(filename) as data: group = data['entry/instrument'] if source_component not in group: @@ -183,26 +282,19 @@ def bifrost(filename: NeXusFileName, choppers = load_all(group, snx.NXdisk_chopper) monitors = load_all(group, snx.NXmonitor) + # this is very BIFROST simulation specific -- can it be less so? + # TODO use the _sample_ orientation itself to define a3 (and goniometer angles?) + logs = load_named(data['entry/parameters'], snx.NXlog, ('a3', 'a4')) - if is_simulated: - for name in triplets: - triplets[name]['data'] = convert_simulated_time_to_frame_time(triplets[name]['data']) + return sample, triplets, analyzers, choppers, monitors, logs - for name in triplets: - triplets[name] = snx.compute_positions(triplets[name], store_transform='transform') - - analyzers = combine_analyzers(analyzers, triplets) - detectors = combine_detectors(triplets) - kf_params, sample_detector_flight_time = find_sample_detector_flight_time(sample, analyzers, detectors) +def one_setting(sample, triplet_events, analyzers, norm_monitor, filename, names, warn_about_a3=True): - triplet_events = get_triplet_events(triplets) + detector_positions = triplet_events.coords['position'] # this is the same as detectors['position'].data! + kf_params, sample_detector_flight_time = find_sample_detector_flight_time(sample, analyzers, detector_positions) sample_events = get_sample_events(triplet_events, sample_detector_flight_time) - - ki_params, unwrapped_events, primary = get_unwrapped_events(filename, source_component, sample_component, sample_events, focus_components) - - norm_monitor = get_normalization_monitor(monitors, monitor_component) - + ki_params, unwrapped_events, primary = get_unwrapped_events(filename, names['source'], names['sample'], sample_events, names['focus']) ei, en, ef = get_energy_axes(ki_params, kf_params) energy_events = sample_events.copy() @@ -210,7 +302,17 @@ def bifrost(filename: NeXusFileName, energy_events.bins.coords['incident_energy'] = ei energy_events.coords['final_energy'] = ef - #return triplet_events, sample_events, unwrapped_events, norm_monitor, energy_events, sample_detector_flight_time, analyzers, detectors + if 'a3' in triplet_events.coords: + # this _should_ be one (a3, a4) setting, with a single a3 value on triple_events (and norm_monitor) + a3 = triplet_events.coords['a3'] + else: + from scipp import scalar + if warn_about_a3: + logger.warning("No a3 present in setting, assuming 0 a3") + a3 = scalar(0, unit='deg') + + energy_momentum_events = add_momentum_axes(ki_params, kf_params, energy_events, a3) + return { 'triplet_events': triplet_events, 'sample_events': sample_events, @@ -219,5 +321,118 @@ def bifrost(filename: NeXusFileName, 'energy_events': energy_events, 'sample_detector_flight_time': sample_detector_flight_time, 'analyzers': analyzers, - 'detectors': detectors, - } \ No newline at end of file + 'energy_momentum_events': energy_momentum_events, + # 'detectors': detectors, + # 'monitors': monitors, + # 'triplets': triplets, + } + +def load_precompute(filename: NeXusFileName, named_components, is_simulated: bool=False): + import scippnexus as snx + sample, triplets, analyzers, choppers, monitors, logs = load_everything(filename, named_components) + + if is_simulated: + for name in triplets: + triplets[name]['data'] = convert_simulated_time_to_frame_time(triplets[name]['data']) + + for name in triplets: + triplets[name] = snx.compute_positions(triplets[name], store_transform='transform') + + analyzers = combine_analyzers(analyzers, triplets) + # detectors = combine_detectors(triplets) + triplet_events = get_triplet_events(triplets) + + norm_monitor = get_normalization_monitor(monitors, named_components['monitor']) + return sample, analyzers, triplet_events, norm_monitor, logs + +def component_names(source_component: str | None = None, sample_component: str | None = None, + focus_components: list[str] | None = None, monitor_component: str | None = None, + is_simulated: bool=False): + names = { + 'source': source_component, + 'sample': sample_component, + 'focus': focus_components, + 'monitor': monitor_component, + } + if is_simulated: + sim_components = { + 'source': '001_ESS_source', + 'sample': '114_sample_stack', + 'monitor': '110_frame_3', + 'focus': [FocusComponentName('005_PulseShapingChopper'), FocusComponentName('006_PulseShapingChopper2')], + } + for k, v in sim_components.items(): + if names[k] is None: + names[k] = v + return names + +def bifrost(filename: NeXusFileName, + source_component: str | None = None, + sample_component: str | None = None, + focus_components: list[str] | None = None, + monitor_component: str | None = None, + is_simulated: bool=False): + import scipp as sc + from tqdm import tqdm + named_components = component_names( + source_component, sample_component, focus_components, monitor_component, is_simulated + ) + sample, analyzers, triplet_events, norm_monitor, logs = load_precompute(filename, named_components, is_simulated) + settings = split(triplet_events, analyzers, norm_monitor, logs) + data = [one_setting(sample, one_triplet_events, one_analyzers, one_monitor, filename, named_components) + for one_triplet_events, one_analyzers, one_monitor in tqdm(settings, desc='(a3, a4) settings')] + return {k: sc.concat([d[k] for d in data], 'setting') for k in data[0]} + + +# def bifrost_dask(filename: NeXusFileName, +# source_component: str | None = None, +# sample_component: str | None = None, +# focus_components: list[str] | None = None, +# monitor_component: str | None = None, +# is_simulated: bool=False): +# import scipp as sc +# from tqdm.dask import TqdmCallback +# import dask +# named_components = component_names( +# source_component, sample_component, focus_components, monitor_component, is_simulated +# ) +# sample, analyzers, triplet_events, norm_monitor, logs = load_precompute(filename, named_components, is_simulated) +# settings = split(triplet_events, analyzers, norm_monitor, logs) +# +# def concat_one(parts): +# return sc.concat(parts, dim='setting') +# +# do_one = dask.delayed(one_setting) +# concat_one = dask.delayed(concat_one) +# +# # This fails because ... something ... can't be pickled -- scipp things? +# data = [do_one(sample, ev, an, mn, filename, named_components) for ev, an, mn in settings] +# with TqdmCallback(desc="(a3, a4) setting"): +# data = dask.compute(*data) +# +# keys = list(data[0].keys()) +# with TqdmCallback(desc="Combine settings"): +# futures = dask.persist(*[concat_one([d[k] for d in data]) for k in keys]) +# return {k: v for k, v in zip(keys, dask.compute(*futures))} + + +def bifrost_single(filename: NeXusFileName, + source_component: str | None = None, + sample_component: str | None = None, + focus_components: list[str] | None = None, + monitor_component: str | None = None, + is_simulated: bool = False, + extras: bool = False): + named_components = component_names( + source_component, sample_component, focus_components, monitor_component, is_simulated + ) + sample, analyzers, triplet_events, norm_monitor, logs = load_precompute(filename, named_components, is_simulated) + + data = one_setting(sample, triplet_events, analyzers, norm_monitor, filename, named_components, warn_about_a3=False) + + if extras: + data['sample'] = sample + data['logs'] = logs + + return data + diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 45381c2f4..045f82fa4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -72,4 +72,18 @@ def typer(named: str) -> Type[scipp_type]: LabMomentumTransferY = variable_type("LabMomentumTransferY") LabMomentumTransferZ = variable_type("LabMomentumTransferZ") -EnergyTransfer = variable_type('EnergyTransfer') \ No newline at end of file +SampleTableAngle = variable_type("SampleTableAngle") +TableMomentumTransfer = variable_type('TableMomentumTransfer') +TableMomentumTransferX = variable_type("TableMomentumTransferX") +TableMomentumTransferY = variable_type("TableMomentumTransferY") +TableMomentumTransferZ = variable_type("TableMomentumTransferZ") + +SampleMomentumTransfer = variable_type('SampleMomentumTransfer') +SampleMomentumTransferX = variable_type("SampleMomentumTransferX") +SampleMomentumTransferY = variable_type("SampleMomentumTransferY") +SampleMomentumTransferZ = variable_type("SampleMomentumTransferZ") + +EnergyTransfer = variable_type('EnergyTransfer') + +# Debugging types, likely to be removed +DetectorGeometricA4 = variable_type("DetectorGeometricA4") \ No newline at end of file diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py index fbf8f3483..48d5b0113 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -1,4 +1,4 @@ -from scipp import Variable +from scipp import Variable, DataArray def norm(vector: Variable) -> Variable: @@ -25,3 +25,81 @@ def unit(x): if a_unit != b_unit: b = b.to(unit=a_unit) return b + + +def is_in_coords(x: DataArray, name: str): + return name in x.coords or (x.bins is not None and name in x.bins.coords) + + +def split_setting(*args, + arg_coord: str | list[str] | None = None, + **kwargs): + """For each of the DataArrays in args, find their segments according to the provided kwargs lookup tables + + Parameters + ---------- + args: + The DataArrays for which to perform coordinate lookup + arg_coord: + The coordinate name(s) in each DataArray which are used in the lookup + kwargs: + The named scipp lookup tables used in the conversion + + The coordinate name to use in the lookup might differ depending on the type/source of DataArray + so it should be provided in the keyword argument `lookup_coord` as a list, one name per data array + + >>> split_setting(triplets, monitor['first'], arg_coord=['event_time_zero', 'time'], a3=table(a3_log['value'], 'time')) + """ + from itertools import product + from collections import namedtuple + + if arg_coord is None: + raise ValueError("The argument lookup coordinate name(s) must be provided") + if isinstance(arg_coord, str): + arg_coord = [arg_coord] + if len(arg_coord) == 1 and len(args) > 1: + arg_coord = arg_coord * len(args) + + for arg, coord in zip(args, arg_coord): + if not is_in_coords(arg, coord): + raise ValueError(f"No {coord} coordinate in DataArray\n{arg}") + + def dim_size(k, v): + size = 0 + for argument, coordinate in zip(args, arg_coord): + a = argument.transform_coords(k, graph={k: lambda x: v[x], 'x': coordinate}, keep_aliases=False) + if a.bins is not None: + a = a.group(k) + if size and a.sizes[k] and size != a.sizes[k]: + raise ValueError(f"Earlier-found {k} size, {size}, not consistent with current {a.sizes[k]}") + elif size == 0: + size = a.sizes[k] + return size + + dims = {k: dim_size(k, v) for k, v in kwargs.items()} + key = namedtuple('key', dims.keys()) + keys = list(dims.keys()) + ranges = [range(x) for x in dims.values()] + entries = [key(**{k: v for k, v in zip(keys, values)}) for values in product(*ranges)] + + graph = {k: lambda x: v[x] for k, v in kwargs.items()} + targets = tuple(graph.keys()) + # everything = lambda x: tuple(v[x] for v in kwargs.values()) + + new_args = [a for a in args] + for i, coord in enumerate(arg_coord): + graph['x'] = coord + new_args[i] = new_args[i].transform_coords(targets, graph=graph, keep_aliases=False) + if new_args[i].bins is not None: + new_args[i] = new_args[i].group(*targets) + + return new_args + + def one_entry(new_arg, entry): + a = new_arg + for index, k in enumerate(kwargs.keys()): + a = a[k, entry[index]] + return a + + data = {entry: tuple(one_entry(x, entry) for x in new_args) for entry in entries} + return data From 553de63acd582b32ad0c91466a4f7ec493461280 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Sat, 14 Sep 2024 21:32:02 +0200 Subject: [PATCH 027/330] [Fix] instrument coordinate system: Y is vertical, not Z --- .../ess/spectroscopy/indirect/conservation.py | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index bf861683c..588c2c3d3 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -4,8 +4,8 @@ from .kf import providers as kf_providers -# scipp vectors are always float64 element type? -X, Y, Z = [vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])] +# Directions relative to the incident beam coordinate system +PERP, VERT, PARALLEL = [vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])] def lab_momentum_vector(ki: IncidentWavevector, kf: FinalWavevector) -> LabMomentumTransfer: @@ -14,17 +14,45 @@ def lab_momentum_vector(ki: IncidentWavevector, kf: FinalWavevector) -> LabMomen def lab_momentum_x(q: LabMomentumTransfer) -> LabMomentumTransferX: from scipp import dot - return dot(X, q) + return dot(PERP, q) def lab_momentum_y(q: LabMomentumTransfer) -> LabMomentumTransferY: from scipp import dot - return dot(Y, q) + return dot(VERT, q) def lab_momentum_z(q: LabMomentumTransfer) -> LabMomentumTransferZ: from scipp import dot - return dot(Z, q) + return dot(PARALLEL, q) + + +def sample_table_momentum_vector(a3: SampleTableAngle, q: LabMomentumTransfer) -> TableMomentumTransfer: + """Rotate the momentum transfer vector into the sample-table coordinate system + + When a3 is zero, the sample-table and lab coordinate systems are the same. That is, Z is along the incident + beam, Y is opposite the gravitational force, and X completes the right-handed coordinate system. + The sample-table angle, a3, has a rotation vector along Y, such that a positive 90-degree rotation places the + sample-table Z along the lab X. + """ + from scipp.spatial import rotations_from_rotvecs + # negative a3 since we rotate coordinates not axes here + return rotations_from_rotvecs(-a3 * VERT) * q + + +def sample_table_momentum_x(q: TableMomentumTransfer) -> TableMomentumTransferX: + from scipp import dot + return dot(PERP, q) + + +def sample_table_momentum_y(q: TableMomentumTransfer) -> TableMomentumTransferY: + from scipp import dot + return dot(VERT, q) + + +def sample_table_momentum_z(q: TableMomentumTransfer) -> TableMomentumTransferZ: + from scipp import dot + return dot(PARALLEL, q) # def energy(ei: IncidentEnergy, ef: FinalEnergy) -> EnergyTransfer: @@ -43,5 +71,9 @@ def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: lab_momentum_x, lab_momentum_y, lab_momentum_z, + sample_table_momentum_vector, + sample_table_momentum_x, + sample_table_momentum_y, + sample_table_momentum_z, energy, ] \ No newline at end of file From f660d3e3b61301757a79f1ad001479be90e33bd4 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Sat, 14 Sep 2024 21:33:37 +0200 Subject: [PATCH 028/330] [Update] dependencies --- packages/essspectroscopy/pyproject.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index e5f617272..2c1386cb1 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -34,7 +34,9 @@ dependencies = [ "scipp>=24.01", "scippneutron>=24.01", "scippnexus>=23.12", - "choppera>=0.1.3", + "choppera>=0.1.4", + "loguru", + "tqdm", ] dynamic = ["version"] From 7ff51e083899311a7ebaaec0d90ff57a32f9f5ec Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Sun, 15 Sep 2024 19:29:38 +0200 Subject: [PATCH 029/330] Make dependency versions explicit --- packages/essspectroscopy/pyproject.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 2c1386cb1..0c73551b4 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,13 +30,13 @@ requires-python = ">=3.10" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "sciline>=24.02", - "scipp>=24.01", - "scippneutron>=24.01", - "scippnexus>=23.12", - "choppera>=0.1.4", - "loguru", - "tqdm", + "sciline==24.6.3", + "scipp==24.9.1", + "scippneutron==24.8.0", + "scippnexus==24.9.0", + "choppera==0.1.4", + "loguru==0.7.2", + "tqdm==4.66.5", ] dynamic = ["version"] From 2b4045d7ef6239925b005262e86d856f76812c71 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 08:54:39 +0000 Subject: [PATCH 030/330] Apply automatic formatting --- .../docs/developer/encountered-issues.md | 6 +- .../src/ess/spectroscopy/indirect/__init__.py | 2 +- .../ess/spectroscopy/indirect/conservation.py | 26 +- .../src/ess/spectroscopy/indirect/kf.py | 134 ++++++--- .../src/ess/spectroscopy/indirect/ki.py | 121 ++++++--- .../spectroscopy/indirect/normalisation.py | 38 ++- .../src/ess/spectroscopy/indirect/workflow.py | 255 ++++++++++++++---- .../src/ess/spectroscopy/types.py | 10 +- .../src/ess/spectroscopy/utils.py | 31 ++- .../essspectroscopy/tests/indirect_test.py | 88 +++--- 10 files changed, 510 insertions(+), 201 deletions(-) diff --git a/packages/essspectroscopy/docs/developer/encountered-issues.md b/packages/essspectroscopy/docs/developer/encountered-issues.md index d70fc5dbb..803440639 100644 --- a/packages/essspectroscopy/docs/developer/encountered-issues.md +++ b/packages/essspectroscopy/docs/developer/encountered-issues.md @@ -6,14 +6,14 @@ Comparing the event times when unwrapped and propagated to the sample with the n it appeared that too much time had been removed from the recorded frame-times before unwrapping. ![Screenshot from 2024-08-27 08-24-50.png](Screenshot%20from%202024-08-27%2008-24-50.png) -The calculated time of flight from sample to detector had only been checked relative +The calculated time of flight from sample to detector had only been checked relative to an order of magnitude estimate, which was not accurate enough. A more careful estimate shows that neutrons hitting the central pixel of each central tube in the symmetric geometry case should take around 3.3 μsec from sample to detector. ![Screenshot from 2024-08-27 08-20-49.png](Screenshot%20from%202024-08-27%2008-20-49.png) ### Cause -The sample-to-detector time-of-flight depends on the square root of the energy of the neutron, +The sample-to-detector time-of-flight depends on the square root of the energy of the neutron, which was calculated incorrectly due to a mistake finding the vector from the sample to the detector pixel. If the sample is at 0, the analyzer at A and the detector at A + D, @@ -26,7 +26,7 @@ This then produced the wrong scattering angle, the wrong wavevector magnitude, a Correcting the calculation also corrected the per detector pixel energies ![Screenshot from 2024-08-27 10-54-08.png](Screenshot%20from%202024-08-27%2010-54-08.png) -The calculated sample-to-detector time-of-flights are consistent with the limited hand calculated values +The calculated sample-to-detector time-of-flights are consistent with the limited hand calculated values ![Screenshot from 2024-08-27 10-55-10.png](Screenshot%20from%202024-08-27%2010-55-10.png) And the unwrapped time-at-sample seems more consistent with the monitor histogram. diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py index 50b94a6a8..b3b7a992c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py @@ -3,4 +3,4 @@ __all__ = [ "bifrost", "bifrost_single", -] \ No newline at end of file +] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index 588c2c3d3..195fab2c4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -1,33 +1,40 @@ -from scipp import vector from ess.spectroscopy.types import * -from .ki import providers as ki_providers -from .kf import providers as kf_providers +from scipp import vector +from .kf import providers as kf_providers +from .ki import providers as ki_providers # Directions relative to the incident beam coordinate system PERP, VERT, PARALLEL = [vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])] -def lab_momentum_vector(ki: IncidentWavevector, kf: FinalWavevector) -> LabMomentumTransfer: +def lab_momentum_vector( + ki: IncidentWavevector, kf: FinalWavevector +) -> LabMomentumTransfer: return kf - ki def lab_momentum_x(q: LabMomentumTransfer) -> LabMomentumTransferX: from scipp import dot + return dot(PERP, q) def lab_momentum_y(q: LabMomentumTransfer) -> LabMomentumTransferY: from scipp import dot + return dot(VERT, q) def lab_momentum_z(q: LabMomentumTransfer) -> LabMomentumTransferZ: from scipp import dot + return dot(PARALLEL, q) -def sample_table_momentum_vector(a3: SampleTableAngle, q: LabMomentumTransfer) -> TableMomentumTransfer: +def sample_table_momentum_vector( + a3: SampleTableAngle, q: LabMomentumTransfer +) -> TableMomentumTransfer: """Rotate the momentum transfer vector into the sample-table coordinate system When a3 is zero, the sample-table and lab coordinate systems are the same. That is, Z is along the incident @@ -36,32 +43,37 @@ def sample_table_momentum_vector(a3: SampleTableAngle, q: LabMomentumTransfer) - sample-table Z along the lab X. """ from scipp.spatial import rotations_from_rotvecs + # negative a3 since we rotate coordinates not axes here return rotations_from_rotvecs(-a3 * VERT) * q def sample_table_momentum_x(q: TableMomentumTransfer) -> TableMomentumTransferX: from scipp import dot + return dot(PERP, q) def sample_table_momentum_y(q: TableMomentumTransfer) -> TableMomentumTransferY: from scipp import dot + return dot(VERT, q) def sample_table_momentum_z(q: TableMomentumTransfer) -> TableMomentumTransferZ: from scipp import dot + return dot(PARALLEL, q) # def energy(ei: IncidentEnergy, ef: FinalEnergy) -> EnergyTransfer: # return ei - ef + def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: from scipp.constants import hbar, neutron_mass - return hbar * hbar * (ki * ki - kf * kf) / 2 / neutron_mass + return hbar * hbar * (ki * ki - kf * kf) / 2 / neutron_mass providers = [ @@ -76,4 +88,4 @@ def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: sample_table_momentum_y, sample_table_momentum_z, energy, -] \ No newline at end of file +] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 941cdf8e5..2341b7957 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -2,10 +2,10 @@ def sample_analyzer_vector( - sample_position: SamplePosition, - analyzer_position: AnalyzerPosition, - analyzer_orientation: AnalyzerOrientation, - detector_position: DetectorPosition + sample_position: SamplePosition, + analyzer_position: AnalyzerPosition, + analyzer_orientation: AnalyzerOrientation, + detector_position: DetectorPosition, ) -> SampleAnalyzerVector: """Determine the sample to analyzer-reflection-point vector per detector element @@ -23,13 +23,15 @@ def sample_analyzer_vector( There is expected to be multiple detector element positions per analyzer which can be represented as an additional dimension compared to the analyzer shapes. """ - from scipp import vector, dot from ess.spectroscopy.utils import norm + from scipp import dot, vector # Scipp does not distinguish between coordinates and directions, so we need to do some extra legwork # to ensure we can apply the orientation transformation _and_ obtain a dimensionless direction vector o = vector([0, 0, 0], unit=analyzer_orientation.unit) - y = vector([0, 1, 0], unit=analyzer_orientation.unit) # and y perpendicular to the scattering plane + y = vector( + [0, 1, 0], unit=analyzer_orientation.unit + ) # and y perpendicular to the scattering plane yhat = analyzer_orientation * y - analyzer_orientation * o yhat /= norm(yhat) @@ -38,7 +40,9 @@ def sample_analyzer_vector( sample_detector_vector = detector_position - sample_position sd_out_of_plane = dot(sample_detector_vector, yhat) # the sample-detector vector is the sum of sample-analyzer, analyzer-detector-center, the out-of-plane vector - analyzer_detector_center_vector = sample_detector_vector - sample_analyzer_center_vector - sd_out_of_plane * yhat + analyzer_detector_center_vector = ( + sample_detector_vector - sample_analyzer_center_vector - sd_out_of_plane * yhat + ) # TODO Consider requiring that dot(analyzer_position - sample_position, yhat) is zero? @@ -47,23 +51,30 @@ def sample_analyzer_vector( analyzer_detector_center_distance = norm(analyzer_detector_center_vector) # similar-triangles give the out-of-plane analyzer reflection point distance - sa_out_of_plane = sample_analyzer_center_distance / (sample_analyzer_center_distance + analyzer_detector_center_distance) * sd_out_of_plane + sa_out_of_plane = ( + sample_analyzer_center_distance + / (sample_analyzer_center_distance + analyzer_detector_center_distance) + * sd_out_of_plane + ) return sample_analyzer_center_vector + sa_out_of_plane * yhat def detector_geometric_a4(vec: SampleAnalyzerVector) -> DetectorGeometricA4: - from scipp import vector, dot, atan2 - lab_x = vector([1, 0, 0]) # perpendicular to the incident beam, in the horizontal plane + from scipp import atan2, dot, vector + + lab_x = vector( + [1, 0, 0] + ) # perpendicular to the incident beam, in the horizontal plane lab_z = vector([0, 0, 1]) # along the incident beam direction return atan2(y=dot(lab_x, vec), x=dot(lab_z, vec)).to(unit='deg') def fixed_tau_hat_sample_analyzer_vector( - sample_position: SamplePosition, - analyzer_position: AnalyzerPosition, - analyzer_orientation: AnalyzerOrientation, - detector_position: DetectorPosition + sample_position: SamplePosition, + analyzer_position: AnalyzerPosition, + analyzer_orientation: AnalyzerOrientation, + detector_position: DetectorPosition, ) -> SampleAnalyzerVector: """Determine the sample to analyzer-reflection-point vector per detector element as the intersection of three planes @@ -87,23 +98,36 @@ def fixed_tau_hat_sample_analyzer_vector( scatter slightly different energies to the different detectors, so this method can not work. """ from uuid import uuid4 - from numpy.linalg import solve as linalg_solve, matrix_rank, lstsq as linalg_least_sqr - from scipp import any as sc_any, cross, concat, scalar, vector, dot, vectors + from ess.spectroscopy.utils import norm + from numpy.linalg import lstsq as linalg_least_sqr + from numpy.linalg import matrix_rank + from numpy.linalg import solve as linalg_solve + from scipp import any as sc_any + from scipp import concat, cross, dot, scalar, vector, vectors # Scipp does not distinguish between coordinates and directions, so we need to do some extra legwork # to ensure we can apply the orientation transformation _and_ obtain a dimensionless direction vector o = vector([0, 0, 0], unit=analyzer_orientation.unit) - x = vector([1, 0, 0], unit=analyzer_orientation.unit) # McStas defines x parallel to Bragg plane tau - y = vector([0, 1, 0], unit=analyzer_orientation.unit) # and y perpendicular to the scattering plane + x = vector( + [1, 0, 0], unit=analyzer_orientation.unit + ) # McStas defines x parallel to Bragg plane tau + y = vector( + [0, 1, 0], unit=analyzer_orientation.unit + ) # and y perpendicular to the scattering plane # z is in the Bragg plane and in the scattering plane - tau, yhat = [v / norm(v) for v in [(analyzer_orientation * ei - analyzer_orientation * o) for ei in (x, y)]] + tau, yhat = [ + v / norm(v) + for v in [ + (analyzer_orientation * ei - analyzer_orientation * o) for ei in (x, y) + ] + ] v_d = detector_position - sample_position n_v_d = norm(v_d) - if sc_any(n_v_d == scalar(0., unit=sample_position.unit)): - bad = n_v_d == scalar(0., unit=sample_position.unit) + if sc_any(n_v_d == scalar(0.0, unit=sample_position.unit)): + bad = n_v_d == scalar(0.0, unit=sample_position.unit) n_v_d.values[bad.values] = 1.0 print(f"Some detector(s) are located at the detector?") v_d /= n_v_d @@ -111,19 +135,38 @@ def fixed_tau_hat_sample_analyzer_vector( # collect the normal directions for the three planes n_1, n_2, n_3 = cross(v_d, tau), tau, v_d # each (N_det, 3), or (3,) # and collect the right-hand side of the three plane equations - b_1 = dot(sample_position, n_1).to(unit=sample_position.unit) # (N_sample, N_det) or (N_det,) - b_2 = dot(analyzer_position, n_2).to(unit=sample_position.unit) # (N_analyzer,) - b_3 = dot(0.5 * sample_position + 0.5 * detector_position, n_3).to(unit=sample_position.unit) - - if n_1.ndim > 0 or n_2.ndim > 0 or n_3.ndim > 0 or b_1.ndim > 0 or b_2.ndim > 0 or b_3.ndim > 0: + b_1 = dot(sample_position, n_1).to( + unit=sample_position.unit + ) # (N_sample, N_det) or (N_det,) + b_2 = dot(analyzer_position, n_2).to(unit=sample_position.unit) # (N_analyzer,) + b_3 = dot(0.5 * sample_position + 0.5 * detector_position, n_3).to( + unit=sample_position.unit + ) + + if ( + n_1.ndim > 0 + or n_2.ndim > 0 + or n_3.ndim > 0 + or b_1.ndim > 0 + or b_2.ndim > 0 + or b_3.ndim > 0 + ): blob = 0 * (n_1 + n_2 + n_3) # broadcast to a common shape n_1, n_2, n_3 = [x + blob for x in (n_1, n_2, n_3)] blob = 0 * (b_1 + b_2 + b_3) # broadcast to a common shape b_1, b_2, b_3 = [x + blob for x in (b_1, b_2, b_3)] new_dim = str(uuid4()) - a = concat([n_1, n_2, n_3], dim=new_dim).transpose(dims=n_1.dims + (new_dim,)).values # (..., 3, 3) - b = concat([b_1, b_2, b_3], dim=new_dim).transpose(dims=n_1.dims + (new_dim,)).values # (..., 3) + a = ( + concat([n_1, n_2, n_3], dim=new_dim) + .transpose(dims=n_1.dims + (new_dim,)) + .values + ) # (..., 3, 3) + b = ( + concat([b_1, b_2, b_3], dim=new_dim) + .transpose(dims=n_1.dims + (new_dim,)) + .values + ) # (..., 3) # as of numpy 2.0, b must be (..., 3, 1) for broadcasting to work # https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html @@ -135,6 +178,7 @@ def fixed_tau_hat_sample_analyzer_vector( # numpy.linalg.solve will not have worked, and probably returned garbage. if any((mr := matrix_rank(a)) < 3): from numpy import ndenumerate + for i, m in ndenumerate(mr): if m < 3: x[i] = linalg_least_sqr(a[i], b[i][:, 0])[0] @@ -144,30 +188,32 @@ def fixed_tau_hat_sample_analyzer_vector( def analyzer_detector_vector( - sample_position: SamplePosition, - sample_analyzer_vec: SampleAnalyzerVector, - detector_position: DetectorPosition + sample_position: SamplePosition, + sample_analyzer_vec: SampleAnalyzerVector, + detector_position: DetectorPosition, ) -> AnalyzerDetectorVector: return detector_position - (sample_position + sample_analyzer_vec) def kf_hat(sample_analyzer_vec: SampleAnalyzerVector) -> SampleAnalyzerDirection: from ess.spectroscopy.utils import norm + return sample_analyzer_vec / norm(sample_analyzer_vec) def reciprocal_lattice_spacing(tau_vector: ReciprocalLatticeVectorAbsolute): from ess.spectroscopy.utils import norm + return norm(tau_vector) def final_wavenumber( - sample_analyzer_vec: SampleAnalyzerVector, - analyzer_detector_vec: AnalyzerDetectorVector, - tau: ReciprocalLatticeSpacing + sample_analyzer_vec: SampleAnalyzerVector, + analyzer_detector_vec: AnalyzerDetectorVector, + tau: ReciprocalLatticeSpacing, ) -> FinalWavenumber: - from scipp import sqrt from ess.spectroscopy.utils import norm + from scipp import sqrt # law of Cosines gives the scattering angle based on distances: l_sa = norm(sample_analyzer_vec) @@ -183,36 +229,36 @@ def final_wavenumber( def final_energy(kf: FinalWavenumber) -> FinalEnergy: from scipp.constants import hbar, neutron_mass + return ((hbar * hbar / 2 / neutron_mass) * kf * kf).to(unit='meV') def final_wavevector( - kf_direction: SampleAnalyzerDirection, - kf_magnitude: FinalWavenumber + kf_direction: SampleAnalyzerDirection, kf_magnitude: FinalWavenumber ) -> FinalWavevector: return kf_direction * kf_magnitude def secondary_flight_path_length( - sample_analyzer_vec: SampleAnalyzerVector, - analyzer_detector_vec: AnalyzerDetectorVector + sample_analyzer_vec: SampleAnalyzerVector, + analyzer_detector_vec: AnalyzerDetectorVector, ) -> SampleDetectorPathLength: from ess.spectroscopy.utils import norm + return norm(sample_analyzer_vec) + norm(analyzer_detector_vec) def secondary_flight_time( - secondary_flight_distance: SampleDetectorPathLength, - kf_magnitude: FinalWavenumber + secondary_flight_distance: SampleDetectorPathLength, kf_magnitude: FinalWavenumber ) -> SampleDetectorFlightTime: from scipp.constants import hbar, neutron_mass + velocity = kf_magnitude * hbar / neutron_mass return secondary_flight_distance / velocity def sample_frame_time( - detector_time: DetectorFrameTime, - secondary_time: SampleDetectorFlightTime + detector_time: DetectorFrameTime, secondary_time: SampleDetectorFlightTime ) -> SampleFrameTime: return detector_time - secondary_time @@ -228,4 +274,4 @@ def sample_frame_time( sample_frame_time, final_energy, detector_geometric_a4, -] \ No newline at end of file +] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index f89a3f2b6..cf55345e1 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -1,12 +1,15 @@ """Utilities for the primary spectrometer of an indirect geometry time-of-flight spectrometer""" -from __future__ import annotations -#TODO move elsewhere since possibly (probably) too specific to BIFROST. +from __future__ import annotations +# TODO move elsewhere since possibly (probably) too specific to BIFROST. from ess.spectroscopy.types import * from scippnexus import Group -def determine_name_with_type(instrument: Group, name: str | None, options: list, type_name: str) -> str: + +def determine_name_with_type( + instrument: Group, name: str | None, options: list, type_name: str +) -> str: if name is not None and name in instrument: return name found = {x for x in instrument if type_name in x.lower()} @@ -18,15 +21,19 @@ def determine_name_with_type(instrument: Group, name: str | None, options: list, def guess_source_name(file: NeXusFileName) -> SourceName: - from scippnexus import NXsource, NXmoderator, File + from scippnexus import File, NXmoderator, NXsource + with File(file) as data: instrument = data['entry/instrument'] - name = determine_name_with_type(instrument, None, [NXsource, NXmoderator], 'source') + name = determine_name_with_type( + instrument, None, [NXsource, NXmoderator], 'source' + ) return SourceName(name) def guess_sample_name(file: NeXusFileName) -> SampleName: - from scippnexus import NXsample, File + from scippnexus import File, NXsample + with File(file) as data: instrument = data['entry/instrument'] name = determine_name_with_type(instrument, None, [NXsample], 'sample') @@ -44,13 +51,18 @@ def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: The component type, primacy, and allowed distance range could be user configurable inputs """ from scipp import scalar - from scippnexus import NXdisk_chopper, File, compute_positions + from scippnexus import File, NXdisk_chopper, compute_positions + from ..utils import norm + allowance = scalar(0.5, unit='m') with File(file) as data: instrument = data['entry/instrument'] - choppers = {k: compute_positions(v[...])['position'] for k, v in instrument[NXdisk_chopper].items()} + choppers = { + k: compute_positions(v[...])['position'] + for k, v in instrument[NXdisk_chopper].items() + } names = list(choppers.keys()) focus_names = [FocusComponentName(names[0])] @@ -68,20 +80,26 @@ def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: def source_position(file: NeXusFileName, source: SourceName) -> SourcePosition: - from scippnexus import compute_positions, File + from scippnexus import File, compute_positions + with File(file) as data: return compute_positions(data['entry/instrument'][source][...])['position'] def sample_position(file: NeXusFileName, sample: SampleName) -> SamplePosition: - from scippnexus import compute_positions, File + from scippnexus import File, compute_positions + with File(file) as data: return compute_positions(data['entry/instrument'][sample][...])['position'] -def focus_distance(file: NeXusFileName, origin: SourcePosition ,names: FocusComponentNames) -> PrimaryFocusDistance: - from scippnexus import compute_positions, File +def focus_distance( + file: NeXusFileName, origin: SourcePosition, names: FocusComponentNames +) -> PrimaryFocusDistance: + from scippnexus import File, compute_positions + from ..utils import norm + pos = 0 * origin with File(file) as data: for name in names: @@ -90,83 +108,116 @@ def focus_distance(file: NeXusFileName, origin: SourcePosition ,names: FocusComp return norm(pos - origin) -def focus_time(primary: PrimarySpectrometerObject, distance: PrimaryFocusDistance) -> PrimaryFocusTime: +def focus_time( + primary: PrimarySpectrometerObject, distance: PrimaryFocusDistance +) -> PrimaryFocusTime: from choppera.nexus import primary_focus_time + return primary_focus_time(primary, distance) -def primary_path_length(file: NeXusFileName, source: SourcePosition, sample: SamplePosition) -> SourceSamplePathLength: +def primary_path_length( + file: NeXusFileName, source: SourcePosition, sample: SamplePosition +) -> SourceSamplePathLength: """Compute the primary spectrometer path length Note: This *requires* that the instrument group *is sorted* along the beam path. HDF5 group entries are sorted alphabetically, so you should ensure that the NeXus file was constructed with this in mind. """ - from scippnexus import compute_positions, NXguide, File - from scipp import dot, sqrt, sum, concat + from scipp import concat, dot, sqrt, sum + from scippnexus import File, NXguide, compute_positions + with File(file) as data: - positions = [compute_positions(v[...])['position'] for v in data['entry/instrument'][NXguide].values()] + positions = [ + compute_positions(v[...])['position'] + for v in data['entry/instrument'][NXguide].values() + ] positions = concat((source, *positions, sample), dim='path') diff = positions['path', 1:] - positions['path', :-1] return sum(sqrt(dot(diff, diff))) -def primary_spectrometer(file: NeXusFileName, - source: SourceName, - sample: SampleName, - frequency: SourceFrequency, - duration: SourceDuration, - delay: SourceDelay, - velocities: SourceVelocities) -> PrimarySpectrometerObject: - from scippnexus import File +def primary_spectrometer( + file: NeXusFileName, + source: SourceName, + sample: SampleName, + frequency: SourceFrequency, + duration: SourceDuration, + delay: SourceDelay, + velocities: SourceVelocities, +) -> PrimarySpectrometerObject: from choppera.nexus import primary_spectrometer + from scippnexus import File + with File(file) as data: instrument = data['entry/instrument'] - assert source in instrument, f"The source '{source}' is not in the instrument group" - assert sample in instrument, f"The sample '{sample}' is not in the instrument group" - return primary_spectrometer(instrument, source, sample, frequency, duration, delay, velocities) + assert ( + source in instrument + ), f"The source '{source}' is not in the instrument group" + assert ( + sample in instrument + ), f"The sample '{sample}' is not in the instrument group" + return primary_spectrometer( + instrument, source, sample, frequency, duration, delay, velocities + ) def primary_pivot_time(primary: PrimarySpectrometerObject) -> SourceSampleFlightTime: from choppera.nexus import primary_pivot_time as primary_time + return primary_time(primary) -def unwrap_sample_time(times: SampleFrameTime, frequency: SourceFrequency, least: SourceSampleFlightTime) -> SampleTime: +def unwrap_sample_time( + times: SampleFrameTime, frequency: SourceFrequency, least: SourceSampleFlightTime +) -> SampleTime: from choppera.nexus import unwrap as choppera_unwrap + return choppera_unwrap(times, frequency, least) -def incident_slowness(length: SourceSamplePathLength, time: SampleTime, - distance: PrimaryFocusDistance, focus: PrimaryFocusTime) -> IncidentSlowness: +def incident_slowness( + length: SourceSamplePathLength, + time: SampleTime, + distance: PrimaryFocusDistance, + focus: PrimaryFocusTime, +) -> IncidentSlowness: from ..utils import in_same_unit + tof = time - in_same_unit(focus, to=time) slowness = tof / (length - distance) # slowness _is_ inverse velocity return slowness def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: - from scipp.constants import neutron_mass, Planck + from scipp.constants import Planck, neutron_mass + return (slowness * Planck / neutron_mass).to(unit='angstrom') def incident_wavenumber(slowness: IncidentSlowness) -> IncidentWavenumber: - from scipp.constants import neutron_mass, hbar + from scipp.constants import hbar, neutron_mass + return (neutron_mass / hbar / slowness).to(unit='1/angstrom') def incident_direction() -> IncidentDirection: from scipp import vector - return vector([0, 0, 1.]) + + return vector([0, 0, 1.0]) -def incident_wavevector(ki_magnitude: IncidentWavenumber, direction: IncidentDirection) -> IncidentWavevector: +def incident_wavevector( + ki_magnitude: IncidentWavenumber, direction: IncidentDirection +) -> IncidentWavevector: return ki_magnitude * direction def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: from scipp.constants import hbar, neutron_mass + return ((hbar * hbar / 2 / neutron_mass) * ki * ki).to(unit='meV') diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index 1afc3342d..6be88a79d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -1,21 +1,31 @@ from ess.spectroscopy.types import * -def incident_monitor_normalization(slowness: IncidentSlowness, monitor: SlownessMonitor) -> MonitorNormalisation: +def incident_monitor_normalization( + slowness: IncidentSlowness, monitor: SlownessMonitor +) -> MonitorNormalisation: """For the incident slowness of each event, return the corresponding monitor intensity""" from scipp import lookup + coords = list(monitor.coords) if len(coords) != 1: raise ValueError(f'Monitor expected to have exactly 1 coordinate, has {coords}') return lookup(monitor, dim=coords[0])[slowness] -def monitor_pivot_time(primary: PrimarySpectrometerObject, length: SourceMonitorPathLength) -> SourceMonitorFlightTime: +def monitor_pivot_time( + primary: PrimarySpectrometerObject, length: SourceMonitorPathLength +) -> SourceMonitorFlightTime: from choppera.nexus import primary_pivot_time_at + return primary_pivot_time_at(primary, length) -def monitor_wall_time(monitor: FrameTimeMonitor, frequency: SourceFrequency, least: SourceMonitorFlightTime) -> WallTimeMonitor: +def monitor_wall_time( + monitor: FrameTimeMonitor, + frequency: SourceFrequency, + least: SourceMonitorFlightTime, +) -> WallTimeMonitor: """Convert the independent 'frame_time' coordinate of a histogram DataArray to the equivalent unwrapped 'wall_time' Parameters @@ -29,17 +39,25 @@ def monitor_wall_time(monitor: FrameTimeMonitor, frequency: SourceFrequency, lea The same intensities with independent axis converted to the likely time since neutron-producing proton pulse """ from choppera.nexus import unwrap + coords = list(monitor.coords) if len(coords) != 1: raise ValueError(f'Monitor expected to have exactly 1 coordinate, has {coords}') frame = coords[0] wall = 'wall_time' names = {frame: wall} - return DataArray(monitor.data.rename(names), coords={wall: unwrap(monitor.coords[frame], frequency, least).rename(names)}) + return DataArray( + monitor.data.rename(names), + coords={wall: unwrap(monitor.coords[frame], frequency, least).rename(names)}, + ) -def monitor_slowness(monitor: WallTimeMonitor, length: SourceMonitorPathLength, - distance: PrimaryFocusDistance, focus: PrimaryFocusTime) -> SlownessMonitor: +def monitor_slowness( + monitor: WallTimeMonitor, + length: SourceMonitorPathLength, + distance: PrimaryFocusDistance, + focus: PrimaryFocusTime, +) -> SlownessMonitor: """Convert the independent 'wall_time' coordinate of a histogram DataArray to the equivalent slowness Parameters @@ -60,7 +78,11 @@ def monitor_slowness(monitor: WallTimeMonitor, length: SourceMonitorPathLength, wall = coords[0] slow = 'slowness' names = {wall: slow} - slowness = ((monitor.coords[wall] - focus) / (length - distance)).rename(names).to(unit='s/m') + slowness = ( + ((monitor.coords[wall] - focus) / (length - distance)) + .rename(names) + .to(unit='s/m') + ) return DataArray(monitor.data.rename(names), coords={slow: slowness}) @@ -69,4 +91,4 @@ def monitor_slowness(monitor: WallTimeMonitor, length: SourceMonitorPathLength, monitor_pivot_time, monitor_wall_time, monitor_slowness, -] \ No newline at end of file +] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 13fca1d7d..7ec656791 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -1,8 +1,9 @@ from __future__ import annotations -from loguru import logger import sys +from loguru import logger + logger_format = ( "{time:YYYY-MM-DD HH:mm:ss.SSS} | " "{level: <8} | " @@ -26,6 +27,7 @@ def load_named(group, obj_type, names): def ess_source_frequency(): from scipp import scalar + return scalar(14.0, unit='Hz') @@ -35,44 +37,62 @@ def ess_source_period(): def ess_source_delay(): from scipp import array - return array(values=[0, 0.], dims=['wavelength'], unit='sec', dtype='float64') + + return array(values=[0, 0.0], dims=['wavelength'], unit='sec', dtype='float64') def ess_source_duration(): from scipp import scalar + return scalar(3.0, unit='msec').to(unit='sec') def ess_source_velocities(): from scipp import array - return array(values=[100, 1e4], dims=['wavelength'], unit='m/s') # ~53 ueV to 530 meV + + return array( + values=[100, 1e4], dims=['wavelength'], unit='m/s' + ) # ~53 ueV to 530 meV def convert_simulated_time_to_frame_time(data): - graph = {'frame_time': lambda event_time_offset: event_time_offset % ess_source_period()} - return data.transform_coords('frame_time', graph=graph, rename_dims=False, keep_intermediate=False) + graph = { + 'frame_time': lambda event_time_offset: event_time_offset % ess_source_period() + } + return data.transform_coords( + 'frame_time', graph=graph, rename_dims=False, keep_intermediate=False + ) def analyzer_per_detector(analyzers, triplets): """Find the right analyzer name for each detector""" + # TODO Update this function if the NeXus group naming changes, or components are added/removed. def correct_index(d, a): detector_index = int(d.split('_', 1)[0]) analyzer_index = detector_index - 2 return a.startswith(str(analyzer_index)) - return {d: [x for x in analyzers.keys() if correct_index(d, x)][0] for d in list(triplets.keys())} + return { + d: [x for x in analyzers.keys() if correct_index(d, x)][0] + for d in list(triplets.keys()) + } def detector_per_pixel(triplets): """Find the right detector name for every pixel index""" - return {i: name for name, det in triplets.items() for i in det['data'].coords['detector_number'].values.flatten()} + return { + i: name + for name, det in triplets.items() + for i in det['data'].coords['detector_number'].values.flatten() + } def combine_analyzers(analyzers, triplets): """Combine needed analyzer properties into a single array, duplicating information, to have per-pixel data""" + from scipp import Dataset, array, concat from scippnexus import compute_positions - from scipp import Dataset, concat, array + def analyzer_extract(obj): obj = compute_positions(obj, store_transform='transform') return Dataset(data={k: obj[k] for k in ('position', 'transform', 'd_spacing')}) @@ -87,12 +107,14 @@ def analyzer_extract(obj): data['event_id'] = array(values=pixels, dims=['event_id'], unit=None) return data + def combine_detectors(triplets): from scipp import Dataset, concat, sort + def extract(obj): pixels = obj['data'].coords['detector_number'] midpoints = obj['data'].coords['position'] - return Dataset(data={'event_id': pixels, 'position': midpoints}) + return Dataset(data={'event_id': pixels, 'position': midpoints}) data = concat([extract(v) for v in triplets.values()], dim='arm') data = Dataset({k: v.flatten(to='event_id') for k, v in data.items()}) @@ -100,9 +122,11 @@ def extract(obj): def find_sample_detector_flight_time(sample, analyzers, detector_positions): - from sciline import Pipeline import numpy as np + from sciline import Pipeline + from .kf import providers as kf_providers + params = { SamplePosition: sample['position'], AnalyzerPosition: analyzers['position'].data, @@ -110,12 +134,17 @@ def find_sample_detector_flight_time(sample, analyzers, detector_positions): AnalyzerOrientation: analyzers['transform'].data, ReciprocalLatticeSpacing: 2 * np.pi / analyzers['d_spacing'].data, } - return params, Pipeline(kf_providers, params=params).get(SampleDetectorFlightTime).compute().to(unit='ms') + return params, Pipeline(kf_providers, params=params).get( + SampleDetectorFlightTime + ).compute().to(unit='ms') def get_triplet_events(triplets): from scipp import concat, sort - events = concat([x['data'] for x in triplets.values()], dim='arm').flatten(to='event_id') + + events = concat([x['data'] for x in triplets.values()], dim='arm').flatten( + to='event_id' + ) events = sort(events, events.coords['detector_number']) return events @@ -129,9 +158,13 @@ def get_sample_events(triplet_events, sample_detector_flight_times): return events -def get_unwrapped_events(filename, source_name, sample_name, sample_events, focus_components): +def get_unwrapped_events( + filename, source_name, sample_name, sample_events, focus_components +): from sciline import Pipeline + from .ki import providers as ki_providers + params = { NeXusFileName: filename, SampleName: sample_name, @@ -141,7 +174,7 @@ def get_unwrapped_events(filename, source_name, sample_name, sample_events, focu SourceFrequency: ess_source_frequency(), SourceVelocities: ess_source_velocities(), SampleFrameTime: sample_events.data.bins.coords['frame_time'], - FocusComponentNames: focus_components + FocusComponentNames: focus_components, } pipeline = Pipeline(ki_providers, params=params) primary = pipeline.get(PrimarySpectrometerObject).compute() @@ -157,12 +190,16 @@ def get_normalization_monitor(monitors, monitor_component, collapse: bool = Fals # This is very specialized to how the simulated scans are done, it needs to be generalized normalization = normalization.sum(dim='time') # rescale the frame_time axis. Why does it need to be done this way? - return normalization.transform_coords(['frame_time'], graph={'frame_time': lambda t: t.to(unit='nanosecond')}) + return normalization.transform_coords( + ['frame_time'], graph={'frame_time': lambda t: t.to(unit='nanosecond')} + ) def get_energy_axes(ki_params, kf_params): from sciline import Pipeline + from .conservation import providers + params = {} params.update(ki_params) params.update(kf_params) @@ -177,7 +214,9 @@ def get_energy_axes(ki_params, kf_params): def add_momentum_axes(ki_params, kf_params, events, a3: Variable): from sciline import Pipeline + from .conservation import providers + if a3.size != 1: raise ValueError(f'Expected a3 to have 1-entry, not {a3.size}') @@ -195,13 +234,24 @@ def add_momentum_axes(ki_params, kf_params, events, a3: Variable): events.bins.coords['lab_momentum_z'] = pipeline.get(LabMomentumTransferZ).compute() pipeline[TableMomentumTransfer] = pipeline.get(TableMomentumTransfer).compute() - events.bins.coords['table_momentum_x'] = pipeline.get(TableMomentumTransferX).compute().transpose(events.dims) + events.bins.coords['table_momentum_x'] = ( + pipeline.get(TableMomentumTransferX).compute().transpose(events.dims) + ) # events.bins.coords['table_momentum_y'] = pipeline.get(TableMomentumTransferY).compute().transpose(events.dims) - events.bins.coords['table_momentum_z'] = pipeline.get(TableMomentumTransferZ).compute().transpose(events.dims) + events.bins.coords['table_momentum_z'] = ( + pipeline.get(TableMomentumTransferZ).compute().transpose(events.dims) + ) return events -def split(triplets, analyzers, monitors, logs, a3_name: str | None = None, a4_name: str | None = None): +def split( + triplets, + analyzers, + monitors, + logs, + a3_name: str | None = None, + a4_name: str | None = None, +): """Use the (a3, a4) logged value pairs to split triplet, analyzer, and monitor data into single-setting sets Parameters @@ -226,7 +276,9 @@ def split(triplets, analyzers, monitors, logs, a3_name: str | None = None, a4_na A list[[triplet, analyzer, monitor]] of individual (a3, a4) setting(s) """ from scipp import lookup + from ..utils import is_in_coords, split_setting + if a3_name is None: a3_name = 'a3' if a4_name is None: @@ -239,7 +291,10 @@ def split(triplets, analyzers, monitors, logs, a3_name: str | None = None, a4_na a3 = lookup(logs[a3_name]['value'], 'time') a4 = lookup(logs[a4_name]['value'], 'time') - event_graph = {'a3': lambda event_time_zero: a3[event_time_zero], 'a4': lambda event_time_zero: a4[event_time_zero]} + event_graph = { + 'a3': lambda event_time_zero: a3[event_time_zero], + 'a4': lambda event_time_zero: a4[event_time_zero], + } histogram_graph = {'a3': lambda time: a3[time], 'a4': lambda time: a4[time]} def do_split(x, time_name): @@ -250,16 +305,29 @@ def do_split(x, time_name): x = x.group('a3', 'a4') return x - vals = [do_split(x, t) for x, t in ((triplets, 'event_time_zero'), (analyzers, 'time'), (monitors, 'time'))] + vals = [ + do_split(x, t) + for x, t in ( + (triplets, 'event_time_zero'), + (analyzers, 'time'), + (monitors, 'time'), + ) + ] # FIXME this only works because v.sizes['a4'] is always 1 at the moment - vals = [v.flatten(['a3', 'a4'], to='time') if 'a3' in v.dims and 'a4' in v.dims else v for v in vals] + vals = [ + v.flatten(['a3', 'a4'], to='time') if 'a3' in v.dims and 'a4' in v.dims else v + for v in vals + ] n_time = [v.sizes['time'] for v in vals if 'time' in v.dims] if len(n_time): assert all(n == n_time[0] for n in n_time) n_time = n_time[0] - vals = [[v['time', i] if 'time' in v.dims else v for v in vals] for i in range(n_time)] + vals = [ + [v['time', i] if 'time' in v.dims else v for v in vals] + for i in range(n_time) + ] else: vals = [vals] @@ -268,15 +336,22 @@ def do_split(x, time_name): def load_everything(filename, named_components): import scippnexus as snx + source_component = named_components['source'] sample_component = named_components['sample'] with snx.File(filename) as data: group = data['entry/instrument'] if source_component not in group: - raise ValueError(f'Missing source component {source_component} for path-length calculations') + raise ValueError( + f'Missing source component {source_component} for path-length calculations' + ) if sample_component not in group: - raise ValueError(f'Missing sample component {sample_component} for origin identification') - sample = snx.compute_positions(group[sample_component][...], store_transform='transform') + raise ValueError( + f'Missing sample component {sample_component} for origin identification' + ) + sample = snx.compute_positions( + group[sample_component][...], store_transform='transform' + ) triplets = load_all(group, snx.NXdetector) analyzers = load_all(group, snx.NXcrystal) choppers = load_all(group, snx.NXdisk_chopper) @@ -289,12 +364,19 @@ def load_everything(filename, named_components): return sample, triplets, analyzers, choppers, monitors, logs -def one_setting(sample, triplet_events, analyzers, norm_monitor, filename, names, warn_about_a3=True): - - detector_positions = triplet_events.coords['position'] # this is the same as detectors['position'].data! - kf_params, sample_detector_flight_time = find_sample_detector_flight_time(sample, analyzers, detector_positions) +def one_setting( + sample, triplet_events, analyzers, norm_monitor, filename, names, warn_about_a3=True +): + detector_positions = triplet_events.coords[ + 'position' + ] # this is the same as detectors['position'].data! + kf_params, sample_detector_flight_time = find_sample_detector_flight_time( + sample, analyzers, detector_positions + ) sample_events = get_sample_events(triplet_events, sample_detector_flight_time) - ki_params, unwrapped_events, primary = get_unwrapped_events(filename, names['source'], names['sample'], sample_events, names['focus']) + ki_params, unwrapped_events, primary = get_unwrapped_events( + filename, names['source'], names['sample'], sample_events, names['focus'] + ) ei, en, ef = get_energy_axes(ki_params, kf_params) energy_events = sample_events.copy() @@ -307,6 +389,7 @@ def one_setting(sample, triplet_events, analyzers, norm_monitor, filename, names a3 = triplet_events.coords['a3'] else: from scipp import scalar + if warn_about_a3: logger.warning("No a3 present in setting, assuming 0 a3") a3 = scalar(0, unit='deg') @@ -327,16 +410,26 @@ def one_setting(sample, triplet_events, analyzers, norm_monitor, filename, names # 'triplets': triplets, } -def load_precompute(filename: NeXusFileName, named_components, is_simulated: bool=False): + +def load_precompute( + filename: NeXusFileName, named_components, is_simulated: bool = False +): import scippnexus as snx - sample, triplets, analyzers, choppers, monitors, logs = load_everything(filename, named_components) + + sample, triplets, analyzers, choppers, monitors, logs = load_everything( + filename, named_components + ) if is_simulated: for name in triplets: - triplets[name]['data'] = convert_simulated_time_to_frame_time(triplets[name]['data']) + triplets[name]['data'] = convert_simulated_time_to_frame_time( + triplets[name]['data'] + ) for name in triplets: - triplets[name] = snx.compute_positions(triplets[name], store_transform='transform') + triplets[name] = snx.compute_positions( + triplets[name], store_transform='transform' + ) analyzers = combine_analyzers(analyzers, triplets) # detectors = combine_detectors(triplets) @@ -345,9 +438,14 @@ def load_precompute(filename: NeXusFileName, named_components, is_simulated: boo norm_monitor = get_normalization_monitor(monitors, named_components['monitor']) return sample, analyzers, triplet_events, norm_monitor, logs -def component_names(source_component: str | None = None, sample_component: str | None = None, - focus_components: list[str] | None = None, monitor_component: str | None = None, - is_simulated: bool=False): + +def component_names( + source_component: str | None = None, + sample_component: str | None = None, + focus_components: list[str] | None = None, + monitor_component: str | None = None, + is_simulated: bool = False, +): names = { 'source': source_component, 'sample': sample_component, @@ -359,28 +457,52 @@ def component_names(source_component: str | None = None, sample_component: str | 'source': '001_ESS_source', 'sample': '114_sample_stack', 'monitor': '110_frame_3', - 'focus': [FocusComponentName('005_PulseShapingChopper'), FocusComponentName('006_PulseShapingChopper2')], + 'focus': [ + FocusComponentName('005_PulseShapingChopper'), + FocusComponentName('006_PulseShapingChopper2'), + ], } for k, v in sim_components.items(): if names[k] is None: names[k] = v return names -def bifrost(filename: NeXusFileName, - source_component: str | None = None, - sample_component: str | None = None, - focus_components: list[str] | None = None, - monitor_component: str | None = None, - is_simulated: bool=False): + +def bifrost( + filename: NeXusFileName, + source_component: str | None = None, + sample_component: str | None = None, + focus_components: list[str] | None = None, + monitor_component: str | None = None, + is_simulated: bool = False, +): import scipp as sc from tqdm import tqdm + named_components = component_names( - source_component, sample_component, focus_components, monitor_component, is_simulated + source_component, + sample_component, + focus_components, + monitor_component, + is_simulated, + ) + sample, analyzers, triplet_events, norm_monitor, logs = load_precompute( + filename, named_components, is_simulated ) - sample, analyzers, triplet_events, norm_monitor, logs = load_precompute(filename, named_components, is_simulated) settings = split(triplet_events, analyzers, norm_monitor, logs) - data = [one_setting(sample, one_triplet_events, one_analyzers, one_monitor, filename, named_components) - for one_triplet_events, one_analyzers, one_monitor in tqdm(settings, desc='(a3, a4) settings')] + data = [ + one_setting( + sample, + one_triplet_events, + one_analyzers, + one_monitor, + filename, + named_components, + ) + for one_triplet_events, one_analyzers, one_monitor in tqdm( + settings, desc='(a3, a4) settings' + ) + ] return {k: sc.concat([d[k] for d in data], 'setting') for k in data[0]} @@ -416,23 +538,38 @@ def bifrost(filename: NeXusFileName, # return {k: v for k, v in zip(keys, dask.compute(*futures))} -def bifrost_single(filename: NeXusFileName, - source_component: str | None = None, - sample_component: str | None = None, - focus_components: list[str] | None = None, - monitor_component: str | None = None, - is_simulated: bool = False, - extras: bool = False): +def bifrost_single( + filename: NeXusFileName, + source_component: str | None = None, + sample_component: str | None = None, + focus_components: list[str] | None = None, + monitor_component: str | None = None, + is_simulated: bool = False, + extras: bool = False, +): named_components = component_names( - source_component, sample_component, focus_components, monitor_component, is_simulated + source_component, + sample_component, + focus_components, + monitor_component, + is_simulated, + ) + sample, analyzers, triplet_events, norm_monitor, logs = load_precompute( + filename, named_components, is_simulated ) - sample, analyzers, triplet_events, norm_monitor, logs = load_precompute(filename, named_components, is_simulated) - data = one_setting(sample, triplet_events, analyzers, norm_monitor, filename, named_components, warn_about_a3=False) + data = one_setting( + sample, + triplet_events, + analyzers, + norm_monitor, + filename, + named_components, + warn_about_a3=False, + ) if extras: data['sample'] = sample data['logs'] = logs return data - diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 045f82fa4..a0ed846a4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,12 +1,16 @@ -from typing import Type, NewType -from scipp import Variable, DataArray +from typing import NewType, Type + from choppera.primary import PrimarySpectrometer +from scipp import DataArray, Variable + def make_scipp_named_typer(scipp_type): def typer(named: str) -> Type[scipp_type]: return NewType(named, scipp_type) + return typer + variable_type = make_scipp_named_typer(Variable) data_array_type = make_scipp_named_typer(DataArray) @@ -86,4 +90,4 @@ def typer(named: str) -> Type[scipp_type]: EnergyTransfer = variable_type('EnergyTransfer') # Debugging types, likely to be removed -DetectorGeometricA4 = variable_type("DetectorGeometricA4") \ No newline at end of file +DetectorGeometricA4 = variable_type("DetectorGeometricA4") diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py index 48d5b0113..090ef6ab1 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -1,9 +1,12 @@ -from scipp import Variable, DataArray +from scipp import DataArray, Variable def norm(vector: Variable) -> Variable: - from scipp import sqrt, dot, DType - assert vector.dtype == DType.vector3 # "Vector operations require scipp.DType.vector3 elements!" + from scipp import DType, dot, sqrt + + assert ( + vector.dtype == DType.vector3 + ) # "Vector operations require scipp.DType.vector3 elements!" return sqrt(dot(vector, vector)) @@ -31,9 +34,7 @@ def is_in_coords(x: DataArray, name: str): return name in x.coords or (x.bins is not None and name in x.bins.coords) -def split_setting(*args, - arg_coord: str | list[str] | None = None, - **kwargs): +def split_setting(*args, arg_coord: str | list[str] | None = None, **kwargs): """For each of the DataArrays in args, find their segments according to the provided kwargs lookup tables Parameters @@ -50,8 +51,8 @@ def split_setting(*args, >>> split_setting(triplets, monitor['first'], arg_coord=['event_time_zero', 'time'], a3=table(a3_log['value'], 'time')) """ - from itertools import product from collections import namedtuple + from itertools import product if arg_coord is None: raise ValueError("The argument lookup coordinate name(s) must be provided") @@ -67,11 +68,15 @@ def split_setting(*args, def dim_size(k, v): size = 0 for argument, coordinate in zip(args, arg_coord): - a = argument.transform_coords(k, graph={k: lambda x: v[x], 'x': coordinate}, keep_aliases=False) + a = argument.transform_coords( + k, graph={k: lambda x: v[x], 'x': coordinate}, keep_aliases=False + ) if a.bins is not None: a = a.group(k) if size and a.sizes[k] and size != a.sizes[k]: - raise ValueError(f"Earlier-found {k} size, {size}, not consistent with current {a.sizes[k]}") + raise ValueError( + f"Earlier-found {k} size, {size}, not consistent with current {a.sizes[k]}" + ) elif size == 0: size = a.sizes[k] return size @@ -80,7 +85,9 @@ def dim_size(k, v): key = namedtuple('key', dims.keys()) keys = list(dims.keys()) ranges = [range(x) for x in dims.values()] - entries = [key(**{k: v for k, v in zip(keys, values)}) for values in product(*ranges)] + entries = [ + key(**{k: v for k, v in zip(keys, values)}) for values in product(*ranges) + ] graph = {k: lambda x: v[x] for k, v in kwargs.items()} targets = tuple(graph.keys()) @@ -89,7 +96,9 @@ def dim_size(k, v): new_args = [a for a in args] for i, coord in enumerate(arg_coord): graph['x'] = coord - new_args[i] = new_args[i].transform_coords(targets, graph=graph, keep_aliases=False) + new_args[i] = new_args[i].transform_coords( + targets, graph=graph, keep_aliases=False + ) if new_args[i].bins is not None: new_args[i] = new_args[i].group(*targets) diff --git a/packages/essspectroscopy/tests/indirect_test.py b/packages/essspectroscopy/tests/indirect_test.py index e9cb14e53..616c9b00e 100644 --- a/packages/essspectroscopy/tests/indirect_test.py +++ b/packages/essspectroscopy/tests/indirect_test.py @@ -1,27 +1,26 @@ from ess.spectroscopy.indirect import kf as secondary from ess.spectroscopy.indirect import ki as primary - -from scipp import vector, scalar, array, sqrt -from scipp.spatial import rotations_from_rotvecs -from ess.spectroscopy.utils import norm - from ess.spectroscopy.types import ( - SamplePosition, - SampleAnalyzerVector, - DetectorPosition, AnalyzerDetectorVector, - SampleAnalyzerDirection, - ReciprocalLatticeSpacing, - ReciprocalLatticeVectorAbsolute, + DetectorPosition, FinalWavenumber, FinalWavevector, + ReciprocalLatticeSpacing, + ReciprocalLatticeVectorAbsolute, + SampleAnalyzerDirection, + SampleAnalyzerVector, + SampleDetectorFlightTime, SampleDetectorPathLength, - SampleDetectorFlightTime + SamplePosition, ) +from ess.spectroscopy.utils import norm +from scipp import array, scalar, sqrt, vector +from scipp.spatial import rotations_from_rotvecs def vectors_close(a, b, tol=None): - from scipp import dot, sqrt, scalar + from scipp import dot, scalar, sqrt + if tol is None: tol = scalar(1e-8, unit=a.unit) difference = a - b @@ -61,7 +60,7 @@ def test_back_scattering_sample_analyzer_vector(): sample_position = vector([0.0, 0.0, 0.0], unit='m') # The analyzer orientation defines the scattering plane coordinate system: - analyzer_transform = rotations_from_rotvecs(vector([0., 0., 0.], unit='degree')) + analyzer_transform = rotations_from_rotvecs(vector([0.0, 0.0, 0.0], unit='degree')) x = analyzer_transform * vector([1.0, 0.0, 0.0], unit='1') y = analyzer_transform * vector([0.0, 1.0, 0.0], unit='1') @@ -78,8 +77,13 @@ def test_back_scattering_sample_analyzer_vector(): # The detector positions are defined in the coordinate system, then rotated around the analyzer position tubes = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['tube']) * x detector_positions = scalar(1.0, unit='m') * z + tubes - detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions - calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, detector_positions) + detector_positions = ( + analyzer_position + + analyzer_orientation * analyzer_orientation * detector_positions + ) + calculated = secondary.sample_analyzer_vector( + sample_position, analyzer_position, analyzer_orientation, detector_positions + ) # This would be 'right' for fixed tau direction, but we utilize the mosaic and insist on scattering from # the center line of the analyzer @@ -89,16 +93,26 @@ def test_back_scattering_sample_analyzer_vector(): # Offsetting along the analyzer scattering plane normal moves the analyzer intersection point by half wires = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['wire']) * y detector_positions = scalar(1.0, unit='m') * z + wires - detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions - calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, detector_positions) + detector_positions = ( + analyzer_position + + analyzer_orientation * analyzer_orientation * detector_positions + ) + calculated = secondary.sample_analyzer_vector( + sample_position, analyzer_position, analyzer_orientation, detector_positions + ) assert all_vectors_close(calculated, sample_analyzer_vec + wires / 2.0) # Offsetting in both transverse directions at once detector_positions = scalar(1.0, unit='m') * z + wires + tubes - detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions - calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, detector_positions) + detector_positions = ( + analyzer_position + + analyzer_orientation * analyzer_orientation * detector_positions + ) + calculated = secondary.sample_analyzer_vector( + sample_position, analyzer_position, analyzer_orientation, detector_positions + ) # as the x displacement increases, the y displacement should decrease - frac = wires / (1.0 + sqrt(1.0 + (norm(tubes) / scalar(1.0, unit='m'))**2)) + frac = wires / (1.0 + sqrt(1.0 + (norm(tubes) / scalar(1.0, unit='m')) ** 2)) assert all_vectors_close(calculated, sample_analyzer_vec + frac) @@ -109,10 +123,11 @@ def test_sample_analyzer_vector(): # TODO Randomize the detector positions from random import random + sample_position = vector([0.0, 0.0, 0.0], unit='m') # The analyzer orientation defines the scattering plane coordinate system: - analyzer_transform = rotations_from_rotvecs(vector([0., 0., 0.], unit='degree')) + analyzer_transform = rotations_from_rotvecs(vector([0.0, 0.0, 0.0], unit='degree')) x = analyzer_transform * vector([1.0, 0.0, 0.0], unit='1') y = analyzer_transform * vector([0.0, 1.0, 0.0], unit='1') @@ -131,24 +146,37 @@ def test_sample_analyzer_vector(): # The detector positions are defined in the coordinate system, then rotated around the analyzer position tubes = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['tube']) * x detector_positions = scalar(1.0, unit='m') * z + tubes - detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions - calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, detector_positions) + detector_positions = ( + analyzer_position + + analyzer_orientation * analyzer_orientation * detector_positions + ) + calculated = secondary.sample_analyzer_vector( + sample_position, analyzer_position, analyzer_orientation, detector_positions + ) offset = calculated - sample_analyzer_vec assert all_vectors_close(offset, 0 * tubes) # Offsetting along the analyzer scattering plane normal moves the analyzer intersection point by half wires = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['wire']) * y detector_positions = scalar(1.0, unit='m') * z + wires - detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions - calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, - detector_positions) + detector_positions = ( + analyzer_position + + analyzer_orientation * analyzer_orientation * detector_positions + ) + calculated = secondary.sample_analyzer_vector( + sample_position, analyzer_position, analyzer_orientation, detector_positions + ) assert all_vectors_close(calculated, sample_analyzer_vec + wires / 2.0) # Offsetting in both transverse directions at once detector_positions = scalar(1.0, unit='m') * z + wires + tubes - detector_positions = analyzer_position + analyzer_orientation * analyzer_orientation * detector_positions - calculated = secondary.sample_analyzer_vector(sample_position, analyzer_position, analyzer_orientation, - detector_positions) + detector_positions = ( + analyzer_position + + analyzer_orientation * analyzer_orientation * detector_positions + ) + calculated = secondary.sample_analyzer_vector( + sample_position, analyzer_position, analyzer_orientation, detector_positions + ) # as the x displacement increases, the y displacement should decrease frac = wires / (1.0 + sqrt(1.0 + (norm(tubes) / scalar(1.0, unit='m')) ** 2)) assert all_vectors_close(calculated, sample_analyzer_vec + frac) From ad8cc44c5952d0aecf42b562e104bbd2d24c19cd Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 16 Sep 2024 11:48:12 +0200 Subject: [PATCH 031/330] [Ref] move images to _static folder --- .../Screenshot from 2024-08-27 08-20-49.png | Bin .../Screenshot from 2024-08-27 08-23-41.png | Bin .../Screenshot from 2024-08-27 08-24-50.png | Bin .../Screenshot from 2024-08-27 10-54-08.png | Bin .../Screenshot from 2024-08-27 10-55-10.png | Bin .../Screenshot from 2024-08-27 10-56-40.png | Bin .../Screenshot from 2024-08-28 08-12-56.png | Bin .../docs/developer/encountered-issues.md | 19 +++++++++++------- 8 files changed, 12 insertions(+), 7 deletions(-) rename packages/essspectroscopy/docs/{ => _static}/developer/Screenshot from 2024-08-27 08-20-49.png (100%) rename packages/essspectroscopy/docs/{ => _static}/developer/Screenshot from 2024-08-27 08-23-41.png (100%) rename packages/essspectroscopy/docs/{ => _static}/developer/Screenshot from 2024-08-27 08-24-50.png (100%) rename packages/essspectroscopy/docs/{ => _static}/developer/Screenshot from 2024-08-27 10-54-08.png (100%) rename packages/essspectroscopy/docs/{ => _static}/developer/Screenshot from 2024-08-27 10-55-10.png (100%) rename packages/essspectroscopy/docs/{ => _static}/developer/Screenshot from 2024-08-27 10-56-40.png (100%) rename packages/essspectroscopy/docs/{ => _static}/developer/Screenshot from 2024-08-28 08-12-56.png (100%) diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-20-49.png b/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-20-49.png similarity index 100% rename from packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-20-49.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-20-49.png diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-23-41.png b/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-23-41.png similarity index 100% rename from packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-23-41.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-23-41.png diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-24-50.png b/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-24-50.png similarity index 100% rename from packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 08-24-50.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-24-50.png diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-54-08.png b/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-54-08.png similarity index 100% rename from packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-54-08.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-54-08.png diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-55-10.png b/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-55-10.png similarity index 100% rename from packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-55-10.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-55-10.png diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-56-40.png b/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-56-40.png similarity index 100% rename from packages/essspectroscopy/docs/developer/Screenshot from 2024-08-27 10-56-40.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-56-40.png diff --git a/packages/essspectroscopy/docs/developer/Screenshot from 2024-08-28 08-12-56.png b/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-28 08-12-56.png similarity index 100% rename from packages/essspectroscopy/docs/developer/Screenshot from 2024-08-28 08-12-56.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-28 08-12-56.png diff --git a/packages/essspectroscopy/docs/developer/encountered-issues.md b/packages/essspectroscopy/docs/developer/encountered-issues.md index 803440639..71286ff3b 100644 --- a/packages/essspectroscopy/docs/developer/encountered-issues.md +++ b/packages/essspectroscopy/docs/developer/encountered-issues.md @@ -4,13 +4,13 @@ ### Description Comparing the event times when unwrapped and propagated to the sample with the normalization monitor histogram it appeared that too much time had been removed from the recorded frame-times before unwrapping. -![Screenshot from 2024-08-27 08-24-50.png](Screenshot%20from%202024-08-27%2008-24-50.png) +![Screenshot from 2024-08-27 08-24-50.png](../_static/developer/Screenshot%20from%202024-08-27%2008-24-50.png) The calculated time of flight from sample to detector had only been checked relative to an order of magnitude estimate, which was not accurate enough. A more careful estimate shows that neutrons hitting the central pixel of each central tube in the symmetric geometry case should take around 3.3 μsec from sample to detector. -![Screenshot from 2024-08-27 08-20-49.png](Screenshot%20from%202024-08-27%2008-20-49.png) +![Screenshot from 2024-08-27 08-20-49.png](../_static/developer/Screenshot%20from%202024-08-27%2008-20-49.png) ### Cause The sample-to-detector time-of-flight depends on the square root of the energy of the neutron, @@ -24,13 +24,13 @@ This then produced the wrong scattering angle, the wrong wavevector magnitude, a ### Resolution Correcting the calculation also corrected the per detector pixel energies -![Screenshot from 2024-08-27 10-54-08.png](Screenshot%20from%202024-08-27%2010-54-08.png) +![Screenshot from 2024-08-27 10-54-08.png](../_static/developer/Screenshot%20from%202024-08-27%2010-54-08.png) The calculated sample-to-detector time-of-flights are consistent with the limited hand calculated values -![Screenshot from 2024-08-27 10-55-10.png](Screenshot%20from%202024-08-27%2010-55-10.png) +![Screenshot from 2024-08-27 10-55-10.png](../_static/developer/Screenshot%20from%202024-08-27%2010-55-10.png) And the unwrapped time-at-sample seems more consistent with the monitor histogram. -![Screenshot from 2024-08-27 10-56-40.png](Screenshot%20from%202024-08-27%2010-56-40.png) +![Screenshot from 2024-08-27 10-56-40.png](../_static/developer/Screenshot%20from%202024-08-27%2010-56-40.png) ## Wrong pixel indexing? @@ -43,11 +43,16 @@ This should mean that the first 900 pixel's events arrive at a later time-of-fli (barring wrap-around at the frame boundary). Instead, the opposite is shown -![Screenshot from 2024-08-28 08-12-56.png](Screenshot%20from%202024-08-28%2008-12-56.png) +![Screenshot from 2024-08-28 08-12-56.png](../_static/developer/Screenshot%20from%202024-08-28%2008-12-56.png) ### Cause This could indicate a problem with the read geometry per pixel, but that seems unlikely given that the final energy per pixel is now correct (see above). Therefore, the likely culprit lies somewhere in the conversion to pixel indexing from charge division in the McStas simulation or EFU binary, -or from EFU pixel identifiers to position in the moreniius translation of McStas to NeXus. \ No newline at end of file +or from EFU pixel identifiers to position in the moreniius translation of McStas to NeXus. + +### Solution +The charge division was, effectively, reversed by switching the `A` and `B` values used in the McStas simulations. +This seems to have fixed the problem, and highlights the need to systematically verify the meaning of signals +through all stages of the real instrument. \ No newline at end of file From 311ddb6ed9e13f8fec1cb8a5a7f9c8f0e7cda3f9 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 16 Sep 2024 11:51:42 +0200 Subject: [PATCH 032/330] [Ref] remove pinned dependencies --- packages/essspectroscopy/pyproject.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 0c73551b4..8d10cc45f 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,13 +30,13 @@ requires-python = ">=3.10" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "sciline==24.6.3", - "scipp==24.9.1", - "scippneutron==24.8.0", - "scippnexus==24.9.0", - "choppera==0.1.4", - "loguru==0.7.2", - "tqdm==4.66.5", + "sciline>=24.6.3", + "scipp>=24.9.1", + "scippneutron>=24.8.0", + "scippnexus>=24.9.0", + "choppera>=0.1.4", + "loguru", + "tqdm", ] dynamic = ["version"] From 99ae40ab803af6e86b3bd941198e9cfdb65840c6 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 16 Sep 2024 16:13:35 +0200 Subject: [PATCH 033/330] [Add] missing doc strings [Fix] import star, tuples instead of lists --- .../src/ess/spectroscopy/indirect/__init__.py | 4 +- .../ess/spectroscopy/indirect/conservation.py | 33 +- .../src/ess/spectroscopy/indirect/kf.py | 190 +++----- .../src/ess/spectroscopy/indirect/ki.py | 150 +++++- .../spectroscopy/indirect/normalisation.py | 33 +- .../src/ess/spectroscopy/indirect/workflow.py | 429 ++++++++++++++---- 6 files changed, 610 insertions(+), 229 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py index b3b7a992c..d69eb1ec5 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py @@ -1,6 +1,6 @@ from .workflow import bifrost, bifrost_single -__all__ = [ +__all__ = ( "bifrost", "bifrost_single", -] +) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index 195fab2c4..0c695babe 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -1,9 +1,15 @@ -from ess.spectroscopy.types import * from scipp import vector +from ..types import ( + IncidentWavevector, IncidentWavenumber, FinalWavenumber, FinalWavevector, EnergyTransfer, SampleTableAngle, + LabMomentumTransfer, LabMomentumTransferX, LabMomentumTransferY, LabMomentumTransferZ, + TableMomentumTransfer, TableMomentumTransferX, TableMomentumTransferY, TableMomentumTransferZ, + +) from .kf import providers as kf_providers from .ki import providers as ki_providers + # Directions relative to the incident beam coordinate system PERP, VERT, PARALLEL = [vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])] @@ -11,22 +17,26 @@ def lab_momentum_vector( ki: IncidentWavevector, kf: FinalWavevector ) -> LabMomentumTransfer: + """Return the momentum transferred to the sample in the laboratory coordinate system, independent of sample angle""" return kf - ki def lab_momentum_x(q: LabMomentumTransfer) -> LabMomentumTransferX: + """Return the X coordinate of the momentum transferred to the sample in the laboratory coordinate system""" from scipp import dot return dot(PERP, q) def lab_momentum_y(q: LabMomentumTransfer) -> LabMomentumTransferY: + """Return the Y coordinate of the momentum transferred to the sample in the laboratory coordinate system""" from scipp import dot return dot(VERT, q) def lab_momentum_z(q: LabMomentumTransfer) -> LabMomentumTransferZ: + """Return the Z coordinate of the momentum transferred to the sample in the laboratory coordinate system""" from scipp import dot return dot(PARALLEL, q) @@ -37,10 +47,19 @@ def sample_table_momentum_vector( ) -> TableMomentumTransfer: """Rotate the momentum transfer vector into the sample-table coordinate system + Notes + ----- When a3 is zero, the sample-table and lab coordinate systems are the same. That is, Z is along the incident beam, Y is opposite the gravitational force, and X completes the right-handed coordinate system. The sample-table angle, a3, has a rotation vector along Y, such that a positive 90-degree rotation places the sample-table Z along the lab X. + + Parameters + ---------- + a3: + The rotation angle of the sample table around the laboratory Y axis + q: + The momentum transfer in the laboratory coordinate system """ from scipp.spatial import rotations_from_rotvecs @@ -49,34 +68,34 @@ def sample_table_momentum_vector( def sample_table_momentum_x(q: TableMomentumTransfer) -> TableMomentumTransferX: + """Return the X coordinate of the momentum transferred to the sample in the sample-table coordinate system""" from scipp import dot return dot(PERP, q) def sample_table_momentum_y(q: TableMomentumTransfer) -> TableMomentumTransferY: + """Return the Y coordinate of the momentum transferred to the sample in the sample-table coordinate system""" from scipp import dot return dot(VERT, q) def sample_table_momentum_z(q: TableMomentumTransfer) -> TableMomentumTransferZ: + """Return the Z coordinate of the momentum transferred to the sample in the sample-table coordinate system""" from scipp import dot return dot(PARALLEL, q) -# def energy(ei: IncidentEnergy, ef: FinalEnergy) -> EnergyTransfer: -# return ei - ef - - def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: + """Calculate the energy transferred to the sample by a neutron""" from scipp.constants import hbar, neutron_mass return hbar * hbar * (ki * ki - kf * kf) / 2 / neutron_mass -providers = [ +providers = ( *ki_providers, *kf_providers, lab_momentum_vector, @@ -88,4 +107,4 @@ def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: sample_table_momentum_y, sample_table_momentum_z, energy, -] +) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 2341b7957..edf04993a 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -1,4 +1,9 @@ -from ess.spectroscopy.types import * +from ess.spectroscopy.types import ( + SamplePosition, AnalyzerPosition, AnalyzerOrientation, DetectorPosition, SampleAnalyzerVector, + DetectorGeometricA4, AnalyzerDetectorVector, SampleAnalyzerDirection, ReciprocalLatticeVectorAbsolute, + ReciprocalLatticeSpacing, FinalWavenumber, FinalEnergy, FinalWavevector, SampleDetectorPathLength, + SampleDetectorFlightTime, DetectorFrameTime, SampleFrameTime, +) def sample_analyzer_vector( @@ -9,19 +14,27 @@ def sample_analyzer_vector( ) -> SampleAnalyzerVector: """Determine the sample to analyzer-reflection-point vector per detector element - :parameter sample_position: scipp.DType.vector3 + Note + ---- + The shapes of the analyzer position and orientation should be self-consistent and will likely be 1:1. + There is expected to be multiple detector element positions per analyzer which can be represented as + an additional dimension compared to the analyzer shapes. + + Parameters + ---------- + sample_position: scipp.DType.vector3 The (probably singular) sample position, typically (0, 0, 0) - :parameter analyzer_position: scipp.DType.vector3 + analyzer_position: scipp.DType.vector3 The nominal center of the central analyzer blade *surface* - :parameter analyzer_orientation: scipp.DType.rotate3 + analyzer_orientation: scipp.DType.rotate3 The orienting quaternion of the analyzer, used to identify the crystal y-axis - :parameter detector_position: scipp.DType.vector3 + detector_position: scipp.DType.vector3 The position of the detector element - :Note: - The shapes of the analyzer position and orientation should be self-consistent and will likely be 1:1. - There is expected to be multiple detector element positions per analyzer which can be represented as - an additional dimension compared to the analyzer shapes. + Returns + ------- + : + The vector from the sample position to the interaction point on the analyzer for each detector element """ from ess.spectroscopy.utils import norm from scipp import dot, vector @@ -61,6 +74,18 @@ def sample_analyzer_vector( def detector_geometric_a4(vec: SampleAnalyzerVector) -> DetectorGeometricA4: + """Calculate the scattering angle from the incident beam to each detector element + + Parameters + ---------- + vec : scipp.DType.vector3 + The per detector element analyzer interaction position, as determined by `sample_analyzer_vector` + + Returns + ------- + : + The per detector element scattering angle, a4, in degrees. + """ from scipp import atan2, dot, vector lab_x = vector( @@ -70,138 +95,25 @@ def detector_geometric_a4(vec: SampleAnalyzerVector) -> DetectorGeometricA4: return atan2(y=dot(lab_x, vec), x=dot(lab_z, vec)).to(unit='deg') -def fixed_tau_hat_sample_analyzer_vector( - sample_position: SamplePosition, - analyzer_position: AnalyzerPosition, - analyzer_orientation: AnalyzerOrientation, - detector_position: DetectorPosition, -) -> SampleAnalyzerVector: - """Determine the sample to analyzer-reflection-point vector per detector element as the intersection of three planes - - :parameter sample_position: scipp.DType.vector3 - The (probably singular) sample position, typically (0, 0, 0) - :parameter analyzer_position: scipp.DType.vector3 - Any point on the central analyzer blade reflecting plane - :parameter analyzer_orientation: scipp.DType.rotate3 - The orienting quaternion of the analyzer, used to identify the crystal tau and y-axis - :parameter detector_position: scipp.DType.vector3 - The position of the detector element - - :Note: - The shapes of the analyzer position and orientation should be self-consistent and will likely be 1:1. - There is expected to be multiple detector element positions per analyzer which can be represented as - an additional dimension compared to the analyzer shapes. - - :Warning: - This function makes the incorrect assumption that the _direction_ of tau is known, but this breaks the - prismatic analyzer model for BIFROST. In reality, we rely on the finite mosaic spread of the analyzer to - scatter slightly different energies to the different detectors, so this method can not work. - """ - from uuid import uuid4 - - from ess.spectroscopy.utils import norm - from numpy.linalg import lstsq as linalg_least_sqr - from numpy.linalg import matrix_rank - from numpy.linalg import solve as linalg_solve - from scipp import any as sc_any - from scipp import concat, cross, dot, scalar, vector, vectors - - # Scipp does not distinguish between coordinates and directions, so we need to do some extra legwork - # to ensure we can apply the orientation transformation _and_ obtain a dimensionless direction vector - o = vector([0, 0, 0], unit=analyzer_orientation.unit) - x = vector( - [1, 0, 0], unit=analyzer_orientation.unit - ) # McStas defines x parallel to Bragg plane tau - y = vector( - [0, 1, 0], unit=analyzer_orientation.unit - ) # and y perpendicular to the scattering plane - # z is in the Bragg plane and in the scattering plane - - tau, yhat = [ - v / norm(v) - for v in [ - (analyzer_orientation * ei - analyzer_orientation * o) for ei in (x, y) - ] - ] - - v_d = detector_position - sample_position - n_v_d = norm(v_d) - if sc_any(n_v_d == scalar(0.0, unit=sample_position.unit)): - bad = n_v_d == scalar(0.0, unit=sample_position.unit) - n_v_d.values[bad.values] = 1.0 - print(f"Some detector(s) are located at the detector?") - v_d /= n_v_d - - # collect the normal directions for the three planes - n_1, n_2, n_3 = cross(v_d, tau), tau, v_d # each (N_det, 3), or (3,) - # and collect the right-hand side of the three plane equations - b_1 = dot(sample_position, n_1).to( - unit=sample_position.unit - ) # (N_sample, N_det) or (N_det,) - b_2 = dot(analyzer_position, n_2).to(unit=sample_position.unit) # (N_analyzer,) - b_3 = dot(0.5 * sample_position + 0.5 * detector_position, n_3).to( - unit=sample_position.unit - ) - - if ( - n_1.ndim > 0 - or n_2.ndim > 0 - or n_3.ndim > 0 - or b_1.ndim > 0 - or b_2.ndim > 0 - or b_3.ndim > 0 - ): - blob = 0 * (n_1 + n_2 + n_3) # broadcast to a common shape - n_1, n_2, n_3 = [x + blob for x in (n_1, n_2, n_3)] - blob = 0 * (b_1 + b_2 + b_3) # broadcast to a common shape - b_1, b_2, b_3 = [x + blob for x in (b_1, b_2, b_3)] - - new_dim = str(uuid4()) - a = ( - concat([n_1, n_2, n_3], dim=new_dim) - .transpose(dims=n_1.dims + (new_dim,)) - .values - ) # (..., 3, 3) - b = ( - concat([b_1, b_2, b_3], dim=new_dim) - .transpose(dims=n_1.dims + (new_dim,)) - .values - ) # (..., 3) - - # as of numpy 2.0, b must be (..., 3, 1) for broadcasting to work - # https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html - b = b[..., :, None] - # and we need to strip off this dimension after solving - x = linalg_solve(a, b).squeeze(-1) - - # if any of the n_1, n_2, or n_3 are zero (or, equivalently, a linear relationship exists between any two), - # numpy.linalg.solve will not have worked, and probably returned garbage. - if any((mr := matrix_rank(a)) < 3): - from numpy import ndenumerate - - for i, m in ndenumerate(mr): - if m < 3: - x[i] = linalg_least_sqr(a[i], b[i][:, 0])[0] - - analyzer_point = vectors(values=x, dims=n_1.dims, unit=sample_position.unit) - return analyzer_point - sample_position - def analyzer_detector_vector( sample_position: SamplePosition, sample_analyzer_vec: SampleAnalyzerVector, detector_position: DetectorPosition, ) -> AnalyzerDetectorVector: + """Given the sample, analyzer-interaction, and detector element positions, calculate the analyzer-detector vector""" return detector_position - (sample_position + sample_analyzer_vec) def kf_hat(sample_analyzer_vec: SampleAnalyzerVector) -> SampleAnalyzerDirection: + """Calculate the direction of the neutrons for each detector-element, relative to the sample position""" from ess.spectroscopy.utils import norm return sample_analyzer_vec / norm(sample_analyzer_vec) def reciprocal_lattice_spacing(tau_vector: ReciprocalLatticeVectorAbsolute): + """Calculate the distance between lattice planes in, e.g., the analyzer""" from ess.spectroscopy.utils import norm return norm(tau_vector) @@ -212,6 +124,25 @@ def final_wavenumber( analyzer_detector_vec: AnalyzerDetectorVector, tau: ReciprocalLatticeSpacing, ) -> FinalWavenumber: + """Find the wave number of the neutrons reflected to each detector-element + + The wave number and wavelength are inversely proportional with + wavelength = 2 * pi / wavenumber + + Parameters + ---------- + sample_analyzer_vec : scipp.DType.vector3 + The vector from the sample to the analyzer interaction point for each detector element + analyzer_detector_vec: scipp.DType.vector3 + The vector from the analyzer interaction point to its detector element, for each detector element + tau: float-like + The reciprocal lattice plane spacing of the analyzer crystal, likely in inverse angstrom + + Returns + ------- + : + The magnitude of the reflected neutron wave vector for each detector element + """ from ess.spectroscopy.utils import norm from scipp import sqrt @@ -228,6 +159,7 @@ def final_wavenumber( def final_energy(kf: FinalWavenumber) -> FinalEnergy: + """Converts (final) wave number to (final) energy""" from scipp.constants import hbar, neutron_mass return ((hbar * hbar / 2 / neutron_mass) * kf * kf).to(unit='meV') @@ -236,6 +168,7 @@ def final_energy(kf: FinalWavenumber) -> FinalEnergy: def final_wavevector( kf_direction: SampleAnalyzerDirection, kf_magnitude: FinalWavenumber ) -> FinalWavevector: + """Constructs the final wave vector form its direction and magnitude""" return kf_direction * kf_magnitude @@ -243,6 +176,7 @@ def secondary_flight_path_length( sample_analyzer_vec: SampleAnalyzerVector, analyzer_detector_vec: AnalyzerDetectorVector, ) -> SampleDetectorPathLength: + """Returns the distance between the sample and each detector element that a neutron is most likely to travel""" from ess.spectroscopy.utils import norm return norm(sample_analyzer_vec) + norm(analyzer_detector_vec) @@ -251,6 +185,7 @@ def secondary_flight_path_length( def secondary_flight_time( secondary_flight_distance: SampleDetectorPathLength, kf_magnitude: FinalWavenumber ) -> SampleDetectorFlightTime: + """Calculates the most-likely time-of-flight between the sample and each detector element""" from scipp.constants import hbar, neutron_mass velocity = kf_magnitude * hbar / neutron_mass @@ -260,10 +195,11 @@ def secondary_flight_time( def sample_frame_time( detector_time: DetectorFrameTime, secondary_time: SampleDetectorFlightTime ) -> SampleFrameTime: + """For times measured at the detector elements, returns the time each neutron likely interacted with the sample""" return detector_time - secondary_time -providers = [ +providers = ( sample_analyzer_vector, analyzer_detector_vector, kf_hat, @@ -274,4 +210,4 @@ def sample_frame_time( sample_frame_time, final_energy, detector_geometric_a4, -] +) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index cf55345e1..fe51c9f4c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -2,25 +2,55 @@ from __future__ import annotations -# TODO move elsewhere since possibly (probably) too specific to BIFROST. -from ess.spectroscopy.types import * +from ess.spectroscopy.types import ( + NeXusFileName, SourceName, SampleName, FocusComponentNames, FocusComponentName, SourcePosition, SamplePosition, + PrimaryFocusDistance, PrimarySpectrometerObject, PrimaryFocusTime, SourceSamplePathLength, SourceFrequency, + SourceDuration, SourceDelay, SourceVelocities, SourceSampleFlightTime, SampleFrameTime, SampleTime, + IncidentSlowness, IncidentWavenumber, IncidentDirection, IncidentWavelength, IncidentWavevector, IncidentEnergy + +) from scippnexus import Group def determine_name_with_type( instrument: Group, name: str | None, options: list, type_name: str ) -> str: + """Investigate an open NeXus file group for objects with matching name or base type + + Parameter + --------- + instrument: scippnexus.Group + The group to investigate, likely /entry/instrument + name: str + A preferred object name, will be returned if present in the scippnexus.Group + options: list + Should be scippnexus define NeXus object types, e.g., scippnexus.NXdetector + type_name: str + Candidate group members contain this name + + Returns + ------- + : + The matching group-member name + + Raises + ------ + ValueError + If no group member has the specified `name`, + contains the specified `type_name` or is of the specified `option` type + """ if name is not None and name in instrument: return name found = {x for x in instrument if type_name in x.lower()} for option in options: found.update(set(instrument[option])) if len(found) != 1: - raise RuntimeError(f"Could not determine {type_name} name: {found}") + raise ValueError(f"Could not determine {type_name} name: {found}") return list(found)[0] def guess_source_name(file: NeXusFileName) -> SourceName: + """Guess the name of the source in the NeXus instrument file""" from scippnexus import File, NXmoderator, NXsource with File(file) as data: @@ -32,6 +62,7 @@ def guess_source_name(file: NeXusFileName) -> SourceName: def guess_sample_name(file: NeXusFileName) -> SampleName: + """Guess the name of the sample in the NeXus instrument file""" from scippnexus import File, NXsample with File(file) as data: @@ -48,7 +79,18 @@ def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: The order of components in the NeXus file must be consistent with the order of components along the beamline. This assumes that only NXdisk_chopper are used to define a focus distance, and that the first chopper or choppers along the beamline, within a fixed small distance, can define the focus distance. - The component type, primacy, and allowed distance range could be user configurable inputs + The component type, primacy, and allowed distance range could be user configurable inputs. + + Parameters + ---------- + file: NeXusFileName + The (HDF5) NeXus file name that contains an 'entry/instrument' group with one or more + `scippnexus.NXdisk_chopper` groups inside + + Returns + ------- + : + The name or names of the time-focus-defining choppers, given the restrictions noted above """ from scipp import scalar from scippnexus import File, NXdisk_chopper, compute_positions @@ -80,6 +122,7 @@ def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: def source_position(file: NeXusFileName, source: SourceName) -> SourcePosition: + """Extract the position of the named source from a NeXus file""" from scippnexus import File, compute_positions with File(file) as data: @@ -87,6 +130,7 @@ def source_position(file: NeXusFileName, source: SourceName) -> SourcePosition: def sample_position(file: NeXusFileName, sample: SampleName) -> SamplePosition: + """Extract the position of the named sample from a NeXus file""" from scippnexus import File, compute_positions with File(file) as data: @@ -96,6 +140,28 @@ def sample_position(file: NeXusFileName, sample: SampleName) -> SamplePosition: def focus_distance( file: NeXusFileName, origin: SourcePosition, names: FocusComponentNames ) -> PrimaryFocusDistance: + """Extract the average distance from the provided source position to the named components + + Warnings + -------- + This distance is straight-line distance which may not precisely match the path-length that the neutrons take + due to curved guides or other reflecting components. Care should be taken if the primary spectrometer includes + any such components to ensure that the difference in flight path and straight-line path is not important + + Parameters + ---------- + file: NeXusFileName + The name of the HDF5 NeXus file containing the 'entry/instrument' group with the named components + origin: + The position of the source, likely obtained from the same NeXus file + names: list + The name(s) of the components whose average distance is calculated + + Returns + ------- + : + The average straight-line distance from the source position to the named component(s) + """ from scippnexus import File, compute_positions from ..utils import norm @@ -111,6 +177,7 @@ def focus_distance( def focus_time( primary: PrimarySpectrometerObject, distance: PrimaryFocusDistance ) -> PrimaryFocusTime: + """Return the time, relative to the pulse time, that neutrons pass the focus position in a primary spectrometer""" from choppera.nexus import primary_focus_time return primary_focus_time(primary, distance) @@ -119,7 +186,7 @@ def focus_time( def primary_path_length( file: NeXusFileName, source: SourcePosition, sample: SamplePosition ) -> SourceSamplePathLength: - """Compute the primary spectrometer path length + """Compute the primary spectrometer path length from source to sample positions Note: This *requires* that the instrument group *is sorted* along the beam path. HDF5 group entries are sorted @@ -148,6 +215,33 @@ def primary_spectrometer( delay: SourceDelay, velocities: SourceVelocities, ) -> PrimarySpectrometerObject: + """Construct and return a choppera.PrimarySpectrometer object + + Parameters + ---------- + file: + The HDF5 NeXus file with information about the primary spectrometer under 'entry/instrument' + source: + The name of the source component in the NeXus instrument group + sample: + The name of the sample component in the NeXus instrument group + frequency: + The frequency of the source, e.g., scipp.scalar(14.0, unit='Hz') for ESS + duration: + The source pulse duration, e.g., approximately scipp.scalar(3.0, unit='msec') for ESS + delay: + The velocity dependent time delay between source pulse time and neutrons exiting the moderator, + should be 1-D (with dim='wavelength') and have values corresponding to the provided `velocities` + velocities: + The velocities of neutrons produced by the source; must be 1-D (with dim='wavelength') with at least two + values. The velocities and delay times should be the same length, with a 1:1 correspondence. + These values are then used to define the time-slowness phase space polygon produced by each source pulse. + + Returns + ------- + : + A choppera.PrimarySpectrometer object representing the NeXus file contents + """ from choppera.nexus import primary_spectrometer from scippnexus import File @@ -165,6 +259,24 @@ def primary_spectrometer( def primary_pivot_time(primary: PrimarySpectrometerObject) -> SourceSampleFlightTime: + """Return a time, relative to the source pulse time, between neutron-arrival-time periods + + Notes + ----- + The determined pivot time is be before the earliest arrival time of neutrons produced in a source pulse + that then are transmitted through the primary spectrometer, while also being after the latest arrival time + from the preceding pulse. + + Parameters + ---------- + primary: + The choppera.PrimarySpectrometer object + + Returns + ------- + : + The determined pivot time + """ from choppera.nexus import primary_pivot_time as primary_time return primary_time(primary) @@ -173,6 +285,7 @@ def primary_pivot_time(primary: PrimarySpectrometerObject) -> SourceSampleFlight def unwrap_sample_time( times: SampleFrameTime, frequency: SourceFrequency, least: SourceSampleFlightTime ) -> SampleTime: + """Use the pivot time to shift neutron event time offsets, recovering 'real' time after source pulse per event""" from choppera.nexus import unwrap as choppera_unwrap return choppera_unwrap(times, frequency, least) @@ -184,6 +297,24 @@ def incident_slowness( distance: PrimaryFocusDistance, focus: PrimaryFocusTime, ) -> IncidentSlowness: + """Find the slowness of neutrons which pass through the primary spectrometer + + Parameters + ---------- + length: + The path length travelled by neutrons which go through the primary spectrometer + time: + The unwrapped 'wall' time for each event, relative to their producing source pulse + distance: + How far along the primary spectrometer the neutrons travelled before reaching the time-focus point + focus: + The 'wall' time relative to a source pulse time at which all neutrons must have passed the time-focus point + + Returns + ------- + : + The inverse of the velocity for each neutron, that is its 'slowness', which is proportional to wavelength + """ from ..utils import in_same_unit tof = time - in_same_unit(focus, to=time) @@ -192,18 +323,21 @@ def incident_slowness( def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: + """Calculate the incident wavelength from the incident slowness for each neutron""" from scipp.constants import Planck, neutron_mass return (slowness * Planck / neutron_mass).to(unit='angstrom') def incident_wavenumber(slowness: IncidentSlowness) -> IncidentWavenumber: + """Calculate the incident wave number from the incident slowness for each neutron""" from scipp.constants import hbar, neutron_mass return (neutron_mass / hbar / slowness).to(unit='1/angstrom') def incident_direction() -> IncidentDirection: + """Return the incident neutron direction in the laboratory frame, which is defined to be [001]""" from scipp import vector return vector([0, 0, 1.0]) @@ -212,16 +346,18 @@ def incident_direction() -> IncidentDirection: def incident_wavevector( ki_magnitude: IncidentWavenumber, direction: IncidentDirection ) -> IncidentWavevector: + """Find the incident wavevector from its magnitude and direction""" return ki_magnitude * direction def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: + """Convert the incident wavenumber to incident energy in meV""" from scipp.constants import hbar, neutron_mass return ((hbar * hbar / 2 / neutron_mass) * ki * ki).to(unit='meV') -providers = [ +providers = ( sample_position, source_position, guess_sample_name, @@ -239,4 +375,4 @@ def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: incident_wavenumber, incident_wavevector, incident_energy, -] +) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index 6be88a79d..4e9584ad9 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -1,5 +1,9 @@ -from ess.spectroscopy.types import * +from scipp import DataArray +from ..types import ( + IncidentSlowness, SlownessMonitor, MonitorNormalisation, PrimarySpectrometerObject, SourceMonitorPathLength, + SourceMonitorFlightTime, FrameTimeMonitor, SourceFrequency, WallTimeMonitor, PrimaryFocusDistance, PrimaryFocusTime +) def incident_monitor_normalization( slowness: IncidentSlowness, monitor: SlownessMonitor @@ -16,6 +20,7 @@ def incident_monitor_normalization( def monitor_pivot_time( primary: PrimarySpectrometerObject, length: SourceMonitorPathLength ) -> SourceMonitorFlightTime: + """Find the pivot time between single-source-pulse arrival times at the monitor position""" from choppera.nexus import primary_pivot_time_at return primary_pivot_time_at(primary, length) @@ -30,9 +35,12 @@ def monitor_wall_time( Parameters ---------- - monitor: A histogram beam monitor which has with recorded 'frame time' relative to the most-recent source pulse - frequency: The source repetition frequency - least: The minimum wall time between source pulse and arrival at the monitor position + monitor: + A histogram beam monitor which has with recorded 'frame time' relative to the most-recent source pulse + frequency: + The source repetition frequency + least: + The minimum wall time between source pulse and arrival at the monitor position Returns ------- @@ -62,10 +70,15 @@ def monitor_slowness( Parameters ---------- - monitor: A histogram beam monitor which has been converted from recorded 'frame time' to time since producing proton pulse - length: The path length from the source to the monitor - distance: The distance from the source to the time-of-flight defining (chopper) position - focus: The (mean) time from proton pulse to when all neutrons passed the tof defining point + monitor: + A histogram beam monitor which has been converted from recorded 'frame time' to + time since producing proton pulse + length: + The path length from the source to the monitor + distance: + The distance from the source to the time-of-flight defining (chopper) position + focus: + The (mean) time from proton pulse to when all neutrons passed the tof defining point Returns ------- @@ -86,9 +99,9 @@ def monitor_slowness( return DataArray(monitor.data.rename(names), coords={slow: slowness}) -providers = [ +providers = ( incident_monitor_normalization, monitor_pivot_time, monitor_wall_time, monitor_slowness, -] +) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 7ec656791..be160d418 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -1,61 +1,90 @@ from __future__ import annotations - -import sys - from loguru import logger +from scipp import Variable -logger_format = ( - "{time:YYYY-MM-DD HH:mm:ss.SSS} | " - "{level: <8} | " - "{name}:{function}:{line} | " - "{elapsed} {message}" -) -logger.configure(extra={"ip": "", "user": ""}) # Default values -logger.remove() -logger.add(sys.stderr, format=logger_format) +from ..types import NeXusFileName -from ..types import * - -def load_all(group, obj_type): +def _load_all(group, obj_type): + """Helper to find and load all subgroups of a specific scippnexus type""" return {name: obj[...] for name, obj in group[obj_type].items()} -def load_named(group, obj_type, names): +def _load_named(group, obj_type, names): + """Helper to find and load all subgroups of a specific scippnexus type with group name in an allowed set""" return {name: obj[...] for name, obj in group[obj_type].items() if name in names} def ess_source_frequency(): + """Helper to create an input for a sciline workflow, returns the ESS source frequency of 14 Hz""" from scipp import scalar return scalar(14.0, unit='Hz') def ess_source_period(): + """Helper to create an input for a sciline workflow, returns the ESS source period of 1/(14 Hz)""" return (1 / ess_source_frequency()).to(unit='ns') def ess_source_delay(): + """Helper to create an input for a sciline workflow, returns per-wavelength source delays of 0 s""" from scipp import array return array(values=[0, 0.0], dims=['wavelength'], unit='sec', dtype='float64') def ess_source_duration(): + """Helper to create an input for a sciline workflow, returns source pulse duration of 3 msec""" from scipp import scalar return scalar(3.0, unit='msec').to(unit='sec') def ess_source_velocities(): + """Helper to create an input for a sciline workflow, returns per-wavelength source velocity limits + + Notes + ----- + The chosen limits are not based on any properties of the source, but rather entirely on the equivalent + energy range, which is chosen to be ~53 micro electron volts to 530 milli electron volts. + This energy range should be sufficient for all intended incident energies of the ESS spectrometer suite, + but may not be sufficient to capture spurious energies that pass through the real instruments. + + Returns + ------- + : + A 1-D scipp Variable with values=[100, 10000] m/s + """ from scipp import array - return array( - values=[100, 1e4], dims=['wavelength'], unit='m/s' - ) # ~53 ueV to 530 meV + return array(values=[100, 1e4], dims=['wavelength'], unit='m/s') def convert_simulated_time_to_frame_time(data): + """Helper to make McStas simulated event data look more like real data + + McStas has the ability to track the time-of-flight from source to detector for every probabilistic neutron ray. + This is very helpful, but unfortunately real instrument at ESS are not able to record the same information + due to how the timing and data collection systems work. + + Real neutron events will record their event_time_zero most-recent-pulse reference time, and their + event_time_offset detection time relative to that reference time. These two values added together give + a real wall time; and information about the primary spectrometer is necessary to find any time-of-flight + + This function takes event data with per-event coordinate event_time_offset (actually McStas time-of-flight) + and creates a new coordinate frame_time that is the time-of-flight modulo the source repetition period. + + Notes + ----- + If the input data has realistic event_time_offset values, this function should produce frame_time data + which is identical, and will therefore only increase the amount of data stored per event. + + Returns + ------- + : + A copy of the data with extra per-event coordinate frame_time + """ graph = { 'frame_time': lambda event_time_offset: event_time_offset % ess_source_period() } @@ -64,8 +93,27 @@ def convert_simulated_time_to_frame_time(data): ) -def analyzer_per_detector(analyzers, triplets): - """Find the right analyzer name for each detector""" +def analyzer_per_detector(analyzers: list[str], triplets: list[str]) -> dict[str, str]: + """Find the right analyzer name for each detector + + Notes + ----- + Depends heavily on the names of components being preceded by an in-instrument index, + and the analyzer and detector components being separated in index by 2. If either condition changes + this function will need to be modified. + + Parameters + ---------- + analyzers: list[str] + The names of analyzer components, typically generated from the keys of a dict + triplets: dict + The names of triplet detector components, typically generated from the keys of a dict + + Returns + ------- + : + A dictionary with detector name keys and their associated analyzer name values + """ # TODO Update this function if the NeXus group naming changes, or components are added/removed. def correct_index(d, a): @@ -73,14 +121,23 @@ def correct_index(d, a): analyzer_index = detector_index - 2 return a.startswith(str(analyzer_index)) - return { - d: [x for x in analyzers.keys() if correct_index(d, x)][0] - for d in list(triplets.keys()) - } + return {d: [x for x in analyzers if correct_index(d, x)][0] for d in triplets} -def detector_per_pixel(triplets): - """Find the right detector name for every pixel index""" +def detector_per_pixel(triplets: dict) -> dict[int, str]: + """Find the right detector name for every pixel index + + Parameters + ---------- + triplets: dict[str, scipp.DataGroup] + A mapping of detector component name to a loaded scippnexus.NXdetector group, with 'data' group member + that has a 'detector_number' coordinate + + Returns + ------- + : + The mapping of detector_number to detector component name + """ return { i: name for name, det in triplets.items() @@ -88,8 +145,35 @@ def detector_per_pixel(triplets): } -def combine_analyzers(analyzers, triplets): - """Combine needed analyzer properties into a single array, duplicating information, to have per-pixel data""" +def combine_analyzers(analyzers: dict, triplets: dict): + """Combine needed analyzer properties into a single array, duplicating information, to have per-pixel data + + BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, N. + Calculations for the properties of neutrons which make it to each detector pixel need per-pixel data about + the analyzer associated with that pixel. This function collects the required data and combines it into a + single array. + + Analyzer information required to determine the secondary-spectrometer neutron properties are the center-of-mass + position of the analyzer, the orientation of the analyzer, and the lattice spacing separating crystal planes + in the analyzer. + + Notes + ----- + Since there are N pixels per detector, the returned array is strictly N-times larger than necessary, + but the optimization to use only minimal information is left for the future + + Parameters + ---------- + analyzers: dict[str, scipp.DataGroup] + Maps analyzer component name to loaded scippnexus.NXcrystal group + triplets: dict[str, scipp.DataGroup] + Maps detector component name to loaded scippnexus.NXdetector group + + Returns + ------- + : + A single array with 'event_id' pixel dimension and the per-pixel analyzer information + """ from scipp import Dataset, array, concat from scippnexus import compute_positions @@ -98,7 +182,7 @@ def analyzer_extract(obj): return Dataset(data={k: obj[k] for k in ('position', 'transform', 'd_spacing')}) extracted = {k: analyzer_extract(v) for k, v in analyzers.items()} - d2a = analyzer_per_detector(analyzers, triplets) + d2a = analyzer_per_detector(list(analyzers.keys()), list(triplets.keys())) p2d = detector_per_pixel(triplets) p2a = {k: extracted[d2a[v]] for k, v in p2d.items()} @@ -108,7 +192,26 @@ def analyzer_extract(obj): return data -def combine_detectors(triplets): +def combine_detectors(triplets: dict): + """Combine needed detector properties into a single array + + BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, N. + Calculations for the properties of neutrons which make it to each detector pixel need per-pixel data. + This function collects the required data and combines it into a single array. + + Detector information required to determine the secondary-spectrometer neutron properties are the center-of-mass + position of each pixel. + + Parameters + ---------- + triplets: dict[str, scipp.DataGroup] + Maps detector component name to loaded scippnexus.NXdetector group + + Returns + ------- + : + A single array with 'event_id' pixel dimension and the per-pixel center of mass position + """ from scipp import Dataset, concat, sort def extract(obj): @@ -122,9 +225,14 @@ def extract(obj): def find_sample_detector_flight_time(sample, analyzers, detector_positions): + """Use sciline to find the sample to detector flight time per detector pixel""" import numpy as np from sciline import Pipeline + from ..types import ( + SamplePosition, AnalyzerPosition, AnalyzerOrientation, DetectorPosition, ReciprocalLatticeSpacing, + SampleDetectorFlightTime + ) from .kf import providers as kf_providers params = { @@ -140,9 +248,23 @@ def find_sample_detector_flight_time(sample, analyzers, detector_positions): def get_triplet_events(triplets): + """Extract and combine the events from loaded scippneutron.NXdetector groups + + Parameters + ---------- + triplets: + An iterable container of loaded NXdetector groups, each with a 'data' member which contains the + pixel data -- possibly multiple detector-specific (but consistent) dimensions -- with a coordinate + identifying the 'detector_number' + + Returns + ------- + : + The events from each triplet concatenated and sorted by the 'detector_number' + """ from scipp import concat, sort - events = concat([x['data'] for x in triplets.values()], dim='arm').flatten( + events = concat([x['data'] for x in triplets], dim='arm').flatten( to='event_id' ) events = sort(events, events.coords['detector_number']) @@ -150,6 +272,7 @@ def get_triplet_events(triplets): def get_sample_events(triplet_events, sample_detector_flight_times): + """Copy the triplet events structure and offset its frame_time event coordinate to give frame_time at the sample""" events = triplet_events.copy() for coord in ('position', 'x_pixel_offset', 'y_pixel_offset'): del events.coords[coord] @@ -161,8 +284,13 @@ def get_sample_events(triplet_events, sample_detector_flight_times): def get_unwrapped_events( filename, source_name, sample_name, sample_events, focus_components ): + """Use a sciline pipeline to shift frame_time at sample events to time-since-producing-pulse events at sample""" from sciline import Pipeline + from ..types import ( + NeXusFileName, SampleName, SampleFrameTime, SourceName, SourceDelay, SourceDuration, SourceFrequency, + SourceVelocities, FocusComponentNames, PrimarySpectrometerObject, SampleTime + ) from .ki import providers as ki_providers params = { @@ -185,6 +313,23 @@ def get_unwrapped_events( def get_normalization_monitor(monitors, monitor_component, collapse: bool = False): + """Get the data of the named monitor component, converting frame_time to nanoseconds to match event_time_offset + + Parameters + ---------- + monitors: + A dictionary mapping monitor component name to loaded scippneutron.NXmonitor groups + monitor_component: + The name of the monitor component to access + collapse: bool + For some simulated experiments, a parameter was scanned which should not be treated as separate + time points. When provied True, these points are integrated over the 'time' dimension. + + Returns + ------- + : + Monitor data with frame_time converted to nanoseconds to match the timescale used for events + """ normalization = monitors[monitor_component]['data'] if collapse: # This is very specialized to how the simulated scans are done, it needs to be generalized @@ -196,8 +341,27 @@ def get_normalization_monitor(monitors, monitor_component, collapse: bool = Fals def get_energy_axes(ki_params, kf_params): + """Use a sciline pipeline to extract incident_energy, final_energy, and energy_transfer + + Parameters + ---------- + ki_params: + A dictionary of parameters needed by the incident-spectrometer sciline pipeline + kf_params: + A dictionary of parameters needed by the secondary-spectrometer sciline pipeline + + Returns + ------- + ei: + The incident energy + en: + The energy transfer + ef: + The final energy + """ from sciline import Pipeline + from ..types import IncidentEnergy, IncidentWavenumber, FinalEnergy, FinalWavenumber, EnergyTransfer from .conservation import providers params = {} @@ -213,8 +377,32 @@ def get_energy_axes(ki_params, kf_params): def add_momentum_axes(ki_params, kf_params, events, a3: Variable): + """Use a sciline pipeline to extract momentum transfer in the lab and sample-table coordinate systems + + Parameters + ---------- + ki_params: + A dictionary of parameters needed by the incident-spectrometer sciline pipeline + kf_params: + A dictionary of parameters needed by the secondary-spectrometer sciline pipeline + events: + The event data to which the calculated momentum components are appended + a3: + The scalar value of the sample rotation angle describing the events + + Returns + ------- + : + The event data with the two horizontal plane components of the momentum transfer added in the + laboratory coordinate system (independent of a3) and the sample-table coordinate system (rotated by a3 around y) + These new coordinates are named 'lab_momentum_x', 'lab_momentum_z', 'table_momentum_x' and 'table_momentum_z' + """ from sciline import Pipeline + from ..types import ( + SampleTableAngle, LabMomentumTransfer, LabMomentumTransferX, LabMomentumTransferZ, + TableMomentumTransfer, TableMomentumTransferX, TableMomentumTransferZ + ) from .conservation import providers if a3.size != 1: @@ -273,7 +461,8 @@ def split( Returns ------- - A list[[triplet, analyzer, monitor]] of individual (a3, a4) setting(s) + : + A list[[triplet, analyzer, monitor]] of individual (a3, a4) setting(s) """ from scipp import lookup @@ -334,7 +523,31 @@ def do_split(x, time_name): return vals -def load_everything(filename, named_components): +def load_everything(filename: NeXusFileName, named_components: dict[str, str]): + """Load all needed information from the named NeXus HDF5 file + + Parameters + ---------- + filename: + The name of the file to load data from, must have both and 'instrument' and 'parameters' group under 'entry' + named_components: + The file-specific names of (at least) the source and sample group names under 'entry/instrument' + + Returns + ------- + sample: + The loaded sample component group + triplets: + All scippnexus.NXdetector groups under 'entry/instrument' + analyzers: + All scippnexus.NXcrystal groups under 'entry/instrument' + choppers: + All scippnexus.NXdisk_chopper groups under 'entry/instrument' + monitors: + All scippnexus.NXmonitor groups under 'entry/instrument' + logs: + The scippnexus.NXlog groups named 'a3' and 'a4' under 'entry/parameters' + """ import scippnexus as snx source_component = named_components['source'] @@ -352,14 +565,14 @@ def load_everything(filename, named_components): sample = snx.compute_positions( group[sample_component][...], store_transform='transform' ) - triplets = load_all(group, snx.NXdetector) - analyzers = load_all(group, snx.NXcrystal) - choppers = load_all(group, snx.NXdisk_chopper) - monitors = load_all(group, snx.NXmonitor) + triplets = _load_all(group, snx.NXdetector) + analyzers = _load_all(group, snx.NXcrystal) + choppers = _load_all(group, snx.NXdisk_chopper) + monitors = _load_all(group, snx.NXmonitor) # this is very BIFROST simulation specific -- can it be less so? # TODO use the _sample_ orientation itself to define a3 (and goniometer angles?) - logs = load_named(data['entry/parameters'], snx.NXlog, ('a3', 'a4')) + logs = _load_named(data['entry/parameters'], snx.NXlog, ('a3', 'a4')) return sample, triplets, analyzers, choppers, monitors, logs @@ -367,9 +580,8 @@ def load_everything(filename, named_components): def one_setting( sample, triplet_events, analyzers, norm_monitor, filename, names, warn_about_a3=True ): - detector_positions = triplet_events.coords[ - 'position' - ] # this is the same as detectors['position'].data! + """Calculate the event properties for a single (a3, a4) setting""" + detector_positions = triplet_events.coords['position'] kf_params, sample_detector_flight_time = find_sample_detector_flight_time( sample, analyzers, detector_positions ) @@ -412,8 +624,34 @@ def one_setting( def load_precompute( - filename: NeXusFileName, named_components, is_simulated: bool = False + filename: NeXusFileName, named_components: dict[str, str], is_simulated: bool = False ): + """Load data from a NeXus file and perform (a3, a4) independent calculations + + Parameters + ---------- + filename: + The file which contains the data to load + named_components: + The file-specific names of (at least) the source, sample and normalization monitor group names + under 'entry/instrument' + is_simulated: + A flag to indicate if the file comes from a McStas simulation, such that the event_time_offset + needs to be modified to look like real data. + + Returns + ------- + sample: + The sample group loaded from the NeXus file + analyzers: + A single array with all analyzer information needed to calculate secondary-spectrometer parameters + triplet_events: + A single array with the events and detector-pixel information needed to calculate parameters + norm_monitor: + The normalization monitor data with frame_time converted to nanoseconds + logs: + A dictionary of the 'a3' and 'a4' logs from the 'entry/parameter' group in the NeXus file + """ import scippnexus as snx sample, triplets, analyzers, choppers, monitors, logs = load_everything( @@ -433,7 +671,7 @@ def load_precompute( analyzers = combine_analyzers(analyzers, triplets) # detectors = combine_detectors(triplets) - triplet_events = get_triplet_events(triplets) + triplet_events = get_triplet_events(triplets.values()) norm_monitor = get_normalization_monitor(monitors, named_components['monitor']) return sample, analyzers, triplet_events, norm_monitor, logs @@ -446,6 +684,28 @@ def component_names( monitor_component: str | None = None, is_simulated: bool = False, ): + """Return a dictionary mapping component type to component name + + Parameters + ---------- + source_component: str + The user-provided source component name, should exist at 'entry/instrument/{source_component}' in the datafile + sample_component: str + The user-provided sample component name, should exist at 'entry/instrument/{sample_component}' in the datafile + focus_components: list[str] + The user-provided set of component names defining the time-focus position, each should exist under + 'entry/instrument' in the datafile + monitor_component: str + The user-provided normalization monitor component name, should exist at 'entry/instrument/{monitor_component}' + is_simulated: bool + If true, user-provided names will be augmented with the McStas component names for the specific types. + + Returns + ------- + : + A dictionary mapping component type name to group name + """ + from ..types import FocusComponentName names = { 'source': source_component, 'sample': sample_component, @@ -476,6 +736,30 @@ def bifrost( monitor_component: str | None = None, is_simulated: bool = False, ): + """Load a BIFROST data file and convert to S(Q,E) in the sample-table coordinate system + + Parameters + ---------- + filename: + The name of the NeXus file to load + source_component: + The group name under 'entry/instrument' in the NeXus file containing source information + sample_component: + The group name under 'entry/instrument' in the NeXus file containing sample information + focus_components: + The group name or group names under 'entry/instrument' in the NeXus file which define the focus-time + monitor_component: + The group name under 'entry/instrument' in the NeXus file containing normalization monitor information + is_simulated: + Whether the NeXus file comes from a McStas simulation, in which case default component names are set + if not provided and the data is modified to look like real data + + Returns + ------- + A dictionary of data from the workflow, concatenated along a 'setting' dimension corresponding to separate + (a3, a4) grouped data. The entries in the dictionary may not all be useful, and are subject to pruning as + experience is gained with the workflow. + """ import scipp as sc from tqdm import tqdm @@ -506,38 +790,6 @@ def bifrost( return {k: sc.concat([d[k] for d in data], 'setting') for k in data[0]} -# def bifrost_dask(filename: NeXusFileName, -# source_component: str | None = None, -# sample_component: str | None = None, -# focus_components: list[str] | None = None, -# monitor_component: str | None = None, -# is_simulated: bool=False): -# import scipp as sc -# from tqdm.dask import TqdmCallback -# import dask -# named_components = component_names( -# source_component, sample_component, focus_components, monitor_component, is_simulated -# ) -# sample, analyzers, triplet_events, norm_monitor, logs = load_precompute(filename, named_components, is_simulated) -# settings = split(triplet_events, analyzers, norm_monitor, logs) -# -# def concat_one(parts): -# return sc.concat(parts, dim='setting') -# -# do_one = dask.delayed(one_setting) -# concat_one = dask.delayed(concat_one) -# -# # This fails because ... something ... can't be pickled -- scipp things? -# data = [do_one(sample, ev, an, mn, filename, named_components) for ev, an, mn in settings] -# with TqdmCallback(desc="(a3, a4) setting"): -# data = dask.compute(*data) -# -# keys = list(data[0].keys()) -# with TqdmCallback(desc="Combine settings"): -# futures = dask.persist(*[concat_one([d[k] for d in data]) for k in keys]) -# return {k: v for k, v in zip(keys, dask.compute(*futures))} - - def bifrost_single( filename: NeXusFileName, source_component: str | None = None, @@ -547,6 +799,31 @@ def bifrost_single( is_simulated: bool = False, extras: bool = False, ): + """Load a BIFROST data file and convert to S(Q,E) in the laboratory coordinate system + + Parameters + ---------- + filename: + The name of the NeXus file to load + source_component: + The group name under 'entry/instrument' in the NeXus file containing source information + sample_component: + The group name under 'entry/instrument' in the NeXus file containing sample information + focus_components: + The group name or group names under 'entry/instrument' in the NeXus file which define the focus-time + monitor_component: + The group name under 'entry/instrument' in the NeXus file containing normalization monitor information + is_simulated: + Whether the NeXus file comes from a McStas simulation, in which case default component names are set + if not provided and the data is modified to look like real data + extras: + If true, the loaded sample group and 'a3' and 'a4' logs will be returned in the dictionary + + Returns + ------- + A dictionary of data from the workflow. The entries in the dictionary may not all be useful, + and are subject to pruning as experience is gained with the workflow. + """ named_components = component_names( source_component, sample_component, From d5aa3cfdf848b6b6cccfc03c222b97502274dadb Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 16 Sep 2024 16:27:37 +0200 Subject: [PATCH 034/330] [Update] via tox -e deps --- packages/essspectroscopy/.python-version | 1 + packages/essspectroscopy/requirements/base.in | 11 ++- .../essspectroscopy/requirements/base.txt | 77 +++++++++++----- .../essspectroscopy/requirements/basetest.txt | 8 +- packages/essspectroscopy/requirements/ci.txt | 26 +++--- packages/essspectroscopy/requirements/dev.txt | 60 ++++++------- .../essspectroscopy/requirements/docs.txt | 90 ++++++++++--------- .../essspectroscopy/requirements/mypy.txt | 4 +- .../essspectroscopy/requirements/nightly.in | 5 +- .../essspectroscopy/requirements/nightly.txt | 69 ++++++++------ .../essspectroscopy/requirements/static.txt | 17 ++-- .../essspectroscopy/requirements/wheels.txt | 6 +- packages/essspectroscopy/tox.ini | 2 +- 13 files changed, 208 insertions(+), 168 deletions(-) create mode 100644 packages/essspectroscopy/.python-version diff --git a/packages/essspectroscopy/.python-version b/packages/essspectroscopy/.python-version new file mode 100644 index 000000000..35d069c3c --- /dev/null +++ b/packages/essspectroscopy/.python-version @@ -0,0 +1 @@ +{{min_python}} diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 892d2c126..c9f15a911 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,10 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -sciline>=24.02 -scipp>=24.01 -scippneutron>=24.01 -scippnexus>=23.12 +sciline>=24.6.3 +scipp>=24.9.1 +scippneutron>=24.8.0 +scippnexus>=24.9.0 +choppera>=0.1.4 +loguru +tqdm diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 704f8f376..220eb5aa3 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,54 +1,85 @@ -# SHA1:1620711176981be9a0d7abe03b2b6ca1e2fc54b1 +# SHA1:70a2abf0cf0b3f6b18811f7f4f05460f3b48af8b # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # -certifi==2024.2.2 - # via requests -charset-normalizer==3.3.2 - # via requests +choppera==0.1.4 + # via -r base.in +contourpy==1.3.0 + # via matplotlib +cyclebane==24.6.0 + # via sciline +cycler==0.12.1 + # via matplotlib +fonttools==4.53.1 + # via matplotlib h5py==3.11.0 # via # scippneutron # scippnexus -idna==3.7 - # via requests -numpy==1.26.4 +kiwisolver==1.4.7 + # via matplotlib +loguru==0.7.2 + # via -r base.in +matplotlib==3.9.2 + # via + # mpltoolbox + # plopp +mpltoolbox==24.5.1 + # via scippneutron +networkx==3.3 + # via cyclebane +numpy==2.1.1 # via + # choppera + # contourpy # h5py + # matplotlib + # mpltoolbox + # polystar # scipp # scippneutron # scipy -packaging==24.0 - # via pooch -platformdirs==4.2.1 - # via pooch -pooch==1.8.1 +packaging==24.1 + # via matplotlib +pillow==10.4.0 + # via matplotlib +plopp==24.9.1 # via scippneutron +polystar==0.4.4 + # via choppera +pyparsing==3.1.4 + # via matplotlib python-dateutil==2.9.0.post0 - # via scippnexus -requests==2.31.0 - # via pooch -sciline==24.4.1 + # via + # matplotlib + # scippnexus + # strictyaml +sciline==24.6.3 # via -r base.in -scipp==24.6.0 +scipp==24.9.1 # via # -r base.in + # choppera # scippneutron # scippnexus -scippneutron==24.3.0 +scippneutron==24.8.0 # via -r base.in -scippnexus==24.3.1 +scippnexus==24.9.0 # via # -r base.in + # choppera # scippneutron -scipy==1.13.0 +scipy==1.14.1 # via + # choppera # scippneutron # scippnexus six==1.16.0 # via python-dateutil -urllib3==2.2.1 - # via requests +strictyaml==1.7.3 + # via choppera +tqdm==4.66.5 + # via -r base.in diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index b80ba202e..6ede5df4e 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,15 +5,11 @@ # # pip-compile-multi # -exceptiongroup==1.2.1 - # via pytest iniconfig==2.0.0 # via pytest -packaging==24.0 +packaging==24.1 # via pytest pluggy==1.5.0 # via pytest -pytest==8.2.0 +pytest==8.3.3 # via -r basetest.in -tomli==2.0.1 - # via pytest diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 27b9c68fd..08a2d4193 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,9 +5,9 @@ # # pip-compile-multi # -cachetools==5.3.3 +cachetools==5.5.0 # via tox -certifi==2024.2.2 +certifi==2024.8.30 # via requests chardet==5.2.0 # via tox @@ -17,7 +17,7 @@ colorama==0.4.6 # via tox distlib==0.3.8 # via virtualenv -filelock==3.14.0 +filelock==3.16.0 # via # tox # virtualenv @@ -25,32 +25,28 @@ gitdb==4.0.11 # via gitpython gitpython==3.1.43 # via -r ci.in -idna==3.7 +idna==3.10 # via requests -packaging==24.0 +packaging==24.1 # via # -r ci.in # pyproject-api # tox -platformdirs==4.2.1 +platformdirs==4.3.3 # via # tox # virtualenv pluggy==1.5.0 # via tox -pyproject-api==1.6.1 +pyproject-api==1.7.1 # via tox -requests==2.31.0 +requests==2.32.3 # via -r ci.in smmap==5.0.1 # via gitdb -tomli==2.0.1 - # via - # pyproject-api - # tox -tox==4.15.0 +tox==4.18.1 # via -r ci.in -urllib3==2.2.1 +urllib3==2.2.3 # via requests -virtualenv==20.26.1 +virtualenv==20.26.4 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 61cfd1bb9..6b3bbeb05 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -12,9 +12,9 @@ -r static.txt -r test.txt -r wheels.txt -annotated-types==0.6.0 +annotated-types==0.7.0 # via pydantic -anyio==4.3.0 +anyio==4.4.0 # via # httpx # jupyter-server @@ -26,15 +26,15 @@ arrow==1.3.0 # via isoduration async-lru==2.0.4 # via jupyterlab -cffi==1.16.0 +cffi==1.17.1 # via argon2-cffi-bindings click==8.1.7 # via # pip-compile-multi # pip-tools -copier==9.1.1 +copier==9.3.1 # via -r dev.in -dunamai==1.19.2 +dunamai==1.22.0 # via copier fqdn==1.5.1 # via jsonschema @@ -42,38 +42,38 @@ funcy==2.0 # via copier h11==0.14.0 # via httpcore -httpcore==1.0.4 +httpcore==1.0.5 # via httpx -httpx==0.27.0 +httpx==0.27.2 # via jupyterlab isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.9.17 +json5==0.9.25 # via jupyterlab-server -jsonpointer==2.4 +jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.21.1 +jsonschema[format-nongpl]==4.23.0 # via # jupyter-events # jupyterlab-server # nbformat -jupyter-events==0.9.0 +jupyter-events==0.10.0 # via jupyter-server -jupyter-lsp==2.2.2 +jupyter-lsp==2.2.5 # via jupyterlab -jupyter-server==2.12.5 +jupyter-server==2.14.2 # via # jupyter-lsp # jupyterlab # jupyterlab-server # notebook-shim -jupyter-server-terminals==0.5.2 +jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.1.2 +jupyterlab==4.2.5 # via -r dev.in -jupyterlab-server==2.25.3 +jupyterlab-server==2.27.3 # via jupyterlab notebook-shim==0.2.4 # via jupyterlab @@ -81,24 +81,22 @@ overrides==7.7.0 # via jupyter-server pathspec==0.12.1 # via copier -pip-compile-multi==2.6.3 +pip-compile-multi==2.6.4 # via -r dev.in -pip-tools==7.4.0 +pip-tools==7.4.1 # via pip-compile-multi -plumbum==1.8.2 +plumbum==1.8.3 # via copier prometheus-client==0.20.0 # via jupyter-server -pycparser==2.21 +pycparser==2.22 # via cffi -pydantic==2.6.1 +pydantic==2.9.1 # via copier -pydantic-core==2.16.2 +pydantic-core==2.23.3 # via pydantic python-json-logger==2.0.7 # via jupyter-events -pyyaml-include==1.3.2 - # via copier questionary==1.10.0 # via copier rfc3339-validator==0.1.4 @@ -109,27 +107,27 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events -send2trash==1.8.2 +send2trash==1.8.3 # via jupyter-server -sniffio==1.3.0 +sniffio==1.3.1 # via # anyio # httpx -terminado==0.18.0 +terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.8.19.20240106 +types-python-dateutil==2.9.0.20240906 # via arrow uri-template==1.3.0 # via jsonschema -webcolors==1.13 +webcolors==24.8.0 # via jsonschema -websocket-client==1.7.0 +websocket-client==1.8.0 # via jupyter-server -wheel==0.42.0 +wheel==0.44.0 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index eaee8a90a..e17189ce7 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -6,19 +6,17 @@ # pip-compile-multi # -r base.txt -accessible-pygments==0.0.4 +accessible-pygments==0.0.5 # via pydata-sphinx-theme -alabaster==0.7.16 +alabaster==1.0.0 # via sphinx -appnope==0.1.4 - # via ipykernel asttokens==2.4.1 # via stack-data -attrs==23.2.0 +attrs==24.2.0 # via # jsonschema # referencing -babel==2.14.0 +babel==2.16.0 # via # pydata-sphinx-theme # sphinx @@ -28,9 +26,13 @@ beautifulsoup4==4.12.3 # pydata-sphinx-theme bleach==6.1.0 # via nbconvert +certifi==2024.8.30 + # via requests +charset-normalizer==3.3.2 + # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.1 +debugpy==1.8.5 # via ipykernel decorator==5.1.1 # via ipython @@ -42,33 +44,33 @@ docutils==0.21.2 # nbsphinx # pydata-sphinx-theme # sphinx -exceptiongroup==1.2.1 - # via ipython -executing==2.0.1 +executing==2.1.0 # via stack-data -fastjsonschema==2.19.1 +fastjsonschema==2.20.0 # via nbformat +idna==3.10 + # via requests imagesize==1.4.1 # via sphinx -ipykernel==6.29.4 +ipykernel==6.29.5 # via -r docs.in -ipython==8.24.0 +ipython==8.27.0 # via # -r docs.in # ipykernel jedi==0.19.1 # via ipython -jinja2==3.1.3 +jinja2==3.1.4 # via # myst-parser # nbconvert # nbsphinx # sphinx -jsonschema==4.22.0 +jsonschema==4.23.0 # via nbformat jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==8.6.1 +jupyter-client==8.6.2 # via # ipykernel # nbclient @@ -93,13 +95,13 @@ matplotlib-inline==0.1.7 # via # ipykernel # ipython -mdit-py-plugins==0.4.0 +mdit-py-plugins==0.4.2 # via myst-parser mdurl==0.1.2 # via markdown-it-py mistune==3.0.2 # via nbconvert -myst-parser==3.0.1 +myst-parser==4.0.0 # via -r docs.in nbclient==0.10.0 # via nbconvert @@ -110,7 +112,7 @@ nbformat==5.10.4 # nbclient # nbconvert # nbsphinx -nbsphinx==0.9.3 +nbsphinx==0.9.5 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel @@ -120,26 +122,28 @@ parso==0.8.4 # via jedi pexpect==4.9.0 # via ipython -prompt-toolkit==3.0.43 +platformdirs==4.3.3 + # via jupyter-core +prompt-toolkit==3.0.47 # via ipython -psutil==5.9.8 +psutil==6.0.0 # via ipykernel ptyprocess==0.7.0 # via pexpect -pure-eval==0.2.2 +pure-eval==0.2.3 # via stack-data -pydata-sphinx-theme==0.15.2 +pydata-sphinx-theme==0.15.4 # via -r docs.in -pygments==2.17.2 +pygments==2.18.0 # via # accessible-pygments # ipython # nbconvert # pydata-sphinx-theme # sphinx -pyyaml==6.0.1 +pyyaml==6.0.2 # via myst-parser -pyzmq==26.0.3 +pyzmq==26.2.0 # via # ipykernel # jupyter-client @@ -147,15 +151,17 @@ referencing==0.35.1 # via # jsonschema # jsonschema-specifications -rpds-py==0.18.0 +requests==2.32.3 + # via sphinx +rpds-py==0.20.0 # via # jsonschema # referencing snowballstemmer==2.2.0 # via sphinx -soupsieve==2.5 +soupsieve==2.6 # via beautifulsoup4 -sphinx==7.3.7 +sphinx==8.0.2 # via # -r docs.in # myst-parser @@ -164,31 +170,29 @@ sphinx==7.3.7 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==2.1.0 +sphinx-autodoc-typehints==2.4.1 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in -sphinx-design==0.5.0 +sphinx-design==0.6.1 # via -r docs.in -sphinxcontrib-applehelp==1.0.8 +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.6 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.5 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.7 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.10 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx stack-data==0.6.3 # via ipython tinycss2==1.3.0 # via nbconvert -tomli==2.0.1 - # via sphinx -tornado==6.4 +tornado==6.4.1 # via # ipykernel # jupyter-client @@ -204,10 +208,10 @@ traitlets==5.14.3 # nbconvert # nbformat # nbsphinx -typing-extensions==4.11.0 - # via - # ipython - # pydata-sphinx-theme +typing-extensions==4.12.2 + # via pydata-sphinx-theme +urllib3==2.2.3 + # via requests wcwidth==0.2.13 # via prompt-toolkit webencodings==0.5.1 diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index ac2856867..383f872aa 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,9 +6,9 @@ # pip-compile-multi # -r test.txt -mypy==1.8.0 +mypy==1.11.2 # via -r mypy.in mypy-extensions==1.0.0 # via mypy -typing-extensions==4.9.0 +typing-extensions==4.12.2 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 9dbca9b22..dbba71b7f 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,7 +1,10 @@ -r basetest.in # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +scipp>=24.9.1 +choppera>=0.1.4 +loguru +tqdm scippneutron @ git+https://github.com/scipp/scippneutron@main sciline @ git+https://github.com/scipp/sciline@main plopp @ git+https://github.com/scipp/plopp@main diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 9b6d7eb02..5668d0760 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:3c386167be6103fb294aae066742247ee957de4f +# SHA1:ea730da6565cd5faa478a74fbcf95b23f3eb183a # # This file is autogenerated by pip-compile-multi # To update, run: @@ -6,55 +6,64 @@ # pip-compile-multi # -r basetest.txt -certifi==2024.2.2 - # via requests -charset-normalizer==3.3.2 - # via requests -contourpy==1.2.0 +choppera==0.1.4 + # via -r nightly.in +contourpy==1.3.0 # via matplotlib +cyclebane==24.6.0 + # via sciline cycler==0.12.1 # via matplotlib -fonttools==4.49.0 +fonttools==4.53.1 # via matplotlib -h5py==3.10.0 +h5py==3.11.0 # via # scippneutron # scippnexus -idna==3.6 - # via requests -kiwisolver==1.4.5 +kiwisolver==1.4.7 # via matplotlib -matplotlib==3.8.3 - # via plopp -numpy==1.26.4 +loguru==0.7.2 + # via -r nightly.in +matplotlib==3.9.2 # via + # mpltoolbox + # plopp +mpltoolbox==24.5.1 + # via scippneutron +networkx==3.3 + # via cyclebane +numpy==2.1.1 + # via + # choppera # contourpy # h5py # matplotlib + # mpltoolbox + # polystar # scipp # scippneutron # scipy -pillow==10.2.0 +pillow==10.4.0 # via matplotlib -platformdirs==4.2.0 - # via pooch plopp @ git+https://github.com/scipp/plopp@main - # via -r nightly.in -pooch==1.8.1 - # via scippneutron -pyparsing==3.1.1 + # via + # -r nightly.in + # scippneutron +polystar==0.4.4 + # via choppera +pyparsing==3.1.4 # via matplotlib -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # matplotlib # scippnexus -requests==2.31.0 - # via pooch + # strictyaml sciline @ git+https://github.com/scipp/sciline@main # via -r nightly.in -scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +scipp==24.9.1 # via # -r nightly.in + # choppera # scippneutron # scippnexus scippneutron @ git+https://github.com/scipp/scippneutron@main @@ -62,12 +71,16 @@ scippneutron @ git+https://github.com/scipp/scippneutron@main scippnexus @ git+https://github.com/scipp/scippnexus@main # via # -r nightly.in + # choppera # scippneutron -scipy==1.12.0 +scipy==1.14.1 # via + # choppera # scippneutron # scippnexus six==1.16.0 # via python-dateutil -urllib3==2.2.1 - # via requests +strictyaml==1.7.3 + # via choppera +tqdm==4.66.5 + # via -r nightly.in diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 833a84eb0..59cfddf0e 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,20 +9,17 @@ cfgv==3.4.0 # via pre-commit distlib==0.3.8 # via virtualenv -filelock==3.14.0 +filelock==3.16.0 # via virtualenv -identify==2.5.36 +identify==2.6.1 # via pre-commit -nodeenv==1.8.0 +nodeenv==1.9.1 # via pre-commit -platformdirs==4.2.1 +platformdirs==4.3.3 # via virtualenv -pre-commit==3.7.0 +pre-commit==3.8.0 # via -r static.in -pyyaml==6.0.1 +pyyaml==6.0.2 # via pre-commit -virtualenv==20.26.1 +virtualenv==20.26.4 # via pre-commit - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index d1a95de4f..6adb80661 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -5,11 +5,9 @@ # # pip-compile-multi # -build==1.2.1 +build==1.2.2 # via -r wheels.in -packaging==24.0 +packaging==24.1 # via build pyproject-hooks==1.1.0 # via build -tomli==2.0.1 - # via build diff --git a/packages/essspectroscopy/tox.ini b/packages/essspectroscopy/tox.ini index 5a33eea57..8b81c3450 100644 --- a/packages/essspectroscopy/tox.ini +++ b/packages/essspectroscopy/tox.ini @@ -63,5 +63,5 @@ deps = tomli skip_install = true changedir = requirements -commands = python ./make_base.py --nightly scipp,scippneutron,sciline,plopp,scippnexus +commands = python ./make_base.py --nightly scippneutron,sciline,plopp,scippnexus pip-compile-multi -d . --backtracking From f9c6cf8dda449e4206af99240289aeec810ea5e0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:29:14 +0000 Subject: [PATCH 035/330] Apply automatic formatting --- .../ess/spectroscopy/indirect/conservation.py | 19 +++- .../src/ess/spectroscopy/indirect/kf.py | 22 ++++- .../src/ess/spectroscopy/indirect/ki.py | 29 +++++- .../spectroscopy/indirect/normalisation.py | 14 ++- .../src/ess/spectroscopy/indirect/workflow.py | 94 ++++++++++++------- 5 files changed, 127 insertions(+), 51 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index 0c695babe..3e87fdf24 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -1,15 +1,24 @@ from scipp import vector from ..types import ( - IncidentWavevector, IncidentWavenumber, FinalWavenumber, FinalWavevector, EnergyTransfer, SampleTableAngle, - LabMomentumTransfer, LabMomentumTransferX, LabMomentumTransferY, LabMomentumTransferZ, - TableMomentumTransfer, TableMomentumTransferX, TableMomentumTransferY, TableMomentumTransferZ, - + EnergyTransfer, + FinalWavenumber, + FinalWavevector, + IncidentWavenumber, + IncidentWavevector, + LabMomentumTransfer, + LabMomentumTransferX, + LabMomentumTransferY, + LabMomentumTransferZ, + SampleTableAngle, + TableMomentumTransfer, + TableMomentumTransferX, + TableMomentumTransferY, + TableMomentumTransferZ, ) from .kf import providers as kf_providers from .ki import providers as ki_providers - # Directions relative to the incident beam coordinate system PERP, VERT, PARALLEL = [vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index edf04993a..05b9a459d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -1,8 +1,21 @@ from ess.spectroscopy.types import ( - SamplePosition, AnalyzerPosition, AnalyzerOrientation, DetectorPosition, SampleAnalyzerVector, - DetectorGeometricA4, AnalyzerDetectorVector, SampleAnalyzerDirection, ReciprocalLatticeVectorAbsolute, - ReciprocalLatticeSpacing, FinalWavenumber, FinalEnergy, FinalWavevector, SampleDetectorPathLength, - SampleDetectorFlightTime, DetectorFrameTime, SampleFrameTime, + AnalyzerDetectorVector, + AnalyzerOrientation, + AnalyzerPosition, + DetectorFrameTime, + DetectorGeometricA4, + DetectorPosition, + FinalEnergy, + FinalWavenumber, + FinalWavevector, + ReciprocalLatticeSpacing, + ReciprocalLatticeVectorAbsolute, + SampleAnalyzerDirection, + SampleAnalyzerVector, + SampleDetectorFlightTime, + SampleDetectorPathLength, + SampleFrameTime, + SamplePosition, ) @@ -95,7 +108,6 @@ def detector_geometric_a4(vec: SampleAnalyzerVector) -> DetectorGeometricA4: return atan2(y=dot(lab_x, vec), x=dot(lab_z, vec)).to(unit='deg') - def analyzer_detector_vector( sample_position: SamplePosition, sample_analyzer_vec: SampleAnalyzerVector, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index fe51c9f4c..383fe0a97 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -3,11 +3,30 @@ from __future__ import annotations from ess.spectroscopy.types import ( - NeXusFileName, SourceName, SampleName, FocusComponentNames, FocusComponentName, SourcePosition, SamplePosition, - PrimaryFocusDistance, PrimarySpectrometerObject, PrimaryFocusTime, SourceSamplePathLength, SourceFrequency, - SourceDuration, SourceDelay, SourceVelocities, SourceSampleFlightTime, SampleFrameTime, SampleTime, - IncidentSlowness, IncidentWavenumber, IncidentDirection, IncidentWavelength, IncidentWavevector, IncidentEnergy - + FocusComponentName, + FocusComponentNames, + IncidentDirection, + IncidentEnergy, + IncidentSlowness, + IncidentWavelength, + IncidentWavenumber, + IncidentWavevector, + NeXusFileName, + PrimaryFocusDistance, + PrimaryFocusTime, + PrimarySpectrometerObject, + SampleFrameTime, + SampleName, + SamplePosition, + SampleTime, + SourceDelay, + SourceDuration, + SourceFrequency, + SourceName, + SourcePosition, + SourceSampleFlightTime, + SourceSamplePathLength, + SourceVelocities, ) from scippnexus import Group diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index 4e9584ad9..032fe34dd 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -1,10 +1,20 @@ from scipp import DataArray from ..types import ( - IncidentSlowness, SlownessMonitor, MonitorNormalisation, PrimarySpectrometerObject, SourceMonitorPathLength, - SourceMonitorFlightTime, FrameTimeMonitor, SourceFrequency, WallTimeMonitor, PrimaryFocusDistance, PrimaryFocusTime + FrameTimeMonitor, + IncidentSlowness, + MonitorNormalisation, + PrimaryFocusDistance, + PrimaryFocusTime, + PrimarySpectrometerObject, + SlownessMonitor, + SourceFrequency, + SourceMonitorFlightTime, + SourceMonitorPathLength, + WallTimeMonitor, ) + def incident_monitor_normalization( slowness: IncidentSlowness, monitor: SlownessMonitor ) -> MonitorNormalisation: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index be160d418..e4c8db771 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -1,4 +1,5 @@ from __future__ import annotations + from loguru import logger from scipp import Variable @@ -230,8 +231,12 @@ def find_sample_detector_flight_time(sample, analyzers, detector_positions): from sciline import Pipeline from ..types import ( - SamplePosition, AnalyzerPosition, AnalyzerOrientation, DetectorPosition, ReciprocalLatticeSpacing, - SampleDetectorFlightTime + AnalyzerOrientation, + AnalyzerPosition, + DetectorPosition, + ReciprocalLatticeSpacing, + SampleDetectorFlightTime, + SamplePosition, ) from .kf import providers as kf_providers @@ -264,9 +269,7 @@ def get_triplet_events(triplets): """ from scipp import concat, sort - events = concat([x['data'] for x in triplets], dim='arm').flatten( - to='event_id' - ) + events = concat([x['data'] for x in triplets], dim='arm').flatten(to='event_id') events = sort(events, events.coords['detector_number']) return events @@ -288,8 +291,17 @@ def get_unwrapped_events( from sciline import Pipeline from ..types import ( - NeXusFileName, SampleName, SampleFrameTime, SourceName, SourceDelay, SourceDuration, SourceFrequency, - SourceVelocities, FocusComponentNames, PrimarySpectrometerObject, SampleTime + FocusComponentNames, + NeXusFileName, + PrimarySpectrometerObject, + SampleFrameTime, + SampleName, + SampleTime, + SourceDelay, + SourceDuration, + SourceFrequency, + SourceName, + SourceVelocities, ) from .ki import providers as ki_providers @@ -361,7 +373,13 @@ def get_energy_axes(ki_params, kf_params): """ from sciline import Pipeline - from ..types import IncidentEnergy, IncidentWavenumber, FinalEnergy, FinalWavenumber, EnergyTransfer + from ..types import ( + EnergyTransfer, + FinalEnergy, + FinalWavenumber, + IncidentEnergy, + IncidentWavenumber, + ) from .conservation import providers params = {} @@ -400,8 +418,13 @@ def add_momentum_axes(ki_params, kf_params, events, a3: Variable): from sciline import Pipeline from ..types import ( - SampleTableAngle, LabMomentumTransfer, LabMomentumTransferX, LabMomentumTransferZ, - TableMomentumTransfer, TableMomentumTransferX, TableMomentumTransferZ + LabMomentumTransfer, + LabMomentumTransferX, + LabMomentumTransferZ, + SampleTableAngle, + TableMomentumTransfer, + TableMomentumTransferX, + TableMomentumTransferZ, ) from .conservation import providers @@ -624,7 +647,9 @@ def one_setting( def load_precompute( - filename: NeXusFileName, named_components: dict[str, str], is_simulated: bool = False + filename: NeXusFileName, + named_components: dict[str, str], + is_simulated: bool = False, ): """Load data from a NeXus file and perform (a3, a4) independent calculations @@ -706,6 +731,7 @@ def component_names( A dictionary mapping component type name to group name """ from ..types import FocusComponentName + names = { 'source': source_component, 'sample': sample_component, @@ -801,29 +827,29 @@ def bifrost_single( ): """Load a BIFROST data file and convert to S(Q,E) in the laboratory coordinate system - Parameters - ---------- - filename: - The name of the NeXus file to load - source_component: - The group name under 'entry/instrument' in the NeXus file containing source information - sample_component: - The group name under 'entry/instrument' in the NeXus file containing sample information - focus_components: - The group name or group names under 'entry/instrument' in the NeXus file which define the focus-time - monitor_component: - The group name under 'entry/instrument' in the NeXus file containing normalization monitor information - is_simulated: - Whether the NeXus file comes from a McStas simulation, in which case default component names are set - if not provided and the data is modified to look like real data - extras: - If true, the loaded sample group and 'a3' and 'a4' logs will be returned in the dictionary - - Returns - ------- - A dictionary of data from the workflow. The entries in the dictionary may not all be useful, - and are subject to pruning as experience is gained with the workflow. - """ + Parameters + ---------- + filename: + The name of the NeXus file to load + source_component: + The group name under 'entry/instrument' in the NeXus file containing source information + sample_component: + The group name under 'entry/instrument' in the NeXus file containing sample information + focus_components: + The group name or group names under 'entry/instrument' in the NeXus file which define the focus-time + monitor_component: + The group name under 'entry/instrument' in the NeXus file containing normalization monitor information + is_simulated: + Whether the NeXus file comes from a McStas simulation, in which case default component names are set + if not provided and the data is modified to look like real data + extras: + If true, the loaded sample group and 'a3' and 'a4' logs will be returned in the dictionary + + Returns + ------- + A dictionary of data from the workflow. The entries in the dictionary may not all be useful, + and are subject to pruning as experience is gained with the workflow. + """ named_components = component_names( source_component, sample_component, From 81c6b644dc9bfd50ccec089e64ec026a0297cfa2 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 16 Sep 2024 17:38:10 +0200 Subject: [PATCH 036/330] [Fix] linter errors --- .../ess/spectroscopy/indirect/conservation.py | 36 ++- .../src/ess/spectroscopy/indirect/kf.py | 47 +-- .../src/ess/spectroscopy/indirect/ki.py | 102 ++++--- .../spectroscopy/indirect/normalisation.py | 25 +- .../src/ess/spectroscopy/indirect/workflow.py | 272 ++++++++++-------- .../src/ess/spectroscopy/utils.py | 86 +----- .../essspectroscopy/tests/indirect_test.py | 41 ++- 7 files changed, 308 insertions(+), 301 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index 3e87fdf24..22d838ae5 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -26,26 +26,41 @@ def lab_momentum_vector( ki: IncidentWavevector, kf: FinalWavevector ) -> LabMomentumTransfer: - """Return the momentum transferred to the sample in the laboratory coordinate system, independent of sample angle""" + """Return the momentum transferred to the sample in the laboratory coordinate system + + The laboratory coordinate system is independent of sample angle + + Parameters + ---------- + ki: + incident wavevector of the neutron + kf: + final wavevector of the neutron + + Returns + ------- + : + The difference kf - ki + """ return kf - ki def lab_momentum_x(q: LabMomentumTransfer) -> LabMomentumTransferX: - """Return the X coordinate of the momentum transferred to the sample in the laboratory coordinate system""" + """Return the X coordinate of the momentum transfer in the lab coordinate system""" from scipp import dot return dot(PERP, q) def lab_momentum_y(q: LabMomentumTransfer) -> LabMomentumTransferY: - """Return the Y coordinate of the momentum transferred to the sample in the laboratory coordinate system""" + """Return the Y coordinate of the momentum transfer in the lab coordinate system""" from scipp import dot return dot(VERT, q) def lab_momentum_z(q: LabMomentumTransfer) -> LabMomentumTransferZ: - """Return the Z coordinate of the momentum transferred to the sample in the laboratory coordinate system""" + """Return the Z coordinate of the momentum transfer in the lab coordinate system""" from scipp import dot return dot(PARALLEL, q) @@ -58,9 +73,10 @@ def sample_table_momentum_vector( Notes ----- - When a3 is zero, the sample-table and lab coordinate systems are the same. That is, Z is along the incident - beam, Y is opposite the gravitational force, and X completes the right-handed coordinate system. - The sample-table angle, a3, has a rotation vector along Y, such that a positive 90-degree rotation places the + When a3 is zero, the sample-table and lab coordinate systems are the same. + That is, Z is along the incident beam, Y is opposite the gravitational force, + and X completes the right-handed coordinate system. The sample-table angle, a3, + has a rotation vector along Y, such that a positive 90-degree rotation places the sample-table Z along the lab X. Parameters @@ -77,21 +93,21 @@ def sample_table_momentum_vector( def sample_table_momentum_x(q: TableMomentumTransfer) -> TableMomentumTransferX: - """Return the X coordinate of the momentum transferred to the sample in the sample-table coordinate system""" + """Return the X coordinate of the momentum transfer in the sample-table system""" from scipp import dot return dot(PERP, q) def sample_table_momentum_y(q: TableMomentumTransfer) -> TableMomentumTransferY: - """Return the Y coordinate of the momentum transferred to the sample in the sample-table coordinate system""" + """Return the Y coordinate of the momentum transfer in the sample-table system""" from scipp import dot return dot(VERT, q) def sample_table_momentum_z(q: TableMomentumTransfer) -> TableMomentumTransferZ: - """Return the Z coordinate of the momentum transferred to the sample in the sample-table coordinate system""" + """Return the Z coordinate of the momentum transfer in the sample-table system""" from scipp import dot return dot(PARALLEL, q) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 05b9a459d..ec29c7389 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -29,9 +29,10 @@ def sample_analyzer_vector( Note ---- - The shapes of the analyzer position and orientation should be self-consistent and will likely be 1:1. - There is expected to be multiple detector element positions per analyzer which can be represented as - an additional dimension compared to the analyzer shapes. + The shapes of the analyzer position and orientation should be self-consistent + and will likely be 1:1. There is expected to be multiple detector element positions + per analyzer which can be represented as an additional dimension compared to + the analyzer shapes. Parameters ---------- @@ -47,13 +48,15 @@ def sample_analyzer_vector( Returns ------- : - The vector from the sample position to the interaction point on the analyzer for each detector element + The vector from the sample position to the interaction point on the analyzer + for each detector element """ from ess.spectroscopy.utils import norm from scipp import dot, vector - # Scipp does not distinguish between coordinates and directions, so we need to do some extra legwork - # to ensure we can apply the orientation transformation _and_ obtain a dimensionless direction vector + # Scipp does not distinguish between coordinates and directions, so we need to do + # some extra legwork to ensure we can apply the orientation transformation + # _and_ obtain a dimensionless direction vector o = vector([0, 0, 0], unit=analyzer_orientation.unit) y = vector( [0, 1, 0], unit=analyzer_orientation.unit @@ -65,12 +68,13 @@ def sample_analyzer_vector( sample_detector_vector = detector_position - sample_position sd_out_of_plane = dot(sample_detector_vector, yhat) - # the sample-detector vector is the sum of sample-analyzer, analyzer-detector-center, the out-of-plane vector + # the sample-detector vector is the sum of sample-analyzer, + # analyzer-detector-center, the out-of-plane vector analyzer_detector_center_vector = ( sample_detector_vector - sample_analyzer_center_vector - sd_out_of_plane * yhat ) - # TODO Consider requiring that dot(analyzer_position - sample_position, yhat) is zero? + # TODO Consider requiring that dot(analyzer_position-sample_position, yhat) is zero? sample_analyzer_center_distance = norm(sample_analyzer_center_vector) @@ -92,7 +96,8 @@ def detector_geometric_a4(vec: SampleAnalyzerVector) -> DetectorGeometricA4: Parameters ---------- vec : scipp.DType.vector3 - The per detector element analyzer interaction position, as determined by `sample_analyzer_vector` + The per detector element analyzer interaction position, as determined + by `sample_analyzer_vector` Returns ------- @@ -113,12 +118,12 @@ def analyzer_detector_vector( sample_analyzer_vec: SampleAnalyzerVector, detector_position: DetectorPosition, ) -> AnalyzerDetectorVector: - """Given the sample, analyzer-interaction, and detector element positions, calculate the analyzer-detector vector""" + """Calculate the analyzer-detector vector""" return detector_position - (sample_position + sample_analyzer_vec) def kf_hat(sample_analyzer_vec: SampleAnalyzerVector) -> SampleAnalyzerDirection: - """Calculate the direction of the neutrons for each detector-element, relative to the sample position""" + """Calculate the direction of the neutrons for each detector-element""" from ess.spectroscopy.utils import norm return sample_analyzer_vec / norm(sample_analyzer_vec) @@ -144,11 +149,14 @@ def final_wavenumber( Parameters ---------- sample_analyzer_vec : scipp.DType.vector3 - The vector from the sample to the analyzer interaction point for each detector element + The vector from the sample to the analyzer interaction point for each + detector element analyzer_detector_vec: scipp.DType.vector3 - The vector from the analyzer interaction point to its detector element, for each detector element + The vector from the analyzer interaction point to its detector element, + for each detector element tau: float-like - The reciprocal lattice plane spacing of the analyzer crystal, likely in inverse angstrom + The reciprocal lattice plane spacing of the analyzer crystal, + likely in inverse angstrom Returns ------- @@ -162,8 +170,9 @@ def final_wavenumber( l_sa = norm(sample_analyzer_vec) l_ad = norm(analyzer_detector_vec) l_diff = norm(sample_analyzer_vec + analyzer_detector_vec) - # 2 theta is measured from the direction S-A, so the internal angle is (pi - 2 theta) - # and the normal law of Cosines is modified accordingly to be -cos(2 theta) instead of cos(pi - 2 theta) + # 2 theta is measured from the direction S-A, so the internal angle is + # (pi - 2 theta) and the normal law of Cosines is modified accordingly to be + # -cos(2 theta) instead of cos(pi - 2 theta) cos2theta = (l_diff * l_diff - l_sa * l_sa - l_ad * l_ad) / (2 * l_sa * l_ad) # law of Cosines gives the Bragg reflected wavevector magnitude @@ -188,7 +197,7 @@ def secondary_flight_path_length( sample_analyzer_vec: SampleAnalyzerVector, analyzer_detector_vec: AnalyzerDetectorVector, ) -> SampleDetectorPathLength: - """Returns the distance between the sample and each detector element that a neutron is most likely to travel""" + """Returns the path-length-distance between the sample and each detector element""" from ess.spectroscopy.utils import norm return norm(sample_analyzer_vec) + norm(analyzer_detector_vec) @@ -197,7 +206,7 @@ def secondary_flight_path_length( def secondary_flight_time( secondary_flight_distance: SampleDetectorPathLength, kf_magnitude: FinalWavenumber ) -> SampleDetectorFlightTime: - """Calculates the most-likely time-of-flight between the sample and each detector element""" + """Calculates the most-likely time-of-flight between the sample and each pixel""" from scipp.constants import hbar, neutron_mass velocity = kf_magnitude * hbar / neutron_mass @@ -207,7 +216,7 @@ def secondary_flight_time( def sample_frame_time( detector_time: DetectorFrameTime, secondary_time: SampleDetectorFlightTime ) -> SampleFrameTime: - """For times measured at the detector elements, returns the time each neutron likely interacted with the sample""" + """Return the time each neutron likely interacted with the sample""" return detector_time - secondary_time diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 383fe0a97..ca797102e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -1,4 +1,6 @@ -"""Utilities for the primary spectrometer of an indirect geometry time-of-flight spectrometer""" +"""Utilities for the primary spectrometer of an +indirect geometry time-of-flight spectrometer +""" from __future__ import annotations @@ -65,7 +67,7 @@ def determine_name_with_type( found.update(set(instrument[option])) if len(found) != 1: raise ValueError(f"Could not determine {type_name} name: {found}") - return list(found)[0] + return next(iter(found)) def guess_source_name(file: NeXusFileName) -> SourceName: @@ -91,25 +93,27 @@ def guess_sample_name(file: NeXusFileName) -> SampleName: def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: - """Guess the names of the components which define the focus distance of a Primary Spectrometer + """Guess the component names which define the focus of a Primary Spectrometer Note ---- - The order of components in the NeXus file must be consistent with the order of components along the beamline. - This assumes that only NXdisk_chopper are used to define a focus distance, and that the first chopper - or choppers along the beamline, within a fixed small distance, can define the focus distance. - The component type, primacy, and allowed distance range could be user configurable inputs. + The order of components in the NeXus file must be consistent with the order of + components along the beamline. This assumes that only NXdisk_chopper are used to + define a focus distance, and that the first chopper or choppers along the beamline, + within a fixed small distance, can define the focus distance. The component type, + primacy, and allowed distance range could be user configurable inputs. Parameters ---------- file: NeXusFileName - The (HDF5) NeXus file name that contains an 'entry/instrument' group with one or more - `scippnexus.NXdisk_chopper` groups inside + The (HDF5) NeXus file name that contains an 'entry/instrument' group with + one or more `scippnexus.NXdisk_chopper` groups inside Returns ------- : - The name or names of the time-focus-defining choppers, given the restrictions noted above + The name or names of the time-focus-defining choppers, given the restrictions + noted above """ from scipp import scalar from scippnexus import File, NXdisk_chopper, compute_positions @@ -159,18 +163,21 @@ def sample_position(file: NeXusFileName, sample: SampleName) -> SamplePosition: def focus_distance( file: NeXusFileName, origin: SourcePosition, names: FocusComponentNames ) -> PrimaryFocusDistance: - """Extract the average distance from the provided source position to the named components + """Find the average distance from the source position to the named components Warnings -------- - This distance is straight-line distance which may not precisely match the path-length that the neutrons take - due to curved guides or other reflecting components. Care should be taken if the primary spectrometer includes - any such components to ensure that the difference in flight path and straight-line path is not important + This distance is straight-line distance which may not precisely match the + path-length that the neutrons take due to curved guides or other reflecting + components. Care should be taken if the primary spectrometer includes any such + components to ensure that the difference in flight path and straight-line path + is not important Parameters ---------- file: NeXusFileName - The name of the HDF5 NeXus file containing the 'entry/instrument' group with the named components + The name of the HDF5 NeXus file containing the 'entry/instrument' group + with the named components origin: The position of the source, likely obtained from the same NeXus file names: list @@ -179,7 +186,8 @@ def focus_distance( Returns ------- : - The average straight-line distance from the source position to the named component(s) + The average straight-line distance from the source position to the named + component(s) """ from scippnexus import File, compute_positions @@ -196,7 +204,7 @@ def focus_distance( def focus_time( primary: PrimarySpectrometerObject, distance: PrimaryFocusDistance ) -> PrimaryFocusTime: - """Return the time, relative to the pulse time, that neutrons pass the focus position in a primary spectrometer""" + """Return the time relative to the pulse time that neutrons pass the focus""" from choppera.nexus import primary_focus_time return primary_focus_time(primary, distance) @@ -208,8 +216,9 @@ def primary_path_length( """Compute the primary spectrometer path length from source to sample positions Note: - This *requires* that the instrument group *is sorted* along the beam path. HDF5 group entries are sorted - alphabetically, so you should ensure that the NeXus file was constructed with this in mind. + This *requires* that the instrument group *is sorted* along the beam path. + HDF5 group entries are sorted alphabetically, so you should ensure that + the NeXus file was constructed with this in mind. """ from scipp import concat, dot, sqrt, sum from scippnexus import File, NXguide, compute_positions @@ -239,7 +248,8 @@ def primary_spectrometer( Parameters ---------- file: - The HDF5 NeXus file with information about the primary spectrometer under 'entry/instrument' + The HDF5 NeXus file with information about the primary spectrometer + under 'entry/instrument' source: The name of the source component in the NeXus instrument group sample: @@ -247,14 +257,18 @@ def primary_spectrometer( frequency: The frequency of the source, e.g., scipp.scalar(14.0, unit='Hz') for ESS duration: - The source pulse duration, e.g., approximately scipp.scalar(3.0, unit='msec') for ESS + The source pulse duration, e.g., approximately scipp.scalar(3.0, unit='msec') + for ESS delay: - The velocity dependent time delay between source pulse time and neutrons exiting the moderator, - should be 1-D (with dim='wavelength') and have values corresponding to the provided `velocities` + The velocity dependent time delay between source pulse time and neutrons + exiting the moderator, should be 1-D (with dim='wavelength') and have values + corresponding to the provided `velocities` velocities: - The velocities of neutrons produced by the source; must be 1-D (with dim='wavelength') with at least two - values. The velocities and delay times should be the same length, with a 1:1 correspondence. - These values are then used to define the time-slowness phase space polygon produced by each source pulse. + The velocities of neutrons produced by the source; must be 1-D + (with dim='wavelength') with at least two values. The velocities and delay + times should be the same length, with a 1:1 correspondence. These values are + then used to define the time-slowness phase space polygon produced by + each source pulse. Returns ------- @@ -266,25 +280,24 @@ def primary_spectrometer( with File(file) as data: instrument = data['entry/instrument'] - assert ( - source in instrument - ), f"The source '{source}' is not in the instrument group" - assert ( - sample in instrument - ), f"The sample '{sample}' is not in the instrument group" + if source not in instrument: + raise KeyError(f"The source '{source}' is not in the instrument group") + if sample not in instrument: + raise KeyError(f"The sample '{sample}' is not in the instrument group") return primary_spectrometer( instrument, source, sample, frequency, duration, delay, velocities ) def primary_pivot_time(primary: PrimarySpectrometerObject) -> SourceSampleFlightTime: - """Return a time, relative to the source pulse time, between neutron-arrival-time periods + """Return a time, relative to the source pulse time, between neutron-arrival-periods Notes ----- - The determined pivot time is be before the earliest arrival time of neutrons produced in a source pulse - that then are transmitted through the primary spectrometer, while also being after the latest arrival time - from the preceding pulse. + The determined pivot time is be before the earliest arrival time of neutrons + produced in a source pulse that then are transmitted through the primary + spectrometer, while also being after the latest arrival time from the preceding + pulse. Parameters ---------- @@ -304,7 +317,8 @@ def primary_pivot_time(primary: PrimarySpectrometerObject) -> SourceSampleFlight def unwrap_sample_time( times: SampleFrameTime, frequency: SourceFrequency, least: SourceSampleFlightTime ) -> SampleTime: - """Use the pivot time to shift neutron event time offsets, recovering 'real' time after source pulse per event""" + """Use the pivot time to shift neutron event time offsets, recovering 'real' + time after source pulse per event""" from choppera.nexus import unwrap as choppera_unwrap return choppera_unwrap(times, frequency, least) @@ -323,16 +337,20 @@ def incident_slowness( length: The path length travelled by neutrons which go through the primary spectrometer time: - The unwrapped 'wall' time for each event, relative to their producing source pulse + The unwrapped 'wall' time for each event, relative to their producing source + pulse distance: - How far along the primary spectrometer the neutrons travelled before reaching the time-focus point + How far along the primary spectrometer the neutrons travelled before + reaching the time-focus point focus: - The 'wall' time relative to a source pulse time at which all neutrons must have passed the time-focus point + The 'wall' time relative to a source pulse time at which all neutrons must + have passed the time-focus point Returns ------- : - The inverse of the velocity for each neutron, that is its 'slowness', which is proportional to wavelength + The inverse of the velocity for each neutron, that is its 'slowness', which + is proportional to wavelength """ from ..utils import in_same_unit @@ -356,7 +374,7 @@ def incident_wavenumber(slowness: IncidentSlowness) -> IncidentWavenumber: def incident_direction() -> IncidentDirection: - """Return the incident neutron direction in the laboratory frame, which is defined to be [001]""" + """Return the incident neutron direction in the laboratory frame""" from scipp import vector return vector([0, 0, 1.0]) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index 032fe34dd..f5d9df21b 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -18,7 +18,7 @@ def incident_monitor_normalization( slowness: IncidentSlowness, monitor: SlownessMonitor ) -> MonitorNormalisation: - """For the incident slowness of each event, return the corresponding monitor intensity""" + """For each event, return the corresponding monitor intensity""" from scipp import lookup coords = list(monitor.coords) @@ -30,7 +30,7 @@ def incident_monitor_normalization( def monitor_pivot_time( primary: PrimarySpectrometerObject, length: SourceMonitorPathLength ) -> SourceMonitorFlightTime: - """Find the pivot time between single-source-pulse arrival times at the monitor position""" + """Find the pivot time between source-pulse arrival times at the monitor position""" from choppera.nexus import primary_pivot_time_at return primary_pivot_time_at(primary, length) @@ -41,12 +41,14 @@ def monitor_wall_time( frequency: SourceFrequency, least: SourceMonitorFlightTime, ) -> WallTimeMonitor: - """Convert the independent 'frame_time' coordinate of a histogram DataArray to the equivalent unwrapped 'wall_time' + """Convert the independent 'frame_time' coordinate of a histogram DataArray to + the equivalent unwrapped 'wall_time' Parameters ---------- monitor: - A histogram beam monitor which has with recorded 'frame time' relative to the most-recent source pulse + A histogram beam monitor which has with recorded 'frame time' relative to + the most-recent source pulse frequency: The source repetition frequency least: @@ -54,7 +56,9 @@ def monitor_wall_time( Returns ------- - The same intensities with independent axis converted to the likely time since neutron-producing proton pulse + : + The same intensities with independent axis converted to the likely time since + neutron-producing proton pulse """ from choppera.nexus import unwrap @@ -76,7 +80,8 @@ def monitor_slowness( distance: PrimaryFocusDistance, focus: PrimaryFocusTime, ) -> SlownessMonitor: - """Convert the independent 'wall_time' coordinate of a histogram DataArray to the equivalent slowness + """Convert the independent 'wall_time' coordinate of a histogram DataArray to + the equivalent slowness Parameters ---------- @@ -88,12 +93,14 @@ def monitor_slowness( distance: The distance from the source to the time-of-flight defining (chopper) position focus: - The (mean) time from proton pulse to when all neutrons passed the tof defining point + The (mean) time from proton pulse to when all neutrons passed the tof + defining point Returns ------- - The same intensities with independent axis converted to the inverse velocity of the neutrons, which scales - linearly with wall time + : + The same intensities with independent axis converted to the inverse velocity + of the neutrons, which scales linearly with wall time """ coords = list(monitor.coords) if len(coords) != 1: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index e4c8db771..1bde8eba3 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -12,45 +12,48 @@ def _load_all(group, obj_type): def _load_named(group, obj_type, names): - """Helper to find and load all subgroups of a specific scippnexus type with group name in an allowed set""" + """Helper to find and load all subgroups of a specific scippnexus type with + group name in an allowed set""" return {name: obj[...] for name, obj in group[obj_type].items() if name in names} def ess_source_frequency(): - """Helper to create an input for a sciline workflow, returns the ESS source frequency of 14 Hz""" + """Input for a sciline workflow, returns the ESS source frequency of 14 Hz""" from scipp import scalar return scalar(14.0, unit='Hz') def ess_source_period(): - """Helper to create an input for a sciline workflow, returns the ESS source period of 1/(14 Hz)""" + """Input for a sciline workflow, returns the ESS source period of 1/(14 Hz)""" return (1 / ess_source_frequency()).to(unit='ns') def ess_source_delay(): - """Helper to create an input for a sciline workflow, returns per-wavelength source delays of 0 s""" + """Input for a sciline workflow, returns per-wavelength source delays of 0 s""" from scipp import array return array(values=[0, 0.0], dims=['wavelength'], unit='sec', dtype='float64') def ess_source_duration(): - """Helper to create an input for a sciline workflow, returns source pulse duration of 3 msec""" + """Input for a sciline workflow, returns source pulse duration of 3 msec""" from scipp import scalar return scalar(3.0, unit='msec').to(unit='sec') def ess_source_velocities(): - """Helper to create an input for a sciline workflow, returns per-wavelength source velocity limits + """Input for a sciline workflow, returns per-wavelength source velocity limits Notes ----- - The chosen limits are not based on any properties of the source, but rather entirely on the equivalent - energy range, which is chosen to be ~53 micro electron volts to 530 milli electron volts. - This energy range should be sufficient for all intended incident energies of the ESS spectrometer suite, - but may not be sufficient to capture spurious energies that pass through the real instruments. + The chosen limits are not based on any properties of the source, but rather + entirely on the equivalent energy range, which is chosen to be + ~53 micro electron volts to 530 milli electron volts. This energy range should + be sufficient for all intended incident energies of the ESS spectrometer suite, + but may not be sufficient to capture spurious energies that pass through + the real instruments. Returns ------- @@ -65,21 +68,25 @@ def ess_source_velocities(): def convert_simulated_time_to_frame_time(data): """Helper to make McStas simulated event data look more like real data - McStas has the ability to track the time-of-flight from source to detector for every probabilistic neutron ray. - This is very helpful, but unfortunately real instrument at ESS are not able to record the same information - due to how the timing and data collection systems work. + McStas has the ability to track the time-of-flight from source to detector for + every probabilistic neutron ray. This is very helpful, but unfortunately real + instrument at ESS are not able to record the same information due to how the + timing and data collection systems work. - Real neutron events will record their event_time_zero most-recent-pulse reference time, and their - event_time_offset detection time relative to that reference time. These two values added together give - a real wall time; and information about the primary spectrometer is necessary to find any time-of-flight + Real neutron events will record their event_time_zero most-recent-pulse reference + time, and their event_time_offset detection time relative to that reference time. + These two values added together give a real wall time; and information about the + primary spectrometer is necessary to find any time-of-flight - This function takes event data with per-event coordinate event_time_offset (actually McStas time-of-flight) - and creates a new coordinate frame_time that is the time-of-flight modulo the source repetition period. + This function takes event data with per-event coordinate event_time_offset + (actually McStas time-of-flight) and creates a new coordinate frame_time that is + the time-of-flight modulo the source repetition period. Notes ----- - If the input data has realistic event_time_offset values, this function should produce frame_time data - which is identical, and will therefore only increase the amount of data stored per event. + If the input data has realistic event_time_offset values, this function should + produce frame_time data which is identical, and will therefore only increase + the amount of data stored per event. Returns ------- @@ -100,15 +107,16 @@ def analyzer_per_detector(analyzers: list[str], triplets: list[str]) -> dict[str Notes ----- Depends heavily on the names of components being preceded by an in-instrument index, - and the analyzer and detector components being separated in index by 2. If either condition changes - this function will need to be modified. + and the analyzer and detector components being separated in index by 2. + If either condition changes this function will need to be modified. Parameters ---------- analyzers: list[str] The names of analyzer components, typically generated from the keys of a dict triplets: dict - The names of triplet detector components, typically generated from the keys of a dict + The names of triplet detector components, typically generated from the + keys of a dict Returns ------- @@ -116,13 +124,13 @@ def analyzer_per_detector(analyzers: list[str], triplets: list[str]) -> dict[str A dictionary with detector name keys and their associated analyzer name values """ - # TODO Update this function if the NeXus group naming changes, or components are added/removed. + # TODO Update this function if the NeXus structure changes. def correct_index(d, a): detector_index = int(d.split('_', 1)[0]) analyzer_index = detector_index - 2 return a.startswith(str(analyzer_index)) - return {d: [x for x in analyzers if correct_index(d, x)][0] for d in triplets} + return {d: next(x for x in analyzers if correct_index(d, x)) for d in triplets} def detector_per_pixel(triplets: dict) -> dict[int, str]: @@ -131,8 +139,8 @@ def detector_per_pixel(triplets: dict) -> dict[int, str]: Parameters ---------- triplets: dict[str, scipp.DataGroup] - A mapping of detector component name to a loaded scippnexus.NXdetector group, with 'data' group member - that has a 'detector_number' coordinate + A mapping of detector component name to a loaded scippnexus.NXdetector group, + with 'data' group member that has a 'detector_number' coordinate Returns ------- @@ -147,21 +155,23 @@ def detector_per_pixel(triplets: dict) -> dict[int, str]: def combine_analyzers(analyzers: dict, triplets: dict): - """Combine needed analyzer properties into a single array, duplicating information, to have per-pixel data + """Combine needed analyzer properties into a single array, duplicating information, + to have per-pixel data - BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, N. - Calculations for the properties of neutrons which make it to each detector pixel need per-pixel data about - the analyzer associated with that pixel. This function collects the required data and combines it into a - single array. + BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, + N. Calculations for the properties of neutrons which make it to each detector pixel + need per-pixel data about the analyzer associated with that pixel. This function + collects the required data and combines it into a single array. - Analyzer information required to determine the secondary-spectrometer neutron properties are the center-of-mass - position of the analyzer, the orientation of the analyzer, and the lattice spacing separating crystal planes - in the analyzer. + Analyzer information required to determine the secondary-spectrometer neutron + properties are the center-of-mass position of the analyzer, the orientation of + the analyzer, and the lattice spacing separating crystal planes in the analyzer. Notes ----- - Since there are N pixels per detector, the returned array is strictly N-times larger than necessary, - but the optimization to use only minimal information is left for the future + Since there are N pixels per detector, the returned array is strictly N-times + larger than necessary, but the optimization to use only minimal information is + left for the future Parameters ---------- @@ -173,7 +183,8 @@ def combine_analyzers(analyzers: dict, triplets: dict): Returns ------- : - A single array with 'event_id' pixel dimension and the per-pixel analyzer information + A single array with 'event_id' pixel dimension and the + per-pixel analyzer information """ from scipp import Dataset, array, concat from scippnexus import compute_positions @@ -196,12 +207,13 @@ def analyzer_extract(obj): def combine_detectors(triplets: dict): """Combine needed detector properties into a single array - BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, N. - Calculations for the properties of neutrons which make it to each detector pixel need per-pixel data. - This function collects the required data and combines it into a single array. + BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, + N. Calculations for the properties of neutrons which make it to each detector pixel + need per-pixel data. This function collects the required data and combines it into + a single array. - Detector information required to determine the secondary-spectrometer neutron properties are the center-of-mass - position of each pixel. + Detector information required to determine the secondary-spectrometer neutron + properties are the center-of-mass position of each pixel. Parameters ---------- @@ -211,7 +223,8 @@ def combine_detectors(triplets: dict): Returns ------- : - A single array with 'event_id' pixel dimension and the per-pixel center of mass position + A single array with 'event_id' pixel dimension and the + per-pixel center of mass position """ from scipp import Dataset, concat, sort @@ -258,9 +271,10 @@ def get_triplet_events(triplets): Parameters ---------- triplets: - An iterable container of loaded NXdetector groups, each with a 'data' member which contains the - pixel data -- possibly multiple detector-specific (but consistent) dimensions -- with a coordinate - identifying the 'detector_number' + An iterable container of loaded NXdetector groups, each with a 'data' member + which contains the pixel data -- possibly multiple detector-specific + (but consistent) dimensions -- with a coordinate identifying the + 'detector_number' Returns ------- @@ -275,7 +289,7 @@ def get_triplet_events(triplets): def get_sample_events(triplet_events, sample_detector_flight_times): - """Copy the triplet events structure and offset its frame_time event coordinate to give frame_time at the sample""" + """Return the events with the frame_time coordinate offset to time at the sample""" events = triplet_events.copy() for coord in ('position', 'x_pixel_offset', 'y_pixel_offset'): del events.coords[coord] @@ -287,7 +301,7 @@ def get_sample_events(triplet_events, sample_detector_flight_times): def get_unwrapped_events( filename, source_name, sample_name, sample_events, focus_components ): - """Use a sciline pipeline to shift frame_time at sample events to time-since-producing-pulse events at sample""" + """Shift frame_time at sample events to time-since-pulse events at sample""" from sciline import Pipeline from ..types import ( @@ -325,26 +339,31 @@ def get_unwrapped_events( def get_normalization_monitor(monitors, monitor_component, collapse: bool = False): - """Get the data of the named monitor component, converting frame_time to nanoseconds to match event_time_offset + """Get the data of the named monitor component, converting frame_time to nanoseconds + to match event_time_offset Parameters ---------- monitors: - A dictionary mapping monitor component name to loaded scippneutron.NXmonitor groups + A dictionary mapping monitor component name to loaded scippneutron.NXmonitor + groups monitor_component: The name of the monitor component to access collapse: bool - For some simulated experiments, a parameter was scanned which should not be treated as separate - time points. When provied True, these points are integrated over the 'time' dimension. + For some simulated experiments, a parameter was scanned which should not be + treated as separate time points. When provided True, these points are integrated + over the 'time' dimension. Returns ------- : - Monitor data with frame_time converted to nanoseconds to match the timescale used for events + Monitor data with frame_time converted to nanoseconds to match the timescale + used for events """ normalization = monitors[monitor_component]['data'] if collapse: - # This is very specialized to how the simulated scans are done, it needs to be generalized + # This is very specialized to how the simulated scans are done, + # it needs to be generalized? normalization = normalization.sum(dim='time') # rescale the frame_time axis. Why does it need to be done this way? return normalization.transform_coords( @@ -353,7 +372,7 @@ def get_normalization_monitor(monitors, monitor_component, collapse: bool = Fals def get_energy_axes(ki_params, kf_params): - """Use a sciline pipeline to extract incident_energy, final_energy, and energy_transfer + """Extract incident_energy, final_energy, and energy_transfer Parameters ---------- @@ -395,7 +414,7 @@ def get_energy_axes(ki_params, kf_params): def add_momentum_axes(ki_params, kf_params, events, a3: Variable): - """Use a sciline pipeline to extract momentum transfer in the lab and sample-table coordinate systems + """Extract momentum transfer in the lab and sample-table coordinate systems Parameters ---------- @@ -411,9 +430,11 @@ def add_momentum_axes(ki_params, kf_params, events, a3: Variable): Returns ------- : - The event data with the two horizontal plane components of the momentum transfer added in the - laboratory coordinate system (independent of a3) and the sample-table coordinate system (rotated by a3 around y) - These new coordinates are named 'lab_momentum_x', 'lab_momentum_z', 'table_momentum_x' and 'table_momentum_z' + The event data with the two horizontal plane components of the + momentum transfer added in the laboratory coordinate system (independent of a3) + and the sample-table coordinate system (rotated by a3 around y). + These new coordinates are named 'lab_momentum_x', 'lab_momentum_z', + 'table_momentum_x' and 'table_momentum_z' """ from sciline import Pipeline @@ -441,14 +462,12 @@ def add_momentum_axes(ki_params, kf_params, events, a3: Variable): pipeline[LabMomentumTransfer] = pipeline.get(LabMomentumTransfer).compute() events.bins.coords['lab_momentum_x'] = pipeline.get(LabMomentumTransferX).compute() - # events.bins.coords['lab_momentum_y'] = pipeline.get(LabMomentumTransferY).compute() events.bins.coords['lab_momentum_z'] = pipeline.get(LabMomentumTransferZ).compute() pipeline[TableMomentumTransfer] = pipeline.get(TableMomentumTransfer).compute() events.bins.coords['table_momentum_x'] = ( pipeline.get(TableMomentumTransferX).compute().transpose(events.dims) ) - # events.bins.coords['table_momentum_y'] = pipeline.get(TableMomentumTransferY).compute().transpose(events.dims) events.bins.coords['table_momentum_z'] = ( pipeline.get(TableMomentumTransferZ).compute().transpose(events.dims) ) @@ -463,24 +482,28 @@ def split( a3_name: str | None = None, a4_name: str | None = None, ): - """Use the (a3, a4) logged value pairs to split triplet, analyzer, and monitor data into single-setting sets + """Use the (a3, a4) logged value pairs to split triplet, analyzer, and monitor data + into single-setting sets Parameters ---------- triplets: DataArray - The triplet positions _should_ change with a4 (if simulated, this is certainly not implemented correctly yet) - The event data they contain depends on (a3, a4) [plus any other time-dependent parameter] so must be split. - analyzers: Dataset? - The analyzer position _should_ change with a4 (if simulated, this is certainly not implemented correctly yet) + The triplet positions _should_ change with a4 (if simulated, this is certainly + not implemented correctly yet). The event data they contain depends on + (a3, a4) [plus any other time-dependent parameter] so must be split. + analyzers: + The analyzer position _should_ change with a4 + (if simulated, this is certainly not implemented correctly yet) monitors: DataArray - The histogram (simulated, or real current beam monitor) or event (real fission monitor, etc.?) data is - time-dependent and used to normalize the detector data. It must therefore be split into (a3, a4) sets + The histogram (simulated, or real current beam monitor) or event + (real fission monitor, etc.?) data is time-dependent and used to normalize + the detector data. It must therefore be split into (a3, a4) sets logs: DataGroup Entries built from NXlogs in the real or simulated instrument a3_name: str - The name of the sample table angle log entry in `logs` -- 'a3' for simulated data + The name of the sample table angle log entry in `logs`, 'a3' for simulated data a4_name: str - The name of the detector tank angle log entry in `logs` -- 'a4' for simulated data + The name of the detector tank angle log entry in `logs`, 'a4' for simulated data Returns ------- @@ -489,7 +512,7 @@ def split( """ from scipp import lookup - from ..utils import is_in_coords, split_setting + from ..utils import is_in_coords if a3_name is None: a3_name = 'a3' @@ -534,7 +557,8 @@ def do_split(x, time_name): n_time = [v.sizes['time'] for v in vals if 'time' in v.dims] if len(n_time): - assert all(n == n_time[0] for n in n_time) + if not all(n == n_time[0] for n in n_time): + raise ValueError("Not all values have the same 'time' dimension") n_time = n_time[0] vals = [ [v['time', i] if 'time' in v.dims else v for v in vals] @@ -552,9 +576,11 @@ def load_everything(filename: NeXusFileName, named_components: dict[str, str]): Parameters ---------- filename: - The name of the file to load data from, must have both and 'instrument' and 'parameters' group under 'entry' + The name of the file to load data from, must have both and 'instrument' + and 'parameters' group under 'entry' named_components: - The file-specific names of (at least) the source and sample group names under 'entry/instrument' + The file-specific names of (at least) the source and sample group names + under 'entry/instrument' Returns ------- @@ -579,12 +605,10 @@ def load_everything(filename: NeXusFileName, named_components: dict[str, str]): group = data['entry/instrument'] if source_component not in group: raise ValueError( - f'Missing source component {source_component} for path-length calculations' + f'Missing {source_component=} for path-length calculations' ) if sample_component not in group: - raise ValueError( - f'Missing sample component {sample_component} for origin identification' - ) + raise ValueError(f'Missing {sample_component=} for origin identification') sample = snx.compute_positions( group[sample_component][...], store_transform='transform' ) @@ -620,7 +644,8 @@ def one_setting( energy_events.coords['final_energy'] = ef if 'a3' in triplet_events.coords: - # this _should_ be one (a3, a4) setting, with a single a3 value on triple_events (and norm_monitor) + # this _should_ be one (a3, a4) setting, + # with a single a3 value on triple_events (and norm_monitor) a3 = triplet_events.coords['a3'] else: from scipp import scalar @@ -658,24 +683,27 @@ def load_precompute( filename: The file which contains the data to load named_components: - The file-specific names of (at least) the source, sample and normalization monitor group names - under 'entry/instrument' + The file-specific names of (at least) the source, sample and normalization + monitor group names under 'entry/instrument' is_simulated: - A flag to indicate if the file comes from a McStas simulation, such that the event_time_offset - needs to be modified to look like real data. + A flag to indicate if the file comes from a McStas simulation, such that + the event_time_offset needs to be modified to look like real data. Returns ------- sample: The sample group loaded from the NeXus file analyzers: - A single array with all analyzer information needed to calculate secondary-spectrometer parameters + A single array with all analyzer information needed to calculate + secondary-spectrometer parameters triplet_events: - A single array with the events and detector-pixel information needed to calculate parameters + A single array with the events and detector-pixel information needed + to calculate parameters norm_monitor: The normalization monitor data with frame_time converted to nanoseconds logs: - A dictionary of the 'a3' and 'a4' logs from the 'entry/parameter' group in the NeXus file + A dictionary of the 'a3' and 'a4' logs from the 'entry/parameter' group + in the NeXus file """ import scippnexus as snx @@ -714,16 +742,20 @@ def component_names( Parameters ---------- source_component: str - The user-provided source component name, should exist at 'entry/instrument/{source_component}' in the datafile + The user-provided source component name, should exist at + 'entry/instrument/{source_component}' in the datafile sample_component: str - The user-provided sample component name, should exist at 'entry/instrument/{sample_component}' in the datafile + The user-provided sample component name, should exist at + 'entry/instrument/{sample_component}' in the datafile focus_components: list[str] - The user-provided set of component names defining the time-focus position, each should exist under - 'entry/instrument' in the datafile + The user-provided set of component names defining the time-focus position, + each should exist under 'entry/instrument' in the datafile monitor_component: str - The user-provided normalization monitor component name, should exist at 'entry/instrument/{monitor_component}' + The user-provided normalization monitor component name, should exist at + 'entry/instrument/{monitor_component}' is_simulated: bool - If true, user-provided names will be augmented with the McStas component names for the specific types. + If true, user-provided names will be augmented with the McStas component + names for the specific types. Returns ------- @@ -762,29 +794,36 @@ def bifrost( monitor_component: str | None = None, is_simulated: bool = False, ): - """Load a BIFROST data file and convert to S(Q,E) in the sample-table coordinate system + """Load a BIFROST data file and convert to S(Q,E) + in the sample-table coordinate system Parameters ---------- filename: The name of the NeXus file to load source_component: - The group name under 'entry/instrument' in the NeXus file containing source information + The group name under 'entry/instrument' in the NeXus file containing + source information sample_component: - The group name under 'entry/instrument' in the NeXus file containing sample information + The group name under 'entry/instrument' in the NeXus file containing + sample information focus_components: - The group name or group names under 'entry/instrument' in the NeXus file which define the focus-time + The group name or group names under 'entry/instrument' in the NeXus file + which define the focus-time monitor_component: - The group name under 'entry/instrument' in the NeXus file containing normalization monitor information + The group name under 'entry/instrument' in the NeXus file containing + normalization monitor information is_simulated: - Whether the NeXus file comes from a McStas simulation, in which case default component names are set - if not provided and the data is modified to look like real data + Whether the NeXus file comes from a McStas simulation, in which case default + component names are set if not provided and the data is modified to + look like real data Returns ------- - A dictionary of data from the workflow, concatenated along a 'setting' dimension corresponding to separate - (a3, a4) grouped data. The entries in the dictionary may not all be useful, and are subject to pruning as - experience is gained with the workflow. + A dictionary of data from the workflow, concatenated along a 'setting' dimension + corresponding to separate (a3, a4) grouped data. The entries in the dictionary + may not all be useful, and are subject to pruning as experience is gained with + the workflow. """ import scipp as sc from tqdm import tqdm @@ -825,30 +864,37 @@ def bifrost_single( is_simulated: bool = False, extras: bool = False, ): - """Load a BIFROST data file and convert to S(Q,E) in the laboratory coordinate system + """Load a BIFROST data file and convert to S(Q,E) + in the laboratory coordinate system Parameters ---------- filename: The name of the NeXus file to load source_component: - The group name under 'entry/instrument' in the NeXus file containing source information + The group name under 'entry/instrument' in the NeXus file containing + source information sample_component: - The group name under 'entry/instrument' in the NeXus file containing sample information + The group name under 'entry/instrument' in the NeXus file containing + sample information focus_components: - The group name or group names under 'entry/instrument' in the NeXus file which define the focus-time + The group name or group names under 'entry/instrument' in the NeXus file + which define the focus-time monitor_component: - The group name under 'entry/instrument' in the NeXus file containing normalization monitor information + The group name under 'entry/instrument' in the NeXus file containing + normalization monitor information is_simulated: - Whether the NeXus file comes from a McStas simulation, in which case default component names are set - if not provided and the data is modified to look like real data + Whether the NeXus file comes from a McStas simulation, in which case default + component names are set if not provided and the data is modified to look like + real data extras: - If true, the loaded sample group and 'a3' and 'a4' logs will be returned in the dictionary + If true, the loaded sample group and 'a3' and 'a4' logs will be returned in + the dictionary Returns ------- - A dictionary of data from the workflow. The entries in the dictionary may not all be useful, - and are subject to pruning as experience is gained with the workflow. + A dictionary of data from the workflow. The entries in the dictionary may not + all be useful, and are subject to pruning as experience is gained with the workflow. """ named_components = component_names( source_component, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py index 090ef6ab1..b838e0e1a 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -4,9 +4,9 @@ def norm(vector: Variable) -> Variable: from scipp import DType, dot, sqrt - assert ( - vector.dtype == DType.vector3 - ) # "Vector operations require scipp.DType.vector3 elements!" + if vector.dtype != DType.vector3: + raise ValueError("Vector operations require scipp.DType.vector3 elements") + return sqrt(dot(vector, vector)) @@ -32,83 +32,3 @@ def unit(x): def is_in_coords(x: DataArray, name: str): return name in x.coords or (x.bins is not None and name in x.bins.coords) - - -def split_setting(*args, arg_coord: str | list[str] | None = None, **kwargs): - """For each of the DataArrays in args, find their segments according to the provided kwargs lookup tables - - Parameters - ---------- - args: - The DataArrays for which to perform coordinate lookup - arg_coord: - The coordinate name(s) in each DataArray which are used in the lookup - kwargs: - The named scipp lookup tables used in the conversion - - The coordinate name to use in the lookup might differ depending on the type/source of DataArray - so it should be provided in the keyword argument `lookup_coord` as a list, one name per data array - - >>> split_setting(triplets, monitor['first'], arg_coord=['event_time_zero', 'time'], a3=table(a3_log['value'], 'time')) - """ - from collections import namedtuple - from itertools import product - - if arg_coord is None: - raise ValueError("The argument lookup coordinate name(s) must be provided") - if isinstance(arg_coord, str): - arg_coord = [arg_coord] - if len(arg_coord) == 1 and len(args) > 1: - arg_coord = arg_coord * len(args) - - for arg, coord in zip(args, arg_coord): - if not is_in_coords(arg, coord): - raise ValueError(f"No {coord} coordinate in DataArray\n{arg}") - - def dim_size(k, v): - size = 0 - for argument, coordinate in zip(args, arg_coord): - a = argument.transform_coords( - k, graph={k: lambda x: v[x], 'x': coordinate}, keep_aliases=False - ) - if a.bins is not None: - a = a.group(k) - if size and a.sizes[k] and size != a.sizes[k]: - raise ValueError( - f"Earlier-found {k} size, {size}, not consistent with current {a.sizes[k]}" - ) - elif size == 0: - size = a.sizes[k] - return size - - dims = {k: dim_size(k, v) for k, v in kwargs.items()} - key = namedtuple('key', dims.keys()) - keys = list(dims.keys()) - ranges = [range(x) for x in dims.values()] - entries = [ - key(**{k: v for k, v in zip(keys, values)}) for values in product(*ranges) - ] - - graph = {k: lambda x: v[x] for k, v in kwargs.items()} - targets = tuple(graph.keys()) - # everything = lambda x: tuple(v[x] for v in kwargs.values()) - - new_args = [a for a in args] - for i, coord in enumerate(arg_coord): - graph['x'] = coord - new_args[i] = new_args[i].transform_coords( - targets, graph=graph, keep_aliases=False - ) - if new_args[i].bins is not None: - new_args[i] = new_args[i].group(*targets) - - return new_args - - def one_entry(new_arg, entry): - a = new_arg - for index, k in enumerate(kwargs.keys()): - a = a[k, entry[index]] - return a - - data = {entry: tuple(one_entry(x, entry) for x in new_args) for entry in entries} - return data diff --git a/packages/essspectroscopy/tests/indirect_test.py b/packages/essspectroscopy/tests/indirect_test.py index 616c9b00e..90bb3a580 100644 --- a/packages/essspectroscopy/tests/indirect_test.py +++ b/packages/essspectroscopy/tests/indirect_test.py @@ -1,18 +1,4 @@ from ess.spectroscopy.indirect import kf as secondary -from ess.spectroscopy.indirect import ki as primary -from ess.spectroscopy.types import ( - AnalyzerDetectorVector, - DetectorPosition, - FinalWavenumber, - FinalWavevector, - ReciprocalLatticeSpacing, - ReciprocalLatticeVectorAbsolute, - SampleAnalyzerDirection, - SampleAnalyzerVector, - SampleDetectorFlightTime, - SampleDetectorPathLength, - SamplePosition, -) from ess.spectroscopy.utils import norm from scipp import array, scalar, sqrt, vector from scipp.spatial import rotations_from_rotvecs @@ -40,7 +26,7 @@ def all_vectors_close(a, b, tol=None): if len(a.shape) and len(b.shape): if a.shape != b.shape: return False - for x, y in zip(a, b): + for x, y in zip(a, b, strict=True): if not vectors_close(x, y, tol): return False elif len(a.shape): @@ -69,12 +55,14 @@ def test_back_scattering_sample_analyzer_vector(): sample_analyzer_vec = scalar(1.0, unit='m') * z analyzer_position = sample_analyzer_vec + sample_position - # analyzer orientation of 90 degrees -> scattering angle of 180 degrees: back scattering + # analyzer orientation of 90 degrees -> + # scattering angle of 180 degrees: back scattering analyzer_orientation = rotations_from_rotvecs(scalar(90.0, unit='degree') * y) detector_y = analyzer_orientation * analyzer_orientation * y assert vectors_close(detector_y, y) - # The detector positions are defined in the coordinate system, then rotated around the analyzer position + # The detector positions are defined in the coordinate system, + # then rotated around the analyzer position tubes = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['tube']) * x detector_positions = scalar(1.0, unit='m') * z + tubes detector_positions = ( @@ -85,12 +73,14 @@ def test_back_scattering_sample_analyzer_vector(): sample_position, analyzer_position, analyzer_orientation, detector_positions ) - # This would be 'right' for fixed tau direction, but we utilize the mosaic and insist on scattering from - # the center line of the analyzer - # offset = sample_analyzer_vec - tubes / 2.0 # minus because the detector has been rotated 180 degrees + # This would be 'right' for fixed tau direction, but we utilize the mosaic and + # insist on scattering from the center line of the analyzer + # offset = sample_analyzer_vec - tubes / 2.0 + # (minus because the detector has been rotated 180 degrees) assert all_vectors_close(calculated, sample_analyzer_vec) - # Offsetting along the analyzer scattering plane normal moves the analyzer intersection point by half + # Offsetting along the analyzer scattering plane normal moves the analyzer + # intersection point by half wires = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['wire']) * y detector_positions = scalar(1.0, unit='m') * z + wires detector_positions = ( @@ -133,17 +123,17 @@ def test_sample_analyzer_vector(): y = analyzer_transform * vector([0.0, 1.0, 0.0], unit='1') z = analyzer_transform * vector([0.0, 0.0, 1.0], unit='1') # sample-analyzer-vector must be along the local z axis - sample_analyzer_vec = scalar(0.5 + random(), unit='m') * z + sample_analyzer_vec = scalar(0.5 + random(), unit='m') * z # noqa: S311 sample_analyzer_vec /= norm(sample_analyzer_vec).value analyzer_position = sample_analyzer_vec + sample_position # Avoid sin(theta) values near 0 or 1 - # analyzer_orientation = rotations_from_rotvecs(scalar(random() * 70.0 + 5.0, unit='degree') * y) analyzer_orientation = rotations_from_rotvecs(scalar(45.0, unit='degree') * y) detector_y = analyzer_orientation * analyzer_orientation * y assert vectors_close(detector_y, y) - # The detector positions are defined in the coordinate system, then rotated around the analyzer position + # The detector positions are defined in the coordinate system, + # then rotated around the analyzer position tubes = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['tube']) * x detector_positions = scalar(1.0, unit='m') * z + tubes detector_positions = ( @@ -156,7 +146,8 @@ def test_sample_analyzer_vector(): offset = calculated - sample_analyzer_vec assert all_vectors_close(offset, 0 * tubes) - # Offsetting along the analyzer scattering plane normal moves the analyzer intersection point by half + # Offsetting along the analyzer scattering plane normal moves + # the analyzer intersection point by half wires = array(values=[-0.1, 0.0, 0.1], unit='m', dims=['wire']) * y detector_positions = scalar(1.0, unit='m') * z + wires detector_positions = ( From b2d747a4b5e5b303bc397440b1aa093895767787 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Sep 2024 19:22:50 +0200 Subject: [PATCH 037/330] Remove .pyton-version file --- packages/essspectroscopy/.python-version | 1 - 1 file changed, 1 deletion(-) delete mode 100644 packages/essspectroscopy/.python-version diff --git a/packages/essspectroscopy/.python-version b/packages/essspectroscopy/.python-version deleted file mode 100644 index 35d069c3c..000000000 --- a/packages/essspectroscopy/.python-version +++ /dev/null @@ -1 +0,0 @@ -{{min_python}} From a107796424a0af48f9673e3b50e7132a0726c0e7 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Sep 2024 19:29:39 +0200 Subject: [PATCH 038/330] Copier update --- packages/essspectroscopy/.copier-answers.yml | 2 +- .../essspectroscopy/.github/workflows/ci.yml | 4 +++- .../.github/workflows/docs.yml | 6 +++++- .../.github/workflows/nightly_at_main.yml | 1 + .../.github/workflows/nightly_at_release.yml | 1 + .../.github/workflows/test.yml | 18 ++++++++++++++++ .../.github/workflows/unpinned.yml | 1 + packages/essspectroscopy/.gitignore | 3 +++ .../essspectroscopy/.pre-commit-config.yaml | 8 +++---- packages/essspectroscopy/.python-version | 1 + packages/essspectroscopy/conda/meta.yaml | 12 +++++++++-- .../docs/_templates/doc_version.html | 2 +- packages/essspectroscopy/docs/conf.py | 21 ++++++++++++++++--- packages/essspectroscopy/pyproject.toml | 19 ++++++++++++++--- .../essspectroscopy/requirements/basetest.in | 7 ++++++- .../essspectroscopy/requirements/make_base.py | 12 ++++++++--- .../src/ess/spectroscopy/__init__.py | 2 +- .../essspectroscopy/tests/package_test.py | 13 ++++++++++++ 18 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 packages/essspectroscopy/.python-version diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index 7ae50047b..14ee425c5 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: afbe5c7 +_commit: 2f9f107 _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.12' diff --git a/packages/essspectroscopy/.github/workflows/ci.yml b/packages/essspectroscopy/.github/workflows/ci.yml index 44266a238..356700a73 100644 --- a/packages/essspectroscopy/.github/workflows/ci.yml +++ b/packages/essspectroscopy/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: - uses: pre-commit/action@v3.0.1 with: extra_args: --all-files - - uses: pre-commit-ci/lite-action@v1.0.2 + - uses: pre-commit-ci/lite-action@v1.0.3 if: always() with: msg: Apply automatic formatting @@ -46,6 +46,7 @@ jobs: os-variant: ${{ matrix.os }} python-version: ${{ matrix.python.version }} tox-env: ${{ matrix.python.tox-env }} + secrets: inherit docs: needs: tests @@ -54,3 +55,4 @@ jobs: publish: false linkcheck: ${{ contains(matrix.variant.os, 'ubuntu') && github.ref == 'refs/heads/main' }} branch: ${{ github.head_ref == '' && github.ref_name || github.head_ref }} + secrets: inherit diff --git a/packages/essspectroscopy/.github/workflows/docs.yml b/packages/essspectroscopy/.github/workflows/docs.yml index 7e5a7bc6d..c6a413ea0 100644 --- a/packages/essspectroscopy/.github/workflows/docs.yml +++ b/packages/essspectroscopy/.github/workflows/docs.yml @@ -42,6 +42,10 @@ jobs: docs: name: Build documentation runs-on: 'ubuntu-22.04' + env: + ESS_PROTECTED_FILESTORE_USERNAME: ${{ secrets.ESS_PROTECTED_FILESTORE_USERNAME }} + ESS_PROTECTED_FILESTORE_PASSWORD: ${{ secrets.ESS_PROTECTED_FILESTORE_PASSWORD }} + steps: - run: sudo apt install --yes graphviz pandoc - uses: actions/checkout@v4 @@ -65,7 +69,7 @@ jobs: name: docs_html path: html/ - - uses: JamesIves/github-pages-deploy-action@v4.6.0 + - uses: JamesIves/github-pages-deploy-action@v4.6.4 if: ${{ inputs.publish }} with: branch: gh-pages diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml index 08fdddd29..c2b9d33a3 100644 --- a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml +++ b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml @@ -31,3 +31,4 @@ jobs: os-variant: ${{ matrix.os }} python-version: ${{ matrix.python.version }} tox-env: ${{ matrix.python.tox-env }} + secrets: inherit diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml index 373c45463..3faa1c23b 100644 --- a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml +++ b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml @@ -38,3 +38,4 @@ jobs: python-version: ${{ matrix.python.version }} tox-env: ${{ matrix.python.tox-env }} checkout_ref: ${{ needs.setup.outputs.release_tag }} + secrets: inherit diff --git a/packages/essspectroscopy/.github/workflows/test.yml b/packages/essspectroscopy/.github/workflows/test.yml index 5f56a069a..e98ed7cdf 100644 --- a/packages/essspectroscopy/.github/workflows/test.yml +++ b/packages/essspectroscopy/.github/workflows/test.yml @@ -41,8 +41,26 @@ on: type: string jobs: + package-test: + runs-on: ${{ inputs.os-variant }} + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.checkout_ref }} + - uses: actions/setup-python@v5 + with: + python-version: ${{ inputs.python-version }} + - run: python -m pip install --upgrade pip + - run: python -m pip install . + - run: python tests/package_test.py + name: Run package tests + test: runs-on: ${{ inputs.os-variant }} + env: + ESS_PROTECTED_FILESTORE_USERNAME: ${{ secrets.ESS_PROTECTED_FILESTORE_USERNAME }} + ESS_PROTECTED_FILESTORE_PASSWORD: ${{ secrets.ESS_PROTECTED_FILESTORE_PASSWORD }} steps: - uses: actions/checkout@v4 diff --git a/packages/essspectroscopy/.github/workflows/unpinned.yml b/packages/essspectroscopy/.github/workflows/unpinned.yml index 46a84c1c7..3f49f7223 100644 --- a/packages/essspectroscopy/.github/workflows/unpinned.yml +++ b/packages/essspectroscopy/.github/workflows/unpinned.yml @@ -38,3 +38,4 @@ jobs: python-version: ${{ matrix.python.version }} tox-env: ${{ matrix.python.tox-env }} checkout_ref: ${{ needs.setup.outputs.release_tag }} + secrets: inherit diff --git a/packages/essspectroscopy/.gitignore b/packages/essspectroscopy/.gitignore index 0f0541bc6..43c3d6c08 100644 --- a/packages/essspectroscopy/.gitignore +++ b/packages/essspectroscopy/.gitignore @@ -9,6 +9,7 @@ html # Environments venv +.venv # Caches .clangd/ @@ -20,6 +21,7 @@ __pycache__/ .pytest_cache .mypy_cache docs/generated/ +.ruff_cache # Editor settings .idea/ @@ -38,3 +40,4 @@ docs/generated/ *.cif *.rcif *.ort +*.zip diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml index 508073fe1..e0c499eec 100644 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: - id: check-added-large-files - id: check-json @@ -14,14 +14,14 @@ repos: args: [ --markdown-linebreak-ext=md ] exclude: '\.svg' - repo: https://github.com/kynan/nbstripout - rev: 0.6.0 + rev: 0.7.1 hooks: - id: nbstripout types: [ "jupyter" ] args: [ "--drop-empty-cells", "--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.1 + rev: v0.6.2 hooks: - id: ruff args: [ --fix ] @@ -29,7 +29,7 @@ repos: - id: ruff-format types_or: [ python, pyi ] - repo: https://github.com/codespell-project/codespell - rev: v2.2.6 + rev: v2.3.0 hooks: - id: codespell additional_dependencies: diff --git a/packages/essspectroscopy/.python-version b/packages/essspectroscopy/.python-version new file mode 100644 index 000000000..c8cfe3959 --- /dev/null +++ b/packages/essspectroscopy/.python-version @@ -0,0 +1 @@ +3.10 diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml index be17c2ada..868f98f79 100644 --- a/packages/essspectroscopy/conda/meta.yaml +++ b/packages/essspectroscopy/conda/meta.yaml @@ -9,6 +9,7 @@ source: {% set pyproject = load_file_data('pyproject.toml') %} {% set dependencies = pyproject.get('project', {}).get('dependencies', {}) %} +{% set test_dependencies = pyproject.get('project', {}).get('optional-dependencies', {}).get('test', {}) %} requirements: @@ -18,8 +19,9 @@ requirements: run: - python>=3.10 + {# Conda does not allow spaces between package name and version, so remove them #} {% for package in dependencies %} - - {% if package == "graphviz" %}python-graphviz{% else %}{{ package }}{% endif %} + - {% if package == "graphviz" %}python-graphviz{% else %}{{ package|replace(" ", "") }}{% endif %} {% endfor %} @@ -27,7 +29,13 @@ test: imports: - ess.spectroscopy requires: - - pytest + + {# Conda does not allow spaces between package name and version, so remove them #} + {% for package in test_dependencies %} + - {% if package == "graphviz" %}python-graphviz{% else %}{{ package|replace(" ", "") }}{% endif %} + {% endfor %} + + source_files: - pyproject.toml - tests/ diff --git a/packages/essspectroscopy/docs/_templates/doc_version.html b/packages/essspectroscopy/docs/_templates/doc_version.html index 48f9aacf1..005018ac3 100644 --- a/packages/essspectroscopy/docs/_templates/doc_version.html +++ b/packages/essspectroscopy/docs/_templates/doc_version.html @@ -1,2 +1,2 @@ -Current {{ project }} version: {{ version }} (older versions). +Current ESSspectroscopy version: {{ version }} (older versions). diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 6cd80c06e..37ae12a10 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -1,12 +1,18 @@ -# -*- coding: utf-8 -*- +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) import doctest import os import sys +from importlib.metadata import PackageNotFoundError from importlib.metadata import version as get_version +from sphinx.util import logging + sys.path.insert(0, os.path.abspath('.')) +logger = logging.getLogger(__name__) + # General information about the project. project = 'ESSspectroscopy' copyright = '2024 Scipp contributors' @@ -34,6 +40,8 @@ import sciline.sphinxext.domain_types # noqa: F401 extensions.append('sciline.sphinxext.domain_types') + # See https://github.com/tox-dev/sphinx-autodoc-typehints/issues/457 + suppress_warnings = ["config.cache"] except ModuleNotFoundError: pass @@ -111,8 +119,15 @@ # built documents. # -release = get_version("essspectroscopy") -version = ".".join(release.split('.')[:3]) # CalVer +try: + release = get_version("essspectroscopy") + version = ".".join(release.split('.')[:3]) # CalVer +except PackageNotFoundError: + logger.info( + "Warning: determining version from package metadata failed, falling back to " + "a dummy version number." + ) + release = version = "0.0.0-dev" warning_is_error = True diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 8d10cc45f..26455910e 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -41,6 +41,11 @@ dependencies = [ dynamic = ["version"] +[project.optional-dependencies] +test = [ + "pytest", +] + [project.urls] "Bug Tracker" = "https://github.com/scipp/essspectroscopy/issues" "Documentation" = "https://scipp.github.io/essspectroscopy" @@ -71,14 +76,14 @@ extend-exclude = [ [tool.ruff.lint] # See https://docs.astral.sh/ruff/rules/ -select = ["B", "C4", "DTZ", "E", "F", "G", "I", "PERF", "PGH", "PT", "PYI", "RUF", "S", "T20", "W"] +select = ["B", "C4", "DTZ", "E", "F", "G", "I", "PERF", "PGH", "PT", "PYI", "RUF", "S", "T20", "UP", "W"] ignore = [ # Conflict with ruff format, see # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules "COM812", "COM819", "D206", "D300", "E111", "E114", "E117", "ISC001", "ISC002", "Q000", "Q001", "Q002", "Q003", "W191", ] -fixable = ["I001", "B010"] -isort.known-first-party = ["essspectroscopy"] +fixable = ["B010", "I001", "PT001"] +isort.known-first-party = ["ess.spectroscopy"] pydocstyle.convention = "numpy" [tool.ruff.lint.per-file-ignores] @@ -109,3 +114,11 @@ enable_error_code = [ "truthy-bool", ] warn_unreachable = true + +[tool.codespell] +ignore-words-list = [ + # Codespell wants "socioeconomic" which seems to be the standard spelling. + # But we use the word in our code of conduct which is the contributor covenant. + # Let's not modify it if we don't have to. + "socio-economic", +] diff --git a/packages/essspectroscopy/requirements/basetest.in b/packages/essspectroscopy/requirements/basetest.in index e4a48b292..12ab599af 100644 --- a/packages/essspectroscopy/requirements/basetest.in +++ b/packages/essspectroscopy/requirements/basetest.in @@ -1,4 +1,9 @@ # Dependencies that are only used by tests. # Do not make an environment from this file, use test.txt instead! +# Add more dependencies in the ``test`` list +# under ``[project.optional-dependencies]`` section, in ``pyproject.toml`` -pytest +# Anything above "--- END OF CUSTOM SECTION ---" +# will not be touched by ``make_base.py`` +# --- END OF CUSTOM SECTION --- +# The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! diff --git a/packages/essspectroscopy/requirements/make_base.py b/packages/essspectroscopy/requirements/make_base.py index 1e1f48e3b..ccbab0015 100644 --- a/packages/essspectroscopy/requirements/make_base.py +++ b/packages/essspectroscopy/requirements/make_base.py @@ -1,7 +1,6 @@ import sys from argparse import ArgumentParser from pathlib import Path -from typing import List import tomli @@ -20,7 +19,7 @@ """ -def write_dependencies(dependency_name: str, dependencies: List[str]) -> None: +def write_dependencies(dependency_name: str, dependencies: list[str]) -> None: path = Path(f"{dependency_name}.in") if path.exists(): sections = path.read_text().split(CUSTOM_AUTO_SEPARATOR) @@ -43,8 +42,14 @@ def write_dependencies(dependency_name: str, dependencies: List[str]) -> None: if dependencies is None: raise RuntimeError("No dependencies found in pyproject.toml") dependencies = [dep.strip().strip('"') for dep in dependencies] + test_dependencies = ( + pyproject["project"].get("optional-dependencies", {}).get("test", []) + ) + test_dependencies = [dep.strip().strip('"') for dep in test_dependencies] + write_dependencies("base", dependencies) +write_dependencies("basetest", test_dependencies) def as_nightly(repo: str) -> str: @@ -56,7 +61,8 @@ def as_nightly(repo: str) -> str: version = f"cp{sys.version_info.major}{sys.version_info.minor}" base = "https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly" suffix = "manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - return "-".join([base, version, version, suffix]) + prefix = "scipp @ " + return prefix + "-".join([base, version, version, suffix]) return f"{repo} @ git+https://github.com/{org}/{repo}@main" diff --git a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py index 468061b74..fc0e1e855 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py @@ -5,7 +5,7 @@ import importlib.metadata try: - __version__ = importlib.metadata.version(__package__ or __name__) + __version__ = importlib.metadata.version("essspectroscopy") except importlib.metadata.PackageNotFoundError: __version__ = "0.0.0" diff --git a/packages/essspectroscopy/tests/package_test.py b/packages/essspectroscopy/tests/package_test.py index 5b756ad5c..a8e7f2184 100644 --- a/packages/essspectroscopy/tests/package_test.py +++ b/packages/essspectroscopy/tests/package_test.py @@ -1,7 +1,20 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + +"""Tests of package integrity. + +Note that addidional imports need to be added for repositories that +contain multiple packages. +""" + from ess import spectroscopy as pkg def test_has_version(): assert hasattr(pkg, '__version__') + + +# This is for CI package tests. They need to run tests with minimal dependencies, +# that is, without installing pytest. This code does not affect pytest. +if __name__ == '__main__': + test_has_version() From 0281dafe137cfcc3416c98cc946c244c09a4e9a8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Sep 2024 19:31:26 +0200 Subject: [PATCH 039/330] Apply new ruff fixes --- .../src/ess/spectroscopy/indirect/conservation.py | 2 +- .../essspectroscopy/src/ess/spectroscopy/indirect/kf.py | 6 ++++-- .../essspectroscopy/src/ess/spectroscopy/indirect/ki.py | 3 ++- packages/essspectroscopy/src/ess/spectroscopy/types.py | 4 ++-- packages/essspectroscopy/tests/indirect_test.py | 5 +++-- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index 22d838ae5..856ddc6b3 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -20,7 +20,7 @@ from .ki import providers as ki_providers # Directions relative to the incident beam coordinate system -PERP, VERT, PARALLEL = [vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])] +PERP, VERT, PARALLEL = (vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])) def lab_momentum_vector( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index ec29c7389..2d2ac421c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -51,9 +51,10 @@ def sample_analyzer_vector( The vector from the sample position to the interaction point on the analyzer for each detector element """ - from ess.spectroscopy.utils import norm from scipp import dot, vector + from ess.spectroscopy.utils import norm + # Scipp does not distinguish between coordinates and directions, so we need to do # some extra legwork to ensure we can apply the orientation transformation # _and_ obtain a dimensionless direction vector @@ -163,9 +164,10 @@ def final_wavenumber( : The magnitude of the reflected neutron wave vector for each detector element """ - from ess.spectroscopy.utils import norm from scipp import sqrt + from ess.spectroscopy.utils import norm + # law of Cosines gives the scattering angle based on distances: l_sa = norm(sample_analyzer_vec) l_ad = norm(analyzer_detector_vec) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index ca797102e..ea3ba50d6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -4,6 +4,8 @@ from __future__ import annotations +from scippnexus import Group + from ess.spectroscopy.types import ( FocusComponentName, FocusComponentNames, @@ -30,7 +32,6 @@ SourceSamplePathLength, SourceVelocities, ) -from scippnexus import Group def determine_name_with_type( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index a0ed846a4..65f319eb3 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,11 +1,11 @@ -from typing import NewType, Type +from typing import NewType from choppera.primary import PrimarySpectrometer from scipp import DataArray, Variable def make_scipp_named_typer(scipp_type): - def typer(named: str) -> Type[scipp_type]: + def typer(named: str) -> type[scipp_type]: return NewType(named, scipp_type) return typer diff --git a/packages/essspectroscopy/tests/indirect_test.py b/packages/essspectroscopy/tests/indirect_test.py index 90bb3a580..45d293ade 100644 --- a/packages/essspectroscopy/tests/indirect_test.py +++ b/packages/essspectroscopy/tests/indirect_test.py @@ -1,8 +1,9 @@ -from ess.spectroscopy.indirect import kf as secondary -from ess.spectroscopy.utils import norm from scipp import array, scalar, sqrt, vector from scipp.spatial import rotations_from_rotvecs +from ess.spectroscopy.indirect import kf as secondary +from ess.spectroscopy.utils import norm + def vectors_close(a, b, tol=None): from scipp import dot, scalar, sqrt From 9254de59ccd521bd71580fc61b15f510cde3d81b Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Sep 2024 19:42:07 +0200 Subject: [PATCH 040/330] Disable conda build --- .../.github/workflows/release.yml | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml index d1317a767..8975d2bcf 100644 --- a/packages/essspectroscopy/.github/workflows/release.yml +++ b/packages/essspectroscopy/.github/workflows/release.yml @@ -10,28 +10,28 @@ defaults: shell: bash -l {0} # required for conda env jobs: - build_conda: - name: Conda build - runs-on: 'ubuntu-22.04' - - steps: - - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 0 # history required so setuptools_scm can determine version - - - uses: mamba-org/setup-micromamba@v1 - with: - environment-name: build-env - create-args: >- - conda-build - boa - - run: conda mambabuild --channel conda-forge --channel scipp --no-anaconda-upload --override-channels --output-folder conda/package conda - - - uses: actions/upload-artifact@v4 - with: - name: conda-package-noarch - path: conda/package/noarch/*.tar.bz2 + # build_conda: + # name: Conda build + # runs-on: 'ubuntu-22.04' + # + # steps: + # - uses: actions/checkout@v4 + # with: + # submodules: true + # fetch-depth: 0 # history required so setuptools_scm can determine version + # + # - uses: mamba-org/setup-micromamba@v1 + # with: + # environment-name: build-env + # create-args: >- + # conda-build + # boa + # - run: conda mambabuild --channel conda-forge --channel scipp --no-anaconda-upload --override-channels --output-folder conda/package conda + # + # - uses: actions/upload-artifact@v4 + # with: + # name: conda-package-noarch + # path: conda/package/noarch/*.tar.bz2 build_wheels: name: Wheels @@ -60,7 +60,7 @@ jobs: upload_pypi: name: Deploy PyPI - needs: [build_wheels, build_conda] + needs: [build_wheels] runs-on: 'ubuntu-22.04' environment: release permissions: @@ -70,25 +70,25 @@ jobs: - uses: actions/download-artifact@v4 - uses: pypa/gh-action-pypi-publish@v1.8.14 - upload_conda: - name: Deploy Conda - needs: [build_wheels, build_conda] - runs-on: 'ubuntu-22.04' - if: github.event_name == 'release' && github.event.action == 'published' - - steps: - - uses: actions/download-artifact@v4 - - uses: mamba-org/setup-micromamba@v1 - with: - environment-name: upload-env - # frozen python due to breaking removal of 'imp' in 3.12 - create-args: >- - anaconda-client - python=3.11 - - run: anaconda --token ${{ secrets.ANACONDATOKEN }} upload --user scipp --label main $(ls conda-package-noarch/*.tar.bz2) + # upload_conda: + # name: Deploy Conda + # needs: [build_wheels, build_conda] + # runs-on: 'ubuntu-22.04' + # if: github.event_name == 'release' && github.event.action == 'published' + # + # steps: + # - uses: actions/download-artifact@v4 + # - uses: mamba-org/setup-micromamba@v1 + # with: + # environment-name: upload-env + # # frozen python due to breaking removal of 'imp' in 3.12 + # create-args: >- + # anaconda-client + # python=3.11 + # - run: anaconda --token ${{ secrets.ANACONDATOKEN }} upload --user scipp --label main $(ls conda-package-noarch/*.tar.bz2) docs: - needs: [upload_conda, upload_pypi] + needs: [upload_pypi] uses: ./.github/workflows/docs.yml with: publish: ${{ github.event_name == 'release' && github.event.action == 'published' }} From 5f3468bfb8af8df95546d7fd6b2c92c411f6b4e3 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Sep 2024 19:44:09 +0200 Subject: [PATCH 041/330] Reformat --- packages/essspectroscopy/.github/workflows/release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml index 8975d2bcf..0a0429624 100644 --- a/packages/essspectroscopy/.github/workflows/release.yml +++ b/packages/essspectroscopy/.github/workflows/release.yml @@ -13,13 +13,13 @@ jobs: # build_conda: # name: Conda build # runs-on: 'ubuntu-22.04' - # + # # steps: # - uses: actions/checkout@v4 # with: # submodules: true # fetch-depth: 0 # history required so setuptools_scm can determine version - # + # # - uses: mamba-org/setup-micromamba@v1 # with: # environment-name: build-env @@ -27,7 +27,7 @@ jobs: # conda-build # boa # - run: conda mambabuild --channel conda-forge --channel scipp --no-anaconda-upload --override-channels --output-folder conda/package conda - # + # # - uses: actions/upload-artifact@v4 # with: # name: conda-package-noarch @@ -75,7 +75,7 @@ jobs: # needs: [build_wheels, build_conda] # runs-on: 'ubuntu-22.04' # if: github.event_name == 'release' && github.event.action == 'published' - # + # # steps: # - uses: actions/download-artifact@v4 # - uses: mamba-org/setup-micromamba@v1 From 3d63f9f5d715bbc703c6cba12bc1f2a21e8d566a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Sep 2024 19:49:34 +0200 Subject: [PATCH 042/330] Reenable conda build --- .../.github/workflows/release.yml | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml index 0a0429624..4ca0e3ad4 100644 --- a/packages/essspectroscopy/.github/workflows/release.yml +++ b/packages/essspectroscopy/.github/workflows/release.yml @@ -10,28 +10,28 @@ defaults: shell: bash -l {0} # required for conda env jobs: - # build_conda: - # name: Conda build - # runs-on: 'ubuntu-22.04' - # - # steps: - # - uses: actions/checkout@v4 - # with: - # submodules: true - # fetch-depth: 0 # history required so setuptools_scm can determine version - # - # - uses: mamba-org/setup-micromamba@v1 - # with: - # environment-name: build-env - # create-args: >- - # conda-build - # boa - # - run: conda mambabuild --channel conda-forge --channel scipp --no-anaconda-upload --override-channels --output-folder conda/package conda - # - # - uses: actions/upload-artifact@v4 - # with: - # name: conda-package-noarch - # path: conda/package/noarch/*.tar.bz2 + build_conda: + name: Conda build + runs-on: 'ubuntu-22.04' + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 # history required so setuptools_scm can determine version + + - uses: mamba-org/setup-micromamba@v1 + with: + environment-name: build-env + create-args: >- + conda-build + boa + - run: conda mambabuild --channel conda-forge --channel scipp --no-anaconda-upload --override-channels --output-folder conda/package conda + + - uses: actions/upload-artifact@v4 + with: + name: conda-package-noarch + path: conda/package/noarch/*.tar.bz2 build_wheels: name: Wheels @@ -60,7 +60,7 @@ jobs: upload_pypi: name: Deploy PyPI - needs: [build_wheels] + needs: [build_wheels, build_conda] runs-on: 'ubuntu-22.04' environment: release permissions: @@ -70,25 +70,25 @@ jobs: - uses: actions/download-artifact@v4 - uses: pypa/gh-action-pypi-publish@v1.8.14 - # upload_conda: - # name: Deploy Conda - # needs: [build_wheels, build_conda] - # runs-on: 'ubuntu-22.04' - # if: github.event_name == 'release' && github.event.action == 'published' - # - # steps: - # - uses: actions/download-artifact@v4 - # - uses: mamba-org/setup-micromamba@v1 - # with: - # environment-name: upload-env - # # frozen python due to breaking removal of 'imp' in 3.12 - # create-args: >- - # anaconda-client - # python=3.11 - # - run: anaconda --token ${{ secrets.ANACONDATOKEN }} upload --user scipp --label main $(ls conda-package-noarch/*.tar.bz2) + upload_conda: + name: Deploy Conda + needs: [build_wheels, build_conda] + runs-on: 'ubuntu-22.04' + if: github.event_name == 'release' && github.event.action == 'published' + + steps: + - uses: actions/download-artifact@v4 + - uses: mamba-org/setup-micromamba@v1 + with: + environment-name: upload-env + # frozen python due to breaking removal of 'imp' in 3.12 + create-args: >- + anaconda-client + python=3.11 + - run: anaconda --token ${{ secrets.ANACONDATOKEN }} upload --user scipp --label main $(ls conda-package-noarch/*.tar.bz2) docs: - needs: [upload_pypi] + needs: [upload_pypi, upload_conda] uses: ./.github/workflows/docs.yml with: publish: ${{ github.event_name == 'release' && github.event.action == 'published' }} From ddc86ada145b89bd85134e5f5c47ac1bc05edd9a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 18 Sep 2024 16:31:15 +0200 Subject: [PATCH 043/330] Make text in logos paths --- .../docs/_static/logo-dark.svg | 63 ++++++------------- .../essspectroscopy/docs/_static/logo.svg | 63 ++++++------------- 2 files changed, 38 insertions(+), 88 deletions(-) diff --git a/packages/essspectroscopy/docs/_static/logo-dark.svg b/packages/essspectroscopy/docs/_static/logo-dark.svg index a2a0be35e..6a34c889c 100644 --- a/packages/essspectroscopy/docs/_static/logo-dark.svg +++ b/packages/essspectroscopy/docs/_static/logo-dark.svg @@ -2,9 +2,9 @@ - - - + id="defs2" /> @@ -38,34 +25,22 @@ + + id="text8262" + style="font-size:35.2778px;line-height:16.5364px;font-family:Lato;-inkscape-font-specification:Lato;letter-spacing:0px;word-spacing:0px;fill:#ffffff;stroke-width:0.264583px" + aria-label="essspectroscopy" + transform="translate(0,0.12275589)"> - essspectroscopy - - + style="font-weight:bold;-inkscape-font-specification:'Lato Bold'" + d="m 66.374835,11.861102 q 3.986392,0 6.314727,2.293057 2.328335,2.257779 2.328335,6.455837 v 2.540002 H 62.60011 q 0.07056,2.222502 1.305279,3.492502 1.270001,1.270001 3.492502,1.270001 1.869724,0 3.386669,-0.352778 1.516946,-0.388056 3.139725,-1.164167 v 4.056947 q -1.411112,0.705556 -2.998613,1.023056 -1.552224,0.352778 -3.774725,0.352778 -2.89278,0 -5.115281,-1.058334 -2.222502,-1.093612 -3.492503,-3.280835 -1.270001,-2.187224 -1.270001,-5.503337 0,-3.386669 1.12889,-5.609171 1.164167,-2.257779 3.21028,-3.386669 2.046112,-1.128889 4.762503,-1.128889 z m 0.03528,3.739447 q -1.516945,0 -2.540002,0.987778 -0.987778,0.987778 -1.164167,3.069169 h 7.37306 q -0.03528,-1.76389 -0.917223,-2.89278 -0.881945,-1.164167 -2.751668,-1.164167 z m 26.317226,10.160006 q 0,2.928058 -2.08139,4.515559 -2.046113,1.552223 -6.138338,1.552223 -2.010834,0 -3.457224,-0.282222 -1.44639,-0.246945 -2.89278,-0.846667 v -4.33917 q 1.552223,0.705556 3.351391,1.164167 1.799168,0.458612 3.175002,0.458612 1.552224,0 2.187224,-0.458612 0.670278,-0.458611 0.670278,-1.199445 0,-0.493889 -0.282222,-0.881945 -0.246945,-0.388056 -1.12889,-0.881945 -0.881945,-0.493889 -2.751668,-1.270001 -1.799168,-0.776111 -2.963336,-1.516945 -1.164167,-0.776112 -1.728612,-1.834446 -0.564445,-1.093612 -0.564445,-2.716391 0,-2.681112 2.081391,-4.021669 2.08139,-1.340556 5.538614,-1.340556 1.799168,0 3.421947,0.352778 1.622779,0.352778 3.351391,1.164167 l -1.587501,3.774725 Q 89.517061,16.553049 88.24706,16.164993 86.977059,15.74166 85.671781,15.74166 q -2.328335,0 -2.328335,1.270001 0,0.458611 0.282222,0.846667 0.317501,0.352778 1.164168,0.776111 0.881945,0.423334 2.575279,1.12889 1.658057,0.670278 2.857502,1.411112 1.199445,0.705556 1.834446,1.799168 0.670278,1.058334 0.670278,2.786946 z m 17.533059,0 q 0,2.928058 -2.08139,4.515559 -2.04612,1.552223 -6.13834,1.552223 -2.01084,0 -3.457223,-0.282222 -1.44639,-0.246945 -2.89278,-0.846667 v -4.33917 q 1.552223,0.705556 3.351391,1.164167 1.799162,0.458612 3.175002,0.458612 1.55222,0 2.18722,-0.458612 0.67028,-0.458611 0.67028,-1.199445 0,-0.493889 -0.28222,-0.881945 -0.24695,-0.388056 -1.12889,-0.881945 -0.88195,-0.493889 -2.75167,-1.270001 -1.799166,-0.776111 -2.963333,-1.516945 -1.164168,-0.776112 -1.728613,-1.834446 -0.564445,-1.093612 -0.564445,-2.716391 0,-2.681112 2.081391,-4.021669 2.08139,-1.340556 5.53861,-1.340556 1.79917,0 3.42195,0.352778 1.62278,0.352778 3.35139,1.164167 l -1.5875,3.774725 q -1.41111,-0.599723 -2.68111,-0.987779 -1.27,-0.423333 -2.57528,-0.423333 -2.32834,0 -2.32834,1.270001 0,0.458611 0.28222,0.846667 0.3175,0.352778 1.16417,0.776111 0.88195,0.423334 2.57528,1.12889 1.65806,0.670278 2.8575,1.411112 1.19945,0.705556 1.83445,1.799168 0.67028,1.058334 0.67028,2.786946 z" + id="path1" /> + diff --git a/packages/essspectroscopy/docs/_static/logo.svg b/packages/essspectroscopy/docs/_static/logo.svg index eafe115fe..83464e051 100644 --- a/packages/essspectroscopy/docs/_static/logo.svg +++ b/packages/essspectroscopy/docs/_static/logo.svg @@ -2,9 +2,9 @@ - - - + id="defs2" /> @@ -38,34 +25,22 @@ + + id="text8262" + style="font-size:35.2778px;line-height:16.5364px;font-family:Lato;-inkscape-font-specification:Lato;letter-spacing:0px;word-spacing:0px;fill:#0065ac;stroke-width:0.264583px" + aria-label="essspectroscopy" + transform="translate(0,0.12275589)"> - essspectroscopy - - + style="font-weight:bold;-inkscape-font-specification:'Lato Bold'" + d="m 66.374835,11.861102 q 3.986392,0 6.314727,2.293057 2.328335,2.257779 2.328335,6.455837 v 2.540002 H 62.60011 q 0.07056,2.222502 1.305279,3.492502 1.270001,1.270001 3.492502,1.270001 1.869724,0 3.386669,-0.352778 1.516946,-0.388056 3.139725,-1.164167 v 4.056947 q -1.411112,0.705556 -2.998613,1.023056 -1.552224,0.352778 -3.774725,0.352778 -2.89278,0 -5.115281,-1.058334 -2.222502,-1.093612 -3.492503,-3.280835 -1.270001,-2.187224 -1.270001,-5.503337 0,-3.386669 1.12889,-5.609171 1.164167,-2.257779 3.21028,-3.386669 2.046112,-1.128889 4.762503,-1.128889 z m 0.03528,3.739447 q -1.516945,0 -2.540002,0.987778 -0.987778,0.987778 -1.164167,3.069169 h 7.37306 q -0.03528,-1.76389 -0.917223,-2.89278 -0.881945,-1.164167 -2.751668,-1.164167 z m 26.317226,10.160006 q 0,2.928058 -2.08139,4.515559 -2.046113,1.552223 -6.138338,1.552223 -2.010834,0 -3.457224,-0.282222 -1.44639,-0.246945 -2.89278,-0.846667 v -4.33917 q 1.552223,0.705556 3.351391,1.164167 1.799168,0.458612 3.175002,0.458612 1.552224,0 2.187224,-0.458612 0.670278,-0.458611 0.670278,-1.199445 0,-0.493889 -0.282222,-0.881945 -0.246945,-0.388056 -1.12889,-0.881945 -0.881945,-0.493889 -2.751668,-1.270001 -1.799168,-0.776111 -2.963336,-1.516945 -1.164167,-0.776112 -1.728612,-1.834446 -0.564445,-1.093612 -0.564445,-2.716391 0,-2.681112 2.081391,-4.021669 2.08139,-1.340556 5.538614,-1.340556 1.799168,0 3.421947,0.352778 1.622779,0.352778 3.351391,1.164167 l -1.587501,3.774725 Q 89.517061,16.553049 88.24706,16.164993 86.977059,15.74166 85.671781,15.74166 q -2.328335,0 -2.328335,1.270001 0,0.458611 0.282222,0.846667 0.317501,0.352778 1.164168,0.776111 0.881945,0.423334 2.575279,1.12889 1.658057,0.670278 2.857502,1.411112 1.199445,0.705556 1.834446,1.799168 0.670278,1.058334 0.670278,2.786946 z m 17.533059,0 q 0,2.928058 -2.08139,4.515559 -2.04612,1.552223 -6.13834,1.552223 -2.01084,0 -3.457223,-0.282222 -1.44639,-0.246945 -2.89278,-0.846667 v -4.33917 q 1.552223,0.705556 3.351391,1.164167 1.799162,0.458612 3.175002,0.458612 1.55222,0 2.18722,-0.458612 0.67028,-0.458611 0.67028,-1.199445 0,-0.493889 -0.28222,-0.881945 -0.24695,-0.388056 -1.12889,-0.881945 -0.88195,-0.493889 -2.75167,-1.270001 -1.799166,-0.776111 -2.963333,-1.516945 -1.164168,-0.776112 -1.728613,-1.834446 -0.564445,-1.093612 -0.564445,-2.716391 0,-2.681112 2.081391,-4.021669 2.08139,-1.340556 5.53861,-1.340556 1.79917,0 3.42195,0.352778 1.62278,0.352778 3.35139,1.164167 l -1.5875,3.774725 q -1.41111,-0.599723 -2.68111,-0.987779 -1.27,-0.423333 -2.57528,-0.423333 -2.32834,0 -2.32834,1.270001 0,0.458611 0.28222,0.846667 0.3175,0.352778 1.16417,0.776111 0.88195,0.423334 2.57528,1.12889 1.65806,0.670278 2.8575,1.411112 1.19945,0.705556 1.83445,1.799168 0.67028,1.058334 0.67028,2.786946 z" + id="path1" /> + From c9e12edaea86bafd348462c8cbca0c9bc5cf263d Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 20 Sep 2024 14:38:17 +0200 Subject: [PATCH 044/330] Add copyright header to source files --- .../essspectroscopy/src/ess/spectroscopy/indirect/__init__.py | 3 +++ .../src/ess/spectroscopy/indirect/conservation.py | 3 +++ packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py | 3 +++ packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py | 3 +++ .../src/ess/spectroscopy/indirect/normalisation.py | 3 +++ .../essspectroscopy/src/ess/spectroscopy/indirect/workflow.py | 3 +++ packages/essspectroscopy/src/ess/spectroscopy/types.py | 3 +++ packages/essspectroscopy/src/ess/spectroscopy/utils.py | 3 +++ packages/essspectroscopy/tests/indirect_test.py | 3 +++ 9 files changed, 27 insertions(+) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py index d69eb1ec5..38a05f19f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + from .workflow import bifrost, bifrost_single __all__ = ( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index 856ddc6b3..afdfb9bfa 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + from scipp import vector from ..types import ( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 2d2ac421c..6ad17f6c6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + from ess.spectroscopy.types import ( AnalyzerDetectorVector, AnalyzerOrientation, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index ea3ba50d6..a502beb25 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + """Utilities for the primary spectrometer of an indirect geometry time-of-flight spectrometer """ diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index f5d9df21b..d13861b8c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + from scipp import DataArray from ..types import ( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 1bde8eba3..457d2004f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + from __future__ import annotations from loguru import logger diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 65f319eb3..1bf6f983f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + from typing import NewType from choppera.primary import PrimarySpectrometer diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py index b838e0e1a..2fd083a4c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + from scipp import DataArray, Variable diff --git a/packages/essspectroscopy/tests/indirect_test.py b/packages/essspectroscopy/tests/indirect_test.py index 45d293ade..f20d9da42 100644 --- a/packages/essspectroscopy/tests/indirect_test.py +++ b/packages/essspectroscopy/tests/indirect_test.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + from scipp import array, scalar, sqrt, vector from scipp.spatial import rotations_from_rotvecs From b65396b2215a66e8b7455e7391021054da4a28d0 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 20 Sep 2024 14:32:10 +0200 Subject: [PATCH 045/330] Replace custom norm function --- .../src/ess/spectroscopy/indirect/kf.py | 29 +++++++------------ .../src/ess/spectroscopy/utils.py | 9 ------ .../essspectroscopy/tests/indirect_test.py | 12 ++++---- 3 files changed, 16 insertions(+), 34 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 6ad17f6c6..07c556414 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +import scipp as sc from ess.spectroscopy.types import ( AnalyzerDetectorVector, @@ -56,8 +57,6 @@ def sample_analyzer_vector( """ from scipp import dot, vector - from ess.spectroscopy.utils import norm - # Scipp does not distinguish between coordinates and directions, so we need to do # some extra legwork to ensure we can apply the orientation transformation # _and_ obtain a dimensionless direction vector @@ -66,7 +65,7 @@ def sample_analyzer_vector( [0, 1, 0], unit=analyzer_orientation.unit ) # and y perpendicular to the scattering plane yhat = analyzer_orientation * y - analyzer_orientation * o - yhat /= norm(yhat) + yhat /= sc.norm(yhat) sample_analyzer_center_vector = analyzer_position - sample_position @@ -80,9 +79,9 @@ def sample_analyzer_vector( # TODO Consider requiring that dot(analyzer_position-sample_position, yhat) is zero? - sample_analyzer_center_distance = norm(sample_analyzer_center_vector) + sample_analyzer_center_distance = sc.norm(sample_analyzer_center_vector) - analyzer_detector_center_distance = norm(analyzer_detector_center_vector) + analyzer_detector_center_distance = sc.norm(analyzer_detector_center_vector) # similar-triangles give the out-of-plane analyzer reflection point distance sa_out_of_plane = ( @@ -128,16 +127,12 @@ def analyzer_detector_vector( def kf_hat(sample_analyzer_vec: SampleAnalyzerVector) -> SampleAnalyzerDirection: """Calculate the direction of the neutrons for each detector-element""" - from ess.spectroscopy.utils import norm - - return sample_analyzer_vec / norm(sample_analyzer_vec) + return sample_analyzer_vec / sc.norm(sample_analyzer_vec) def reciprocal_lattice_spacing(tau_vector: ReciprocalLatticeVectorAbsolute): """Calculate the distance between lattice planes in, e.g., the analyzer""" - from ess.spectroscopy.utils import norm - - return norm(tau_vector) + return sc.norm(tau_vector) def final_wavenumber( @@ -169,12 +164,10 @@ def final_wavenumber( """ from scipp import sqrt - from ess.spectroscopy.utils import norm - # law of Cosines gives the scattering angle based on distances: - l_sa = norm(sample_analyzer_vec) - l_ad = norm(analyzer_detector_vec) - l_diff = norm(sample_analyzer_vec + analyzer_detector_vec) + l_sa = sc.norm(sample_analyzer_vec) + l_ad = sc.norm(analyzer_detector_vec) + l_diff = sc.norm(sample_analyzer_vec + analyzer_detector_vec) # 2 theta is measured from the direction S-A, so the internal angle is # (pi - 2 theta) and the normal law of Cosines is modified accordingly to be # -cos(2 theta) instead of cos(pi - 2 theta) @@ -203,9 +196,7 @@ def secondary_flight_path_length( analyzer_detector_vec: AnalyzerDetectorVector, ) -> SampleDetectorPathLength: """Returns the path-length-distance between the sample and each detector element""" - from ess.spectroscopy.utils import norm - - return norm(sample_analyzer_vec) + norm(analyzer_detector_vec) + return sc.norm(sample_analyzer_vec) + sc.norm(analyzer_detector_vec) def secondary_flight_time( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py index 2fd083a4c..4ba80d5f4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -4,15 +4,6 @@ from scipp import DataArray, Variable -def norm(vector: Variable) -> Variable: - from scipp import DType, dot, sqrt - - if vector.dtype != DType.vector3: - raise ValueError("Vector operations require scipp.DType.vector3 elements") - - return sqrt(dot(vector, vector)) - - def in_same_unit(b: Variable, to: Variable | None = None) -> Variable: def unit(x): if x.bins is not None: diff --git a/packages/essspectroscopy/tests/indirect_test.py b/packages/essspectroscopy/tests/indirect_test.py index f20d9da42..18712eb1b 100644 --- a/packages/essspectroscopy/tests/indirect_test.py +++ b/packages/essspectroscopy/tests/indirect_test.py @@ -1,20 +1,20 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +import scipp as sc from scipp import array, scalar, sqrt, vector from scipp.spatial import rotations_from_rotvecs from ess.spectroscopy.indirect import kf as secondary -from ess.spectroscopy.utils import norm def vectors_close(a, b, tol=None): - from scipp import dot, scalar, sqrt + from scipp import scalar if tol is None: tol = scalar(1e-8, unit=a.unit) difference = a - b - return sqrt(dot(difference, difference)) < tol + return sc.norm(difference) < tol def all_vectors_close(a, b, tol=None): @@ -106,7 +106,7 @@ def test_back_scattering_sample_analyzer_vector(): sample_position, analyzer_position, analyzer_orientation, detector_positions ) # as the x displacement increases, the y displacement should decrease - frac = wires / (1.0 + sqrt(1.0 + (norm(tubes) / scalar(1.0, unit='m')) ** 2)) + frac = wires / (1.0 + sqrt(1.0 + (sc.norm(tubes) / scalar(1.0, unit='m')) ** 2)) assert all_vectors_close(calculated, sample_analyzer_vec + frac) @@ -128,7 +128,7 @@ def test_sample_analyzer_vector(): z = analyzer_transform * vector([0.0, 0.0, 1.0], unit='1') # sample-analyzer-vector must be along the local z axis sample_analyzer_vec = scalar(0.5 + random(), unit='m') * z # noqa: S311 - sample_analyzer_vec /= norm(sample_analyzer_vec).value + sample_analyzer_vec /= sc.norm(sample_analyzer_vec).value analyzer_position = sample_analyzer_vec + sample_position # Avoid sin(theta) values near 0 or 1 @@ -173,5 +173,5 @@ def test_sample_analyzer_vector(): sample_position, analyzer_position, analyzer_orientation, detector_positions ) # as the x displacement increases, the y displacement should decrease - frac = wires / (1.0 + sqrt(1.0 + (norm(tubes) / scalar(1.0, unit='m')) ** 2)) + frac = wires / (1.0 + sqrt(1.0 + (sc.norm(tubes) / scalar(1.0, unit='m')) ** 2)) assert all_vectors_close(calculated, sample_analyzer_vec + frac) From f57ec56a4be190aea8ae07aa620cadeeda4b0a40 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 21 Oct 2024 15:28:04 +0200 Subject: [PATCH 046/330] [Add] incident beam monitor normalization --- .../src/ess/spectroscopy/indirect/ki.py | 21 +- .../spectroscopy/indirect/normalisation.py | 212 ++++++++++++++++-- .../src/ess/spectroscopy/indirect/workflow.py | 119 ++++++++-- .../src/ess/spectroscopy/types.py | 17 +- 4 files changed, 328 insertions(+), 41 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index a502beb25..658c0c47f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -14,6 +14,7 @@ FocusComponentNames, IncidentDirection, IncidentEnergy, + IncidentSloth, IncidentSlowness, IncidentWavelength, IncidentWavenumber, @@ -119,11 +120,9 @@ def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: The name or names of the time-focus-defining choppers, given the restrictions noted above """ - from scipp import scalar + from scipp import norm, scalar from scippnexus import File, NXdisk_chopper, compute_positions - from ..utils import norm - allowance = scalar(0.5, unit='m') with File(file) as data: @@ -193,10 +192,9 @@ def focus_distance( The average straight-line distance from the source position to the named component(s) """ + from scipp import norm from scippnexus import File, compute_positions - from ..utils import norm - pos = 0 * origin with File(file) as data: for name in names: @@ -363,6 +361,18 @@ def incident_slowness( return slowness +def incident_sloth( + primary: PrimarySpectrometerObject, slowness: IncidentSlowness +) -> IncidentSloth: + from choppera.nexus import primary_slowness + from scipp import max, min + + from ..utils import in_same_unit + + min_max = in_same_unit(primary_slowness(primary), to=slowness) + return (slowness - min(min_max)) / (max(min_max) - min(min_max)) + + def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: """Calculate the incident wavelength from the incident slowness for each neutron""" from scipp.constants import Planck, neutron_mass @@ -412,6 +422,7 @@ def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: unwrap_sample_time, incident_direction, incident_slowness, + incident_sloth, incident_wavelength, incident_wavenumber, incident_wavevector, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index d13861b8c..5e357a420 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -6,15 +6,24 @@ from ..types import ( FrameTimeMonitor, IncidentSlowness, + MonitorName, MonitorNormalisation, + MonitorPosition, + NeXusFileName, + NormWavelengthEvents, PrimaryFocusDistance, PrimaryFocusTime, PrimarySpectrometerObject, + SlothMonitor, SlownessMonitor, SourceFrequency, SourceMonitorFlightTime, SourceMonitorPathLength, + SourcePosition, WallTimeMonitor, + WavelengthBins, + WavelengthEvents, + WavelengthMonitor, ) @@ -30,6 +39,51 @@ def incident_monitor_normalization( return lookup(monitor, dim=coords[0])[slowness] +def monitor_position(file: NeXusFileName, monitor: MonitorName) -> MonitorPosition: + """Extract the position of the named monitor from a NeXus file""" + from scippnexus import File, compute_positions + + with File(file) as data: + return compute_positions(data['entry/instrument'][monitor][...])['position'] + + +def source_monitor_path_length( + file: NeXusFileName, source: SourcePosition, monitor: MonitorPosition +) -> SourceMonitorPathLength: + """Compute the primary spectrometer path length from source to monitor positions + + Note: + This *requires* that the instrument group *is sorted* along the beam path. + HDF5 group entries are sorted alphabetically, so you should ensure that + the NeXus file was constructed with this in mind. + """ + from scipp import concat, dot, sqrt, sum + from scippnexus import File, NXguide, compute_positions + + with File(file) as data: + positions = [ + compute_positions(v[...])['position'] + for v in data['entry/instrument'][NXguide].values() + ] + + def vector_length(vector): + return sqrt(dot(vector, vector)) + + # Find the closest guide to the monitor position, ignoring the possibility that + # a guide could be _beyond_ the monitor _and_ closest :( + closest = 0 + distance = vector_length(source - monitor) + for i, position in enumerate(positions): + d = vector_length(position - monitor) + if d < distance: + distance = d + closest = i + + positions = concat((source, *positions[:closest], monitor), dim='path') + diff = positions['path', 1:] - positions['path', :-1] + return sum(vector_length(diff)) + + def monitor_pivot_time( primary: PrimarySpectrometerObject, length: SourceMonitorPathLength ) -> SourceMonitorFlightTime: @@ -63,18 +117,22 @@ def monitor_wall_time( The same intensities with independent axis converted to the likely time since neutron-producing proton pulse """ - from choppera.nexus import unwrap + from choppera.nexus import unwrap, unwrap_histogram - coords = list(monitor.coords) - if len(coords) != 1: - raise ValueError(f'Monitor expected to have exactly 1 coordinate, has {coords}') - frame = coords[0] + frame = 'frame_time' + if frame not in monitor.coords: + raise RuntimeError(f'A FrameTimeMonitor must have coordinate "{frame}"') wall = 'wall_time' names = {frame: wall} - return DataArray( - monitor.data.rename(names), - coords={wall: unwrap(monitor.coords[frame], frequency, least).rename(names)}, - ) + if monitor.sizes[frame] + 1 == monitor.coords[frame].size: + coord, values = unwrap_histogram( + monitor.coords[frame], monitor.data, frequency, least + ) + else: + values = monitor.data + coord = unwrap(monitor.coord[frame], frequency, least) + + return DataArray(values.rename(names), coords={wall: coord.rename(names)}) def monitor_slowness( @@ -105,23 +163,141 @@ def monitor_slowness( The same intensities with independent axis converted to the inverse velocity of the neutrons, which scales linearly with wall time """ - coords = list(monitor.coords) - if len(coords) != 1: - raise ValueError(f'Monitor expected to have exactly 1 coordinate, has {coords}') - wall = coords[0] + from ..utils import in_same_unit + + wall = 'wall_time' + if wall not in monitor.coords: + raise RuntimeError(f'A WallTimeMonitor must have coordinate "{wall}"') slow = 'slowness' names = {wall: slow} - slowness = ( - ((monitor.coords[wall] - focus) / (length - distance)) - .rename(names) - .to(unit='s/m') - ) + wall_time = monitor.coords[wall] + duration = wall_time - in_same_unit(focus, to=wall_time) + slowness = (duration / (length - distance)).rename(names).to(unit='s/m') return DataArray(monitor.data.rename(names), coords={slow: slowness}) +def monitor_wavelength(monitor: SlownessMonitor) -> WavelengthMonitor: + """Convert the independent 'slowness' coordinate of a histogram DataArray to the + equivalent wavelength + + Parameters + ---------- + monitor: + A histogram beam monitor which has been converted from recorded 'frame time' + to inverse neutron velocity + + Returns + ------- + : + The same intensities with independent axis converted to wavelength + """ + from scipp.constants import Planck, neutron_mass + + c = Planck / neutron_mass + slow = 'slowness' + # wavelength = 'incident_wavelength' + if slow not in monitor.coords: + raise RuntimeError(f'A SlownessMonitor must have the coordinate "{slow}"') + + def converter(slowness): + return (c * slowness).to(unit='angstrom') + + # names = {slow: wavelength} + converted = monitor.transform_coords(incident_wavelength=converter) + return converted + + +def monitor_sloth( + primary: PrimarySpectrometerObject, monitor: SlownessMonitor +) -> SlothMonitor: + """Convert the independent 'slowness' coordinate of a histogram DataArray to the + equivalent sloth, which is -- equivalently -- normalised slowness, normalised + inverse velocity, or normalised (incident) wavelength + + Parameters + ---------- + primary: + The primary spectrometer object describing the choppers and guide setting(s) + monitor: + A histogram beam monitor which has been converted from recorded 'frame time' to + inverse neutron velocity + + Returns + ------- + : + The same intensities with independent axis converted to the sloth, + which is the normalised slowness, inverse velocity, and incident wavelength + """ + from choppera.nexus import primary_slowness + from scipp import max, min + + from ..utils import in_same_unit + + slow = 'slowness' + if slow not in monitor.coords: + raise RuntimeError(f'A SlownessMonitor must have the coordinate "{slow}"') + sloth = 'sloth' + names = {slow: sloth} + min_max = in_same_unit(primary_slowness(primary), to=monitor.coords[slow]) + normed = ( + (monitor.coords[slow] - min(min_max)) / (max(min_max) - min(min_max)) + ).rename(names) + return DataArray(monitor.data.rename(names), coords={sloth: normed}) + + +def normalise( + events: WavelengthEvents, + monitor: WavelengthMonitor, + edges: WavelengthBins, +) -> NormWavelengthEvents: + """Ensure the WavelengthEvents are binned according to the WavelengthBins, then use + the WavelengthMonitor as a lookup table to record the per-bin normalization. + + Parameters + ---------- + events + Event data which includes a per-event sloth coordinate + monitor + (Probably) 1-D histogram data with a sloth coordinate + edges + 1-D bin boundaries for the event data + + Returns + ------- + : + Event data binned by sloth, with a coordinate that is the per-bin normalization + """ + from scipp import lookup + + dim = 'incident_wavelength' + centres = (edges[:-1] + edges[1:]) / 2 + variances = None + if monitor.variances is not None: + monitor = monitor.copy() + variances = monitor.copy() + variances.values = monitor.variances + monitor.variances = None + variances.variances = None + counts = lookup(monitor, dim)[centres] + if variances is not None: + # Bad form, maybe. But two events with the same sloth bin are normalized + # by the same monitor counts -- which has a known uncertainty -- and scipp + # refuses to allow lookup on data which has variances defined. + counts.variances = (lookup(variances, dim)[centres]).values + + binned = events.bin(**{dim: edges}) + binned.coords['monitor'] = counts + return binned + + providers = ( incident_monitor_normalization, monitor_pivot_time, monitor_wall_time, monitor_slowness, + monitor_wavelength, + monitor_sloth, + monitor_position, + source_monitor_path_length, + normalise, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 457d2004f..b1b9344bc 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -6,7 +6,7 @@ from loguru import logger from scipp import Variable -from ..types import NeXusFileName +from ..types import NeXusFileName, NormWavelengthEvents def _load_all(group, obj_type): @@ -335,6 +335,8 @@ def get_unwrapped_events( } pipeline = Pipeline(ki_providers, params=params) primary = pipeline.get(PrimarySpectrometerObject).compute() + pipeline[PrimarySpectrometerObject] = primary + params[PrimarySpectrometerObject] = primary events = sample_events.copy() events.bins.coords['frame_time'] = pipeline.get(SampleTime).compute() @@ -477,6 +479,83 @@ def add_momentum_axes(ki_params, kf_params, events, a3: Variable): return events +def add_wavelength_axes(ki_params, kf_params, events, monitor, monitor_name): + """Convert to incident wavelength per event and independent monitor axis + + Parameters + ---------- + ki_params: + A dictionary of parameters needed by the incident-spectrometer sciline pipeline + kf_params: + A dictionary of parameters needed by the secondary-spectrometer sciline pipeline + events: + Event data, presumably with per-event incident energy (or wavelength, or + inverse velocity == slowness) already calculated; the basis for the returned + events + monitor: + A beam monitor with one independent axis (time since last pulse as measured). + The monitor intensity is expected to be a histogram along the one independent + axis, but event monitor data should work as well. + monitor_name: + The name of the provided beam monitor, used to get its position in the + primary spectrometer + + Returns + ------- + : + The events with a new coordinate, 'incident_wavelength'. + And the monitor with 'incident_wavelength' coordinate. + """ + from sciline import Pipeline + + from ..types import ( + FrameTimeMonitor, + # SlownessMonitor, + IncidentWavelength, + MonitorName, + WavelengthMonitor, + ) + from .kf import providers as kf_providers + from .ki import providers as ki_providers + from .normalisation import providers as monitor_providers + + params = { + MonitorName: monitor_name, + FrameTimeMonitor: monitor, + } + params.update(ki_params) + params.update(kf_params) + pipeline = Pipeline(monitor_providers + ki_providers + kf_providers, params=params) + # slowness = pipeline.compute(SlownessMonitor) + # pipeline[SlownessMonitor] = slowness + wavelength_monitor = pipeline.compute(WavelengthMonitor) + events.bins.coords['incident_wavelength'] = pipeline.compute(IncidentWavelength) + return events, wavelength_monitor + + +def normalise_wavelength_events(ki_params, kf_params, events, monitor): + from sciline import Pipeline + + from ..types import ( + NormWavelengthEvents, + WavelengthBins, + WavelengthEvents, + WavelengthMonitor, + ) + from .normalisation import providers + + params = { + WavelengthEvents: events, + WavelengthMonitor: monitor, + WavelengthBins: monitor.coords['incident_wavelength'], + } + params.update(ki_params) + params.update(kf_params) + pipeline = Pipeline(providers, params=params) + events = pipeline.compute(NormWavelengthEvents) + return events + + def split( triplets, analyzers, @@ -635,16 +714,16 @@ def one_setting( kf_params, sample_detector_flight_time = find_sample_detector_flight_time( sample, analyzers, detector_positions ) - sample_events = get_sample_events(triplet_events, sample_detector_flight_time) + events = get_sample_events(triplet_events, sample_detector_flight_time) ki_params, unwrapped_events, primary = get_unwrapped_events( - filename, names['source'], names['sample'], sample_events, names['focus'] + filename, names['source'], names['sample'], events, names['focus'] ) ei, en, ef = get_energy_axes(ki_params, kf_params) - energy_events = sample_events.copy() - energy_events.bins.coords['energy_transfer'] = en.to(unit='meV') - energy_events.bins.coords['incident_energy'] = ei - energy_events.coords['final_energy'] = ef + # energy_events = sample_events.copy() + events.bins.coords['energy_transfer'] = en.to(unit='meV') + events.bins.coords['incident_energy'] = ei + events.coords['final_energy'] = ef if 'a3' in triplet_events.coords: # this _should_ be one (a3, a4) setting, @@ -657,20 +736,24 @@ def one_setting( logger.warning("No a3 present in setting, assuming 0 a3") a3 = scalar(0, unit='deg') - energy_momentum_events = add_momentum_axes(ki_params, kf_params, energy_events, a3) + events = add_momentum_axes(ki_params, kf_params, events, a3) + + # Set up the normalisation by adding a 'incident_wavelength' coordinate to + # the individual events and the normalisation monitor + events, monitor = add_wavelength_axes( + ki_params, kf_params, events, norm_monitor, names['monitor'] + ) + + norm_events = normalise_wavelength_events(ki_params, kf_params, events, monitor) return { 'triplet_events': triplet_events, - 'sample_events': sample_events, - 'unwrapped_events': unwrapped_events, + 'events': events, 'norm_monitor': norm_monitor, - 'energy_events': energy_events, 'sample_detector_flight_time': sample_detector_flight_time, 'analyzers': analyzers, - 'energy_momentum_events': energy_momentum_events, - # 'detectors': detectors, - # 'monitors': monitors, - # 'triplets': triplets, + 'wavelength_monitor': monitor, + 'norm_events': norm_events, } @@ -828,7 +911,7 @@ def bifrost( may not all be useful, and are subject to pruning as experience is gained with the workflow. """ - import scipp as sc + from scipp import concat from tqdm import tqdm named_components = component_names( @@ -855,7 +938,7 @@ def bifrost( settings, desc='(a3, a4) settings' ) ] - return {k: sc.concat([d[k] for d in data], 'setting') for k in data[0]} + return {k: concat([d[k] for d in data], 'setting') for k in data[0]} def bifrost_single( @@ -909,6 +992,8 @@ def bifrost_single( sample, analyzers, triplet_events, norm_monitor, logs = load_precompute( filename, named_components, is_simulated ) + if 'time' in norm_monitor.sizes: + norm_monitor = norm_monitor.sum('time') data = one_setting( sample, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 1bf6f983f..3fd83ff9f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -32,6 +32,7 @@ def typer(named: str) -> type[scipp_type]: ReciprocalLatticeSpacing = variable_type('ReciprocalLatticeSpacing') IncidentDirection = variable_type('IncidentDirection') IncidentSlowness = variable_type('IncidentSlowness') +IncidentSloth = variable_type('IncidentSloth') IncidentWavelength = variable_type('IncidentWavelength') IncidentWavenumber = variable_type('IncidentWavenumber') IncidentWavevector = variable_type('IncidentWavevector') @@ -66,11 +67,15 @@ def typer(named: str) -> type[scipp_type]: PrimaryFocusDistance = variable_type('PrimaryFocusDistance') PrimaryFocusTime = variable_type('PrimaryFocusTime') +MonitorName = NewType('MonitorName', str) +MonitorPosition = variable_type('MonitorPosition') SourceMonitorPathLength = variable_type('SourceMonitorPathLength') SourceMonitorFlightTime = variable_type('SourceMonitorFlightTime') FrameTimeMonitor = data_array_type('FrameTimeMonitor') WallTimeMonitor = data_array_type('WallTimeMonitor') SlownessMonitor = data_array_type('SlownessMonitor') +WavelengthMonitor = data_array_type('WavelengthMonitor') +SlothMonitor = data_array_type('SlothMonitor') MonitorNormalisation = variable_type('MonitorNormalisation') @@ -92,5 +97,15 @@ def typer(named: str) -> type[scipp_type]: EnergyTransfer = variable_type('EnergyTransfer') -# Debugging types, likely to be removed DetectorGeometricA4 = variable_type("DetectorGeometricA4") + +SlothEvents = data_array_type('SlothEvents') +SlothBins = variable_type('SlothBins') +NormSlothEvents = data_array_type('NormSlothEvents') + +WavelengthEvents = data_array_type('WavelengthEvents') +WavelengthBins = variable_type('WavelengthBins') +NormWavelengthEvents = data_array_type('NormWavelengthEvents') + +NXspeFileName = NewType('NXspeFileName', str) +NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) From 21a7969141eec0586be59ae32c878f10098f8a76 Mon Sep 17 00:00:00 2001 From: "Gregory S. Tucker" Date: Mon, 21 Oct 2024 16:06:09 +0200 Subject: [PATCH 047/330] Update workflow.py --- .../essspectroscopy/src/ess/spectroscopy/indirect/workflow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index b1b9344bc..aea018bc9 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -537,7 +537,6 @@ def normalise_wavelength_events(ki_params, kf_params, events, monitor): from sciline import Pipeline from ..types import ( - NormWavelengthEvents, WavelengthBins, WavelengthEvents, WavelengthMonitor, From e37a0acac52dc8af3c34b8dc71f3a7316a2fb329 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 21 Oct 2024 17:51:58 +0200 Subject: [PATCH 048/330] [Fix] review raised issues --- .../src/ess/spectroscopy/indirect/ki.py | 8 +++--- .../spectroscopy/indirect/normalisation.py | 27 ++++++++----------- .../src/ess/spectroscopy/indirect/workflow.py | 3 --- .../src/ess/spectroscopy/utils.py | 22 +++++++++++++++ 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 658c0c47f..2104edef6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -364,13 +364,13 @@ def incident_slowness( def incident_sloth( primary: PrimarySpectrometerObject, slowness: IncidentSlowness ) -> IncidentSloth: + import scipp as sc from choppera.nexus import primary_slowness - from scipp import max, min - from ..utils import in_same_unit + from ..utils import range_normalized - min_max = in_same_unit(primary_slowness(primary), to=slowness) - return (slowness - min(min_max)) / (max(min_max) - min(min_max)) + min_max = primary_slowness(primary) + return range_normalized(slowness, sc.min(min_max), sc.max(min_max)) def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index 5e357a420..1105a033a 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -57,7 +57,7 @@ def source_monitor_path_length( HDF5 group entries are sorted alphabetically, so you should ensure that the NeXus file was constructed with this in mind. """ - from scipp import concat, dot, sqrt, sum + import scipp as sc from scippnexus import File, NXguide, compute_positions with File(file) as data: @@ -66,22 +66,19 @@ def source_monitor_path_length( for v in data['entry/instrument'][NXguide].values() ] - def vector_length(vector): - return sqrt(dot(vector, vector)) - # Find the closest guide to the monitor position, ignoring the possibility that # a guide could be _beyond_ the monitor _and_ closest :( closest = 0 - distance = vector_length(source - monitor) + distance = sc.norm(source - monitor) for i, position in enumerate(positions): - d = vector_length(position - monitor) + d = sc.norm(position - monitor) if d < distance: distance = d closest = i - positions = concat((source, *positions[:closest], monitor), dim='path') + positions = sc.concat((source, *positions[:closest], monitor), dim='path') diff = positions['path', 1:] - positions['path', :-1] - return sum(vector_length(diff)) + return sc.sum(sc.norm(diff)) def monitor_pivot_time( @@ -124,7 +121,7 @@ def monitor_wall_time( raise RuntimeError(f'A FrameTimeMonitor must have coordinate "{frame}"') wall = 'wall_time' names = {frame: wall} - if monitor.sizes[frame] + 1 == monitor.coords[frame].size: + if monitor.coords.is_edges(frame, dim=frame): coord, values = unwrap_histogram( monitor.coords[frame], monitor.data, frequency, least ) @@ -228,21 +225,19 @@ def monitor_sloth( The same intensities with independent axis converted to the sloth, which is the normalised slowness, inverse velocity, and incident wavelength """ + import scipp as sc from choppera.nexus import primary_slowness - from scipp import max, min - from ..utils import in_same_unit + from ..utils import range_normalized slow = 'slowness' if slow not in monitor.coords: raise RuntimeError(f'A SlownessMonitor must have the coordinate "{slow}"') sloth = 'sloth' names = {slow: sloth} - min_max = in_same_unit(primary_slowness(primary), to=monitor.coords[slow]) - normed = ( - (monitor.coords[slow] - min(min_max)) / (max(min_max) - min(min_max)) - ).rename(names) - return DataArray(monitor.data.rename(names), coords={sloth: normed}) + min_max = primary_slowness(primary) + normed = range_normalized(monitor.coords[slow], sc.min(min_max), sc.max(min_max)) + return DataArray(monitor.data.rename(names), coords={sloth: normed.rename(names)}) def normalise( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index aea018bc9..50fdb1252 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -526,8 +526,6 @@ def add_wavelength_axes(ki_params, kf_params, events, monitor, monitor_name): params.update(ki_params) params.update(kf_params) pipeline = Pipeline(monitor_providers + ki_providers + kf_providers, params=params) - # slowness = pipeline.compute(SlownessMonitor) - # pipeline[SlownessMonitor] = slowness wavelength_monitor = pipeline.compute(WavelengthMonitor) events.bins.coords['incident_wavelength'] = pipeline.compute(IncidentWavelength) return events, wavelength_monitor @@ -719,7 +717,6 @@ def one_setting( ) ei, en, ef = get_energy_axes(ki_params, kf_params) - # energy_events = sample_events.copy() events.bins.coords['energy_transfer'] = en.to(unit='meV') events.bins.coords['incident_energy'] = ei events.coords['final_energy'] = ef diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py index 4ba80d5f4..7650171be 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -24,5 +24,27 @@ def unit(x): return b +def range_normalized(variable: Variable, minimum: Variable, maximum: Variable): + """Convert a variable to a normalized range + + Parameters + ---------- + variable: scipp.Variable + The values to be normalized + minimum: scipp.Variable + The minimal value that the input `variable` could take + maximum: scipp.Variable + The maximal value that the input `variable` could take + + Returns + ------- + : + The input `variable` rescaled by the range of allowed values + """ + full = maximum - minimum + minimum, full = (in_same_unit(x, to=variable) for x in (minimum, full)) + return (variable - minimum) / full + + def is_in_coords(x: DataArray, name: str): return name in x.coords or (x.bins is not None and name in x.bins.coords) From 109b814bd5c3ca4fc5f8ca49a47aa8b88f5ef731 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Mon, 21 Oct 2024 15:51:43 +0200 Subject: [PATCH 049/330] [Add] NXspe output and relegation ADR --- .../adr/0001-relegate-nxspe-support.md | 107 ++++++++++ .../architecture-decision-records.md | 10 + .../essspectroscopy/docs/developer/index.md | 2 + .../src/ess/spectroscopy/indirect/__init__.py | 3 +- .../src/ess/spectroscopy/indirect/io.py | 191 ++++++++++++++++++ .../src/ess/spectroscopy/indirect/workflow.py | 68 +++++-- 6 files changed, 367 insertions(+), 14 deletions(-) create mode 100644 packages/essspectroscopy/docs/developer/adr/0001-relegate-nxspe-support.md create mode 100644 packages/essspectroscopy/docs/developer/architecture-decision-records.md create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py diff --git a/packages/essspectroscopy/docs/developer/adr/0001-relegate-nxspe-support.md b/packages/essspectroscopy/docs/developer/adr/0001-relegate-nxspe-support.md new file mode 100644 index 000000000..e8cf9e638 --- /dev/null +++ b/packages/essspectroscopy/docs/developer/adr/0001-relegate-nxspe-support.md @@ -0,0 +1,107 @@ +# ADR 0001: Relagate NXspe support + +- Status: +- Deciders: +- Date: 2024-10 + +## Context +Targeting community supported data formats will enable efficient use of existing analysis and visualization tools. +A number of histogram formats have been [listed for possible support](https://jira.ess.eu/browse/DMSCSPEC-46): +- [`NXspe`](https://jira.ess.eu/browse/DMSCSPEC-50) +- [`SQW`](https://jira.ess.eu/browse/DMSCSPEC-51) +- [`MJOLNIR`](https://jira.ess.eu/browse/DMSCSPEC-52) + +### `SQW` Prioritization and Challenges + +One of which, [`SQW`](https://github.com/scipp/essspectroscopy/issues/23), +has been identified as higher importance because it will enable interfacing with +the PACE tools. + +The major drawback to the `SQW` format is that it is documented most thoroughly by +its `MATLAB` serialization/deserialization routines, which are less than straightforward +to replicate in part due to an extensive class hierarchy, single-source backwards +compatibility over multiple file format versions, the ability to mix definition and +implementation of functions and place either in at least three different locations +(the `rundata` helper class seems to be spread over six), +and the lack of a free IDE that can help sort out the runtime behavior. + +Recently it was posited that, since `Horace` can read `NXspe` files and produce a valid +`SQW` file from them, perhaps focusing on their output from `essspectroscopy` could +be prudent. + +### Bending `NXspe` to Indirect-Geometry Time-of-Flight +`NXspe` is the [`NeXus` application definition](https://manual.nexusformat.org/classes/applications/NXspe.html#nxspe) +implementation of the columns-of-text `SPE` data format. + +`SPE` format files contain energy-transfer (or time) histograms of intensity, +one per detector element in the instrument. +Information about the positions and sizes of the detector elements was contained in +a separate file, either `PAR` or `PHX`. +The format was defined with Direct-Geometry (DG) Time-of-Flight (TOF) spectrometers in +mind where a single incident energy applied to all data, and all detector elements +shared the same energy-transfer histogram bin edges. This information was kept +separately from the two text files, and put into analysis scripts by the user. + +`NXspe` incorporates all information contained previously in `SPE` and `PAR` files +plus minimal information that otherwise may have gone into a log book. +It represents an appreciable improvement over the previous status-quo for DG-TOF. + +For Indirect-Geometry (IG) TOF instruments with a single final neutron energy, like +back-scattering instruments, it is also possible to histogram all detector energy +spectra with a single set of bin edges. By means of a flag, `Horace` can exchange +_E_i and _E_f in early data loading calculations, and then +otherwise treat conversion more-or-less the same to produce intensity of (**_Q_**,_E_) +observations binned, not unlike `scipp`, in a coarse 4-D grid. + +The problems start, however, when not all detectors share a single final energy, +as with BIFROST. +A single incident wavelength range applies for all BIFROST detector elements, +so one _E_i bin-boundary set would naturally apply for all detectors. +But this is _far_ from fixed _E_i or fixed _E_f with a single +energy transfer, _E_, bin-boundary set. + +#### Imaginary observations +The closest BIFROST data can get to 'standard' `NXspe` _E_ binning is to stitch +together the single _E_i ranges offset by each _E_f. +This has three drawbacks +1. The number of bins per detector element will consequently be larger +2. The sizes of the bins may not match well to the 'natural' incident energy bin sizes for all detector elements +3. Imaginary observations will be created for all detector elements. + +> **Note:** +> The term imaginary is used here to indicate that no measurement was performed +> for the incident neutron energies needed to produce the _E_ in one or more bin. + +#### Natural _E_ binning +Instead, by keeping per-detector-element _E_ binning the adherence to +the `NXspe` standard can be maintained but software like `Horace` struggle to handle +such data — +the required `/entry/data/energy` becomes 2-D but `Horace` expects (and reshapes) this +data to be 1-D. + +One symptom of this incompatibility is excessive memory usage. +For the 13500 BIFROST detector elements, with energy transfer binned into 103 bins, +in an early conversion step `Horace` requires a 13500 × 104 × 13500 array +of double values, and while ∼ 141 GB is not an insurmountable value it's also +not necessary. + +In testing, moving to a machine with 256 GB of memory was not sufficient for the +conversion to proceed. And it seems likely there are more incompatible assumptions +made about the content of the data for `Horace` to successfully produce an `SQW` object +from the '`BIFROST`-`NXspe`' files. + + +## Decision +It is now possible to make `BIFROST` data conform to the `NXspe` standard published by +the NeXus Foundation, but community software that _reads_ `NXspe` is likely to have +made similar assumptions about the shape of required data as `Horace`. +So the utility of `NXspe` as a common data format is likely limited. + +_Producing_ `NXspe` may still be useful, but it can not replace direct output of +`SQW` data files. + +∴ Relegate `NXspe` to lesser-supported output formats. + +## Consequences +A fully-fledged `SQW` output method is still required, which will still pose the same +problems of construction and maintainability. diff --git a/packages/essspectroscopy/docs/developer/architecture-decision-records.md b/packages/essspectroscopy/docs/developer/architecture-decision-records.md new file mode 100644 index 000000000..7368d750d --- /dev/null +++ b/packages/essspectroscopy/docs/developer/architecture-decision-records.md @@ -0,0 +1,10 @@ +# Architecture Decision Records + +```{toctree} +--- +maxdepth: 1 +glob: true +--- + +adr/* +``` \ No newline at end of file diff --git a/packages/essspectroscopy/docs/developer/index.md b/packages/essspectroscopy/docs/developer/index.md index 9dc534a3b..5ada4dd8f 100644 --- a/packages/essspectroscopy/docs/developer/index.md +++ b/packages/essspectroscopy/docs/developer/index.md @@ -13,4 +13,6 @@ maxdepth: 2 getting-started coding-conventions dependency-management +architecture-decision-records ``` + diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py index 38a05f19f..1803430db 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py @@ -1,9 +1,10 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) -from .workflow import bifrost, bifrost_single +from .workflow import bifrost, bifrost_single, bifrost_to_nxspe __all__ = ( "bifrost", "bifrost_single", + "bifrost_to_nxspe", ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py new file mode 100644 index 000000000..ed5f7bee6 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -0,0 +1,191 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + +from __future__ import annotations + +import h5py +import numpy +import scippnexus +from scipp import DataArray + +from ..types import NormWavelengthEvents, NXspeFileName, NXspeFileNames + + +def to_nxspe(events: NormWavelengthEvents, base: NXspeFileName) -> NXspeFileNames: + """Take events, which have been binned in incident wavelength and have monitor + counts per bin, and output one NXspe file per setting + + Parameters + ---------- + events: scipp.DataArray + The events binned in (setting, event_id, incident_wavelength) with + at least 'monitor', 'a3', and 'theta' bin coordinates. + The events and the bins must also have an 'incident_wavelength' coordinate. + base: str | Path + The filename base used to produce each NXspe filename. + + Returns + ------- + : + The list of filenames containing the NXspe data. If there are N settings in the + input DataArray, N filenames are returned. The names are of the form + {base}_{i+1:0{ceil(log10(N+1))}d}.nxspe + """ + from pathlib import Path + + from tqdm import tqdm + + dim = 'setting' + length = len(str(events.sizes[dim] + 1)) + files = [] + if not isinstance(base, Path): + base = Path(base) + parent = base.parent + if not parent.exists(): + parent.mkdir(parents=True) + + progress = tqdm(range(events.sizes[dim])) + for i in progress: + ev = events[dim, i] + fn = str(base) + '_' + f'{i+1}'.rjust(length, '0') + '.nxspe' + files.append(NXspeFileName(fn)) + _to_one_nxspe(ev, fn, progress) + return NXspeFileNames(files) + + +def _make_group(group: h5py.Group) -> scippnexus.Group: + return scippnexus.Group(group, definitions=scippnexus.base_definitions()) + + +def _lambda_to_ei(incident_wavelength): + from scipp.constants import Planck, neutron_mass + + return ((Planck / incident_wavelength) ** 2 / neutron_mass / 2).to(unit='meV') + + +def _ei_ef_to_en(incident_energy, final_energy): + return incident_energy - final_energy + + +def _to_one_nxspe(events: DataArray, filename: str, progress): + """Use scippnexus to create the NXspe file""" + from scipp import full, scalar, sqrt + from scippnexus import ( + NXcollection, + NXdata, + NXentry, + NXfermi_chopper, + NXinstrument, + NXsample, + ) + + observations = events.copy() + ef = events.coords['final_energy'] + observations *= sqrt(events.bins.coords['incident_energy'] / ef) + + # Adding null events requires replicating all coordinates of real events. + # We don't necessarily use all present event coordinates, so remove any we won't use + targets = [ + 'energy_transfer', + 'incident_energy', + 'incident_wavelength', + 'final_energy', + ] + for coord in [x for x in events.bins.coords if x not in targets]: + del observations.bins.coords[coord] + # And provide a means to calculate the rest from bin (not event) information + # we are sure incident_wavelength is a bin coordinate already, so can skip it. + graph = { + 'incident_energy': _lambda_to_ei, + 'energy_transfer': _ei_ef_to_en, + } + # # Adding zero-weight observations, i.e., null events, works now, but involves + # # a memory-copy of the data array and its bin structure. Since it isn't strictly + # # necessary for exporting NXspe, it can be skipped for now. + # observations = add_null_observations(observations, targets, graph) + + # combine the per bin intensities and normalize by monitor counts + # Note, applying this normalization to the _events_ would require splitting + # the bin monitor counts between the bin events. + normalize_by = events.coords['monitor'] # .broadcast(sizes=observations.sizes) + if normalize_by.variances is not None: + # we need to ignore the monitor uncertainty for the time being + normalize_by = normalize_by.copy() + normalize_by.variances = None + + observations = observations.hist().transform_coords(targets, graph=graph) + + if observations.variances is None: + observations.variances = observations.values # correct for counting statistics + observations.variances[observations.values == 0] = 1 + if observations.data.variances is not None: + observations.data.variances[observations.data.variances == 0] = 1 + # the transform_coords above renamed the 'incident_wavelength' dimension + # to 'energy_transfer' ... so we need to do the same to normalize_by or else + # scipp tries to broadcast when it doesn't need to. + observations.data = observations.data / normalize_by.rename_dims( + incident_wavelength='energy_transfer' + ) + + psi = observations.coords['a3'] + polar = observations.coords['theta'] + azimuthal = 0 * polar # all detectors are in the horizontal plane + azimuthal_width = azimuthal + scalar(2.0, unit='degree') + polar_width = azimuthal + scalar(0.1, unit='degree') + distance = full(sizes=polar.sizes, unit='m', value=3.0, dtype=polar.dtype) + data = observations.data + error = 0 * observations.data.values + if observations.data.variances is not None: + error = numpy.sqrt(observations.data.variances) + energy_transfer = observations.coords['energy_transfer'] + incident_energy = observations.coords['incident_energy'] + final_energy = observations.coords['final_energy'] + + with h5py.File(filename, mode='w') as f: + # make / in the file + root = _make_group(f) + # it _must_ contain an NXentry group, called [anything which is allowed]? + # with two fields and five subgroups required + entry = root.create_class('entry', NXentry) + # the name of the author program + entry.create_field('program_name', scalar('essspectroscopy')) + # and the NXDL schema information -- currently version 3.1 + definition = entry.create_field('definition', scalar('NXSPE')) + definition.attrs['version'] = '3.1' + + # the entry group also contains five subgroups + + # the NXcollection group must contain three fields + nxinfo = entry.create_class('NXSPE_info', NXcollection) + nxinfo.create_field('fixed_energy', final_energy) + nxinfo.create_field('ki_over_kf_scaling', scalar(True)) + nxinfo.create_field('psi', psi) + + # the NXdata group has 8 required fields + nxdata = entry.create_class('data', NXdata) + nxdata.create_field('azimuthal', azimuthal) + nxdata.create_field('azimuthal_width', azimuthal_width) + nxdata.create_field('polar', polar) + nxdata.create_field('polar_width', polar_width) + nxdata.create_field('distance', distance) + nxdata.create_field('data', data) + nxdata.create_field('error', error) + nxdata.create_field('energy', energy_transfer) + # Actually more useful extensions to NXspe for an instrument like BIFROST + nxdata.create_field('final_energy', final_energy) + nxdata.create_field('incident_energy', incident_energy) + + # the NXinstrument group has one required field and one required group + instrument = entry.create_class('instrument', NXinstrument) + instrument.create_field('name', scalar('SIMBIFROST')) + fermi = instrument.create_class('fermi_chopper', NXfermi_chopper) + fermi.create_field('energy', scalar(numpy.nan, unit='meV')) + + # and the NXsample group has three required fields + sample = entry.create_class('sample', NXsample) + sample.create_field('rotation_angle', psi) + sample.create_field('seblock', scalar("")) + sample.create_field('temperature', scalar(numpy.nan, unit='K')) + + +providers = (to_nxspe,) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 50fdb1252..6b46bcc38 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -6,7 +6,10 @@ from loguru import logger from scipp import Variable -from ..types import NeXusFileName, NormWavelengthEvents +from ..types import NeXusFileName, NormWavelengthEvents, NXspeFileName + +# PIXEL_NAME = 'event_id' +PIXEL_NAME = 'detector_number' def _load_all(group, obj_type): @@ -158,8 +161,8 @@ def detector_per_pixel(triplets: dict) -> dict[int, str]: def combine_analyzers(analyzers: dict, triplets: dict): - """Combine needed analyzer properties into a single array, duplicating information, - to have per-pixel data + """Combine needed analyzer properties into a single array, + duplicating information, to have per-pixel data BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, N. Calculations for the properties of neutrons which make it to each detector pixel @@ -186,8 +189,7 @@ def combine_analyzers(analyzers: dict, triplets: dict): Returns ------- : - A single array with 'event_id' pixel dimension and the - per-pixel analyzer information + A single array with pixel dimension and the per-pixel analyzer information """ from scipp import Dataset, array, concat from scippnexus import compute_positions @@ -202,8 +204,8 @@ def analyzer_extract(obj): p2a = {k: extracted[d2a[v]] for k, v in p2d.items()} pixels = sorted(p2a) - data = concat([p2a[p] for p in pixels], dim='event_id') - data['event_id'] = array(values=pixels, dims=['event_id'], unit=None) + data = concat([p2a[p] for p in pixels], dim=PIXEL_NAME) + data[PIXEL_NAME] = array(values=pixels, dims=[PIXEL_NAME], unit=None) return data @@ -226,19 +228,18 @@ def combine_detectors(triplets: dict): Returns ------- : - A single array with 'event_id' pixel dimension and the - per-pixel center of mass position + A single array with pixel dimension and the per-pixel center of mass position """ from scipp import Dataset, concat, sort def extract(obj): pixels = obj['data'].coords['detector_number'] midpoints = obj['data'].coords['position'] - return Dataset(data={'event_id': pixels, 'position': midpoints}) + return Dataset(data={PIXEL_NAME: pixels, 'position': midpoints}) data = concat([extract(v) for v in triplets.values()], dim='arm') - data = Dataset({k: v.flatten(to='event_id') for k, v in data.items()}) - return sort(data, data['event_id'].data) + data = Dataset({k: v.flatten(to=PIXEL_NAME) for k, v in data.items()}) + return sort(data, data[PIXEL_NAME].data) def find_sample_detector_flight_time(sample, analyzers, detector_positions): @@ -286,7 +287,7 @@ def get_triplet_events(triplets): """ from scipp import concat, sort - events = concat([x['data'] for x in triplets], dim='arm').flatten(to='event_id') + events = concat([x['data'] for x in triplets], dim='arm').flatten(to=PIXEL_NAME) events = sort(events, events.coords['detector_number']) return events @@ -531,6 +532,17 @@ def add_wavelength_axes(ki_params, kf_params, events, monitor, monitor_name): return events, wavelength_monitor +def get_geometric_a4(kf_params): + from sciline import Pipeline + + from ..types import DetectorGeometricA4 + from .kf import providers + + pipeline = Pipeline(providers, params=kf_params) + geometric_a4 = pipeline.compute(DetectorGeometricA4) + return geometric_a4 + + def normalise_wavelength_events(ki_params, kf_params, events, monitor): from sciline import Pipeline @@ -721,6 +733,8 @@ def one_setting( events.bins.coords['incident_energy'] = ei events.coords['final_energy'] = ef + events.coords['theta'] = get_geometric_a4(kf_params) + if 'a3' in triplet_events.coords: # this _should_ be one (a3, a4) setting, # with a single a3 value on triple_events (and norm_monitor) @@ -1006,3 +1020,31 @@ def bifrost_single( data['logs'] = logs return data + + +def bifrost_to_nxspe( + *, + output: NXspeFileName, + filename: NeXusFileName | None = None, + events: NormWavelengthEvents | None = None, + **kwargs, +): + from sciline import Pipeline + + from ..types import NXspeFileNames + from .io import providers as io_providers + + if filename is None and events is None: + raise ValueError("Provide events, or filename to read and reduce file") + if events is None: + reduced = bifrost(filename, **kwargs) + events = reduced['norm_events'] + + pipeline = Pipeline( + providers=io_providers, + params={ + NXspeFileName: output, + NormWavelengthEvents: events, + }, + ) + return pipeline.compute(NXspeFileNames) From a9d49e330928f615f080f142642313c01ff56bf1 Mon Sep 17 00:00:00 2001 From: "Gregory S. Tucker" Date: Tue, 22 Oct 2024 13:59:48 +0200 Subject: [PATCH 050/330] Update docs/developer/adr/0001-relegate-nxspe-support.md Status → accepted Co-authored-by: Jan-Lukas Wynen --- .../docs/developer/adr/0001-relegate-nxspe-support.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/docs/developer/adr/0001-relegate-nxspe-support.md b/packages/essspectroscopy/docs/developer/adr/0001-relegate-nxspe-support.md index e8cf9e638..b00f90797 100644 --- a/packages/essspectroscopy/docs/developer/adr/0001-relegate-nxspe-support.md +++ b/packages/essspectroscopy/docs/developer/adr/0001-relegate-nxspe-support.md @@ -1,7 +1,7 @@ # ADR 0001: Relagate NXspe support -- Status: -- Deciders: +- Status: accepted +- Deciders: Greg, Jan-Lukas - Date: 2024-10 ## Context From 5744c6609a431deccc4f0ad44049f5232634ad80 Mon Sep 17 00:00:00 2001 From: "Gregory S. Tucker" Date: Tue, 22 Oct 2024 14:26:40 +0200 Subject: [PATCH 051/330] Update src/ess/spectroscopy/indirect/io.py Use `scipp.values` instead of overwriting the `variances` property. Co-authored-by: Jan-Lukas Wynen --- .../essspectroscopy/src/ess/spectroscopy/indirect/io.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index ed5f7bee6..097521599 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -107,11 +107,8 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): # combine the per bin intensities and normalize by monitor counts # Note, applying this normalization to the _events_ would require splitting # the bin monitor counts between the bin events. - normalize_by = events.coords['monitor'] # .broadcast(sizes=observations.sizes) - if normalize_by.variances is not None: - # we need to ignore the monitor uncertainty for the time being - normalize_by = normalize_by.copy() - normalize_by.variances = None + # we need to ignore the monitor uncertainty for the time being + normalize_by = sc.values(events.coords['monitor']) observations = observations.hist().transform_coords(targets, graph=graph) From 3d278b9c5006d5661d1dbf42d324b139577ff089 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Tue, 22 Oct 2024 14:30:36 +0200 Subject: [PATCH 052/330] [Fix] remove duplicate code --- .../src/ess/spectroscopy/indirect/io.py | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index 097521599..9d299768f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -69,7 +69,7 @@ def _ei_ef_to_en(incident_energy, final_energy): def _to_one_nxspe(events: DataArray, filename: str, progress): """Use scippnexus to create the NXspe file""" - from scipp import full, scalar, sqrt + import scipp as sc from scippnexus import ( NXcollection, NXdata, @@ -81,7 +81,7 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): observations = events.copy() ef = events.coords['final_energy'] - observations *= sqrt(events.bins.coords['incident_energy'] / ef) + observations *= sc.sqrt(events.bins.coords['incident_energy'] / ef) # Adding null events requires replicating all coordinates of real events. # We don't necessarily use all present event coordinates, so remove any we won't use @@ -115,8 +115,6 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): if observations.variances is None: observations.variances = observations.values # correct for counting statistics observations.variances[observations.values == 0] = 1 - if observations.data.variances is not None: - observations.data.variances[observations.data.variances == 0] = 1 # the transform_coords above renamed the 'incident_wavelength' dimension # to 'energy_transfer' ... so we need to do the same to normalize_by or else # scipp tries to broadcast when it doesn't need to. @@ -127,9 +125,9 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): psi = observations.coords['a3'] polar = observations.coords['theta'] azimuthal = 0 * polar # all detectors are in the horizontal plane - azimuthal_width = azimuthal + scalar(2.0, unit='degree') - polar_width = azimuthal + scalar(0.1, unit='degree') - distance = full(sizes=polar.sizes, unit='m', value=3.0, dtype=polar.dtype) + azimuthal_width = azimuthal + sc.scalar(2.0, unit='degree') + polar_width = azimuthal + sc.scalar(0.1, unit='degree') + distance = sc.full(sizes=polar.sizes, unit='m', value=3.0, dtype=polar.dtype) data = observations.data error = 0 * observations.data.values if observations.data.variances is not None: @@ -145,9 +143,9 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): # with two fields and five subgroups required entry = root.create_class('entry', NXentry) # the name of the author program - entry.create_field('program_name', scalar('essspectroscopy')) + entry.create_field('program_name', sc.scalar('essspectroscopy')) # and the NXDL schema information -- currently version 3.1 - definition = entry.create_field('definition', scalar('NXSPE')) + definition = entry.create_field('definition', sc.scalar('NXSPE')) definition.attrs['version'] = '3.1' # the entry group also contains five subgroups @@ -155,7 +153,7 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): # the NXcollection group must contain three fields nxinfo = entry.create_class('NXSPE_info', NXcollection) nxinfo.create_field('fixed_energy', final_energy) - nxinfo.create_field('ki_over_kf_scaling', scalar(True)) + nxinfo.create_field('ki_over_kf_scaling', sc.scalar(True)) nxinfo.create_field('psi', psi) # the NXdata group has 8 required fields @@ -174,15 +172,15 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): # the NXinstrument group has one required field and one required group instrument = entry.create_class('instrument', NXinstrument) - instrument.create_field('name', scalar('SIMBIFROST')) + instrument.create_field('name', sc.scalar('SIMBIFROST')) fermi = instrument.create_class('fermi_chopper', NXfermi_chopper) - fermi.create_field('energy', scalar(numpy.nan, unit='meV')) + fermi.create_field('energy', sc.scalar(numpy.nan, unit='meV')) # and the NXsample group has three required fields sample = entry.create_class('sample', NXsample) sample.create_field('rotation_angle', psi) - sample.create_field('seblock', scalar("")) - sample.create_field('temperature', scalar(numpy.nan, unit='K')) + sample.create_field('seblock', sc.scalar("")) + sample.create_field('temperature', sc.scalar(numpy.nan, unit='K')) providers = (to_nxspe,) From 9296e78b3a0343488c9a40015cb5ad5d73001c07 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Tue, 22 Oct 2024 14:37:06 +0200 Subject: [PATCH 053/330] [Refactor] cleanup azimuthal, azimuthal_width, and polar_width creation --- .../essspectroscopy/src/ess/spectroscopy/indirect/io.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index 9d299768f..fa6f868eb 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -124,9 +124,9 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): psi = observations.coords['a3'] polar = observations.coords['theta'] - azimuthal = 0 * polar # all detectors are in the horizontal plane - azimuthal_width = azimuthal + sc.scalar(2.0, unit='degree') - polar_width = azimuthal + sc.scalar(0.1, unit='degree') + azimuthal = sc.zeros(sizes=polar.sizes, unit='deg', dtype=polar.dtype) + azimuthal_width = sc.full(sizes=polar.sizes, unit='deg', value=2.0) + polar_width = sc.full(sizes=polar.sizes, unit='deg', value=0.1) distance = sc.full(sizes=polar.sizes, unit='m', value=3.0, dtype=polar.dtype) data = observations.data error = 0 * observations.data.values From 76c5ceb6e661eb49c0f4001edb96cd33122427fd Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Tue, 22 Oct 2024 14:39:09 +0200 Subject: [PATCH 054/330] [Refactor] review comments --- packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py | 3 ++- .../essspectroscopy/src/ess/spectroscopy/indirect/workflow.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index fa6f868eb..d8f22000b 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -129,9 +129,10 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): polar_width = sc.full(sizes=polar.sizes, unit='deg', value=0.1) distance = sc.full(sizes=polar.sizes, unit='m', value=3.0, dtype=polar.dtype) data = observations.data - error = 0 * observations.data.values if observations.data.variances is not None: error = numpy.sqrt(observations.data.variances) + else: + error = 0 * observations.data.values energy_transfer = observations.coords['energy_transfer'] incident_energy = observations.coords['incident_energy'] final_energy = observations.coords['final_energy'] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 6b46bcc38..5be4cea2d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -8,7 +8,6 @@ from ..types import NeXusFileName, NormWavelengthEvents, NXspeFileName -# PIXEL_NAME = 'event_id' PIXEL_NAME = 'detector_number' From 98c8550f9baff7a832d6ef866bf44024c038395f Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Tue, 22 Oct 2024 14:47:43 +0200 Subject: [PATCH 055/330] [Refactor] remove NXspe progress bar, implement review suggestions --- .../ess/spectroscopy/indirect/conservation.py | 9 +++++++++ .../src/ess/spectroscopy/indirect/io.py | 20 +++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index afdfb9bfa..f632d8f9d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -5,8 +5,10 @@ from ..types import ( EnergyTransfer, + FinalEnergy, FinalWavenumber, FinalWavevector, + IncidentEnergy, IncidentWavenumber, IncidentWavevector, LabMomentumTransfer, @@ -123,6 +125,12 @@ def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: return hbar * hbar * (ki * ki - kf * kf) / 2 / neutron_mass +def energy_transfer( + incident_energy: IncidentEnergy, final_energy: FinalEnergy +) -> EnergyTransfer: + return incident_energy - final_energy + + providers = ( *ki_providers, *kf_providers, @@ -135,4 +143,5 @@ def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: sample_table_momentum_y, sample_table_momentum_z, energy, + energy_transfer, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index d8f22000b..2175457f1 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -33,23 +33,19 @@ def to_nxspe(events: NormWavelengthEvents, base: NXspeFileName) -> NXspeFileName """ from pathlib import Path - from tqdm import tqdm - dim = 'setting' length = len(str(events.sizes[dim] + 1)) files = [] - if not isinstance(base, Path): - base = Path(base) + base = Path(base) parent = base.parent if not parent.exists(): parent.mkdir(parents=True) - progress = tqdm(range(events.sizes[dim])) - for i in progress: + for i in range(events.sizes[dim]): ev = events[dim, i] fn = str(base) + '_' + f'{i+1}'.rjust(length, '0') + '.nxspe' files.append(NXspeFileName(fn)) - _to_one_nxspe(ev, fn, progress) + _to_one_nxspe(ev, fn) return NXspeFileNames(files) @@ -63,11 +59,7 @@ def _lambda_to_ei(incident_wavelength): return ((Planck / incident_wavelength) ** 2 / neutron_mass / 2).to(unit='meV') -def _ei_ef_to_en(incident_energy, final_energy): - return incident_energy - final_energy - - -def _to_one_nxspe(events: DataArray, filename: str, progress): +def _to_one_nxspe(events: DataArray, filename: str): """Use scippnexus to create the NXspe file""" import scipp as sc from scippnexus import ( @@ -79,6 +71,8 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): NXsample, ) + from .conservation import energy_transfer + observations = events.copy() ef = events.coords['final_energy'] observations *= sc.sqrt(events.bins.coords['incident_energy'] / ef) @@ -97,7 +91,7 @@ def _to_one_nxspe(events: DataArray, filename: str, progress): # we are sure incident_wavelength is a bin coordinate already, so can skip it. graph = { 'incident_energy': _lambda_to_ei, - 'energy_transfer': _ei_ef_to_en, + 'energy_transfer': energy_transfer, } # # Adding zero-weight observations, i.e., null events, works now, but involves # # a memory-copy of the data array and its bin structure. Since it isn't strictly From c58cdb9bd8579a2374d2999708a33d40fd06331b Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Tue, 22 Oct 2024 15:53:07 +0200 Subject: [PATCH 056/330] [Add] submodule for BIFROST-specific functionality --- .../src/ess/bifrost/__init__.py | 4 +++ .../src/ess/bifrost/detector.py | 34 +++++++++++++++++++ .../essspectroscopy/src/ess/bifrost/types.py | 5 +++ 3 files changed, 43 insertions(+) create mode 100644 packages/essspectroscopy/src/ess/bifrost/__init__.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/detector.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/types.py diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py new file mode 100644 index 000000000..58b19bbdd --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -0,0 +1,4 @@ +from .detector import providers + + +__all__ = (providers,) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py new file mode 100644 index 000000000..48cc27e5e --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -0,0 +1,34 @@ +from ..spectroscopy.typing import FinalEnergy +from .typing import ArcNumber + + +def arc_number(final_energy: FinalEnergy) -> ArcNumber: + """Calculate BIFROST arc index number from pixel final energy + + The BIFROST analyzers are each set to diffract an + energy in the set (2.7, 3.2, 3.8, 4.4. 5.0) meV. + This energy is only valid for the central point of the center + tube of the associated detector triplet. All other pixels + will have a final energy slightly higher or lower. + + This function assigns the closest arc number indexing the + ordered set above. + + Parameters + ---------- + final_energy: scipp.Variable + The per-pixel (or event) final neutron energy + + Returns + ------- + : + The arc index of the analyzer from which the neutron scattered + """ + import scipp as sc + + minimum = sc.scalar(2.7, unit='meV') + step = sc.scalar(0.575, unit='meV') + return sc.round((final_energy - minimum) / step).to(dtype='int') + + +providers = (arc_number,) diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py new file mode 100644 index 000000000..04a72b7da --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -0,0 +1,5 @@ +from typing import NewType + +from scipp import Variable + +ArcNumber = NewType('ArcNumber', Variable) From 61e6ace3ce6f0449477cc7c896f6508cbd79b8fa Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Tue, 22 Oct 2024 16:23:59 +0200 Subject: [PATCH 057/330] [Fix] *.types.py name typo --- packages/essspectroscopy/src/ess/bifrost/detector.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 48cc27e5e..faf2f5980 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -1,5 +1,5 @@ -from ..spectroscopy.typing import FinalEnergy -from .typing import ArcNumber +from ..spectroscopy.types import FinalEnergy +from .types import ArcNumber def arc_number(final_energy: FinalEnergy) -> ArcNumber: From 1fb4e5a746d71fb88331e9af87592e2f8479cf3f Mon Sep 17 00:00:00 2001 From: "Gregory S. Tucker" Date: Tue, 22 Oct 2024 16:50:10 +0200 Subject: [PATCH 058/330] Update src/ess/bifrost/__init__.py Co-authored-by: Jan-Lukas Wynen --- packages/essspectroscopy/src/ess/bifrost/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py index 58b19bbdd..4d365b1ce 100644 --- a/packages/essspectroscopy/src/ess/bifrost/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -1,4 +1,4 @@ from .detector import providers -__all__ = (providers,) +__all__ = ['providers'] From e5cde0a93544b3f45fa17269671c22e2ebe6766e Mon Sep 17 00:00:00 2001 From: "Gregory S. Tucker" Date: Tue, 22 Oct 2024 16:50:16 +0200 Subject: [PATCH 059/330] Update src/ess/bifrost/__init__.py Co-authored-by: Jan-Lukas Wynen --- packages/essspectroscopy/src/ess/bifrost/__init__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py index 4d365b1ce..61c198ea5 100644 --- a/packages/essspectroscopy/src/ess/bifrost/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -1,4 +1,13 @@ +import importlib.metadata + from .detector import providers +try: + __version__ = importlib.metadata.version("essspectroscopy") +except importlib.metadata.PackageNotFoundError: + __version__ = "0.0.0" + +del importlib + __all__ = ['providers'] From d6261a38286ca8e82e5aff71283b455c3690c21f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 12:18:17 +0000 Subject: [PATCH 060/330] Bump scipp from 24.9.1 to 24.11.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 24.9.1 to 24.11.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/24.09.1...24.11.0) --- updated-dependencies: - dependency-name: scipp dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 220eb5aa3..8f6b02c14 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -59,7 +59,7 @@ python-dateutil==2.9.0.post0 # strictyaml sciline==24.6.3 # via -r base.in -scipp==24.9.1 +scipp==24.11.0 # via # -r base.in # choppera From 5a17f4d727f099d673119ee1d9bfc143f3fe2334 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:25:53 +0000 Subject: [PATCH 061/330] Bump scipp from 24.11.0 to 24.11.1 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 24.11.0 to 24.11.1. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/24.11.0...24.11.1) --- updated-dependencies: - dependency-name: scipp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 8f6b02c14..3a572275b 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -59,7 +59,7 @@ python-dateutil==2.9.0.post0 # strictyaml sciline==24.6.3 # via -r base.in -scipp==24.11.0 +scipp==24.11.1 # via # -r base.in # choppera From 6b029b815d7698f90fd31f4fa01f4ac8ff878d66 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 11:08:59 +0100 Subject: [PATCH 062/330] Copier update --- packages/essspectroscopy/.copier-answers.yml | 8 ++++---- packages/essspectroscopy/.github/workflows/ci.yml | 12 ++++++------ packages/essspectroscopy/.github/workflows/docs.yml | 6 +++--- .../.github/workflows/nightly_at_main.yml | 6 +++--- .../.github/workflows/nightly_at_release.yml | 8 ++++---- .../essspectroscopy/.github/workflows/release.yml | 10 +++++----- packages/essspectroscopy/.github/workflows/test.yml | 4 ++-- .../essspectroscopy/.github/workflows/unpinned.yml | 8 ++++---- packages/essspectroscopy/.gitignore | 3 +++ packages/essspectroscopy/.pre-commit-config.yaml | 12 ++++++++++-- packages/essspectroscopy/docs/conf.py | 1 + packages/essspectroscopy/pyproject.toml | 1 + packages/essspectroscopy/requirements/make_base.py | 4 +++- packages/essspectroscopy/requirements/nightly.in | 1 - packages/essspectroscopy/tests/package_test.py | 2 +- packages/essspectroscopy/tox.ini | 2 +- 16 files changed, 51 insertions(+), 37 deletions(-) diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index 14ee425c5..b61cbb73c 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,13 +1,13 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 2f9f107 +_commit: aa5dc5e _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' -max_python: '3.12' +max_python: '3.13' min_python: '3.10' namespace_package: ess -nightly_deps: scipp,scippneutron,sciline,plopp,scippnexus +nightly_deps: scipp,scippneutron,sciline,plopp,scippnexus,essreduce orgname: scipp prettyname: ESSspectroscopy projectname: essspectroscopy -related_projects: Scipp,ScippNeutron,ScippNexus,Plopp,Sciline +related_projects: Scipp,ScippNeutron,ScippNexus,Plopp,Sciline,ESSreduce year: 2024 diff --git a/packages/essspectroscopy/.github/workflows/ci.yml b/packages/essspectroscopy/.github/workflows/ci.yml index 356700a73..b273e6844 100644 --- a/packages/essspectroscopy/.github/workflows/ci.yml +++ b/packages/essspectroscopy/.github/workflows/ci.yml @@ -10,7 +10,7 @@ on: jobs: formatting: name: Formatting and static analysis - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' outputs: min_python: ${{ steps.vars.outputs.min_python }} min_tox_env: ${{ steps.vars.outputs.min_tox_env }} @@ -19,15 +19,15 @@ jobs: - name: Get Python version for other CI jobs id: vars run: | - echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT - echo "min_tox_env=py$(cat .github/workflows/python-version-ci | sed 's/\.//g')" >> $GITHUB_OUTPUT + echo "min_python=$(< .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" + echo "min_tox_env=py$(sed 's/\.//g' < .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" - uses: actions/setup-python@v5 with: python-version-file: '.github/workflows/python-version-ci' - uses: pre-commit/action@v3.0.1 with: extra_args: --all-files - - uses: pre-commit-ci/lite-action@v1.0.3 + - uses: pre-commit-ci/lite-action@v1.1.0 if: always() with: msg: Apply automatic formatting @@ -37,7 +37,7 @@ jobs: needs: formatting strategy: matrix: - os: ['ubuntu-22.04'] + os: ['ubuntu-24.04'] python: - version: '${{needs.formatting.outputs.min_python}}' tox-env: '${{needs.formatting.outputs.min_tox_env}}' @@ -53,6 +53,6 @@ jobs: uses: ./.github/workflows/docs.yml with: publish: false - linkcheck: ${{ contains(matrix.variant.os, 'ubuntu') && github.ref == 'refs/heads/main' }} + linkcheck: ${{ github.ref == 'refs/heads/main' }} branch: ${{ github.head_ref == '' && github.ref_name || github.head_ref }} secrets: inherit diff --git a/packages/essspectroscopy/.github/workflows/docs.yml b/packages/essspectroscopy/.github/workflows/docs.yml index c6a413ea0..72659cbd8 100644 --- a/packages/essspectroscopy/.github/workflows/docs.yml +++ b/packages/essspectroscopy/.github/workflows/docs.yml @@ -41,7 +41,7 @@ env: jobs: docs: name: Build documentation - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' env: ESS_PROTECTED_FILESTORE_USERNAME: ${{ secrets.ESS_PROTECTED_FILESTORE_USERNAME }} ESS_PROTECTED_FILESTORE_PASSWORD: ${{ secrets.ESS_PROTECTED_FILESTORE_PASSWORD }} @@ -58,7 +58,7 @@ jobs: python-version-file: '.github/workflows/python-version-ci' - run: python -m pip install --upgrade pip - run: python -m pip install -r requirements/ci.txt - - run: tox -e releasedocs -- ${VERSION} + - run: tox -e releasedocs -- "${VERSION}" if: ${{ inputs.version != '' }} - run: tox -e docs if: ${{ inputs.version == '' }} @@ -69,7 +69,7 @@ jobs: name: docs_html path: html/ - - uses: JamesIves/github-pages-deploy-action@v4.6.4 + - uses: JamesIves/github-pages-deploy-action@v4.6.9 if: ${{ inputs.publish }} with: branch: gh-pages diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml index c2b9d33a3..20e9ee4a8 100644 --- a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml +++ b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml @@ -8,21 +8,21 @@ on: jobs: setup: name: Setup variables - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' outputs: min_python: ${{ steps.vars.outputs.min_python }} steps: - uses: actions/checkout@v4 - name: Get Python version for other CI jobs id: vars - run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT + run: echo "min_python=$(< .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" tests: name: Tests needs: setup strategy: matrix: - os: ['ubuntu-22.04'] + os: ['ubuntu-24.04'] python: - version: '${{needs.setup.outputs.min_python}}' tox-env: 'nightly' diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml index 3faa1c23b..14b752135 100644 --- a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml +++ b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml @@ -8,7 +8,7 @@ on: jobs: setup: name: Setup variables - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' outputs: min_python: ${{ steps.vars.outputs.min_python }} release_tag: ${{ steps.release.outputs.release_tag }} @@ -18,17 +18,17 @@ jobs: fetch-depth: 0 # history required so we can determine latest release tag - name: Get last release tag from git id: release - run: echo "release_tag=$(git describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*')" >> $GITHUB_OUTPUT + run: echo "release_tag=$(git describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*')" >> "$GITHUB_OUTPUT" - name: Get Python version for other CI jobs id: vars - run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT + run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" tests: name: Tests needs: setup strategy: matrix: - os: ['ubuntu-22.04'] + os: ['ubuntu-24.04'] python: - version: '${{needs.setup.outputs.min_python}}' tox-env: 'nightly' diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml index 4ca0e3ad4..53ca2e0a5 100644 --- a/packages/essspectroscopy/.github/workflows/release.yml +++ b/packages/essspectroscopy/.github/workflows/release.yml @@ -12,7 +12,7 @@ defaults: jobs: build_conda: name: Conda build - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: actions/checkout@v4 @@ -35,7 +35,7 @@ jobs: build_wheels: name: Wheels - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: actions/checkout@v4 @@ -61,7 +61,7 @@ jobs: upload_pypi: name: Deploy PyPI needs: [build_wheels, build_conda] - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' environment: release permissions: id-token: write @@ -73,7 +73,7 @@ jobs: upload_conda: name: Deploy Conda needs: [build_wheels, build_conda] - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' if: github.event_name == 'release' && github.event.action == 'published' steps: @@ -97,7 +97,7 @@ jobs: assets: name: Upload docs needs: docs - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' permissions: contents: write # This is needed so that the action can upload the asset steps: diff --git a/packages/essspectroscopy/.github/workflows/test.yml b/packages/essspectroscopy/.github/workflows/test.yml index e98ed7cdf..ca40b253e 100644 --- a/packages/essspectroscopy/.github/workflows/test.yml +++ b/packages/essspectroscopy/.github/workflows/test.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: os-variant: - default: 'ubuntu-22.04' + default: 'ubuntu-24.04' type: string python-version: type: string @@ -23,7 +23,7 @@ on: workflow_call: inputs: os-variant: - default: 'ubuntu-22.04' + default: 'ubuntu-24.04' type: string python-version: type: string diff --git a/packages/essspectroscopy/.github/workflows/unpinned.yml b/packages/essspectroscopy/.github/workflows/unpinned.yml index 3f49f7223..ff03faa18 100644 --- a/packages/essspectroscopy/.github/workflows/unpinned.yml +++ b/packages/essspectroscopy/.github/workflows/unpinned.yml @@ -8,7 +8,7 @@ on: jobs: setup: name: Setup variables - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' outputs: min_python: ${{ steps.vars.outputs.min_python }} release_tag: ${{ steps.release.outputs.release_tag }} @@ -18,17 +18,17 @@ jobs: fetch-depth: 0 # history required so we can determine latest release tag - name: Get last release tag from git id: release - run: echo "release_tag=$(git describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*')" >> $GITHUB_OUTPUT + run: echo "release_tag=$(git describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*')" >> "$GITHUB_OUTPUT" - name: Get Python version for other CI jobs id: vars - run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT + run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" tests: name: Tests needs: setup strategy: matrix: - os: ['ubuntu-22.04'] + os: ['ubuntu-24.04'] python: - version: '${{needs.setup.outputs.min_python}}' tox-env: 'unpinned' diff --git a/packages/essspectroscopy/.gitignore b/packages/essspectroscopy/.gitignore index 43c3d6c08..3e02ecce9 100644 --- a/packages/essspectroscopy/.gitignore +++ b/packages/essspectroscopy/.gitignore @@ -4,6 +4,7 @@ dist html .tox *.egg-info +uv.lock # we lock dependencies with pip-compile, not uv *.sw? @@ -41,3 +42,5 @@ docs/generated/ *.rcif *.ort *.zip +*.sqw +*.nxspe diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml index e0c499eec..f83362c61 100644 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -1,8 +1,10 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: check-added-large-files + - id: check-case-conflict + - id: check-illegal-windows-names - id: check-json exclude: asv.conf.json - id: check-merge-conflict @@ -21,7 +23,7 @@ repos: args: [ "--drop-empty-cells", "--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.2 + rev: v0.6.9 hooks: - id: ruff args: [ --fix ] @@ -44,3 +46,9 @@ repos: - id: rst-directive-colons - id: rst-inline-touching-normal - id: text-unicode-replacement-char + - repo: https://github.com/rhysd/actionlint + rev: v1.7.3 + hooks: + - id: actionlint + # Disable because of false-positive SC2046 + args: ["-shellcheck="] diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 37ae12a10..8be27086e 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -166,6 +166,7 @@ "image_dark": "_static/logo-dark.svg", }, "external_links": [ + {"name": "ESSreduce", "url": "https://scipp.github.io/essreduce"}, {"name": "Plopp", "url": "https://scipp.github.io/plopp"}, {"name": "Sciline", "url": "https://scipp.github.io/sciline"}, {"name": "Scipp", "url": "https://scipp.github.io"}, diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 26455910e..49ad73f3e 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -21,6 +21,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering", "Typing :: Typed", ] diff --git a/packages/essspectroscopy/requirements/make_base.py b/packages/essspectroscopy/requirements/make_base.py index ccbab0015..01cd45873 100644 --- a/packages/essspectroscopy/requirements/make_base.py +++ b/packages/essspectroscopy/requirements/make_base.py @@ -67,7 +67,9 @@ def as_nightly(repo: str) -> str: nightly = tuple(args.nightly.split(",") if args.nightly else []) -nightly_dependencies = [dep for dep in dependencies if not dep.startswith(nightly)] +nightly_dependencies = [ + dep for dep in dependencies + test_dependencies if not dep.startswith(nightly) +] nightly_dependencies += [as_nightly(arg) for arg in nightly] write_dependencies("nightly", nightly_dependencies) diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index dbba71b7f..858ead672 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,4 +1,3 @@ --r basetest.in # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! scipp>=24.9.1 diff --git a/packages/essspectroscopy/tests/package_test.py b/packages/essspectroscopy/tests/package_test.py index a8e7f2184..345ee508e 100644 --- a/packages/essspectroscopy/tests/package_test.py +++ b/packages/essspectroscopy/tests/package_test.py @@ -3,7 +3,7 @@ """Tests of package integrity. -Note that addidional imports need to be added for repositories that +Note that additional imports need to be added for repositories that contain multiple packages. """ diff --git a/packages/essspectroscopy/tox.ini b/packages/essspectroscopy/tox.ini index 8b81c3450..63839b890 100644 --- a/packages/essspectroscopy/tox.ini +++ b/packages/essspectroscopy/tox.ini @@ -63,5 +63,5 @@ deps = tomli skip_install = true changedir = requirements -commands = python ./make_base.py --nightly scippneutron,sciline,plopp,scippnexus +commands = python ./make_base.py --nightly scipp,scippneutron,sciline,plopp,scippnexus,essreduce pip-compile-multi -d . --backtracking From a67e7379b45f063391f5b57ba2a9301390eda9ba Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 11:10:51 +0100 Subject: [PATCH 063/330] Update dependencies --- .../essspectroscopy/requirements/base.txt | 32 +++++------ .../essspectroscopy/requirements/basetest.in | 1 + .../essspectroscopy/requirements/basetest.txt | 6 ++- packages/essspectroscopy/requirements/ci.txt | 22 +++++--- packages/essspectroscopy/requirements/dev.txt | 26 ++++----- .../essspectroscopy/requirements/docs.txt | 42 ++++++++------- .../essspectroscopy/requirements/mypy.txt | 2 +- .../essspectroscopy/requirements/nightly.in | 5 +- .../essspectroscopy/requirements/nightly.txt | 53 +++++++++++++------ .../essspectroscopy/requirements/static.txt | 12 ++--- .../essspectroscopy/requirements/wheels.txt | 8 +-- 11 files changed, 126 insertions(+), 83 deletions(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 3a572275b..5eaacffd2 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -5,17 +5,17 @@ # # pip-compile-multi # -choppera==0.1.4 +choppera==0.1.5 # via -r base.in -contourpy==1.3.0 +contourpy==1.3.1 # via matplotlib -cyclebane==24.6.0 +cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -fonttools==4.53.1 +fonttools==4.55.0 # via matplotlib -h5py==3.11.0 +h5py==3.12.1 # via # scippneutron # scippnexus @@ -29,9 +29,9 @@ matplotlib==3.9.2 # plopp mpltoolbox==24.5.1 # via scippneutron -networkx==3.3 +networkx==3.4.2 # via cyclebane -numpy==2.1.1 +numpy==2.1.3 # via # choppera # contourpy @@ -42,22 +42,22 @@ numpy==2.1.1 # scipp # scippneutron # scipy -packaging==24.1 +packaging==24.2 # via matplotlib -pillow==10.4.0 +pillow==11.0.0 # via matplotlib -plopp==24.9.1 +plopp==24.10.0 # via scippneutron -polystar==0.4.4 +polystar==0.4.5 # via choppera -pyparsing==3.1.4 +pyparsing==3.2.0 # via matplotlib python-dateutil==2.9.0.post0 # via # matplotlib # scippnexus # strictyaml -sciline==24.6.3 +sciline==24.10.0 # via -r base.in scipp==24.11.1 # via @@ -65,9 +65,9 @@ scipp==24.11.1 # choppera # scippneutron # scippnexus -scippneutron==24.8.0 +scippneutron==24.11.0 # via -r base.in -scippnexus==24.9.0 +scippnexus==24.11.0 # via # -r base.in # choppera @@ -81,5 +81,5 @@ six==1.16.0 # via python-dateutil strictyaml==1.7.3 # via choppera -tqdm==4.66.5 +tqdm==4.67.0 # via -r base.in diff --git a/packages/essspectroscopy/requirements/basetest.in b/packages/essspectroscopy/requirements/basetest.in index 12ab599af..5b3942ea6 100644 --- a/packages/essspectroscopy/requirements/basetest.in +++ b/packages/essspectroscopy/requirements/basetest.in @@ -7,3 +7,4 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! +pytest diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 6ede5df4e..66970e043 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,11 +5,15 @@ # # pip-compile-multi # +exceptiongroup==1.2.2 + # via pytest iniconfig==2.0.0 # via pytest -packaging==24.1 +packaging==24.2 # via pytest pluggy==1.5.0 # via pytest pytest==8.3.3 # via -r basetest.in +tomli==2.1.0 + # via pytest diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 08a2d4193..14921a291 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -11,13 +11,13 @@ certifi==2024.8.30 # via requests chardet==5.2.0 # via tox -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests colorama==0.4.6 # via tox -distlib==0.3.8 +distlib==0.3.9 # via virtualenv -filelock==3.16.0 +filelock==3.16.1 # via # tox # virtualenv @@ -27,26 +27,32 @@ gitpython==3.1.43 # via -r ci.in idna==3.10 # via requests -packaging==24.1 +packaging==24.2 # via # -r ci.in # pyproject-api # tox -platformdirs==4.3.3 +platformdirs==4.3.6 # via # tox # virtualenv pluggy==1.5.0 # via tox -pyproject-api==1.7.1 +pyproject-api==1.8.0 # via tox requests==2.32.3 # via -r ci.in smmap==5.0.1 # via gitdb -tox==4.18.1 +tomli==2.1.0 + # via + # pyproject-api + # tox +tox==4.23.2 # via -r ci.in +typing-extensions==4.12.2 + # via tox urllib3==2.2.3 # via requests -virtualenv==20.26.4 +virtualenv==20.27.1 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 6b3bbeb05..efc84409c 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -14,7 +14,7 @@ -r wheels.txt annotated-types==0.7.0 # via pydantic -anyio==4.4.0 +anyio==4.6.2.post1 # via # httpx # jupyter-server @@ -32,9 +32,9 @@ click==8.1.7 # via # pip-compile-multi # pip-tools -copier==9.3.1 +copier==9.4.1 # via -r dev.in -dunamai==1.22.0 +dunamai==1.23.0 # via copier fqdn==1.5.1 # via jsonschema @@ -42,7 +42,7 @@ funcy==2.0 # via copier h11==0.14.0 # via httpcore -httpcore==1.0.5 +httpcore==1.0.7 # via httpx httpx==0.27.2 # via jupyterlab @@ -50,7 +50,7 @@ isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.9.25 +json5==0.9.28 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema @@ -71,7 +71,7 @@ jupyter-server==2.14.2 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.2.5 +jupyterlab==4.3.1 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab @@ -85,15 +85,15 @@ pip-compile-multi==2.6.4 # via -r dev.in pip-tools==7.4.1 # via pip-compile-multi -plumbum==1.8.3 +plumbum==1.9.0 # via copier -prometheus-client==0.20.0 +prometheus-client==0.21.0 # via jupyter-server pycparser==2.22 # via cffi -pydantic==2.9.1 +pydantic==2.10.1 # via copier -pydantic-core==2.23.3 +pydantic-core==2.27.1 # via pydantic python-json-logger==2.0.7 # via jupyter-events @@ -119,15 +119,15 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.9.0.20240906 +types-python-dateutil==2.9.0.20241003 # via arrow uri-template==1.3.0 # via jsonschema -webcolors==24.8.0 +webcolors==24.11.1 # via jsonschema websocket-client==1.8.0 # via jupyter-server -wheel==0.44.0 +wheel==0.45.0 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index e17189ce7..f14e27e4e 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -24,15 +24,15 @@ beautifulsoup4==4.12.3 # via # nbconvert # pydata-sphinx-theme -bleach==6.1.0 +bleach==6.2.0 # via nbconvert certifi==2024.8.30 # via requests -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.5 +debugpy==1.8.9 # via ipykernel decorator==5.1.1 # via ipython @@ -44,6 +44,8 @@ docutils==0.21.2 # nbsphinx # pydata-sphinx-theme # sphinx +exceptiongroup==1.2.2 + # via ipython executing==2.1.0 # via stack-data fastjsonschema==2.20.0 @@ -54,11 +56,11 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.27.0 +ipython==8.29.0 # via # -r docs.in # ipykernel -jedi==0.19.1 +jedi==0.19.2 # via ipython jinja2==3.1.4 # via @@ -68,9 +70,9 @@ jinja2==3.1.4 # sphinx jsonschema==4.23.0 # via nbformat -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 # via jsonschema -jupyter-client==8.6.2 +jupyter-client==8.6.3 # via # ipykernel # nbclient @@ -87,7 +89,7 @@ markdown-it-py==3.0.0 # via # mdit-py-plugins # myst-parser -markupsafe==2.1.5 +markupsafe==3.0.2 # via # jinja2 # nbconvert @@ -122,17 +124,17 @@ parso==0.8.4 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.3.3 +platformdirs==4.3.6 # via jupyter-core -prompt-toolkit==3.0.47 +prompt-toolkit==3.0.48 # via ipython -psutil==6.0.0 +psutil==6.1.0 # via ipykernel ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pydata-sphinx-theme==0.15.4 +pydata-sphinx-theme==0.16.0 # via -r docs.in pygments==2.18.0 # via @@ -153,7 +155,7 @@ referencing==0.35.1 # jsonschema-specifications requests==2.32.3 # via sphinx -rpds-py==0.20.0 +rpds-py==0.21.0 # via # jsonschema # referencing @@ -161,7 +163,7 @@ snowballstemmer==2.2.0 # via sphinx soupsieve==2.6 # via beautifulsoup4 -sphinx==8.0.2 +sphinx==8.1.3 # via # -r docs.in # myst-parser @@ -170,7 +172,7 @@ sphinx==8.0.2 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==2.4.1 +sphinx-autodoc-typehints==2.5.0 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in @@ -190,9 +192,11 @@ sphinxcontrib-serializinghtml==2.0.0 # via sphinx stack-data==0.6.3 # via ipython -tinycss2==1.3.0 +tinycss2==1.4.0 # via nbconvert -tornado==6.4.1 +tomli==2.1.0 + # via sphinx +tornado==6.4.2 # via # ipykernel # jupyter-client @@ -209,7 +213,9 @@ traitlets==5.14.3 # nbformat # nbsphinx typing-extensions==4.12.2 - # via pydata-sphinx-theme + # via + # ipython + # pydata-sphinx-theme urllib3==2.2.3 # via requests wcwidth==0.2.13 diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 383f872aa..6ffc9ba63 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,7 +6,7 @@ # pip-compile-multi # -r test.txt -mypy==1.11.2 +mypy==1.13.0 # via -r mypy.in mypy-extensions==1.0.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 858ead672..f064a2676 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,10 +1,13 @@ + # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -scipp>=24.9.1 choppera>=0.1.4 loguru tqdm +pytest +scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl scippneutron @ git+https://github.com/scipp/scippneutron@main sciline @ git+https://github.com/scipp/sciline@main plopp @ git+https://github.com/scipp/plopp@main scippnexus @ git+https://github.com/scipp/scippnexus@main +essreduce @ git+https://github.com/scipp/essreduce@main diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 5668d0760..d48351b88 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,25 +1,30 @@ -# SHA1:ea730da6565cd5faa478a74fbcf95b23f3eb183a +# SHA1:681863fcf78cc681b36b5a7b2e8630e327107555 # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # --r basetest.txt -choppera==0.1.4 +choppera==0.1.5 # via -r nightly.in -contourpy==1.3.0 +contourpy==1.3.1 # via matplotlib -cyclebane==24.6.0 +cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -fonttools==4.53.1 +essreduce @ git+https://github.com/scipp/essreduce@main + # via -r nightly.in +exceptiongroup==1.2.2 + # via pytest +fonttools==4.55.0 # via matplotlib -h5py==3.11.0 +h5py==3.12.1 # via # scippneutron # scippnexus +iniconfig==2.0.0 + # via pytest kiwisolver==1.4.7 # via matplotlib loguru==0.7.2 @@ -30,9 +35,9 @@ matplotlib==3.9.2 # plopp mpltoolbox==24.5.1 # via scippneutron -networkx==3.3 +networkx==3.4.2 # via cyclebane -numpy==2.1.1 +numpy==2.1.3 # via # choppera # contourpy @@ -43,35 +48,49 @@ numpy==2.1.1 # scipp # scippneutron # scipy -pillow==10.4.0 +packaging==24.2 + # via + # matplotlib + # pytest +pillow==11.0.0 # via matplotlib plopp @ git+https://github.com/scipp/plopp@main # via # -r nightly.in # scippneutron -polystar==0.4.4 +pluggy==1.5.0 + # via pytest +polystar==0.4.5 # via choppera -pyparsing==3.1.4 +pyparsing==3.2.0 # via matplotlib +pytest==8.3.3 + # via -r nightly.in python-dateutil==2.9.0.post0 # via # matplotlib # scippnexus # strictyaml sciline @ git+https://github.com/scipp/sciline@main - # via -r nightly.in -scipp==24.9.1 + # via + # -r nightly.in + # essreduce +scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl # via # -r nightly.in # choppera + # essreduce # scippneutron # scippnexus scippneutron @ git+https://github.com/scipp/scippneutron@main - # via -r nightly.in + # via + # -r nightly.in + # essreduce scippnexus @ git+https://github.com/scipp/scippnexus@main # via # -r nightly.in # choppera + # essreduce # scippneutron scipy==1.14.1 # via @@ -82,5 +101,7 @@ six==1.16.0 # via python-dateutil strictyaml==1.7.3 # via choppera -tqdm==4.66.5 +tomli==2.1.0 + # via pytest +tqdm==4.67.0 # via -r nightly.in diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 59cfddf0e..e107d9150 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -7,19 +7,19 @@ # cfgv==3.4.0 # via pre-commit -distlib==0.3.8 +distlib==0.3.9 # via virtualenv -filelock==3.16.0 +filelock==3.16.1 # via virtualenv -identify==2.6.1 +identify==2.6.2 # via pre-commit nodeenv==1.9.1 # via pre-commit -platformdirs==4.3.3 +platformdirs==4.3.6 # via virtualenv -pre-commit==3.8.0 +pre-commit==4.0.1 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.26.4 +virtualenv==20.27.1 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 6adb80661..6a1c0600c 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -5,9 +5,11 @@ # # pip-compile-multi # -build==1.2.2 +build==1.2.2.post1 # via -r wheels.in -packaging==24.1 +packaging==24.2 # via build -pyproject-hooks==1.1.0 +pyproject-hooks==1.2.0 + # via build +tomli==2.1.0 # via build From 9c06fe6e7a20727513f3de47cf10142fc3fbb660 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 14:30:27 +0100 Subject: [PATCH 064/330] Disable linkcheck for Jira --- packages/essspectroscopy/docs/conf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 8be27086e..07a1ba1ef 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -266,4 +266,6 @@ def do_not_plot(*args, **kwargs): linkcheck_ignore = [ # Specific lines in Github blobs cannot be found by linkcheck. r'https?://github\.com/.*?/blob/[a-f0-9]+/.+?#', + # ESS Jira is not publicly accessible. + r'https?://jira\.ess\.eu', ] From 05538eda7a3f9a59cb34fb219a83a69ea6749174 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 12:32:31 +0000 Subject: [PATCH 065/330] Bump scipp from 24.11.1 to 24.11.2 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 24.11.1 to 24.11.2. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/24.11.1...24.11.2) --- updated-dependencies: - dependency-name: scipp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 5eaacffd2..e401408e3 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -59,7 +59,7 @@ python-dateutil==2.9.0.post0 # strictyaml sciline==24.10.0 # via -r base.in -scipp==24.11.1 +scipp==24.11.2 # via # -r base.in # choppera From 0eb668cbf770582669b42b969b86b0e6eb4e2542 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 23 Sep 2024 15:43:04 +0200 Subject: [PATCH 066/330] Use sc.norm --- packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 2104edef6..9dbf5a41e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -7,6 +7,7 @@ from __future__ import annotations +import scipp as sc from scippnexus import Group from ess.spectroscopy.types import ( @@ -138,7 +139,7 @@ def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: distance = 0 * allowance for name in names[1:]: x = choppers[name]['position'] - distance += norm(x - last) + distance += sc.norm(x - last) last = x if distance <= allowance: focus_names.append(FocusComponentName(name)) @@ -200,7 +201,7 @@ def focus_distance( for name in names: pos += compute_positions(data['entry/instrument'][name][...])['position'] pos /= len(names) - return norm(pos - origin) + return sc.norm(pos - origin) def focus_time( From 612fdce6ce2c8d3524f3c3066c959455a61ee94b Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 23 Sep 2024 15:43:32 +0200 Subject: [PATCH 067/330] Use types from ess.reduce --- .../src/ess/spectroscopy/indirect/ki.py | 18 ++++++------ .../src/ess/spectroscopy/indirect/workflow.py | 14 ++++----- .../src/ess/spectroscopy/types.py | 29 +++++++++++++++---- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 9dbf5a41e..5bbcce269 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -11,6 +11,7 @@ from scippnexus import Group from ess.spectroscopy.types import ( + Filename, FocusComponentName, FocusComponentNames, IncidentDirection, @@ -20,7 +21,6 @@ IncidentWavelength, IncidentWavenumber, IncidentWavevector, - NeXusFileName, PrimaryFocusDistance, PrimaryFocusTime, PrimarySpectrometerObject, @@ -76,7 +76,7 @@ def determine_name_with_type( return next(iter(found)) -def guess_source_name(file: NeXusFileName) -> SourceName: +def guess_source_name(file: Filename) -> SourceName: """Guess the name of the source in the NeXus instrument file""" from scippnexus import File, NXmoderator, NXsource @@ -88,7 +88,7 @@ def guess_source_name(file: NeXusFileName) -> SourceName: return SourceName(name) -def guess_sample_name(file: NeXusFileName) -> SampleName: +def guess_sample_name(file: Filename) -> SampleName: """Guess the name of the sample in the NeXus instrument file""" from scippnexus import File, NXsample @@ -98,7 +98,7 @@ def guess_sample_name(file: NeXusFileName) -> SampleName: return SampleName(name) -def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: +def guess_focus_component_names(file: Filename) -> FocusComponentNames: """Guess the component names which define the focus of a Primary Spectrometer Note @@ -148,7 +148,7 @@ def guess_focus_component_names(file: NeXusFileName) -> FocusComponentNames: return FocusComponentNames(focus_names) -def source_position(file: NeXusFileName, source: SourceName) -> SourcePosition: +def source_position(file: Filename, source: SourceName) -> SourcePosition: """Extract the position of the named source from a NeXus file""" from scippnexus import File, compute_positions @@ -156,7 +156,7 @@ def source_position(file: NeXusFileName, source: SourceName) -> SourcePosition: return compute_positions(data['entry/instrument'][source][...])['position'] -def sample_position(file: NeXusFileName, sample: SampleName) -> SamplePosition: +def sample_position(file: Filename, sample: SampleName) -> SamplePosition: """Extract the position of the named sample from a NeXus file""" from scippnexus import File, compute_positions @@ -165,7 +165,7 @@ def sample_position(file: NeXusFileName, sample: SampleName) -> SamplePosition: def focus_distance( - file: NeXusFileName, origin: SourcePosition, names: FocusComponentNames + file: Filename, origin: SourcePosition, names: FocusComponentNames ) -> PrimaryFocusDistance: """Find the average distance from the source position to the named components @@ -214,7 +214,7 @@ def focus_time( def primary_path_length( - file: NeXusFileName, source: SourcePosition, sample: SamplePosition + file: Filename, source: SourcePosition, sample: SamplePosition ) -> SourceSamplePathLength: """Compute the primary spectrometer path length from source to sample positions @@ -238,7 +238,7 @@ def primary_path_length( def primary_spectrometer( - file: NeXusFileName, + file: Filename, source: SourceName, sample: SampleName, frequency: SourceFrequency, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 5be4cea2d..3b2e96f9e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -6,7 +6,7 @@ from loguru import logger from scipp import Variable -from ..types import NeXusFileName, NormWavelengthEvents, NXspeFileName +from ..types import Filename, NeXusFileName, NormWavelengthEvents, NXspeFileName PIXEL_NAME = 'detector_number' @@ -308,8 +308,8 @@ def get_unwrapped_events( from sciline import Pipeline from ..types import ( + Filename, FocusComponentNames, - NeXusFileName, PrimarySpectrometerObject, SampleFrameTime, SampleName, @@ -323,7 +323,7 @@ def get_unwrapped_events( from .ki import providers as ki_providers params = { - NeXusFileName: filename, + Filename: filename, SampleName: sample_name, SourceName: source_name, SourceDelay: ess_source_delay(), @@ -660,7 +660,7 @@ def do_split(x, time_name): return vals -def load_everything(filename: NeXusFileName, named_components: dict[str, str]): +def load_everything(filename: Filename, named_components: dict[str, str]): """Load all needed information from the named NeXus HDF5 file Parameters @@ -767,7 +767,7 @@ def one_setting( def load_precompute( - filename: NeXusFileName, + filename: Filename, named_components: dict[str, str], is_simulated: bool = False, ): @@ -882,7 +882,7 @@ def component_names( def bifrost( - filename: NeXusFileName, + filename: Filename, source_component: str | None = None, sample_component: str | None = None, focus_components: list[str] | None = None, @@ -951,7 +951,7 @@ def bifrost( def bifrost_single( - filename: NeXusFileName, + filename: Filename, source_component: str | None = None, sample_component: str | None = None, focus_components: list[str] | None = None, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 3fd83ff9f..f74e52afc 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -6,6 +6,9 @@ from choppera.primary import PrimarySpectrometer from scipp import DataArray, Variable +from ess.reduce.nexus import generic_types as reduce_gt +from ess.reduce.nexus import types as reduce_t + def make_scipp_named_typer(scipp_type): def typer(named: str) -> type[scipp_type]: @@ -17,11 +20,27 @@ def typer(named: str) -> type[scipp_type]: variable_type = make_scipp_named_typer(Variable) data_array_type = make_scipp_named_typer(DataArray) +CalibratedDetector = reduce_gt.CalibratedDetector +DetectorPositionOffset = reduce_gt.DetectorPositionOffset +DetectorData = reduce_gt.DetectorData +GravityVector = reduce_t.GravityVector +Filename = reduce_gt.Filename +MonitorData = reduce_gt.MonitorData +NeXusComponentLocationSpec = reduce_gt.NeXusComponentLocationSpec +NeXusDetector = reduce_gt.NeXusDetector +NeXusDetectorName = reduce_t.NeXusDetectorName +NeXusMonitor = reduce_gt.NeXusMonitor +NeXusMonitorName = reduce_gt.NeXusMonitorName +NeXusSource = reduce_gt.NeXusSource +RunType = reduce_gt.RunType +SamplePosition = reduce_gt.SamplePosition +SampleRun = reduce_gt.SampleRun +SourcePosition = reduce_gt.SourcePosition + +# See https://github.com/scipp/essreduce/issues/105 about monitor names +Monitor3 = reduce_gt.Monitor3 +MonitorType = reduce_gt.MonitorType -NeXusFileName = NewType('NeXusFileName', str) - -SourcePosition = variable_type('SourcePosition') -SamplePosition = variable_type('SamplePosition') AnalyzerPosition = variable_type('AnalyzerPosition') DetectorPosition = variable_type('DetectorPosition') AnalyzerOrientation = variable_type('AnalyzerOrientation') @@ -53,8 +72,8 @@ def typer(named: str) -> type[scipp_type]: DetectorTime = variable_type('DetectorTime') SourceTime = variable_type('SourceTime') -SourceName = NewType('SourceName', str) SampleName = NewType('SampleName', str) +SourceName = NewType('SourceName', str) SourceFrequency = variable_type('SourceFrequency') SourceDuration = variable_type('SourceDuration') SourceDelay = variable_type('SourceDelay') From 49260b3bc4bd417849ed75ffc722f8650fefbac3 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 23 Sep 2024 16:33:48 +0200 Subject: [PATCH 068/330] Add pooch dependency --- packages/essspectroscopy/pyproject.toml | 1 + .../essspectroscopy/requirements/base.txt | 30 +++++------ .../essspectroscopy/requirements/basetest.in | 1 + .../essspectroscopy/requirements/basetest.txt | 24 +++++++-- packages/essspectroscopy/requirements/ci.txt | 14 +++-- packages/essspectroscopy/requirements/dev.txt | 24 ++++----- .../essspectroscopy/requirements/docs.txt | 32 ++++++------ .../essspectroscopy/requirements/nightly.txt | 51 ++++++------------- .../essspectroscopy/requirements/static.txt | 8 +-- .../essspectroscopy/requirements/wheels.txt | 2 + 10 files changed, 92 insertions(+), 95 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 49ad73f3e..d5d2c3017 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -44,6 +44,7 @@ dynamic = ["version"] [project.optional-dependencies] test = [ + "pooch", "pytest", ] diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index e401408e3..f6f9f02b3 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -5,17 +5,17 @@ # # pip-compile-multi # -choppera==0.1.5 +choppera==0.1.4 # via -r base.in -contourpy==1.3.1 +contourpy==1.3.0 # via matplotlib -cyclebane==24.10.0 +cyclebane==24.6.0 # via sciline cycler==0.12.1 # via matplotlib -fonttools==4.55.0 +fonttools==4.53.1 # via matplotlib -h5py==3.12.1 +h5py==3.11.0 # via # scippneutron # scippnexus @@ -29,9 +29,9 @@ matplotlib==3.9.2 # plopp mpltoolbox==24.5.1 # via scippneutron -networkx==3.4.2 +networkx==3.3 # via cyclebane -numpy==2.1.3 +numpy==2.1.1 # via # choppera # contourpy @@ -42,22 +42,22 @@ numpy==2.1.3 # scipp # scippneutron # scipy -packaging==24.2 +packaging==24.1 # via matplotlib -pillow==11.0.0 +pillow==10.4.0 # via matplotlib -plopp==24.10.0 +plopp==24.9.2 # via scippneutron polystar==0.4.5 # via choppera -pyparsing==3.2.0 +pyparsing==3.1.4 # via matplotlib python-dateutil==2.9.0.post0 # via # matplotlib # scippnexus # strictyaml -sciline==24.10.0 +sciline==24.6.3 # via -r base.in scipp==24.11.2 # via @@ -65,9 +65,9 @@ scipp==24.11.2 # choppera # scippneutron # scippnexus -scippneutron==24.11.0 +scippneutron==24.9.0 # via -r base.in -scippnexus==24.11.0 +scippnexus==24.9.0 # via # -r base.in # choppera @@ -81,5 +81,5 @@ six==1.16.0 # via python-dateutil strictyaml==1.7.3 # via choppera -tqdm==4.67.0 +tqdm==4.66.5 # via -r base.in diff --git a/packages/essspectroscopy/requirements/basetest.in b/packages/essspectroscopy/requirements/basetest.in index 5b3942ea6..25ac83568 100644 --- a/packages/essspectroscopy/requirements/basetest.in +++ b/packages/essspectroscopy/requirements/basetest.in @@ -7,4 +7,5 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! +pooch pytest diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 66970e043..6b41e80eb 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -1,19 +1,35 @@ -# SHA1:0eaa389e1fdb3a1917c0f987514bd561be5718ee +# SHA1:54ed0e3deb2d458e91bae14067e84eaad659f5fd # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # +certifi==2024.8.30 + # via requests +charset-normalizer==3.3.2 + # via requests exceptiongroup==1.2.2 # via pytest +idna==3.10 + # via requests iniconfig==2.0.0 # via pytest -packaging==24.2 - # via pytest +packaging==24.1 + # via + # pooch + # pytest +platformdirs==4.3.6 + # via pooch pluggy==1.5.0 # via pytest +pooch==1.8.2 + # via -r basetest.in pytest==8.3.3 # via -r basetest.in -tomli==2.1.0 +requests==2.32.3 + # via pooch +tomli==2.0.1 # via pytest +urllib3==2.2.3 + # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 14921a291..af1677b2d 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -11,11 +11,11 @@ certifi==2024.8.30 # via requests chardet==5.2.0 # via tox -charset-normalizer==3.4.0 +charset-normalizer==3.3.2 # via requests colorama==0.4.6 # via tox -distlib==0.3.9 +distlib==0.3.8 # via virtualenv filelock==3.16.1 # via @@ -27,7 +27,7 @@ gitpython==3.1.43 # via -r ci.in idna==3.10 # via requests -packaging==24.2 +packaging==24.1 # via # -r ci.in # pyproject-api @@ -44,15 +44,13 @@ requests==2.32.3 # via -r ci.in smmap==5.0.1 # via gitdb -tomli==2.1.0 +tomli==2.0.1 # via # pyproject-api # tox -tox==4.23.2 +tox==4.20.0 # via -r ci.in -typing-extensions==4.12.2 - # via tox urllib3==2.2.3 # via requests -virtualenv==20.27.1 +virtualenv==20.26.5 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index efc84409c..253572253 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -14,7 +14,7 @@ -r wheels.txt annotated-types==0.7.0 # via pydantic -anyio==4.6.2.post1 +anyio==4.6.0 # via # httpx # jupyter-server @@ -32,9 +32,9 @@ click==8.1.7 # via # pip-compile-multi # pip-tools -copier==9.4.1 +copier==9.3.1 # via -r dev.in -dunamai==1.23.0 +dunamai==1.22.0 # via copier fqdn==1.5.1 # via jsonschema @@ -42,7 +42,7 @@ funcy==2.0 # via copier h11==0.14.0 # via httpcore -httpcore==1.0.7 +httpcore==1.0.5 # via httpx httpx==0.27.2 # via jupyterlab @@ -50,7 +50,7 @@ isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.9.28 +json5==0.9.25 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema @@ -71,7 +71,7 @@ jupyter-server==2.14.2 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.3.1 +jupyterlab==4.2.5 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab @@ -85,15 +85,15 @@ pip-compile-multi==2.6.4 # via -r dev.in pip-tools==7.4.1 # via pip-compile-multi -plumbum==1.9.0 +plumbum==1.8.3 # via copier prometheus-client==0.21.0 # via jupyter-server pycparser==2.22 # via cffi -pydantic==2.10.1 +pydantic==2.9.2 # via copier -pydantic-core==2.27.1 +pydantic-core==2.23.4 # via pydantic python-json-logger==2.0.7 # via jupyter-events @@ -119,15 +119,15 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.9.0.20241003 +types-python-dateutil==2.9.0.20240906 # via arrow uri-template==1.3.0 # via jsonschema -webcolors==24.11.1 +webcolors==24.8.0 # via jsonschema websocket-client==1.8.0 # via jupyter-server -wheel==0.45.0 +wheel==0.44.0 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index f14e27e4e..720709027 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -24,15 +24,15 @@ beautifulsoup4==4.12.3 # via # nbconvert # pydata-sphinx-theme -bleach==6.2.0 +bleach==6.1.0 # via nbconvert certifi==2024.8.30 # via requests -charset-normalizer==3.4.0 +charset-normalizer==3.3.2 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.9 +debugpy==1.8.5 # via ipykernel decorator==5.1.1 # via ipython @@ -56,11 +56,11 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.29.0 +ipython==8.27.0 # via # -r docs.in # ipykernel -jedi==0.19.2 +jedi==0.19.1 # via ipython jinja2==3.1.4 # via @@ -70,7 +70,7 @@ jinja2==3.1.4 # sphinx jsonschema==4.23.0 # via nbformat -jsonschema-specifications==2024.10.1 +jsonschema-specifications==2023.12.1 # via jsonschema jupyter-client==8.6.3 # via @@ -89,7 +89,7 @@ markdown-it-py==3.0.0 # via # mdit-py-plugins # myst-parser -markupsafe==3.0.2 +markupsafe==2.1.5 # via # jinja2 # nbconvert @@ -126,15 +126,15 @@ pexpect==4.9.0 # via ipython platformdirs==4.3.6 # via jupyter-core -prompt-toolkit==3.0.48 +prompt-toolkit==3.0.47 # via ipython -psutil==6.1.0 +psutil==6.0.0 # via ipykernel ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pydata-sphinx-theme==0.16.0 +pydata-sphinx-theme==0.15.4 # via -r docs.in pygments==2.18.0 # via @@ -155,7 +155,7 @@ referencing==0.35.1 # jsonschema-specifications requests==2.32.3 # via sphinx -rpds-py==0.21.0 +rpds-py==0.20.0 # via # jsonschema # referencing @@ -163,7 +163,7 @@ snowballstemmer==2.2.0 # via sphinx soupsieve==2.6 # via beautifulsoup4 -sphinx==8.1.3 +sphinx==8.0.2 # via # -r docs.in # myst-parser @@ -172,7 +172,7 @@ sphinx==8.1.3 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==2.5.0 +sphinx-autodoc-typehints==2.4.4 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in @@ -192,11 +192,11 @@ sphinxcontrib-serializinghtml==2.0.0 # via sphinx stack-data==0.6.3 # via ipython -tinycss2==1.4.0 +tinycss2==1.3.0 # via nbconvert -tomli==2.1.0 +tomli==2.0.1 # via sphinx -tornado==6.4.2 +tornado==6.4.1 # via # ipykernel # jupyter-client diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index d48351b88..8800e5228 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,30 +1,25 @@ -# SHA1:681863fcf78cc681b36b5a7b2e8630e327107555 +# SHA1:ea730da6565cd5faa478a74fbcf95b23f3eb183a # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # -choppera==0.1.5 +-r basetest.txt +choppera==0.1.4 # via -r nightly.in -contourpy==1.3.1 +contourpy==1.3.0 # via matplotlib -cyclebane==24.10.0 +cyclebane==24.6.0 # via sciline cycler==0.12.1 # via matplotlib -essreduce @ git+https://github.com/scipp/essreduce@main - # via -r nightly.in -exceptiongroup==1.2.2 - # via pytest -fonttools==4.55.0 +fonttools==4.53.1 # via matplotlib -h5py==3.12.1 +h5py==3.11.0 # via # scippneutron # scippnexus -iniconfig==2.0.0 - # via pytest kiwisolver==1.4.7 # via matplotlib loguru==0.7.2 @@ -35,9 +30,9 @@ matplotlib==3.9.2 # plopp mpltoolbox==24.5.1 # via scippneutron -networkx==3.4.2 +networkx==3.3 # via cyclebane -numpy==2.1.3 +numpy==2.1.1 # via # choppera # contourpy @@ -48,49 +43,35 @@ numpy==2.1.3 # scipp # scippneutron # scipy -packaging==24.2 - # via - # matplotlib - # pytest -pillow==11.0.0 +pillow==10.4.0 # via matplotlib plopp @ git+https://github.com/scipp/plopp@main # via # -r nightly.in # scippneutron -pluggy==1.5.0 - # via pytest polystar==0.4.5 # via choppera -pyparsing==3.2.0 +pyparsing==3.1.4 # via matplotlib -pytest==8.3.3 - # via -r nightly.in python-dateutil==2.9.0.post0 # via # matplotlib # scippnexus # strictyaml sciline @ git+https://github.com/scipp/sciline@main - # via - # -r nightly.in - # essreduce -scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + # via -r nightly.in +scipp==24.9.1 # via # -r nightly.in # choppera - # essreduce # scippneutron # scippnexus scippneutron @ git+https://github.com/scipp/scippneutron@main - # via - # -r nightly.in - # essreduce + # via -r nightly.in scippnexus @ git+https://github.com/scipp/scippnexus@main # via # -r nightly.in # choppera - # essreduce # scippneutron scipy==1.14.1 # via @@ -101,7 +82,5 @@ six==1.16.0 # via python-dateutil strictyaml==1.7.3 # via choppera -tomli==2.1.0 - # via pytest -tqdm==4.67.0 +tqdm==4.66.5 # via -r nightly.in diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index e107d9150..d7f3ca425 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -7,19 +7,19 @@ # cfgv==3.4.0 # via pre-commit -distlib==0.3.9 +distlib==0.3.8 # via virtualenv filelock==3.16.1 # via virtualenv -identify==2.6.2 +identify==2.6.1 # via pre-commit nodeenv==1.9.1 # via pre-commit platformdirs==4.3.6 # via virtualenv -pre-commit==4.0.1 +pre-commit==3.8.0 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.27.1 +virtualenv==20.26.5 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 6a1c0600c..5a997b6cd 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -13,3 +13,5 @@ pyproject-hooks==1.2.0 # via build tomli==2.1.0 # via build +tomli==2.0.1 + # via build From eaea751606314c1c18b93a257639df801165452e Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 23 Sep 2024 16:34:10 +0200 Subject: [PATCH 069/330] Start BIFROST simulation workflow --- .../src/ess/bifrost/__init__.py | 12 ++- .../essspectroscopy/src/ess/bifrost/data.py | 40 ++++++++ .../src/ess/bifrost/io/__init__.py | 8 ++ .../src/ess/bifrost/io/nexus.py | 14 +++ .../essspectroscopy/src/ess/bifrost/py.typed | 0 .../src/ess/bifrost/workflow.py | 98 +++++++++++++++++++ .../tests/bifrost/workflow_test.py | 41 ++++++++ 7 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/bifrost/data.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/io/__init__.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/io/nexus.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/py.typed create mode 100644 packages/essspectroscopy/src/ess/bifrost/workflow.py create mode 100644 packages/essspectroscopy/tests/bifrost/workflow_test.py diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py index 61c198ea5..89e3fd565 100644 --- a/packages/essspectroscopy/src/ess/bifrost/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -1,5 +1,14 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# ruff: noqa: E402, F401 + +"""Components for BIFROST.""" + import importlib.metadata +from . import data +from .io import nexus +from .workflow import BifrostSimulationWorkflow from .detector import providers try: @@ -9,5 +18,4 @@ del importlib - -__all__ = ['providers'] +__all__ = ['BifrostSimulationWorkflow', 'data', 'nexus', 'providers'] diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py new file mode 100644 index 000000000..881a4748c --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + +"""Data for tests and documentation with BIFROST.""" + +_version = "1" + +__all__ = ["get_path"] + + +def _make_pooch(): + import pooch + + return pooch.create( + path=pooch.os_cache("ess/bifrost"), + env="ESS_DATA_DIR", + base_url="https://public.esss.dk/groups/scipp/ess/bifrost/{version}/", + version=_version, + registry={ + "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", # noqa: E501 + }, + ) + + +_pooch = _make_pooch() + + +def get_path(name: str) -> str: + """ + Return the path to a data file bundled with ess.biofrost. + + This function only works with example data and cannot handle + paths to custom files. + """ + return _pooch.fetch(name) + + +def simulated_elastic_incoherent_with_phonon() -> str: + """Simulated data for elastic incoherent scattering including a phonon.""" + return get_path("BIFROST_20240914T053723.h5") diff --git a/packages/essspectroscopy/src/ess/bifrost/io/__init__.py b/packages/essspectroscopy/src/ess/bifrost/io/__init__.py new file mode 100644 index 000000000..8d4d05b4c --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/io/__init__.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + +"""Input/output for BIFROST.""" + +from . import nexus + +__all__ = ['nexus'] diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py new file mode 100644 index 000000000..d3d6327d3 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + +"""NeXus input/output for BIFROST.""" + +import sciline + +from ess.reduce.nexus.generic_workflow import GenericNeXusWorkflow + + +def LoadNeXusWorkflow() -> sciline.Pipeline: + """Workflow for loading BIFROST NeXus files.""" + workflow = GenericNeXusWorkflow() + return workflow diff --git a/packages/essspectroscopy/src/ess/bifrost/py.typed b/packages/essspectroscopy/src/ess/bifrost/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py new file mode 100644 index 000000000..c29dfdad8 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -0,0 +1,98 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + +from typing import Any + +import sciline +import scippnexus as snx + +from ess.spectroscopy.types import ( + CalibratedDetector, + DetectorPositionOffset, + GravityVector, + Monitor3, + NeXusComponentLocationSpec, + NeXusDetector, + NeXusMonitorName, + NeXusSource, + RunType, + SamplePosition, + SourcePosition, +) + +from .io import nexus + + +# See https://github.com/scipp/essreduce/issues/98 +def load_nexus_source_from_moderator( + location: NeXusComponentLocationSpec[snx.NXsource, RunType], +) -> NeXusSource[RunType]: + """Load a NeXus moderator as a source.""" + from ess.reduce.nexus import load_component + + return NeXusSource[RunType](load_component(location, nx_class=snx.NXmoderator)) + + +def get_calibrated_detector_bifrost( + detector: NeXusDetector[RunType], + *, + offset: DetectorPositionOffset[RunType], + source_position: SourcePosition[RunType], + sample_position: SamplePosition[RunType], + gravity: GravityVector, +) -> CalibratedDetector[RunType]: + """Extract the data array corresponding to a detector's signal field. + + The returned data array includes coords and masks pertaining directly to the + signal values array, but not additional information about the detector. + The data array is reshaped to the logical detector shape. + + Parameters + ---------- + detector: + NeXus detector group. + offset: + Offset to add to the detector position. + source_position: + Position of the neutron source. + sample_position: + Position of the sample. + gravity: + Gravity vector. + + Returns + ------- + : + Detector data. + """ + + from ess.reduce.nexus.types import DetectorBankSizes + from ess.reduce.nexus.workflow import get_calibrated_detector + + da = get_calibrated_detector( + detector=detector, + offset=offset, + source_position=source_position, + sample_position=sample_position, + gravity=gravity, + # The detectors are folded in the file, no need to do that here. + bank_sizes=DetectorBankSizes({}), + ) + da = da.rename(dim_0='tube', dim_1='length') + return CalibratedDetector[RunType](da) + + +def default_parameters() -> dict[type, Any]: + return { + NeXusMonitorName[Monitor3]: '110_frame_3', + } + + +def BifrostSimulationWorkflow() -> sciline.Pipeline: + """Data reduction workflow for simulated BIFROST data.""" + workflow = nexus.LoadNeXusWorkflow() + workflow.insert(load_nexus_source_from_moderator) + workflow.insert(get_calibrated_detector_bifrost) + for key, val in default_parameters().items(): + workflow[key] = val + return workflow diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py new file mode 100644 index 000000000..967ef022c --- /dev/null +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) + +from ess import bifrost +from ess.spectroscopy.types import ( + DetectorData, + Filename, + Monitor3, + MonitorData, + NeXusDetectorName, + SampleRun, +) + + +def test_simulation_workflow_can_load_detector() -> None: + workflow = bifrost.BifrostSimulationWorkflow() + workflow[Filename[SampleRun]] = ( + bifrost.data.simulated_elastic_incoherent_with_phonon() + ) + workflow[NeXusDetectorName] = "125_channel_1_1_triplet" + result = workflow.compute(DetectorData[SampleRun]) + + assert result.bins is not None + assert set(result.dims) == {'tube', 'length'} + assert result.sizes['tube'] == 3 + assert 'position' in result.coords + assert 'sample_position' in result.coords + assert 'source_position' in result.coords + + +def test_simulation_workflow_can_load_monitor() -> None: + workflow = bifrost.BifrostSimulationWorkflow() + workflow[Filename[SampleRun]] = ( + bifrost.data.simulated_elastic_incoherent_with_phonon() + ) + result = workflow.compute(MonitorData[SampleRun, Monitor3]) + + assert result.bins is None + assert 'position' in result.coords + assert 'sample_position' not in result.coords + assert 'source_position' in result.coords From 38de8ff5f5f8599ac952b95170173e812e6579b7 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 18 Nov 2024 10:34:43 +0100 Subject: [PATCH 070/330] Depend on essreduce --- packages/essspectroscopy/pyproject.toml | 5 ++- packages/essspectroscopy/requirements/base.in | 5 ++- .../essspectroscopy/requirements/base.txt | 40 +++++++++++-------- .../essspectroscopy/requirements/basetest.txt | 6 +-- packages/essspectroscopy/requirements/ci.txt | 14 ++++--- packages/essspectroscopy/requirements/dev.txt | 20 +++++----- .../essspectroscopy/requirements/docs.txt | 30 +++++++------- .../essspectroscopy/requirements/nightly.in | 2 + .../essspectroscopy/requirements/nightly.txt | 32 +++++++++------ .../essspectroscopy/requirements/static.txt | 8 ++-- .../essspectroscopy/requirements/wheels.txt | 2 - 11 files changed, 90 insertions(+), 74 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index d5d2c3017..3c9b9a707 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -31,12 +31,13 @@ requires-python = ">=3.10" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ + "choppera>=0.1.4", + "essreduce>=24.11.1", + "loguru", "sciline>=24.6.3", "scipp>=24.9.1", "scippneutron>=24.8.0", "scippnexus>=24.9.0", - "choppera>=0.1.4", - "loguru", "tqdm", ] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index c9f15a911..f64d8f95d 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,10 +2,11 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! +choppera>=0.1.4 +essreduce>=24.11.1 +loguru sciline>=24.6.3 scipp>=24.9.1 scippneutron>=24.8.0 scippnexus>=24.9.0 -choppera>=0.1.4 -loguru tqdm diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index f6f9f02b3..624e0a82b 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,21 +1,23 @@ -# SHA1:70a2abf0cf0b3f6b18811f7f4f05460f3b48af8b +# SHA1:64cd603c0efd09d29c0703af1ec328f25a18f7b1 # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # -choppera==0.1.4 +choppera==0.1.5 # via -r base.in -contourpy==1.3.0 +contourpy==1.3.1 # via matplotlib -cyclebane==24.6.0 +cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -fonttools==4.53.1 +essreduce==24.11.1 + # via -r base.in +fonttools==4.55.0 # via matplotlib -h5py==3.11.0 +h5py==3.12.1 # via # scippneutron # scippnexus @@ -29,9 +31,9 @@ matplotlib==3.9.2 # plopp mpltoolbox==24.5.1 # via scippneutron -networkx==3.3 +networkx==3.4.2 # via cyclebane -numpy==2.1.1 +numpy==2.1.3 # via # choppera # contourpy @@ -42,35 +44,39 @@ numpy==2.1.1 # scipp # scippneutron # scipy -packaging==24.1 +packaging==24.2 # via matplotlib -pillow==10.4.0 +pillow==11.0.0 # via matplotlib -plopp==24.9.2 +plopp==24.10.0 # via scippneutron polystar==0.4.5 # via choppera -pyparsing==3.1.4 +pyparsing==3.2.0 # via matplotlib python-dateutil==2.9.0.post0 # via # matplotlib # scippnexus # strictyaml -sciline==24.6.3 - # via -r base.in +sciline==24.10.0 + # via + # -r base.in + # essreduce scipp==24.11.2 # via # -r base.in # choppera + # essreduce # scippneutron # scippnexus -scippneutron==24.9.0 +scippneutron==24.11.0 # via -r base.in -scippnexus==24.9.0 +scippnexus==24.11.0 # via # -r base.in # choppera + # essreduce # scippneutron scipy==1.14.1 # via @@ -81,5 +87,5 @@ six==1.16.0 # via python-dateutil strictyaml==1.7.3 # via choppera -tqdm==4.66.5 +tqdm==4.67.0 # via -r base.in diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 6b41e80eb..351f447ab 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -7,7 +7,7 @@ # certifi==2024.8.30 # via requests -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests exceptiongroup==1.2.2 # via pytest @@ -15,7 +15,7 @@ idna==3.10 # via requests iniconfig==2.0.0 # via pytest -packaging==24.1 +packaging==24.2 # via # pooch # pytest @@ -29,7 +29,7 @@ pytest==8.3.3 # via -r basetest.in requests==2.32.3 # via pooch -tomli==2.0.1 +tomli==2.1.0 # via pytest urllib3==2.2.3 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index af1677b2d..14921a291 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -11,11 +11,11 @@ certifi==2024.8.30 # via requests chardet==5.2.0 # via tox -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests colorama==0.4.6 # via tox -distlib==0.3.8 +distlib==0.3.9 # via virtualenv filelock==3.16.1 # via @@ -27,7 +27,7 @@ gitpython==3.1.43 # via -r ci.in idna==3.10 # via requests -packaging==24.1 +packaging==24.2 # via # -r ci.in # pyproject-api @@ -44,13 +44,15 @@ requests==2.32.3 # via -r ci.in smmap==5.0.1 # via gitdb -tomli==2.0.1 +tomli==2.1.0 # via # pyproject-api # tox -tox==4.20.0 +tox==4.23.2 # via -r ci.in +typing-extensions==4.12.2 + # via tox urllib3==2.2.3 # via requests -virtualenv==20.26.5 +virtualenv==20.27.1 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 253572253..e0ff645a7 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -14,7 +14,7 @@ -r wheels.txt annotated-types==0.7.0 # via pydantic -anyio==4.6.0 +anyio==4.6.2.post1 # via # httpx # jupyter-server @@ -32,9 +32,9 @@ click==8.1.7 # via # pip-compile-multi # pip-tools -copier==9.3.1 +copier==9.4.1 # via -r dev.in -dunamai==1.22.0 +dunamai==1.23.0 # via copier fqdn==1.5.1 # via jsonschema @@ -42,7 +42,7 @@ funcy==2.0 # via copier h11==0.14.0 # via httpcore -httpcore==1.0.5 +httpcore==1.0.7 # via httpx httpx==0.27.2 # via jupyterlab @@ -50,7 +50,7 @@ isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.9.25 +json5==0.9.28 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema @@ -71,7 +71,7 @@ jupyter-server==2.14.2 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.2.5 +jupyterlab==4.3.1 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab @@ -85,7 +85,7 @@ pip-compile-multi==2.6.4 # via -r dev.in pip-tools==7.4.1 # via pip-compile-multi -plumbum==1.8.3 +plumbum==1.9.0 # via copier prometheus-client==0.21.0 # via jupyter-server @@ -119,15 +119,15 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.9.0.20240906 +types-python-dateutil==2.9.0.20241003 # via arrow uri-template==1.3.0 # via jsonschema -webcolors==24.8.0 +webcolors==24.11.1 # via jsonschema websocket-client==1.8.0 # via jupyter-server -wheel==0.44.0 +wheel==0.45.0 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 720709027..4f16c6ffa 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -24,15 +24,15 @@ beautifulsoup4==4.12.3 # via # nbconvert # pydata-sphinx-theme -bleach==6.1.0 +bleach==6.2.0 # via nbconvert certifi==2024.8.30 # via requests -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.5 +debugpy==1.8.8 # via ipykernel decorator==5.1.1 # via ipython @@ -56,11 +56,11 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.27.0 +ipython==8.29.0 # via # -r docs.in # ipykernel -jedi==0.19.1 +jedi==0.19.2 # via ipython jinja2==3.1.4 # via @@ -70,7 +70,7 @@ jinja2==3.1.4 # sphinx jsonschema==4.23.0 # via nbformat -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 # via jsonschema jupyter-client==8.6.3 # via @@ -89,7 +89,7 @@ markdown-it-py==3.0.0 # via # mdit-py-plugins # myst-parser -markupsafe==2.1.5 +markupsafe==3.0.2 # via # jinja2 # nbconvert @@ -126,15 +126,15 @@ pexpect==4.9.0 # via ipython platformdirs==4.3.6 # via jupyter-core -prompt-toolkit==3.0.47 +prompt-toolkit==3.0.48 # via ipython -psutil==6.0.0 +psutil==6.1.0 # via ipykernel ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pydata-sphinx-theme==0.15.4 +pydata-sphinx-theme==0.16.0 # via -r docs.in pygments==2.18.0 # via @@ -155,7 +155,7 @@ referencing==0.35.1 # jsonschema-specifications requests==2.32.3 # via sphinx -rpds-py==0.20.0 +rpds-py==0.21.0 # via # jsonschema # referencing @@ -163,7 +163,7 @@ snowballstemmer==2.2.0 # via sphinx soupsieve==2.6 # via beautifulsoup4 -sphinx==8.0.2 +sphinx==8.1.3 # via # -r docs.in # myst-parser @@ -172,7 +172,7 @@ sphinx==8.0.2 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==2.4.4 +sphinx-autodoc-typehints==2.5.0 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in @@ -192,9 +192,9 @@ sphinxcontrib-serializinghtml==2.0.0 # via sphinx stack-data==0.6.3 # via ipython -tinycss2==1.3.0 +tinycss2==1.4.0 # via nbconvert -tomli==2.0.1 +tomli==2.1.0 # via sphinx tornado==6.4.1 # via diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index f064a2676..0658db473 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -2,7 +2,9 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! choppera>=0.1.4 +essreduce>=24.11.1 loguru +scipp>=24.9.1 tqdm pytest scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 8800e5228..506d4b435 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:ea730da6565cd5faa478a74fbcf95b23f3eb183a +# SHA1:dbd5230e6673a867e9175e186234067cb73d8861 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -6,17 +6,19 @@ # pip-compile-multi # -r basetest.txt -choppera==0.1.4 +choppera==0.1.5 # via -r nightly.in -contourpy==1.3.0 +contourpy==1.3.1 # via matplotlib -cyclebane==24.6.0 +cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -fonttools==4.53.1 +essreduce==24.11.1 + # via -r nightly.in +fonttools==4.55.0 # via matplotlib -h5py==3.11.0 +h5py==3.12.1 # via # scippneutron # scippnexus @@ -30,9 +32,9 @@ matplotlib==3.9.2 # plopp mpltoolbox==24.5.1 # via scippneutron -networkx==3.3 +networkx==3.4.2 # via cyclebane -numpy==2.1.1 +numpy==2.1.3 # via # choppera # contourpy @@ -43,7 +45,7 @@ numpy==2.1.1 # scipp # scippneutron # scipy -pillow==10.4.0 +pillow==11.0.0 # via matplotlib plopp @ git+https://github.com/scipp/plopp@main # via @@ -51,7 +53,7 @@ plopp @ git+https://github.com/scipp/plopp@main # scippneutron polystar==0.4.5 # via choppera -pyparsing==3.1.4 +pyparsing==3.2.0 # via matplotlib python-dateutil==2.9.0.post0 # via @@ -59,11 +61,14 @@ python-dateutil==2.9.0.post0 # scippnexus # strictyaml sciline @ git+https://github.com/scipp/sciline@main - # via -r nightly.in -scipp==24.9.1 + # via + # -r nightly.in + # essreduce +scipp==24.11.1 # via # -r nightly.in # choppera + # essreduce # scippneutron # scippnexus scippneutron @ git+https://github.com/scipp/scippneutron@main @@ -72,6 +77,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # via # -r nightly.in # choppera + # essreduce # scippneutron scipy==1.14.1 # via @@ -82,5 +88,5 @@ six==1.16.0 # via python-dateutil strictyaml==1.7.3 # via choppera -tqdm==4.66.5 +tqdm==4.67.0 # via -r nightly.in diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index d7f3ca425..e107d9150 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -7,19 +7,19 @@ # cfgv==3.4.0 # via pre-commit -distlib==0.3.8 +distlib==0.3.9 # via virtualenv filelock==3.16.1 # via virtualenv -identify==2.6.1 +identify==2.6.2 # via pre-commit nodeenv==1.9.1 # via pre-commit platformdirs==4.3.6 # via virtualenv -pre-commit==3.8.0 +pre-commit==4.0.1 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.26.5 +virtualenv==20.27.1 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 5a997b6cd..6a1c0600c 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -13,5 +13,3 @@ pyproject-hooks==1.2.0 # via build tomli==2.1.0 # via build -tomli==2.0.1 - # via build From e9ae1549dabc0da8f83b8bcec992a5b5e75cd688 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 18 Nov 2024 11:22:14 +0100 Subject: [PATCH 071/330] Load analyzers and choppers --- packages/essspectroscopy/pyproject.toml | 2 + .../essspectroscopy/src/ess/bifrost/data.py | 2 +- .../src/ess/bifrost/io/nexus.py | 21 ++++++++- .../src/ess/bifrost/workflow.py | 39 ++++------------- .../src/ess/spectroscopy/types.py | 43 ++++++++++--------- .../tests/bifrost/workflow_test.py | 36 ++++++++++++++++ 6 files changed, 90 insertions(+), 53 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 3c9b9a707..38879d8e6 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -68,6 +68,8 @@ addopts = """ testpaths = "tests" filterwarnings = [ "error", + # Plotting related warnings. + 'ignore:\n Sentinel is not a public part of the traitlets API:DeprecationWarning', ] [tool.ruff] diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 881a4748c..9e7a359e3 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -17,7 +17,7 @@ def _make_pooch(): base_url="https://public.esss.dk/groups/scipp/ess/bifrost/{version}/", version=_version, registry={ - "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", # noqa: E501 + "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", }, ) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index d3d6327d3..1d0c08160 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -4,11 +4,30 @@ """NeXus input/output for BIFROST.""" import sciline +import scippnexus as snx -from ess.reduce.nexus.generic_workflow import GenericNeXusWorkflow +from ess.reduce.nexus import load_component +from ess.reduce.nexus.workflow import GenericNeXusWorkflow +from ess.spectroscopy.types import ( + NeXusComponent, + NeXusComponentLocationSpec, + RunType, +) + + +# TODO can override nx_class_for_source instead +# See https://github.com/scipp/essreduce/issues/98 +def load_nexus_source_from_moderator( + location: NeXusComponentLocationSpec[snx.NXsource, RunType], +) -> NeXusComponent[snx.NXsource, RunType]: + """Load a NeXus moderator as a source.""" + return NeXusComponent[snx.NXsource, RunType]( + load_component(location, nx_class=snx.NXmoderator) + ) def LoadNeXusWorkflow() -> sciline.Pipeline: """Workflow for loading BIFROST NeXus files.""" workflow = GenericNeXusWorkflow() + workflow.insert(load_nexus_source_from_moderator) return workflow diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index c29dfdad8..f11455bc3 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -9,37 +9,21 @@ from ess.spectroscopy.types import ( CalibratedDetector, DetectorPositionOffset, - GravityVector, Monitor3, - NeXusComponentLocationSpec, - NeXusDetector, + NeXusComponent, NeXusMonitorName, - NeXusSource, + NeXusTransformation, RunType, - SamplePosition, - SourcePosition, ) from .io import nexus -# See https://github.com/scipp/essreduce/issues/98 -def load_nexus_source_from_moderator( - location: NeXusComponentLocationSpec[snx.NXsource, RunType], -) -> NeXusSource[RunType]: - """Load a NeXus moderator as a source.""" - from ess.reduce.nexus import load_component - - return NeXusSource[RunType](load_component(location, nx_class=snx.NXmoderator)) - - def get_calibrated_detector_bifrost( - detector: NeXusDetector[RunType], + detector: NeXusComponent[snx.NXdetector, RunType], *, + transform: NeXusTransformation[snx.NXdetector, RunType], offset: DetectorPositionOffset[RunType], - source_position: SourcePosition[RunType], - sample_position: SamplePosition[RunType], - gravity: GravityVector, ) -> CalibratedDetector[RunType]: """Extract the data array corresponding to a detector's signal field. @@ -50,15 +34,11 @@ def get_calibrated_detector_bifrost( Parameters ---------- detector: - NeXus detector group. + Loaded NeXus detector. + transform: + Transformation that determines the detector position. offset: Offset to add to the detector position. - source_position: - Position of the neutron source. - sample_position: - Position of the sample. - gravity: - Gravity vector. Returns ------- @@ -71,10 +51,8 @@ def get_calibrated_detector_bifrost( da = get_calibrated_detector( detector=detector, + transform=transform, offset=offset, - source_position=source_position, - sample_position=sample_position, - gravity=gravity, # The detectors are folded in the file, no need to do that here. bank_sizes=DetectorBankSizes({}), ) @@ -91,7 +69,6 @@ def default_parameters() -> dict[type, Any]: def BifrostSimulationWorkflow() -> sciline.Pipeline: """Data reduction workflow for simulated BIFROST data.""" workflow = nexus.LoadNeXusWorkflow() - workflow.insert(load_nexus_source_from_moderator) workflow.insert(get_calibrated_detector_bifrost) for key, val in default_parameters().items(): workflow[key] = val diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index f74e52afc..3e2952cb4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -3,10 +3,9 @@ from typing import NewType +import scipp as sc from choppera.primary import PrimarySpectrometer -from scipp import DataArray, Variable -from ess.reduce.nexus import generic_types as reduce_gt from ess.reduce.nexus import types as reduce_t @@ -17,32 +16,36 @@ def typer(named: str) -> type[scipp_type]: return typer -variable_type = make_scipp_named_typer(Variable) -data_array_type = make_scipp_named_typer(DataArray) +variable_type = make_scipp_named_typer(sc.Variable) +data_array_type = make_scipp_named_typer(sc.DataArray) -CalibratedDetector = reduce_gt.CalibratedDetector -DetectorPositionOffset = reduce_gt.DetectorPositionOffset -DetectorData = reduce_gt.DetectorData +Analyzers = reduce_t.Analyzers +CalibratedDetector = reduce_t.CalibratedDetector +Choppers = reduce_t.Choppers +DetectorData = reduce_t.DetectorData +DetectorPositionOffset = reduce_t.DetectorPositionOffset GravityVector = reduce_t.GravityVector -Filename = reduce_gt.Filename -MonitorData = reduce_gt.MonitorData -NeXusComponentLocationSpec = reduce_gt.NeXusComponentLocationSpec -NeXusDetector = reduce_gt.NeXusDetector +Filename = reduce_t.Filename +MonitorData = reduce_t.MonitorData +NeXusComponentLocationSpec = reduce_t.NeXusComponentLocationSpec +NeXusComponent = reduce_t.NeXusComponent +AllNeXusComponents = reduce_t.AllNeXusComponents NeXusDetectorName = reduce_t.NeXusDetectorName -NeXusMonitor = reduce_gt.NeXusMonitor -NeXusMonitorName = reduce_gt.NeXusMonitorName -NeXusSource = reduce_gt.NeXusSource -RunType = reduce_gt.RunType -SamplePosition = reduce_gt.SamplePosition -SampleRun = reduce_gt.SampleRun -SourcePosition = reduce_gt.SourcePosition +NeXusFileSpec = reduce_t.NeXusFileSpec +NeXusMonitorName = reduce_t.NeXusName +NeXusTransformation = reduce_t.NeXusTransformation +Position = reduce_t.Position +RunType = reduce_t.RunType +SampleRun = reduce_t.SampleRun # See https://github.com/scipp/essreduce/issues/105 about monitor names -Monitor3 = reduce_gt.Monitor3 -MonitorType = reduce_gt.MonitorType +Monitor3 = reduce_t.Monitor3 +MonitorType = reduce_t.MonitorType + AnalyzerPosition = variable_type('AnalyzerPosition') DetectorPosition = variable_type('DetectorPosition') +SamplePosition = variable_type('SamplePosition') AnalyzerOrientation = variable_type('AnalyzerOrientation') SampleAnalyzerVector = variable_type('SampleAnalyzerVector') AnalyzerDetectorVector = variable_type('AnalyzerDetectorVector') diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 967ef022c..a209c4c99 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -3,6 +3,8 @@ from ess import bifrost from ess.spectroscopy.types import ( + Analyzers, + Choppers, DetectorData, Filename, Monitor3, @@ -39,3 +41,37 @@ def test_simulation_workflow_can_load_monitor() -> None: assert 'position' in result.coords assert 'sample_position' not in result.coords assert 'source_position' in result.coords + + +def test_simulation_workflow_can_load_analyzers() -> None: + workflow = bifrost.BifrostSimulationWorkflow() + workflow[Filename[SampleRun]] = ( + bifrost.data.simulated_elastic_incoherent_with_phonon() + ) + analyzers = workflow.compute(Analyzers[SampleRun]) + + assert len(analyzers) == 45 + first = next(iter(analyzers.values())) + assert 'position' in first + assert 'd_spacing' in first + + +def test_simulation_workflow_can_load_choppers() -> None: + workflow = bifrost.BifrostSimulationWorkflow() + workflow[Filename[SampleRun]] = ( + bifrost.data.simulated_elastic_incoherent_with_phonon() + ) + choppers = workflow.compute(Choppers[SampleRun]) + + assert choppers.keys() == { + '005_PulseShapingChopper', + '006_PulseShapingChopper2', + '019_FOC1', + '048_FOC2', + '095_BWC1', + '096_BWC2', + } + first = next(iter(choppers.values())) + assert 'position' in first + assert 'rotation_speed' in first + assert first['slit_edges'].shape == (2,) From 11df32ea96c9cc312a78fb047502f8abe820efb2 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 11:15:53 +0100 Subject: [PATCH 072/330] Require essreduce >= 24.11.2 --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- .../essspectroscopy/requirements/base.txt | 8 ++-- packages/essspectroscopy/requirements/dev.txt | 4 +- .../essspectroscopy/requirements/docs.txt | 4 +- .../essspectroscopy/requirements/nightly.in | 3 +- .../essspectroscopy/requirements/nightly.txt | 40 ++++++++++++++++--- 7 files changed, 47 insertions(+), 16 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 38879d8e6..65a3a37c2 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -32,7 +32,7 @@ requires-python = ">=3.10" # Make sure to list one dependency per line. dependencies = [ "choppera>=0.1.4", - "essreduce>=24.11.1", + "essreduce>=24.11.2", "loguru", "sciline>=24.6.3", "scipp>=24.9.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index f64d8f95d..97ecdd120 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -3,7 +3,7 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! choppera>=0.1.4 -essreduce>=24.11.1 +essreduce>=24.11.2 loguru sciline>=24.6.3 scipp>=24.9.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 624e0a82b..0f39873cb 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:64cd603c0efd09d29c0703af1ec328f25a18f7b1 +# SHA1:444e861a339d8952d5c2d6c9dbd23e0566cb5a96 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -13,7 +13,7 @@ cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -essreduce==24.11.1 +essreduce==24.11.2 # via -r base.in fonttools==4.55.0 # via matplotlib @@ -71,7 +71,9 @@ scipp==24.11.2 # scippneutron # scippnexus scippneutron==24.11.0 - # via -r base.in + # via + # -r base.in + # essreduce scippnexus==24.11.0 # via # -r base.in diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index e0ff645a7..efc84409c 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -91,9 +91,9 @@ prometheus-client==0.21.0 # via jupyter-server pycparser==2.22 # via cffi -pydantic==2.9.2 +pydantic==2.10.1 # via copier -pydantic-core==2.23.4 +pydantic-core==2.27.1 # via pydantic python-json-logger==2.0.7 # via jupyter-events diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 4f16c6ffa..f14e27e4e 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -32,7 +32,7 @@ charset-normalizer==3.4.0 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.8 +debugpy==1.8.9 # via ipykernel decorator==5.1.1 # via ipython @@ -196,7 +196,7 @@ tinycss2==1.4.0 # via nbconvert tomli==2.1.0 # via sphinx -tornado==6.4.1 +tornado==6.4.2 # via # ipykernel # jupyter-client diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 0658db473..73a992191 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -2,10 +2,9 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! choppera>=0.1.4 -essreduce>=24.11.1 loguru -scipp>=24.9.1 tqdm +pooch pytest scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl scippneutron @ git+https://github.com/scipp/scippneutron@main diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 506d4b435..465c73aba 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,11 +1,14 @@ -# SHA1:dbd5230e6673a867e9175e186234067cb73d8861 +# SHA1:e85f42994c4b6596e6e67da03048787165ef6929 # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # --r basetest.txt +certifi==2024.8.30 + # via requests +charset-normalizer==3.4.0 + # via requests choppera==0.1.5 # via -r nightly.in contourpy==1.3.1 @@ -14,14 +17,20 @@ cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -essreduce==24.11.1 +essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in +exceptiongroup==1.2.2 + # via pytest fonttools==4.55.0 # via matplotlib h5py==3.12.1 # via # scippneutron # scippnexus +idna==3.10 + # via requests +iniconfig==2.0.0 + # via pytest kiwisolver==1.4.7 # via matplotlib loguru==0.7.2 @@ -45,26 +54,41 @@ numpy==2.1.3 # scipp # scippneutron # scipy +packaging==24.2 + # via + # matplotlib + # pooch + # pytest pillow==11.0.0 # via matplotlib +platformdirs==4.3.6 + # via pooch plopp @ git+https://github.com/scipp/plopp@main # via # -r nightly.in # scippneutron +pluggy==1.5.0 + # via pytest polystar==0.4.5 # via choppera +pooch==1.8.2 + # via -r nightly.in pyparsing==3.2.0 # via matplotlib +pytest==8.3.3 + # via -r nightly.in python-dateutil==2.9.0.post0 # via # matplotlib # scippnexus # strictyaml +requests==2.32.3 + # via pooch sciline @ git+https://github.com/scipp/sciline@main # via # -r nightly.in # essreduce -scipp==24.11.1 +scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl # via # -r nightly.in # choppera @@ -72,7 +96,9 @@ scipp==24.11.1 # scippneutron # scippnexus scippneutron @ git+https://github.com/scipp/scippneutron@main - # via -r nightly.in + # via + # -r nightly.in + # essreduce scippnexus @ git+https://github.com/scipp/scippnexus@main # via # -r nightly.in @@ -88,5 +114,9 @@ six==1.16.0 # via python-dateutil strictyaml==1.7.3 # via choppera +tomli==2.1.0 + # via pytest tqdm==4.67.0 # via -r nightly.in +urllib3==2.2.3 + # via requests From 525c74d64cc4ae2f05c41b2e156635ae18e71c69 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 11:21:26 +0100 Subject: [PATCH 073/330] Fix merge --- .../src/ess/spectroscopy/indirect/normalisation.py | 6 +++--- .../src/ess/spectroscopy/indirect/workflow.py | 4 ++-- packages/essspectroscopy/src/ess/spectroscopy/types.py | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index 1105a033a..c7d394e00 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -4,12 +4,12 @@ from scipp import DataArray from ..types import ( + Filename, FrameTimeMonitor, IncidentSlowness, MonitorName, MonitorNormalisation, MonitorPosition, - NeXusFileName, NormWavelengthEvents, PrimaryFocusDistance, PrimaryFocusTime, @@ -39,7 +39,7 @@ def incident_monitor_normalization( return lookup(monitor, dim=coords[0])[slowness] -def monitor_position(file: NeXusFileName, monitor: MonitorName) -> MonitorPosition: +def monitor_position(file: Filename, monitor: MonitorName) -> MonitorPosition: """Extract the position of the named monitor from a NeXus file""" from scippnexus import File, compute_positions @@ -48,7 +48,7 @@ def monitor_position(file: NeXusFileName, monitor: MonitorName) -> MonitorPositi def source_monitor_path_length( - file: NeXusFileName, source: SourcePosition, monitor: MonitorPosition + file: Filename, source: SourcePosition, monitor: MonitorPosition ) -> SourceMonitorPathLength: """Compute the primary spectrometer path length from source to monitor positions diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 3b2e96f9e..141b418df 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -6,7 +6,7 @@ from loguru import logger from scipp import Variable -from ..types import Filename, NeXusFileName, NormWavelengthEvents, NXspeFileName +from ..types import Filename, NormWavelengthEvents, NXspeFileName, SampleRun PIXEL_NAME = 'detector_number' @@ -1024,7 +1024,7 @@ def bifrost_single( def bifrost_to_nxspe( *, output: NXspeFileName, - filename: NeXusFileName | None = None, + filename: Filename[SampleRun] | None = None, events: NormWavelengthEvents | None = None, **kwargs, ): diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 3e2952cb4..36841707b 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -46,6 +46,7 @@ def typer(named: str) -> type[scipp_type]: AnalyzerPosition = variable_type('AnalyzerPosition') DetectorPosition = variable_type('DetectorPosition') SamplePosition = variable_type('SamplePosition') +SourcePosition = variable_type('SourcePosition') AnalyzerOrientation = variable_type('AnalyzerOrientation') SampleAnalyzerVector = variable_type('SampleAnalyzerVector') AnalyzerDetectorVector = variable_type('AnalyzerDetectorVector') From 8fce29c0b7e4995df3414fd7711fe7a3a9000092 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 14:06:26 +0100 Subject: [PATCH 074/330] Use new workflow --- .../src/ess/bifrost/io/nexus.py | 22 +++ .../essspectroscopy/src/ess/bifrost/types.py | 11 ++ .../src/ess/bifrost/workflow.py | 16 ++- .../src/ess/spectroscopy/indirect/workflow.py | 132 ++++++++++++------ .../src/ess/spectroscopy/types.py | 10 +- .../tests/bifrost/workflow_test.py | 4 +- 6 files changed, 143 insertions(+), 52 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 1d0c08160..e94de2574 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -4,13 +4,16 @@ """NeXus input/output for BIFROST.""" import sciline +import scipp as sc import scippnexus as snx from ess.reduce.nexus import load_component from ess.reduce.nexus.workflow import GenericNeXusWorkflow from ess.spectroscopy.types import ( + GoniometerAngles, NeXusComponent, NeXusComponentLocationSpec, + NeXusFileSpec, RunType, ) @@ -26,8 +29,27 @@ def load_nexus_source_from_moderator( ) +def load_goniometer_angles( + file_spec: NeXusFileSpec[RunType], +) -> GoniometerAngles[RunType]: + # TODO need mechanism in ESSreduce to load specific components of non-unique + # class by name + from ess.reduce.nexus._nexus_loader import _open_nexus_file, _unique_child_group + + with _open_nexus_file(file_spec.value) as file: + parameters = _unique_child_group( + _unique_child_group(file, snx.NXentry, name=None), + snx.NXparameters, + name=None, + ) + return GoniometerAngles[RunType]( + sc.DataGroup({name: parameters[name][()]['value'] for name in ('a3', 'a4')}) + ) + + def LoadNeXusWorkflow() -> sciline.Pipeline: """Workflow for loading BIFROST NeXus files.""" workflow = GenericNeXusWorkflow() workflow.insert(load_nexus_source_from_moderator) + workflow.insert(load_goniometer_angles) return workflow diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 04a72b7da..29c2364fe 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -2,4 +2,15 @@ from scipp import Variable +from ess.reduce.nexus import types as reduce_t + ArcNumber = NewType('ArcNumber', Variable) + +# See https://github.com/scipp/essreduce/issues/105 about monitor names +FrameMonitor0 = reduce_t.Monitor1 +FrameMonitor1 = reduce_t.Monitor2 +FrameMonitor2 = reduce_t.Monitor3 +FrameMonitor3 = reduce_t.Monitor4 +PsdMonitor0 = reduce_t.Monitor5 +PsdMonitor1 = reduce_t.Monitor6 +MonitorType = reduce_t.MonitorType diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index f11455bc3..da6c0161c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -9,7 +9,6 @@ from ess.spectroscopy.types import ( CalibratedDetector, DetectorPositionOffset, - Monitor3, NeXusComponent, NeXusMonitorName, NeXusTransformation, @@ -17,6 +16,14 @@ ) from .io import nexus +from .types import ( + FrameMonitor0, + FrameMonitor1, + FrameMonitor2, + FrameMonitor3, + PsdMonitor0, + PsdMonitor1, +) def get_calibrated_detector_bifrost( @@ -62,7 +69,12 @@ def get_calibrated_detector_bifrost( def default_parameters() -> dict[type, Any]: return { - NeXusMonitorName[Monitor3]: '110_frame_3', + NeXusMonitorName[FrameMonitor0]: '007_frame_0', + NeXusMonitorName[FrameMonitor1]: '090_frame_1', + NeXusMonitorName[FrameMonitor2]: '097_frame_2', + NeXusMonitorName[FrameMonitor3]: '110_frame_3', + NeXusMonitorName[PsdMonitor0]: '111_psd0', + NeXusMonitorName[PsdMonitor1]: '113_psd1', } diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 141b418df..3bcf2d07b 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -3,10 +3,27 @@ from __future__ import annotations +from collections.abc import Iterable + +import scipp as sc +import scippnexus as snx from loguru import logger from scipp import Variable -from ..types import Filename, NormWavelengthEvents, NXspeFileName, SampleRun +from ..types import ( + Analyzers, + Choppers, + DetectorData, + Filename, + GoniometerAngles, + MonitorData, + NeXusDetectorName, + NeXusMonitorName, + NormWavelengthEvents, + NXspeFileName, + Position, + SampleRun, +) PIXEL_NAME = 'detector_number' @@ -155,11 +172,11 @@ def detector_per_pixel(triplets: dict) -> dict[int, str]: return { i: name for name, det in triplets.items() - for i in det['data'].coords['detector_number'].values.flatten() + for i in det.coords['detector_number'].values.flatten() } -def combine_analyzers(analyzers: dict, triplets: dict): +def combine_analyzers(analyzers: dict, triplets: sc.DataGroup[sc.DataArray]): """Combine needed analyzer properties into a single array, duplicating information, to have per-pixel data @@ -208,7 +225,7 @@ def analyzer_extract(obj): return data -def combine_detectors(triplets: dict): +def combine_detectors(triplets: sc.DataGroup[sc.DataArray]): """Combine needed detector properties into a single array BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, @@ -232,8 +249,8 @@ def combine_detectors(triplets: dict): from scipp import Dataset, concat, sort def extract(obj): - pixels = obj['data'].coords['detector_number'] - midpoints = obj['data'].coords['position'] + pixels = obj.coords['detector_number'] + midpoints = obj.coords['position'] return Dataset(data={PIXEL_NAME: pixels, 'position': midpoints}) data = concat([extract(v) for v in triplets.values()], dim='arm') @@ -268,7 +285,7 @@ def find_sample_detector_flight_time(sample, analyzers, detector_positions): ).compute().to(unit='ms') -def get_triplet_events(triplets): +def get_triplet_events(triplets: Iterable[sc.DataArray]): """Extract and combine the events from loaded scippneutron.NXdetector groups Parameters @@ -286,7 +303,7 @@ def get_triplet_events(triplets): """ from scipp import concat, sort - events = concat([x['data'] for x in triplets], dim='arm').flatten(to=PIXEL_NAME) + events = concat(list(triplets), dim='arm').flatten(to=PIXEL_NAME) events = sort(events, events.coords['detector_number']) return events @@ -365,7 +382,7 @@ def get_normalization_monitor(monitors, monitor_component, collapse: bool = Fals Monitor data with frame_time converted to nanoseconds to match the timescale used for events """ - normalization = monitors[monitor_component]['data'] + normalization = monitors[monitor_component] if collapse: # This is very specialized to how the simulated scans are done, # it needs to be generalized? @@ -613,8 +630,8 @@ def split( logger.warning('Missing a3 or a4, so split performed') return [[triplets, analyzers, monitors]] - a3 = lookup(logs[a3_name]['value'], 'time') - a4 = lookup(logs[a4_name]['value'], 'time') + a3 = lookup(logs[a3_name], 'time') + a4 = lookup(logs[a4_name], 'time') event_graph = { 'a3': lambda event_time_zero: a3[event_time_zero], @@ -660,6 +677,12 @@ def do_split(x, time_name): return vals +# TODO preopen +def _get_detector_names(filename: Filename) -> list[str]: + with snx.File(filename) as f: + return list(f['entry/instrument'][snx.NXdetector]) + + def load_everything(filename: Filename, named_components: dict[str, str]): """Load all needed information from the named NeXus HDF5 file @@ -687,31 +710,61 @@ def load_everything(filename: Filename, named_components: dict[str, str]): logs: The scippnexus.NXlog groups named 'a3' and 'a4' under 'entry/parameters' """ - import scippnexus as snx - - source_component = named_components['source'] - sample_component = named_components['sample'] - with snx.File(filename) as data: - group = data['entry/instrument'] - if source_component not in group: - raise ValueError( - f'Missing {source_component=} for path-length calculations' - ) - if sample_component not in group: - raise ValueError(f'Missing {sample_component=} for origin identification') - sample = snx.compute_positions( - group[sample_component][...], store_transform='transform' - ) - triplets = _load_all(group, snx.NXdetector) - analyzers = _load_all(group, snx.NXcrystal) - choppers = _load_all(group, snx.NXdisk_chopper) - monitors = _load_all(group, snx.NXmonitor) + from ess.bifrost.types import ( + FrameMonitor0, + FrameMonitor1, + FrameMonitor2, + FrameMonitor3, + PsdMonitor0, + PsdMonitor1, + ) + from ess.bifrost.workflow import BifrostSimulationWorkflow + + monitor_keys = ( + FrameMonitor0, + FrameMonitor1, + FrameMonitor2, + FrameMonitor3, + PsdMonitor0, + PsdMonitor1, + ) + detector_names = _get_detector_names(filename) + + workflow = BifrostSimulationWorkflow() + # Use [SampleRun] for now until we process multiple runs together. + workflow[Filename[SampleRun]] = filename + workflow[DetectorData[SampleRun]] = ( + workflow[DetectorData[SampleRun]] + .map({NeXusDetectorName: detector_names}) + .reduce(func=lambda *x: x) + ) - # this is very BIFROST simulation specific -- can it be less so? - # TODO use the _sample_ orientation itself to define a3 (and goniometer angles?) - logs = _load_named(data['entry/parameters'], snx.NXlog, ('a3', 'a4')) + loaded = workflow.compute( + [ + DetectorData[SampleRun], + Position[snx.NXsample, SampleRun], + Analyzers[SampleRun], + Choppers[SampleRun], + GoniometerAngles[SampleRun], + *(MonitorData[SampleRun, key] for key in monitor_keys), + *(NeXusMonitorName[key] for key in monitor_keys), + ] + ) + sample = sc.DataGroup(position=loaded[Position[snx.NXsample, SampleRun]]) + analyzers = loaded[Analyzers[SampleRun]] + choppers = loaded[Choppers[SampleRun]] + monitors = sc.DataGroup( + { + loaded[NeXusMonitorName[key]]: loaded[MonitorData[SampleRun, key]] + for key in monitor_keys + } + ) + triplets = sc.DataGroup( + zip(detector_names, loaded[DetectorData[SampleRun]], strict=True) + ) + goniometer_angles = loaded[GoniometerAngles[SampleRun]] - return sample, triplets, analyzers, choppers, monitors, logs + return sample, triplets, analyzers, choppers, monitors, goniometer_angles def one_setting( @@ -800,22 +853,13 @@ def load_precompute( A dictionary of the 'a3' and 'a4' logs from the 'entry/parameter' group in the NeXus file """ - import scippnexus as snx - sample, triplets, analyzers, choppers, monitors, logs = load_everything( filename, named_components ) if is_simulated: for name in triplets: - triplets[name]['data'] = convert_simulated_time_to_frame_time( - triplets[name]['data'] - ) - - for name in triplets: - triplets[name] = snx.compute_positions( - triplets[name], store_transform='transform' - ) + triplets[name] = convert_simulated_time_to_frame_time(triplets[name]) analyzers = combine_analyzers(analyzers, triplets) # detectors = combine_detectors(triplets) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 36841707b..04cf6bf17 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,8 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) - from typing import NewType +import sciline import scipp as sc from choppera.primary import PrimarySpectrometer @@ -38,9 +38,11 @@ def typer(named: str) -> type[scipp_type]: RunType = reduce_t.RunType SampleRun = reduce_t.SampleRun -# See https://github.com/scipp/essreduce/issues/105 about monitor names -Monitor3 = reduce_t.Monitor3 -MonitorType = reduce_t.MonitorType + +class GoniometerAngles( + sciline.Scope[RunType, sc.DataGroup[sc.DataArray]], sc.DataGroup[sc.DataArray] +): + """Sample goniometer angles as a function of time.""" AnalyzerPosition = variable_type('AnalyzerPosition') diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index a209c4c99..fcaa93027 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -2,12 +2,12 @@ # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) from ess import bifrost +from ess.bifrost.types import FrameMonitor3 from ess.spectroscopy.types import ( Analyzers, Choppers, DetectorData, Filename, - Monitor3, MonitorData, NeXusDetectorName, SampleRun, @@ -35,7 +35,7 @@ def test_simulation_workflow_can_load_monitor() -> None: workflow[Filename[SampleRun]] = ( bifrost.data.simulated_elastic_incoherent_with_phonon() ) - result = workflow.compute(MonitorData[SampleRun, Monitor3]) + result = workflow.compute(MonitorData[SampleRun, FrameMonitor3]) assert result.bins is None assert 'position' in result.coords From 6881a2256b836656494be8c7f6335229f0623bc6 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 14:06:57 +0100 Subject: [PATCH 075/330] Appease ruff --- packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 5bbcce269..c4dcfcbee 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -121,7 +121,7 @@ def guess_focus_component_names(file: Filename) -> FocusComponentNames: The name or names of the time-focus-defining choppers, given the restrictions noted above """ - from scipp import norm, scalar + from scipp import scalar from scippnexus import File, NXdisk_chopper, compute_positions allowance = scalar(0.5, unit='m') @@ -193,7 +193,6 @@ def focus_distance( The average straight-line distance from the source position to the named component(s) """ - from scipp import norm from scippnexus import File, compute_positions pos = 0 * origin From 96ac67b333e13cf4d1efdf712f7ce99d70aad864 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 14:12:48 +0100 Subject: [PATCH 076/330] Preopen nexus file --- .../src/ess/spectroscopy/indirect/workflow.py | 12 ++++-------- .../essspectroscopy/src/ess/spectroscopy/types.py | 3 ++- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 3bcf2d07b..161adaed8 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -22,6 +22,7 @@ NormWavelengthEvents, NXspeFileName, Position, + PreopenNeXusFile, SampleRun, ) @@ -677,13 +678,12 @@ def do_split(x, time_name): return vals -# TODO preopen def _get_detector_names(filename: Filename) -> list[str]: with snx.File(filename) as f: return list(f['entry/instrument'][snx.NXdetector]) -def load_everything(filename: Filename, named_components: dict[str, str]): +def load_everything(filename: Filename): """Load all needed information from the named NeXus HDF5 file Parameters @@ -691,9 +691,6 @@ def load_everything(filename: Filename, named_components: dict[str, str]): filename: The name of the file to load data from, must have both and 'instrument' and 'parameters' group under 'entry' - named_components: - The file-specific names of (at least) the source and sample group names - under 'entry/instrument' Returns ------- @@ -733,6 +730,7 @@ def load_everything(filename: Filename, named_components: dict[str, str]): workflow = BifrostSimulationWorkflow() # Use [SampleRun] for now until we process multiple runs together. workflow[Filename[SampleRun]] = filename + workflow[PreopenNeXusFile] = PreopenNeXusFile(True) workflow[DetectorData[SampleRun]] = ( workflow[DetectorData[SampleRun]] .map({NeXusDetectorName: detector_names}) @@ -853,9 +851,7 @@ def load_precompute( A dictionary of the 'a3' and 'a4' logs from the 'entry/parameter' group in the NeXus file """ - sample, triplets, analyzers, choppers, monitors, logs = load_everything( - filename, named_components - ) + sample, triplets, analyzers, choppers, monitors, logs = load_everything(filename) if is_simulated: for name in triplets: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 04cf6bf17..de4e72527 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -19,6 +19,7 @@ def typer(named: str) -> type[scipp_type]: variable_type = make_scipp_named_typer(sc.Variable) data_array_type = make_scipp_named_typer(sc.DataArray) +AllNeXusComponents = reduce_t.AllNeXusComponents Analyzers = reduce_t.Analyzers CalibratedDetector = reduce_t.CalibratedDetector Choppers = reduce_t.Choppers @@ -29,12 +30,12 @@ def typer(named: str) -> type[scipp_type]: MonitorData = reduce_t.MonitorData NeXusComponentLocationSpec = reduce_t.NeXusComponentLocationSpec NeXusComponent = reduce_t.NeXusComponent -AllNeXusComponents = reduce_t.AllNeXusComponents NeXusDetectorName = reduce_t.NeXusDetectorName NeXusFileSpec = reduce_t.NeXusFileSpec NeXusMonitorName = reduce_t.NeXusName NeXusTransformation = reduce_t.NeXusTransformation Position = reduce_t.Position +PreopenNeXusFile = reduce_t.PreopenNeXusFile RunType = reduce_t.RunType SampleRun = reduce_t.SampleRun From 43912d2bdeeebbc93b44d2415a0b4cff88edaa49 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 22 Nov 2024 14:22:29 +0100 Subject: [PATCH 077/330] Select moderator via its class --- .../essspectroscopy/src/ess/bifrost/io/nexus.py | 17 +++++------------ .../src/ess/spectroscopy/types.py | 1 + 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index e94de2574..d65e02545 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -7,26 +7,19 @@ import scipp as sc import scippnexus as snx -from ess.reduce.nexus import load_component from ess.reduce.nexus.workflow import GenericNeXusWorkflow from ess.spectroscopy.types import ( GoniometerAngles, - NeXusComponent, - NeXusComponentLocationSpec, + NeXusClass, NeXusFileSpec, RunType, ) -# TODO can override nx_class_for_source instead # See https://github.com/scipp/essreduce/issues/98 -def load_nexus_source_from_moderator( - location: NeXusComponentLocationSpec[snx.NXsource, RunType], -) -> NeXusComponent[snx.NXsource, RunType]: - """Load a NeXus moderator as a source.""" - return NeXusComponent[snx.NXsource, RunType]( - load_component(location, nx_class=snx.NXmoderator) - ) +def moderator_class_for_source() -> NeXusClass[snx.NXsource]: + """Select NXmoderator as the source.""" + return NeXusClass[snx.NXsource](snx.NXmoderator) def load_goniometer_angles( @@ -50,6 +43,6 @@ def load_goniometer_angles( def LoadNeXusWorkflow() -> sciline.Pipeline: """Workflow for loading BIFROST NeXus files.""" workflow = GenericNeXusWorkflow() - workflow.insert(load_nexus_source_from_moderator) + workflow.insert(moderator_class_for_source) workflow.insert(load_goniometer_angles) return workflow diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index de4e72527..99efe5201 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -28,6 +28,7 @@ def typer(named: str) -> type[scipp_type]: GravityVector = reduce_t.GravityVector Filename = reduce_t.Filename MonitorData = reduce_t.MonitorData +NeXusClass = reduce_t.NeXusClass NeXusComponentLocationSpec = reduce_t.NeXusComponentLocationSpec NeXusComponent = reduce_t.NeXusComponent NeXusDetectorName = reduce_t.NeXusDetectorName From bfb9f9185e843b711e383b50e959f853a582644d Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 25 Nov 2024 14:32:05 +0100 Subject: [PATCH 078/330] Do not import data into bifrost --- .../essspectroscopy/src/ess/bifrost/__init__.py | 3 +-- .../tests/bifrost/workflow_test.py | 17 +++++------------ 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py index 89e3fd565..d588f9c0d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -6,7 +6,6 @@ import importlib.metadata -from . import data from .io import nexus from .workflow import BifrostSimulationWorkflow from .detector import providers @@ -18,4 +17,4 @@ del importlib -__all__ = ['BifrostSimulationWorkflow', 'data', 'nexus', 'providers'] +__all__ = ['BifrostSimulationWorkflow', 'nexus', 'providers'] diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index fcaa93027..089c218c2 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -2,6 +2,7 @@ # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) from ess import bifrost +from ess.bifrost.data import simulated_elastic_incoherent_with_phonon from ess.bifrost.types import FrameMonitor3 from ess.spectroscopy.types import ( Analyzers, @@ -16,9 +17,7 @@ def test_simulation_workflow_can_load_detector() -> None: workflow = bifrost.BifrostSimulationWorkflow() - workflow[Filename[SampleRun]] = ( - bifrost.data.simulated_elastic_incoherent_with_phonon() - ) + workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() workflow[NeXusDetectorName] = "125_channel_1_1_triplet" result = workflow.compute(DetectorData[SampleRun]) @@ -32,9 +31,7 @@ def test_simulation_workflow_can_load_detector() -> None: def test_simulation_workflow_can_load_monitor() -> None: workflow = bifrost.BifrostSimulationWorkflow() - workflow[Filename[SampleRun]] = ( - bifrost.data.simulated_elastic_incoherent_with_phonon() - ) + workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() result = workflow.compute(MonitorData[SampleRun, FrameMonitor3]) assert result.bins is None @@ -45,9 +42,7 @@ def test_simulation_workflow_can_load_monitor() -> None: def test_simulation_workflow_can_load_analyzers() -> None: workflow = bifrost.BifrostSimulationWorkflow() - workflow[Filename[SampleRun]] = ( - bifrost.data.simulated_elastic_incoherent_with_phonon() - ) + workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() analyzers = workflow.compute(Analyzers[SampleRun]) assert len(analyzers) == 45 @@ -58,9 +53,7 @@ def test_simulation_workflow_can_load_analyzers() -> None: def test_simulation_workflow_can_load_choppers() -> None: workflow = bifrost.BifrostSimulationWorkflow() - workflow[Filename[SampleRun]] = ( - bifrost.data.simulated_elastic_incoherent_with_phonon() - ) + workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() choppers = workflow.compute(Choppers[SampleRun]) assert choppers.keys() == { From d74a622db85ffce824f082402b6a1b6cd382cfc1 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 25 Nov 2024 14:43:15 +0100 Subject: [PATCH 079/330] Explain custom function --- packages/essspectroscopy/src/ess/bifrost/workflow.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index da6c0161c..7e4abd8ad 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -38,6 +38,11 @@ def get_calibrated_detector_bifrost( signal values array, but not additional information about the detector. The data array is reshaped to the logical detector shape. + This function is specific to BIFROST and differs from the generic + :func:`ess.reduce.nexus.workflow.get_calibrated_detector` in that it does not + fold the detectors into logical dimensions because the files already contain + the detectors in the correct shape. + Parameters ---------- detector: From 3b74556dc83cd61b881c5cd3183dd1afdc7e5c4b Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 28 Nov 2024 11:20:51 +0100 Subject: [PATCH 080/330] Fix typo Co-authored-by: Gregory S. Tucker --- packages/essspectroscopy/src/ess/bifrost/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 9e7a359e3..884e16382 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -27,7 +27,7 @@ def _make_pooch(): def get_path(name: str) -> str: """ - Return the path to a data file bundled with ess.biofrost. + Return the path to a data file bundled with ess.bifrost. This function only works with example data and cannot handle paths to custom files. From 15bb8795d280d298a359dbe3bc43aca586a96d19 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 28 Nov 2024 11:20:28 +0100 Subject: [PATCH 081/330] Rename goniometer to instrument angles --- .../essspectroscopy/src/ess/bifrost/io/nexus.py | 14 ++++++++------ .../src/ess/spectroscopy/indirect/workflow.py | 8 ++++---- .../essspectroscopy/src/ess/spectroscopy/types.py | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index d65e02545..525aefc2c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -9,7 +9,7 @@ from ess.reduce.nexus.workflow import GenericNeXusWorkflow from ess.spectroscopy.types import ( - GoniometerAngles, + InstrumentAngles, NeXusClass, NeXusFileSpec, RunType, @@ -22,9 +22,9 @@ def moderator_class_for_source() -> NeXusClass[snx.NXsource]: return NeXusClass[snx.NXsource](snx.NXmoderator) -def load_goniometer_angles( +def load_instrument_angles( file_spec: NeXusFileSpec[RunType], -) -> GoniometerAngles[RunType]: +) -> InstrumentAngles[RunType]: # TODO need mechanism in ESSreduce to load specific components of non-unique # class by name from ess.reduce.nexus._nexus_loader import _open_nexus_file, _unique_child_group @@ -35,8 +35,10 @@ def load_goniometer_angles( snx.NXparameters, name=None, ) - return GoniometerAngles[RunType]( - sc.DataGroup({name: parameters[name][()]['value'] for name in ('a3', 'a4')}) + return InstrumentAngles[RunType]( + sc.DataGroup[sc.DataArray]( + {name: parameters[name][()]['value'] for name in ('a3', 'a4')} + ) ) @@ -44,5 +46,5 @@ def LoadNeXusWorkflow() -> sciline.Pipeline: """Workflow for loading BIFROST NeXus files.""" workflow = GenericNeXusWorkflow() workflow.insert(moderator_class_for_source) - workflow.insert(load_goniometer_angles) + workflow.insert(load_instrument_angles) return workflow diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 161adaed8..0e351759e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -15,7 +15,7 @@ Choppers, DetectorData, Filename, - GoniometerAngles, + InstrumentAngles, MonitorData, NeXusDetectorName, NeXusMonitorName, @@ -743,7 +743,7 @@ def load_everything(filename: Filename): Position[snx.NXsample, SampleRun], Analyzers[SampleRun], Choppers[SampleRun], - GoniometerAngles[SampleRun], + InstrumentAngles[SampleRun], *(MonitorData[SampleRun, key] for key in monitor_keys), *(NeXusMonitorName[key] for key in monitor_keys), ] @@ -760,9 +760,9 @@ def load_everything(filename: Filename): triplets = sc.DataGroup( zip(detector_names, loaded[DetectorData[SampleRun]], strict=True) ) - goniometer_angles = loaded[GoniometerAngles[SampleRun]] + instrument_angles = loaded[InstrumentAngles[SampleRun]] - return sample, triplets, analyzers, choppers, monitors, goniometer_angles + return sample, triplets, analyzers, choppers, monitors, instrument_angles def one_setting( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 99efe5201..cbde155fc 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -41,10 +41,10 @@ def typer(named: str) -> type[scipp_type]: SampleRun = reduce_t.SampleRun -class GoniometerAngles( +class InstrumentAngles( sciline.Scope[RunType, sc.DataGroup[sc.DataArray]], sc.DataGroup[sc.DataArray] ): - """Sample goniometer angles as a function of time.""" + """Instrument angles for the sample orientation as a function of time.""" AnalyzerPosition = variable_type('AnalyzerPosition') From 15d796d598490427564bd4511f1dbd31e07db2bc Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 29 Nov 2024 16:20:31 +0100 Subject: [PATCH 082/330] Remove PSD Monitors --- packages/essspectroscopy/src/ess/bifrost/types.py | 2 -- packages/essspectroscopy/src/ess/bifrost/workflow.py | 4 ---- .../essspectroscopy/src/ess/spectroscopy/indirect/workflow.py | 4 ---- 3 files changed, 10 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 29c2364fe..18a190b45 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -11,6 +11,4 @@ FrameMonitor1 = reduce_t.Monitor2 FrameMonitor2 = reduce_t.Monitor3 FrameMonitor3 = reduce_t.Monitor4 -PsdMonitor0 = reduce_t.Monitor5 -PsdMonitor1 = reduce_t.Monitor6 MonitorType = reduce_t.MonitorType diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 7e4abd8ad..8759aae53 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -21,8 +21,6 @@ FrameMonitor1, FrameMonitor2, FrameMonitor3, - PsdMonitor0, - PsdMonitor1, ) @@ -78,8 +76,6 @@ def default_parameters() -> dict[type, Any]: NeXusMonitorName[FrameMonitor1]: '090_frame_1', NeXusMonitorName[FrameMonitor2]: '097_frame_2', NeXusMonitorName[FrameMonitor3]: '110_frame_3', - NeXusMonitorName[PsdMonitor0]: '111_psd0', - NeXusMonitorName[PsdMonitor1]: '113_psd1', } diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 0e351759e..d1afdd6db 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -712,8 +712,6 @@ def load_everything(filename: Filename): FrameMonitor1, FrameMonitor2, FrameMonitor3, - PsdMonitor0, - PsdMonitor1, ) from ess.bifrost.workflow import BifrostSimulationWorkflow @@ -722,8 +720,6 @@ def load_everything(filename: Filename): FrameMonitor1, FrameMonitor2, FrameMonitor3, - PsdMonitor0, - PsdMonitor1, ) detector_names = _get_detector_names(filename) From f5fd6842614557c08e50a65c8491722ca3415356 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 6 Jan 2025 14:31:13 +0100 Subject: [PATCH 083/330] Require essreduce>=24.12.0 To use the new workflow pruning implementation. --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- .../essspectroscopy/requirements/base.txt | 28 ++++++------ .../essspectroscopy/requirements/basetest.txt | 10 ++--- packages/essspectroscopy/requirements/ci.txt | 16 +++---- packages/essspectroscopy/requirements/dev.txt | 34 +++++++-------- .../essspectroscopy/requirements/docs.txt | 43 ++++++++++--------- .../essspectroscopy/requirements/mypy.txt | 2 +- .../essspectroscopy/requirements/nightly.txt | 30 ++++++------- .../essspectroscopy/requirements/static.txt | 4 +- .../essspectroscopy/requirements/wheels.txt | 2 +- 11 files changed, 86 insertions(+), 87 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 65a3a37c2..dd5266b85 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -32,7 +32,7 @@ requires-python = ">=3.10" # Make sure to list one dependency per line. dependencies = [ "choppera>=0.1.4", - "essreduce>=24.11.2", + "essreduce>=24.12.0", "loguru", "sciline>=24.6.3", "scipp>=24.9.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 97ecdd120..ecb5c7af2 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -3,7 +3,7 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! choppera>=0.1.4 -essreduce>=24.11.2 +essreduce>=24.12.0 loguru sciline>=24.6.3 scipp>=24.9.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 0f39873cb..9a4b257db 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:444e861a339d8952d5c2d6c9dbd23e0566cb5a96 +# SHA1:f506d52482b48ff6f4ec68146a2b5cd77360c7da # # This file is autogenerated by pip-compile-multi # To update, run: @@ -13,19 +13,19 @@ cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -essreduce==24.11.2 +essreduce==24.12.0 # via -r base.in -fonttools==4.55.0 +fonttools==4.55.3 # via matplotlib h5py==3.12.1 # via # scippneutron # scippnexus -kiwisolver==1.4.7 +kiwisolver==1.4.8 # via matplotlib -loguru==0.7.2 +loguru==0.7.3 # via -r base.in -matplotlib==3.9.2 +matplotlib==3.10.0 # via # mpltoolbox # plopp @@ -33,7 +33,7 @@ mpltoolbox==24.5.1 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.1.3 +numpy==2.2.1 # via # choppera # contourpy @@ -46,13 +46,13 @@ numpy==2.1.3 # scipy packaging==24.2 # via matplotlib -pillow==11.0.0 +pillow==11.1.0 # via matplotlib plopp==24.10.0 # via scippneutron polystar==0.4.5 # via choppera -pyparsing==3.2.0 +pyparsing==3.2.1 # via matplotlib python-dateutil==2.9.0.post0 # via @@ -70,24 +70,24 @@ scipp==24.11.2 # essreduce # scippneutron # scippnexus -scippneutron==24.11.0 +scippneutron==24.12.0 # via # -r base.in # essreduce -scippnexus==24.11.0 +scippnexus==24.11.1 # via # -r base.in # choppera # essreduce # scippneutron -scipy==1.14.1 +scipy==1.15.0 # via # choppera # scippneutron # scippnexus -six==1.16.0 +six==1.17.0 # via python-dateutil strictyaml==1.7.3 # via choppera -tqdm==4.67.0 +tqdm==4.67.1 # via -r base.in diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 351f447ab..9ac0cd689 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,9 +5,9 @@ # # pip-compile-multi # -certifi==2024.8.30 +certifi==2024.12.14 # via requests -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via requests exceptiongroup==1.2.2 # via pytest @@ -25,11 +25,11 @@ pluggy==1.5.0 # via pytest pooch==1.8.2 # via -r basetest.in -pytest==8.3.3 +pytest==8.3.4 # via -r basetest.in requests==2.32.3 # via pooch -tomli==2.1.0 +tomli==2.2.1 # via pytest -urllib3==2.2.3 +urllib3==2.3.0 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 14921a291..9b11ec994 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -7,11 +7,11 @@ # cachetools==5.5.0 # via tox -certifi==2024.8.30 +certifi==2024.12.14 # via requests chardet==5.2.0 # via tox -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via requests colorama==0.4.6 # via tox @@ -21,9 +21,9 @@ filelock==3.16.1 # via # tox # virtualenv -gitdb==4.0.11 +gitdb==4.0.12 # via gitpython -gitpython==3.1.43 +gitpython==3.1.44 # via -r ci.in idna==3.10 # via requests @@ -42,9 +42,9 @@ pyproject-api==1.8.0 # via tox requests==2.32.3 # via -r ci.in -smmap==5.0.1 +smmap==5.0.2 # via gitdb -tomli==2.1.0 +tomli==2.2.1 # via # pyproject-api # tox @@ -52,7 +52,7 @@ tox==4.23.2 # via -r ci.in typing-extensions==4.12.2 # via tox -urllib3==2.2.3 +urllib3==2.3.0 # via requests -virtualenv==20.27.1 +virtualenv==20.28.1 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index efc84409c..c936ee027 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -14,7 +14,7 @@ -r wheels.txt annotated-types==0.7.0 # via pydantic -anyio==4.6.2.post1 +anyio==4.8.0 # via # httpx # jupyter-server @@ -28,7 +28,7 @@ async-lru==2.0.4 # via jupyterlab cffi==1.17.1 # via argon2-cffi-bindings -click==8.1.7 +click==8.1.8 # via # pip-compile-multi # pip-tools @@ -44,13 +44,13 @@ h11==0.14.0 # via httpcore httpcore==1.0.7 # via httpx -httpx==0.27.2 +httpx==0.28.1 # via jupyterlab isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.9.28 +json5==0.10.0 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema @@ -59,11 +59,11 @@ jsonschema[format-nongpl]==4.23.0 # jupyter-events # jupyterlab-server # nbformat -jupyter-events==0.10.0 +jupyter-events==0.11.0 # via jupyter-server jupyter-lsp==2.2.5 # via jupyterlab -jupyter-server==2.14.2 +jupyter-server==2.15.0 # via # jupyter-lsp # jupyterlab @@ -71,7 +71,7 @@ jupyter-server==2.14.2 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.3.1 +jupyterlab==4.3.4 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab @@ -81,23 +81,23 @@ overrides==7.7.0 # via jupyter-server pathspec==0.12.1 # via copier -pip-compile-multi==2.6.4 +pip-compile-multi==2.7.1 # via -r dev.in pip-tools==7.4.1 # via pip-compile-multi plumbum==1.9.0 # via copier -prometheus-client==0.21.0 +prometheus-client==0.21.1 # via jupyter-server pycparser==2.22 # via cffi -pydantic==2.10.1 +pydantic==2.10.4 # via copier -pydantic-core==2.27.1 +pydantic-core==2.27.2 # via pydantic -python-json-logger==2.0.7 +python-json-logger==3.2.1 # via jupyter-events -questionary==1.10.0 +questionary==2.1.0 # via copier rfc3339-validator==0.1.4 # via @@ -110,16 +110,14 @@ rfc3986-validator==0.1.1 send2trash==1.8.3 # via jupyter-server sniffio==1.3.1 - # via - # anyio - # httpx + # via anyio terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.9.0.20241003 +types-python-dateutil==2.9.0.20241206 # via arrow uri-template==1.3.0 # via jsonschema @@ -127,7 +125,7 @@ webcolors==24.11.1 # via jsonschema websocket-client==1.8.0 # via jupyter-server -wheel==0.45.0 +wheel==0.45.1 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index f14e27e4e..774698d81 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -10,9 +10,9 @@ accessible-pygments==0.0.5 # via pydata-sphinx-theme alabaster==1.0.0 # via sphinx -asttokens==2.4.1 +asttokens==3.0.0 # via stack-data -attrs==24.2.0 +attrs==24.3.0 # via # jsonschema # referencing @@ -24,15 +24,15 @@ beautifulsoup4==4.12.3 # via # nbconvert # pydata-sphinx-theme -bleach==6.2.0 +bleach[css]==6.2.0 # via nbconvert -certifi==2024.8.30 +certifi==2024.12.14 # via requests -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.9 +debugpy==1.8.11 # via ipykernel decorator==5.1.1 # via ipython @@ -48,7 +48,7 @@ exceptiongroup==1.2.2 # via ipython executing==2.1.0 # via stack-data -fastjsonschema==2.20.0 +fastjsonschema==2.21.1 # via nbformat idna==3.10 # via requests @@ -56,13 +56,13 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.29.0 +ipython==8.31.0 # via # -r docs.in # ipykernel jedi==0.19.2 # via ipython -jinja2==3.1.4 +jinja2==3.1.5 # via # myst-parser # nbconvert @@ -101,20 +101,20 @@ mdit-py-plugins==0.4.2 # via myst-parser mdurl==0.1.2 # via markdown-it-py -mistune==3.0.2 +mistune==3.1.0 # via nbconvert myst-parser==4.0.0 # via -r docs.in -nbclient==0.10.0 +nbclient==0.10.2 # via nbconvert -nbconvert==7.16.4 +nbconvert==7.16.5 # via nbsphinx nbformat==5.10.4 # via # nbclient # nbconvert # nbsphinx -nbsphinx==0.9.5 +nbsphinx==0.9.6 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel @@ -128,15 +128,15 @@ platformdirs==4.3.6 # via jupyter-core prompt-toolkit==3.0.48 # via ipython -psutil==6.1.0 +psutil==6.1.1 # via ipykernel ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pydata-sphinx-theme==0.16.0 +pydata-sphinx-theme==0.16.1 # via -r docs.in -pygments==2.18.0 +pygments==2.19.0 # via # accessible-pygments # ipython @@ -155,7 +155,7 @@ referencing==0.35.1 # jsonschema-specifications requests==2.32.3 # via sphinx -rpds-py==0.21.0 +rpds-py==0.22.3 # via # jsonschema # referencing @@ -172,7 +172,7 @@ sphinx==8.1.3 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==2.5.0 +sphinx-autodoc-typehints==3.0.0 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in @@ -193,8 +193,8 @@ sphinxcontrib-serializinghtml==2.0.0 stack-data==0.6.3 # via ipython tinycss2==1.4.0 - # via nbconvert -tomli==2.1.0 + # via bleach +tomli==2.2.1 # via sphinx tornado==6.4.2 # via @@ -215,8 +215,9 @@ traitlets==5.14.3 typing-extensions==4.12.2 # via # ipython + # mistune # pydata-sphinx-theme -urllib3==2.2.3 +urllib3==2.3.0 # via requests wcwidth==0.2.13 # via prompt-toolkit diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 6ffc9ba63..6eb0592cf 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,7 +6,7 @@ # pip-compile-multi # -r test.txt -mypy==1.13.0 +mypy==1.14.1 # via -r mypy.in mypy-extensions==1.0.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 465c73aba..99271406a 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -5,9 +5,9 @@ # # pip-compile-multi # -certifi==2024.8.30 +certifi==2024.12.14 # via requests -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via requests choppera==0.1.5 # via -r nightly.in @@ -21,7 +21,7 @@ essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in exceptiongroup==1.2.2 # via pytest -fonttools==4.55.0 +fonttools==4.55.3 # via matplotlib h5py==3.12.1 # via @@ -31,11 +31,11 @@ idna==3.10 # via requests iniconfig==2.0.0 # via pytest -kiwisolver==1.4.7 +kiwisolver==1.4.8 # via matplotlib -loguru==0.7.2 +loguru==0.7.3 # via -r nightly.in -matplotlib==3.9.2 +matplotlib==3.10.0 # via # mpltoolbox # plopp @@ -43,7 +43,7 @@ mpltoolbox==24.5.1 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.1.3 +numpy==2.2.1 # via # choppera # contourpy @@ -59,7 +59,7 @@ packaging==24.2 # matplotlib # pooch # pytest -pillow==11.0.0 +pillow==11.1.0 # via matplotlib platformdirs==4.3.6 # via pooch @@ -73,9 +73,9 @@ polystar==0.4.5 # via choppera pooch==1.8.2 # via -r nightly.in -pyparsing==3.2.0 +pyparsing==3.2.1 # via matplotlib -pytest==8.3.3 +pytest==8.3.4 # via -r nightly.in python-dateutil==2.9.0.post0 # via @@ -105,18 +105,18 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # choppera # essreduce # scippneutron -scipy==1.14.1 +scipy==1.15.0 # via # choppera # scippneutron # scippnexus -six==1.16.0 +six==1.17.0 # via python-dateutil strictyaml==1.7.3 # via choppera -tomli==2.1.0 +tomli==2.2.1 # via pytest -tqdm==4.67.0 +tqdm==4.67.1 # via -r nightly.in -urllib3==2.2.3 +urllib3==2.3.0 # via requests diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index e107d9150..aa0e67cda 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -11,7 +11,7 @@ distlib==0.3.9 # via virtualenv filelock==3.16.1 # via virtualenv -identify==2.6.2 +identify==2.6.5 # via pre-commit nodeenv==1.9.1 # via pre-commit @@ -21,5 +21,5 @@ pre-commit==4.0.1 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.27.1 +virtualenv==20.28.1 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 6a1c0600c..bfae20bff 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -11,5 +11,5 @@ packaging==24.2 # via build pyproject-hooks==1.2.0 # via build -tomli==2.1.0 +tomli==2.2.1 # via build From 672a61ef85869e5c538a2192a8707e6948fecb22 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 6 Jan 2025 14:33:32 +0100 Subject: [PATCH 084/330] Prune the nexus workflow --- .../src/ess/bifrost/io/nexus.py | 18 +++++++++++++++++- .../essspectroscopy/src/ess/bifrost/types.py | 1 - .../src/ess/spectroscopy/types.py | 15 +++++++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 525aefc2c..4e4c415ab 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -13,6 +13,14 @@ NeXusClass, NeXusFileSpec, RunType, + SampleRun, +) + +from ..types import ( + FrameMonitor0, + FrameMonitor1, + FrameMonitor2, + FrameMonitor3, ) @@ -44,7 +52,15 @@ def load_instrument_angles( def LoadNeXusWorkflow() -> sciline.Pipeline: """Workflow for loading BIFROST NeXus files.""" - workflow = GenericNeXusWorkflow() + workflow = GenericNeXusWorkflow( + run_types=(SampleRun,), + monitor_types=( + FrameMonitor0, + FrameMonitor1, + FrameMonitor2, + FrameMonitor3, + ), + ) workflow.insert(moderator_class_for_source) workflow.insert(load_instrument_angles) return workflow diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 18a190b45..724ee6024 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -11,4 +11,3 @@ FrameMonitor1 = reduce_t.Monitor2 FrameMonitor2 = reduce_t.Monitor3 FrameMonitor3 = reduce_t.Monitor4 -MonitorType = reduce_t.MonitorType diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index cbde155fc..018058456 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) -from typing import NewType +from typing import NewType, TypeVar import sciline import scipp as sc @@ -37,9 +37,20 @@ def typer(named: str) -> type[scipp_type]: NeXusTransformation = reduce_t.NeXusTransformation Position = reduce_t.Position PreopenNeXusFile = reduce_t.PreopenNeXusFile -RunType = reduce_t.RunType SampleRun = reduce_t.SampleRun +# Include BackgroundRun because a single constraint is not allowed. +# We will eventually have more than one... +RunType = TypeVar("RunType", SampleRun, reduce_t.BackgroundRun) +# Monitor types include all monitors used by instrument packages. +MonitorType = TypeVar( + "MonitorType", + reduce_t.Monitor1, + reduce_t.Monitor2, + reduce_t.Monitor3, + reduce_t.Monitor4, +) + class InstrumentAngles( sciline.Scope[RunType, sc.DataGroup[sc.DataArray]], sc.DataGroup[sc.DataArray] From 99dd6fe452a30e4940916ddbc57bce314b1ecfd6 Mon Sep 17 00:00:00 2001 From: Mridul Seth Date: Wed, 12 Feb 2025 15:06:20 +0100 Subject: [PATCH 085/330] copier bump --- packages/essspectroscopy/.copier-answers.yml | 4 +- .../.github/workflows/docs.yml | 2 +- .../workflows/weekly_windows_macos.yml | 42 +++++++++++++++++++ packages/essspectroscopy/.gitignore | 3 +- .../essspectroscopy/.pre-commit-config.yaml | 2 +- packages/essspectroscopy/LICENSE | 2 +- packages/essspectroscopy/docs/conf.py | 4 +- packages/essspectroscopy/pyproject.toml | 3 +- .../essspectroscopy/requirements/make_base.py | 15 ++++--- .../src/ess/spectroscopy/__init__.py | 4 +- .../essspectroscopy/tests/package_test.py | 2 +- packages/essspectroscopy/tox.ini | 5 ++- 12 files changed, 68 insertions(+), 20 deletions(-) create mode 100644 packages/essspectroscopy/.github/workflows/weekly_windows_macos.yml diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index b61cbb73c..a8c8d295b 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: aa5dc5e +_commit: 5c4fd02 _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.13' @@ -10,4 +10,4 @@ orgname: scipp prettyname: ESSspectroscopy projectname: essspectroscopy related_projects: Scipp,ScippNeutron,ScippNexus,Plopp,Sciline,ESSreduce -year: 2024 +year: 2025 diff --git a/packages/essspectroscopy/.github/workflows/docs.yml b/packages/essspectroscopy/.github/workflows/docs.yml index 72659cbd8..a90bcf100 100644 --- a/packages/essspectroscopy/.github/workflows/docs.yml +++ b/packages/essspectroscopy/.github/workflows/docs.yml @@ -69,7 +69,7 @@ jobs: name: docs_html path: html/ - - uses: JamesIves/github-pages-deploy-action@v4.6.9 + - uses: JamesIves/github-pages-deploy-action@v4.7.2 if: ${{ inputs.publish }} with: branch: gh-pages diff --git a/packages/essspectroscopy/.github/workflows/weekly_windows_macos.yml b/packages/essspectroscopy/.github/workflows/weekly_windows_macos.yml new file mode 100644 index 000000000..1544d7f97 --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/weekly_windows_macos.yml @@ -0,0 +1,42 @@ +name: Windows and MacOS weekly tests + +on: + workflow_dispatch: + schedule: + - cron: '0 2 * * 1' + +jobs: + pytox: + name: Python and Tox env + runs-on: 'ubuntu-24.04' + outputs: + min_python: ${{ steps.vars.outputs.min_python }} + min_tox_env: ${{ steps.vars.outputs.min_tox_env }} + steps: + - uses: actions/checkout@v4 + - name: Get Python version for other CI jobs + id: vars + run: | + echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT + echo "min_tox_env=py$(cat .github/workflows/python-version-ci | sed 's/\.//g')" >> $GITHUB_OUTPUT + tests: + name: Tests + needs: pytox + strategy: + matrix: + os: ['macos-latest', 'windows-latest'] + python: + - version: '${{needs.pytox.outputs.min_python}}' + tox-env: '${{needs.pytox.outputs.min_tox_env}}' + uses: ./.github/workflows/test.yml + with: + os-variant: ${{ matrix.os }} + python-version: ${{ matrix.python.version }} + tox-env: ${{ matrix.python.tox-env }} + + docs: + needs: tests + uses: ./.github/workflows/docs.yml + with: + publish: false + branch: ${{ github.head_ref == '' && github.ref_name || github.head_ref }} diff --git a/packages/essspectroscopy/.gitignore b/packages/essspectroscopy/.gitignore index 3e02ecce9..340e6499b 100644 --- a/packages/essspectroscopy/.gitignore +++ b/packages/essspectroscopy/.gitignore @@ -4,7 +4,8 @@ dist html .tox *.egg-info -uv.lock # we lock dependencies with pip-compile, not uv +# we lock dependencies with pip-compile, not uv +uv.lock *.sw? diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml index f83362c61..0f3f9a957 100644 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: args: [ "--drop-empty-cells", "--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.9 + rev: v0.8.0 hooks: - id: ruff args: [ --fix ] diff --git a/packages/essspectroscopy/LICENSE b/packages/essspectroscopy/LICENSE index 54b3cf4d5..7d62083d5 100644 --- a/packages/essspectroscopy/LICENSE +++ b/packages/essspectroscopy/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2024, Scipp contributors (https://github.com/scipp) +Copyright (c) 2025, Scipp contributors (https://github.com/scipp) All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 07a1ba1ef..665f24910 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import doctest import os @@ -15,7 +15,7 @@ # General information about the project. project = 'ESSspectroscopy' -copyright = '2024 Scipp contributors' +copyright = '2025 Scipp contributors' author = 'Scipp contributors' html_show_sourcelink = True diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index dd5266b85..2ba024540 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -87,13 +87,12 @@ ignore = [ # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules "COM812", "COM819", "D206", "D300", "E111", "E114", "E117", "ISC001", "ISC002", "Q000", "Q001", "Q002", "Q003", "W191", ] -fixable = ["B010", "I001", "PT001"] +fixable = ["B010", "I001", "PT001", "RUF022"] isort.known-first-party = ["ess.spectroscopy"] pydocstyle.convention = "numpy" [tool.ruff.lint.per-file-ignores] # those files have an increased risk of relying on import order -"__init__.py" = ["I"] "tests/*" = [ "S101", # asserts are fine in tests "B018", # 'useless expressions' are ok because some tests just check for exceptions diff --git a/packages/essspectroscopy/requirements/make_base.py b/packages/essspectroscopy/requirements/make_base.py index 01cd45873..2cda547f5 100644 --- a/packages/essspectroscopy/requirements/make_base.py +++ b/packages/essspectroscopy/requirements/make_base.py @@ -1,4 +1,3 @@ -import sys from argparse import ArgumentParser from pathlib import Path @@ -58,11 +57,15 @@ def as_nightly(repo: str) -> str: else: org = "scipp" if repo == "scipp": - version = f"cp{sys.version_info.major}{sys.version_info.minor}" - base = "https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly" - suffix = "manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - prefix = "scipp @ " - return prefix + "-".join([base, version, version, suffix]) + # With the standard pip resolver index-url takes precedence over + # extra-index-url but with uv it's reversed, so if we move to tox-uv + # this needs to be reversed. + return ( + "scipp\n" + "--index-url=https://pypi.anaconda.org/scipp-nightly-wheels/simple/\n" + "--extra-index-url=https://pypi.org/simple\n" + "--pre" + ) return f"{repo} @ git+https://github.com/{org}/{repo}@main" diff --git a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py index fc0e1e855..93c529095 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) -# ruff: noqa: E402, F401 +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +# ruff: noqa: E402, F401, I import importlib.metadata diff --git a/packages/essspectroscopy/tests/package_test.py b/packages/essspectroscopy/tests/package_test.py index 345ee508e..f47925443 100644 --- a/packages/essspectroscopy/tests/package_test.py +++ b/packages/essspectroscopy/tests/package_test.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) """Tests of package integrity. diff --git a/packages/essspectroscopy/tox.ini b/packages/essspectroscopy/tox.ini index 63839b890..04d552b19 100644 --- a/packages/essspectroscopy/tox.ini +++ b/packages/essspectroscopy/tox.ini @@ -10,6 +10,9 @@ commands = pytest {posargs} [testenv:nightly] deps = -r requirements/nightly.txt +setenv = + PIP_INDEX_URL = https://pypi.anaconda.org/scipp-nightly-wheels/simple + PIP_EXTRA_INDEX_URL = https://pypi.org/simple commands = pytest {posargs} [testenv:unpinned] @@ -64,4 +67,4 @@ deps = skip_install = true changedir = requirements commands = python ./make_base.py --nightly scipp,scippneutron,sciline,plopp,scippnexus,essreduce - pip-compile-multi -d . --backtracking + pip-compile-multi -d . --backtracking --annotate-index From c7c664c36f449496f7bf06a8bd4bdaa8561b53a9 Mon Sep 17 00:00:00 2001 From: Mridul Seth Date: Wed, 12 Feb 2025 15:08:16 +0100 Subject: [PATCH 086/330] tox -e deps --- .../essspectroscopy/requirements/base.txt | 14 +++---- .../essspectroscopy/requirements/basetest.txt | 2 +- packages/essspectroscopy/requirements/ci.txt | 12 +++--- packages/essspectroscopy/requirements/dev.txt | 6 +-- .../essspectroscopy/requirements/docs.txt | 34 ++++++++------- .../essspectroscopy/requirements/mypy.txt | 2 +- .../essspectroscopy/requirements/nightly.in | 5 ++- .../essspectroscopy/requirements/nightly.txt | 41 +++++++++++++++---- .../essspectroscopy/requirements/static.txt | 8 ++-- 9 files changed, 78 insertions(+), 46 deletions(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 9a4b257db..71854b427 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -5,7 +5,7 @@ # # pip-compile-multi # -choppera==0.1.5 +choppera==0.1.6 # via -r base.in contourpy==1.3.1 # via matplotlib @@ -13,9 +13,9 @@ cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -essreduce==24.12.0 +essreduce==25.2.0 # via -r base.in -fonttools==4.55.3 +fonttools==4.56.0 # via matplotlib h5py==3.12.1 # via @@ -33,7 +33,7 @@ mpltoolbox==24.5.1 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.1 +numpy==2.2.2 # via # choppera # contourpy @@ -63,14 +63,14 @@ sciline==24.10.0 # via # -r base.in # essreduce -scipp==24.11.2 +scipp==25.2.0 # via # -r base.in # choppera # essreduce # scippneutron # scippnexus -scippneutron==24.12.0 +scippneutron==25.1.0 # via # -r base.in # essreduce @@ -80,7 +80,7 @@ scippnexus==24.11.1 # choppera # essreduce # scippneutron -scipy==1.15.0 +scipy==1.15.1 # via # choppera # scippneutron diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 9ac0cd689..4277ad106 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,7 +5,7 @@ # # pip-compile-multi # -certifi==2024.12.14 +certifi==2025.1.31 # via requests charset-normalizer==3.4.1 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 9b11ec994..078cca56e 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,9 +5,9 @@ # # pip-compile-multi # -cachetools==5.5.0 +cachetools==5.5.1 # via tox -certifi==2024.12.14 +certifi==2025.1.31 # via requests chardet==5.2.0 # via tox @@ -17,7 +17,7 @@ colorama==0.4.6 # via tox distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via # tox # virtualenv @@ -38,7 +38,7 @@ platformdirs==4.3.6 # virtualenv pluggy==1.5.0 # via tox -pyproject-api==1.8.0 +pyproject-api==1.9.0 # via tox requests==2.32.3 # via -r ci.in @@ -48,11 +48,11 @@ tomli==2.2.1 # via # pyproject-api # tox -tox==4.23.2 +tox==4.24.1 # via -r ci.in typing-extensions==4.12.2 # via tox urllib3==2.3.0 # via requests -virtualenv==20.28.1 +virtualenv==20.29.2 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index c936ee027..f5ef3159f 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -59,7 +59,7 @@ jsonschema[format-nongpl]==4.23.0 # jupyter-events # jupyterlab-server # nbformat -jupyter-events==0.11.0 +jupyter-events==0.12.0 # via jupyter-server jupyter-lsp==2.2.5 # via jupyterlab @@ -71,7 +71,7 @@ jupyter-server==2.15.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.3.4 +jupyterlab==4.3.5 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab @@ -91,7 +91,7 @@ prometheus-client==0.21.1 # via jupyter-server pycparser==2.22 # via cffi -pydantic==2.10.4 +pydantic==2.10.6 # via copier pydantic-core==2.27.2 # via pydantic diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 774698d81..57a05ff9f 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -10,29 +10,31 @@ accessible-pygments==0.0.5 # via pydata-sphinx-theme alabaster==1.0.0 # via sphinx +appnope==0.1.4 + # via ipykernel asttokens==3.0.0 # via stack-data -attrs==24.3.0 +attrs==25.1.0 # via # jsonschema # referencing -babel==2.16.0 +babel==2.17.0 # via # pydata-sphinx-theme # sphinx -beautifulsoup4==4.12.3 +beautifulsoup4==4.13.3 # via # nbconvert # pydata-sphinx-theme bleach[css]==6.2.0 # via nbconvert -certifi==2024.12.14 +certifi==2025.1.31 # via requests charset-normalizer==3.4.1 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.11 +debugpy==1.8.12 # via ipykernel decorator==5.1.1 # via ipython @@ -46,7 +48,7 @@ docutils==0.21.2 # sphinx exceptiongroup==1.2.2 # via ipython -executing==2.1.0 +executing==2.2.0 # via stack-data fastjsonschema==2.21.1 # via nbformat @@ -56,7 +58,7 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.31.0 +ipython==8.32.0 # via # -r docs.in # ipykernel @@ -101,13 +103,13 @@ mdit-py-plugins==0.4.2 # via myst-parser mdurl==0.1.2 # via markdown-it-py -mistune==3.1.0 +mistune==3.1.1 # via nbconvert -myst-parser==4.0.0 +myst-parser==4.0.1 # via -r docs.in nbclient==0.10.2 # via nbconvert -nbconvert==7.16.5 +nbconvert==7.16.6 # via nbsphinx nbformat==5.10.4 # via @@ -126,7 +128,7 @@ pexpect==4.9.0 # via ipython platformdirs==4.3.6 # via jupyter-core -prompt-toolkit==3.0.48 +prompt-toolkit==3.0.50 # via ipython psutil==6.1.1 # via ipykernel @@ -136,7 +138,7 @@ pure-eval==0.2.3 # via stack-data pydata-sphinx-theme==0.16.1 # via -r docs.in -pygments==2.19.0 +pygments==2.19.1 # via # accessible-pygments # ipython @@ -145,11 +147,11 @@ pygments==2.19.0 # sphinx pyyaml==6.0.2 # via myst-parser -pyzmq==26.2.0 +pyzmq==26.2.1 # via # ipykernel # jupyter-client -referencing==0.35.1 +referencing==0.36.2 # via # jsonschema # jsonschema-specifications @@ -172,7 +174,7 @@ sphinx==8.1.3 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==3.0.0 +sphinx-autodoc-typehints==3.0.1 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in @@ -214,9 +216,11 @@ traitlets==5.14.3 # nbsphinx typing-extensions==4.12.2 # via + # beautifulsoup4 # ipython # mistune # pydata-sphinx-theme + # referencing urllib3==2.3.0 # via requests wcwidth==0.2.13 diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 6eb0592cf..7f020f7a7 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,7 +6,7 @@ # pip-compile-multi # -r test.txt -mypy==1.14.1 +mypy==1.15.0 # via -r mypy.in mypy-extensions==1.0.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 73a992191..772d3622c 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -6,7 +6,10 @@ loguru tqdm pooch pytest -scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +scipp +--index-url=https://pypi.anaconda.org/scipp-nightly-wheels/simple/ +--extra-index-url=https://pypi.org/simple +--pre scippneutron @ git+https://github.com/scipp/scippneutron@main sciline @ git+https://github.com/scipp/sciline@main plopp @ git+https://github.com/scipp/plopp@main diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 99271406a..860261002 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,15 +1,20 @@ -# SHA1:e85f42994c4b6596e6e67da03048787165ef6929 +# SHA1:0a3c9fa315432a5f76cff678a2584a5d73065066 # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # -certifi==2024.12.14 +--index-url https://pypi.anaconda.org/scipp-nightly-wheels/simple/ +--extra-index-url https://pypi.org/simple + +annotated-types==0.7.0 + # via pydantic +certifi==2025.1.31 # via requests charset-normalizer==3.4.1 # via requests -choppera==0.1.5 +choppera==0.1.6 # via -r nightly.in contourpy==1.3.1 # via matplotlib @@ -17,22 +22,32 @@ cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib +dnspython==2.7.0 + # via email-validator +email-validator==2.2.0 + # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in exceptiongroup==1.2.2 # via pytest -fonttools==4.55.3 +fonttools==4.56.0 # via matplotlib h5py==3.12.1 # via # scippneutron # scippnexus idna==3.10 - # via requests + # via + # email-validator + # requests iniconfig==2.0.0 # via pytest kiwisolver==1.4.8 # via matplotlib +lazy-loader==0.4 + # via + # plopp + # scippneutron loguru==0.7.3 # via -r nightly.in matplotlib==3.10.0 @@ -43,7 +58,7 @@ mpltoolbox==24.5.1 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.1 +numpy==2.2.2 # via # choppera # contourpy @@ -56,6 +71,7 @@ numpy==2.2.1 # scipy packaging==24.2 # via + # lazy-loader # matplotlib # pooch # pytest @@ -73,6 +89,10 @@ polystar==0.4.5 # via choppera pooch==1.8.2 # via -r nightly.in +pydantic==2.11.0a2 + # via scippneutron +pydantic-core==2.29.0 + # via pydantic pyparsing==3.2.1 # via matplotlib pytest==8.3.4 @@ -80,6 +100,7 @@ pytest==8.3.4 python-dateutil==2.9.0.post0 # via # matplotlib + # scippneutron # scippnexus # strictyaml requests==2.32.3 @@ -88,7 +109,7 @@ sciline @ git+https://github.com/scipp/sciline@main # via # -r nightly.in # essreduce -scipp @ https://github.com/scipp/scipp/releases/download/nightly/scipp-nightly-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +scipp==100.0.0.dev0 # via # -r nightly.in # choppera @@ -105,7 +126,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # choppera # essreduce # scippneutron -scipy==1.15.0 +scipy==1.15.1 # via # choppera # scippneutron @@ -118,5 +139,9 @@ tomli==2.2.1 # via pytest tqdm==4.67.1 # via -r nightly.in +typing-extensions==4.12.2 + # via + # pydantic + # pydantic-core urllib3==2.3.0 # via requests diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index aa0e67cda..a0569bdaf 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,17 +9,17 @@ cfgv==3.4.0 # via pre-commit distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via virtualenv -identify==2.6.5 +identify==2.6.7 # via pre-commit nodeenv==1.9.1 # via pre-commit platformdirs==4.3.6 # via virtualenv -pre-commit==4.0.1 +pre-commit==4.1.0 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.28.1 +virtualenv==20.29.2 # via pre-commit From 85731522fdd9c199ddadd56f8d6552e7fc24ac26 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 14:11:00 +0000 Subject: [PATCH 087/330] Apply automatic formatting --- packages/essspectroscopy/src/ess/bifrost/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py index d588f9c0d..2d581f26b 100644 --- a/packages/essspectroscopy/src/ess/bifrost/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -6,9 +6,9 @@ import importlib.metadata +from .detector import providers from .io import nexus from .workflow import BifrostSimulationWorkflow -from .detector import providers try: __version__ = importlib.metadata.version("essspectroscopy") From ca4e7aa17fca67513b4ca285eb76f181eb34402c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 5 Mar 2025 13:27:36 +0100 Subject: [PATCH 088/330] Replace choppera dep with tof --- packages/essspectroscopy/pyproject.toml | 4 +- packages/essspectroscopy/requirements/base.in | 4 +- .../essspectroscopy/requirements/base.txt | 61 ++++++++++++------- .../essspectroscopy/requirements/basetest.txt | 2 +- packages/essspectroscopy/requirements/ci.txt | 2 +- packages/essspectroscopy/requirements/dev.txt | 8 +-- .../essspectroscopy/requirements/docs.txt | 25 +++----- .../essspectroscopy/requirements/mypy.txt | 2 - .../essspectroscopy/requirements/nightly.in | 2 +- .../essspectroscopy/requirements/nightly.txt | 31 ++++------ .../essspectroscopy/requirements/static.txt | 2 +- 11 files changed, 69 insertions(+), 74 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 2ba024540..fb832cda7 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -31,13 +31,13 @@ requires-python = ">=3.10" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "choppera>=0.1.4", - "essreduce>=24.12.0", + "essreduce>=25.02.4", "loguru", "sciline>=24.6.3", "scipp>=24.9.1", "scippneutron>=24.8.0", "scippnexus>=24.9.0", + "tof>=25.01.2", "tqdm", ] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index ecb5c7af2..862746c50 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,11 +2,11 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -choppera>=0.1.4 -essreduce>=24.12.0 +essreduce>=25.02.4 loguru sciline>=24.6.3 scipp>=24.9.1 scippneutron>=24.8.0 scippnexus>=24.9.0 +tof>=25.01.2 tqdm diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 71854b427..7c146c289 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,31 +1,43 @@ -# SHA1:f506d52482b48ff6f4ec68146a2b5cd77360c7da +# SHA1:7257c564a37a68f9db3c7126051d084c01df47d8 # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # -choppera==0.1.6 - # via -r base.in +annotated-types==0.7.0 + # via pydantic contourpy==1.3.1 # via matplotlib cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -essreduce==25.2.0 +dnspython==2.7.0 + # via email-validator +email-validator==2.2.0 + # via scippneutron +essreduce==25.3.0 # via -r base.in fonttools==4.56.0 # via matplotlib -h5py==3.12.1 +h5py==3.13.0 # via # scippneutron # scippnexus +idna==3.10 + # via email-validator +importlib-resources==6.5.2 + # via tof kiwisolver==1.4.8 # via matplotlib +lazy-loader==0.4 + # via + # plopp + # scippneutron loguru==0.7.3 # via -r base.in -matplotlib==3.10.0 +matplotlib==3.10.1 # via # mpltoolbox # plopp @@ -33,32 +45,36 @@ mpltoolbox==24.5.1 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.2 +numpy==2.2.3 # via - # choppera # contourpy # h5py # matplotlib # mpltoolbox - # polystar # scipp # scippneutron # scipy packaging==24.2 - # via matplotlib + # via + # lazy-loader + # matplotlib pillow==11.1.0 # via matplotlib -plopp==24.10.0 +plopp==25.2.0 + # via + # scippneutron + # tof +pydantic==2.10.6 # via scippneutron -polystar==0.4.5 - # via choppera +pydantic-core==2.27.2 + # via pydantic pyparsing==3.2.1 # via matplotlib python-dateutil==2.9.0.post0 # via # matplotlib + # scippneutron # scippnexus - # strictyaml sciline==24.10.0 # via # -r base.in @@ -66,28 +82,31 @@ sciline==24.10.0 scipp==25.2.0 # via # -r base.in - # choppera # essreduce # scippneutron # scippnexus -scippneutron==25.1.0 + # tof +scippneutron==25.2.1 # via # -r base.in # essreduce scippnexus==24.11.1 # via # -r base.in - # choppera # essreduce # scippneutron -scipy==1.15.1 +scipy==1.15.2 # via - # choppera # scippneutron # scippnexus + # tof six==1.17.0 # via python-dateutil -strictyaml==1.7.3 - # via choppera +tof==25.2.0 + # via -r base.in tqdm==4.67.1 # via -r base.in +typing-extensions==4.12.2 + # via + # pydantic + # pydantic-core diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 4277ad106..929e397d6 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -25,7 +25,7 @@ pluggy==1.5.0 # via pytest pooch==1.8.2 # via -r basetest.in -pytest==8.3.4 +pytest==8.3.5 # via -r basetest.in requests==2.32.3 # via pooch diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 078cca56e..1faaceaf1 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,7 +5,7 @@ # # pip-compile-multi # -cachetools==5.5.1 +cachetools==5.5.2 # via tox certifi==2025.1.31 # via requests diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index f5ef3159f..c456d48f3 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -12,8 +12,6 @@ -r static.txt -r test.txt -r wheels.txt -annotated-types==0.7.0 - # via pydantic anyio==4.8.0 # via # httpx @@ -32,7 +30,7 @@ click==8.1.8 # via # pip-compile-multi # pip-tools -copier==9.4.1 +copier==9.5.0 # via -r dev.in dunamai==1.23.0 # via copier @@ -91,10 +89,6 @@ prometheus-client==0.21.1 # via jupyter-server pycparser==2.22 # via cffi -pydantic==2.10.6 - # via copier -pydantic-core==2.27.2 - # via pydantic python-json-logger==3.2.1 # via jupyter-events questionary==2.1.0 diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 57a05ff9f..607608954 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -10,8 +10,6 @@ accessible-pygments==0.0.5 # via pydata-sphinx-theme alabaster==1.0.0 # via sphinx -appnope==0.1.4 - # via ipykernel asttokens==3.0.0 # via stack-data attrs==25.1.0 @@ -34,9 +32,9 @@ charset-normalizer==3.4.1 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.12 +debugpy==1.8.13 # via ipykernel -decorator==5.1.1 +decorator==5.2.1 # via ipython defusedxml==0.7.1 # via nbconvert @@ -52,13 +50,11 @@ executing==2.2.0 # via stack-data fastjsonschema==2.21.1 # via nbformat -idna==3.10 - # via requests imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.32.0 +ipython==8.33.0 # via # -r docs.in # ipykernel @@ -103,7 +99,7 @@ mdit-py-plugins==0.4.2 # via myst-parser mdurl==0.1.2 # via markdown-it-py -mistune==3.1.1 +mistune==3.1.2 # via nbconvert myst-parser==4.0.1 # via -r docs.in @@ -116,7 +112,7 @@ nbformat==5.10.4 # nbclient # nbconvert # nbsphinx -nbsphinx==0.9.6 +nbsphinx==0.9.7 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel @@ -130,7 +126,7 @@ platformdirs==4.3.6 # via jupyter-core prompt-toolkit==3.0.50 # via ipython -psutil==6.1.1 +psutil==7.0.0 # via ipykernel ptyprocess==0.7.0 # via pexpect @@ -157,7 +153,7 @@ referencing==0.36.2 # jsonschema-specifications requests==2.32.3 # via sphinx -rpds-py==0.22.3 +rpds-py==0.23.1 # via # jsonschema # referencing @@ -214,13 +210,6 @@ traitlets==5.14.3 # nbconvert # nbformat # nbsphinx -typing-extensions==4.12.2 - # via - # beautifulsoup4 - # ipython - # mistune - # pydata-sphinx-theme - # referencing urllib3==2.3.0 # via requests wcwidth==0.2.13 diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 7f020f7a7..61d88db19 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -10,5 +10,3 @@ mypy==1.15.0 # via -r mypy.in mypy-extensions==1.0.0 # via mypy -typing-extensions==4.12.2 - # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 772d3622c..67f7b120a 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,8 +1,8 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -choppera>=0.1.4 loguru +tof>=25.01.2 tqdm pooch pytest diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 860261002..3e7498724 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:0a3c9fa315432a5f76cff678a2584a5d73065066 +# SHA1:535311ce15f018bdb70abaeacbf1bcc612a11614 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -14,8 +14,6 @@ certifi==2025.1.31 # via requests charset-normalizer==3.4.1 # via requests -choppera==0.1.6 - # via -r nightly.in contourpy==1.3.1 # via matplotlib cyclebane==24.10.0 @@ -32,7 +30,7 @@ exceptiongroup==1.2.2 # via pytest fonttools==4.56.0 # via matplotlib -h5py==3.12.1 +h5py==3.13.0 # via # scippneutron # scippnexus @@ -40,6 +38,8 @@ idna==3.10 # via # email-validator # requests +importlib-resources==6.5.2 + # via tof iniconfig==2.0.0 # via pytest kiwisolver==1.4.8 @@ -50,7 +50,7 @@ lazy-loader==0.4 # scippneutron loguru==0.7.3 # via -r nightly.in -matplotlib==3.10.0 +matplotlib==3.10.1 # via # mpltoolbox # plopp @@ -58,14 +58,12 @@ mpltoolbox==24.5.1 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.2 +numpy==2.2.3 # via - # choppera # contourpy # h5py # matplotlib # mpltoolbox - # polystar # scipp # scippneutron # scipy @@ -83,10 +81,9 @@ plopp @ git+https://github.com/scipp/plopp@main # via # -r nightly.in # scippneutron + # tof pluggy==1.5.0 # via pytest -polystar==0.4.5 - # via choppera pooch==1.8.2 # via -r nightly.in pydantic==2.11.0a2 @@ -95,14 +92,13 @@ pydantic-core==2.29.0 # via pydantic pyparsing==3.2.1 # via matplotlib -pytest==8.3.4 +pytest==8.3.5 # via -r nightly.in python-dateutil==2.9.0.post0 # via # matplotlib # scippneutron # scippnexus - # strictyaml requests==2.32.3 # via pooch sciline @ git+https://github.com/scipp/sciline@main @@ -112,10 +108,10 @@ sciline @ git+https://github.com/scipp/sciline@main scipp==100.0.0.dev0 # via # -r nightly.in - # choppera # essreduce # scippneutron # scippnexus + # tof scippneutron @ git+https://github.com/scipp/scippneutron@main # via # -r nightly.in @@ -123,18 +119,17 @@ scippneutron @ git+https://github.com/scipp/scippneutron@main scippnexus @ git+https://github.com/scipp/scippnexus@main # via # -r nightly.in - # choppera # essreduce # scippneutron -scipy==1.15.1 +scipy==1.15.2 # via - # choppera # scippneutron # scippnexus + # tof six==1.17.0 # via python-dateutil -strictyaml==1.7.3 - # via choppera +tof==25.2.0 + # via -r nightly.in tomli==2.2.1 # via pytest tqdm==4.67.1 diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index a0569bdaf..098c4f5a0 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -11,7 +11,7 @@ distlib==0.3.9 # via virtualenv filelock==3.17.0 # via virtualenv -identify==2.6.7 +identify==2.6.8 # via pre-commit nodeenv==1.9.1 # via pre-commit From 7f3b75da4d24d4e098e977bf62eb71229ccfd18a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 7 Mar 2025 15:25:52 +0100 Subject: [PATCH 089/330] Compute ToF at sample using ESSreduce Also changes how energies are computed because now, t=0 is at the source. Before it was at the pulse shaping choppers. --- .../ess/spectroscopy/indirect/conservation.py | 8 - .../src/ess/spectroscopy/indirect/ki.py | 50 ++++-- .../src/ess/spectroscopy/indirect/workflow.py | 170 +++++++++++------- .../src/ess/spectroscopy/types.py | 5 + 4 files changed, 152 insertions(+), 81 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index f632d8f9d..b633afb46 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -118,13 +118,6 @@ def sample_table_momentum_z(q: TableMomentumTransfer) -> TableMomentumTransferZ: return dot(PARALLEL, q) -def energy(ki: IncidentWavenumber, kf: FinalWavenumber) -> EnergyTransfer: - """Calculate the energy transferred to the sample by a neutron""" - from scipp.constants import hbar, neutron_mass - - return hbar * hbar * (ki * ki - kf * kf) / 2 / neutron_mass - - def energy_transfer( incident_energy: IncidentEnergy, final_energy: FinalEnergy ) -> EnergyTransfer: @@ -142,6 +135,5 @@ def energy_transfer( sample_table_momentum_x, sample_table_momentum_y, sample_table_momentum_z, - energy, energy_transfer, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index c4dcfcbee..31b0d33ed 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -7,9 +7,11 @@ from __future__ import annotations +import sciline import scipp as sc from scippnexus import Group +from ess.reduce import time_of_flight from ess.spectroscopy.types import ( Filename, FocusComponentName, @@ -24,7 +26,7 @@ PrimaryFocusDistance, PrimaryFocusTime, PrimarySpectrometerObject, - SampleFrameTime, + SampleEvents, SampleName, SamplePosition, SampleTime, @@ -36,6 +38,8 @@ SourceSampleFlightTime, SourceSamplePathLength, SourceVelocities, + TimeOfFlightLookupTable, + TofSampleEvents, ) @@ -212,6 +216,7 @@ def focus_time( return primary_focus_time(primary, distance) +# TODO insert this as l1 into the events to make sure to use the correct length def primary_path_length( file: Filename, source: SourcePosition, sample: SamplePosition ) -> SourceSamplePathLength: @@ -317,15 +322,29 @@ def primary_pivot_time(primary: PrimarySpectrometerObject) -> SourceSampleFlight def unwrap_sample_time( - times: SampleFrameTime, frequency: SourceFrequency, least: SourceSampleFlightTime -) -> SampleTime: + sample_events: SampleEvents, + table: TimeOfFlightLookupTable, + l1: SourceSamplePathLength, +) -> TofSampleEvents: """Use the pivot time to shift neutron event time offsets, recovering 'real' time after source pulse per event""" - from choppera.nexus import unwrap as choppera_unwrap - - return choppera_unwrap(times, frequency, least) - + pipeline = sciline.Pipeline( + time_of_flight.providers(), + params={ + **time_of_flight.default_parameters(), + time_of_flight.TimeOfFlightLookupTable: table, + time_of_flight.Ltotal: l1, + time_of_flight.RawData: sample_events, + }, + ) + result = pipeline.compute(time_of_flight.TofData) + # This is time-of-flight at the sample. + result.bins.coords['sample_tof'] = result.bins.coords.pop('tof') + return TofSampleEvents(result) + + +# TODO remove def incident_slowness( length: SourceSamplePathLength, time: SampleTime, @@ -361,6 +380,7 @@ def incident_slowness( return slowness +# TODO remove def incident_sloth( primary: PrimarySpectrometerObject, slowness: IncidentSlowness ) -> IncidentSloth: @@ -373,6 +393,7 @@ def incident_sloth( return range_normalized(slowness, sc.min(min_max), sc.max(min_max)) +# TODO remove def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: """Calculate the incident wavelength from the incident slowness for each neutron""" from scipp.constants import Planck, neutron_mass @@ -380,6 +401,7 @@ def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: return (slowness * Planck / neutron_mass).to(unit='angstrom') +# TODO remove def incident_wavenumber(slowness: IncidentSlowness) -> IncidentWavenumber: """Calculate the incident wave number from the incident slowness for each neutron""" from scipp.constants import hbar, neutron_mass @@ -387,6 +409,7 @@ def incident_wavenumber(slowness: IncidentSlowness) -> IncidentWavenumber: return (neutron_mass / hbar / slowness).to(unit='1/angstrom') +# TODO remove def incident_direction() -> IncidentDirection: """Return the incident neutron direction in the laboratory frame""" from scipp import vector @@ -394,6 +417,7 @@ def incident_direction() -> IncidentDirection: return vector([0, 0, 1.0]) +# TODO remove def incident_wavevector( ki_magnitude: IncidentWavenumber, direction: IncidentDirection ) -> IncidentWavevector: @@ -421,10 +445,10 @@ def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: primary_pivot_time, unwrap_sample_time, incident_direction, - incident_slowness, - incident_sloth, - incident_wavelength, - incident_wavenumber, - incident_wavevector, - incident_energy, + # incident_slowness, # TODO + # incident_sloth, + # incident_wavelength, + # incident_wavenumber, + # incident_wavevector, + # incident_energy, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index d1afdd6db..5d410a2ba 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -5,11 +5,14 @@ from collections.abc import Iterable +import numpy as np import scipp as sc import scippnexus as snx from loguru import logger from scipp import Variable +from ess.reduce import time_of_flight + from ..types import ( Analyzers, Choppers, @@ -23,7 +26,11 @@ NXspeFileName, Position, PreopenNeXusFile, + SampleEvents, SampleRun, + SourceSamplePathLength, + TimeOfFlightLookupTable, + TofSampleEvents, ) PIXEL_NAME = 'detector_number' @@ -88,7 +95,7 @@ def ess_source_velocities(): return array(values=[100, 1e4], dims=['wavelength'], unit='m/s') -def convert_simulated_time_to_frame_time(data): +def convert_simulated_time_to_event_time_offset(data): """Helper to make McStas simulated event data look more like real data McStas has the ability to track the time-of-flight from source to detector for @@ -102,26 +109,26 @@ def convert_simulated_time_to_frame_time(data): primary spectrometer is necessary to find any time-of-flight This function takes event data with per-event coordinate event_time_offset - (actually McStas time-of-flight) and creates a new coordinate frame_time that is + (actually McStas time-of-flight) and converts the coordinate to be the time-of-flight modulo the source repetition period. Notes ----- If the input data has realistic event_time_offset values, this function should - produce frame_time data which is identical, and will therefore only increase - the amount of data stored per event. + be a noop. Returns ------- : - A copy of the data with extra per-event coordinate frame_time + A copy of the data with realistic per-event coordinate event_time_offset. """ - graph = { - 'frame_time': lambda event_time_offset: event_time_offset % ess_source_period() - } - return data.transform_coords( - 'frame_time', graph=graph, rename_dims=False, keep_intermediate=False + res = data.transform_coords( + frame_time=lambda event_time_offset: event_time_offset % ess_source_period(), + rename_dims=False, + keep_intermediate=False, + keep_inputs=False, ) + return res.transform_coords(event_time_offset='frame_time', keep_inputs=False) def analyzer_per_detector(analyzers: list[str], triplets: list[str]) -> dict[str, str]: @@ -309,18 +316,25 @@ def get_triplet_events(triplets: Iterable[sc.DataArray]): return events -def get_sample_events(triplet_events, sample_detector_flight_times): +def get_sample_events(triplet_events: sc.DataArray, sample_detector_flight_times): """Return the events with the frame_time coordinate offset to time at the sample""" - events = triplet_events.copy() - for coord in ('position', 'x_pixel_offset', 'y_pixel_offset'): - del events.coords[coord] - events.bins.coords['frame_time'] -= sample_detector_flight_times.to(unit='ns') - events.bins.coords['frame_time'] %= ess_source_period() + events = triplet_events.drop_coords( + ('position', 'x_pixel_offset', 'y_pixel_offset') + ) + events.bins.coords['event_time_offset'] -= sample_detector_flight_times.to( + unit='ns' + ) + events.bins.coords['event_time_offset'] %= ess_source_period() return events -def get_unwrapped_events( - filename, source_name, sample_name, sample_events, focus_components +def get_unwrapped_sample_events( + filename, + source_name, + sample_name, + sample_events, + focus_components, + tof_lookup_table, ): """Shift frame_time at sample events to time-since-pulse events at sample""" from sciline import Pipeline @@ -329,9 +343,7 @@ def get_unwrapped_events( Filename, FocusComponentNames, PrimarySpectrometerObject, - SampleFrameTime, SampleName, - SampleTime, SourceDelay, SourceDuration, SourceFrequency, @@ -348,17 +360,19 @@ def get_unwrapped_events( SourceDuration: ess_source_duration(), SourceFrequency: ess_source_frequency(), SourceVelocities: ess_source_velocities(), - SampleFrameTime: sample_events.data.bins.coords['frame_time'], + SampleEvents: sample_events, FocusComponentNames: focus_components, + TimeOfFlightLookupTable: tof_lookup_table, } pipeline = Pipeline(ki_providers, params=params) - primary = pipeline.get(PrimarySpectrometerObject).compute() - pipeline[PrimarySpectrometerObject] = primary - params[PrimarySpectrometerObject] = primary + # TODO remove? + # primary = pipeline.get(PrimarySpectrometerObject).compute() + # pipeline[PrimarySpectrometerObject] = primary + # params[PrimarySpectrometerObject] = primary - events = sample_events.copy() - events.bins.coords['frame_time'] = pipeline.get(SampleTime).compute() - return params, events, primary + events = pipeline.compute(TofSampleEvents) + events = events.bins.drop_coords(('event_time_zero', 'event_time_offset')) + return params, events, None # primary def get_normalization_monitor(monitors, monitor_component, collapse: bool = False): @@ -394,11 +408,13 @@ def get_normalization_monitor(monitors, monitor_component, collapse: bool = Fals ) -def get_energy_axes(ki_params, kf_params): +def add_energy_coordinates(sample_events, ki_params, kf_params): """Extract incident_energy, final_energy, and energy_transfer Parameters ---------- + sample_events: + Events with time of flight to the sample. ki_params: A dictionary of parameters needed by the incident-spectrometer sciline pipeline kf_params: @@ -406,21 +422,18 @@ def get_energy_axes(ki_params, kf_params): Returns ------- - ei: - The incident energy - en: - The energy transfer - ef: - The final energy + : + ``sample_events`` with added 'incident_energy', 'final_energy', and + 'energy_transfer' coordinates. """ from sciline import Pipeline + from scippneutron.conversion.tof import energy_from_tof from ..types import ( EnergyTransfer, FinalEnergy, FinalWavenumber, IncidentEnergy, - IncidentWavenumber, ) from .conservation import providers @@ -428,12 +441,28 @@ def get_energy_axes(ki_params, kf_params): params.update(ki_params) params.update(kf_params) pipeline = Pipeline(providers, params=params) - pipeline[IncidentWavenumber] = pipeline.get(IncidentWavenumber).compute() pipeline[FinalWavenumber] = pipeline.get(FinalWavenumber).compute() - ei = pipeline.get(IncidentEnergy).compute() - en = pipeline.get(EnergyTransfer).compute() - ef = pipeline.get(FinalEnergy).compute() - return ei, en, ef + + incident_graph = { + 'incident_energy': lambda sample_tof, L1: energy_from_tof( + tof=sample_tof, Ltotal=L1 + ), + # TODO remove once L1 is precomputed + 'L1': lambda: pipeline.compute(SourceSamplePathLength), + } + events_with_energy_axes = sample_events.transform_coords( + 'incident_energy', + graph=incident_graph, + keep_inputs=False, + keep_intermediate=False, + ) + pipeline[IncidentEnergy] = events_with_energy_axes.bins.coords['incident_energy'] + energies = pipeline.compute((EnergyTransfer, FinalEnergy)) + events_with_energy_axes.bins.coords['energy_transfer'] = energies[ + EnergyTransfer + ].to(unit='meV') + events_with_energy_axes.coords['final_energy'] = energies[FinalEnergy] + return events_with_energy_axes def add_momentum_axes(ki_params, kf_params, events, a3: Variable): @@ -762,24 +791,33 @@ def load_everything(filename: Filename): def one_setting( - sample, triplet_events, analyzers, norm_monitor, filename, names, warn_about_a3=True + sample, + triplet_events, + analyzers, + norm_monitor, + filename, + names, + tof_lookup_table, + warn_about_a3=True, ): """Calculate the event properties for a single (a3, a4) setting""" detector_positions = triplet_events.coords['position'] kf_params, sample_detector_flight_time = find_sample_detector_flight_time( sample, analyzers, detector_positions ) - events = get_sample_events(triplet_events, sample_detector_flight_time) - ki_params, unwrapped_events, primary = get_unwrapped_events( - filename, names['source'], names['sample'], events, names['focus'] + sample_events = get_sample_events(triplet_events, sample_detector_flight_time) + ki_params, unwrapped_sample_events, primary = get_unwrapped_sample_events( + filename, + names['source'], + names['sample'], + sample_events, + names['focus'], + tof_lookup_table, ) - ei, en, ef = get_energy_axes(ki_params, kf_params) - - events.bins.coords['energy_transfer'] = en.to(unit='meV') - events.bins.coords['incident_energy'] = ei - events.coords['final_energy'] = ef - - events.coords['theta'] = get_geometric_a4(kf_params) + unwrapped_sample_events = add_energy_coordinates( + unwrapped_sample_events, ki_params, kf_params + ) + unwrapped_sample_events.coords['theta'] = get_geometric_a4(kf_params) if 'a3' in triplet_events.coords: # this _should_ be one (a3, a4) setting, @@ -792,19 +830,27 @@ def one_setting( logger.warning("No a3 present in setting, assuming 0 a3") a3 = scalar(0, unit='deg') - events = add_momentum_axes(ki_params, kf_params, events, a3) - - # Set up the normalisation by adding a 'incident_wavelength' coordinate to - # the individual events and the normalisation monitor - events, monitor = add_wavelength_axes( - ki_params, kf_params, events, norm_monitor, names['monitor'] + # events = add_momentum_axes(ki_params, kf_params, events, a3) + # + # # Set up the normalisation by adding a 'incident_wavelength' coordinate to + # # the individual events and the normalisation monitor + # events, monitor = add_wavelength_axes( + # ki_params, kf_params, events, norm_monitor, names['monitor'] + # ) + a4 = triplet_events.coords['a4'] + unwrapped_sample_events.save_hdf5( + f"data/new/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5" ) + # events.save_hdf5(f"data/reference/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5") + raise RuntimeError("abort") - norm_events = normalise_wavelength_events(ki_params, kf_params, events, monitor) + norm_events = normalise_wavelength_events( + ki_params, kf_params, sample_events, monitor + ) return { 'triplet_events': triplet_events, - 'events': events, + 'events': sample_events, 'norm_monitor': norm_monitor, 'sample_detector_flight_time': sample_detector_flight_time, 'analyzers': analyzers, @@ -851,7 +897,7 @@ def load_precompute( if is_simulated: for name in triplets: - triplets[name] = convert_simulated_time_to_frame_time(triplets[name]) + triplets[name] = convert_simulated_time_to_event_time_offset(triplets[name]) analyzers = combine_analyzers(analyzers, triplets) # detectors = combine_detectors(triplets) @@ -919,6 +965,7 @@ def component_names( def bifrost( filename: Filename, + tof_lookup_table: TimeOfFlightLookupTable, source_component: str | None = None, sample_component: str | None = None, focus_components: list[str] | None = None, @@ -978,6 +1025,7 @@ def bifrost( one_monitor, filename, named_components, + tof_lookup_table=tof_lookup_table, ) for one_triplet_events, one_analyzers, one_monitor in tqdm( settings, desc='(a3, a4) settings' @@ -988,6 +1036,7 @@ def bifrost( def bifrost_single( filename: Filename, + tof_lookup_table: TimeOfFlightLookupTable, source_component: str | None = None, sample_component: str | None = None, focus_components: list[str] | None = None, @@ -1047,6 +1096,7 @@ def bifrost_single( norm_monitor, filename, named_components, + tof_lookup_table=tof_lookup_table, warn_about_a3=False, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 018058456..28d60d95c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -6,6 +6,7 @@ import scipp as sc from choppera.primary import PrimarySpectrometer +from ess.reduce import time_of_flight from ess.reduce.nexus import types as reduce_t @@ -147,3 +148,7 @@ class InstrumentAngles( NXspeFileName = NewType('NXspeFileName', str) NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) + +SampleEvents = NewType('Sampleevents', sc.DataArray) +TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable +TofSampleEvents = NewType('TofSampleEvents', sc.DataArray) From df4978497545b115bc6c8833aa01e7563c54d507 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 10 Mar 2025 16:30:58 +0100 Subject: [PATCH 090/330] Start computing wavelength from tof --- .../src/ess/spectroscopy/indirect/ki.py | 3 +- .../src/ess/spectroscopy/indirect/workflow.py | 60 +++++++++++++------ 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 31b0d33ed..08de89e77 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -393,7 +393,6 @@ def incident_sloth( return range_normalized(slowness, sc.min(min_max), sc.max(min_max)) -# TODO remove def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: """Calculate the incident wavelength from the incident slowness for each neutron""" from scipp.constants import Planck, neutron_mass @@ -447,7 +446,7 @@ def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: incident_direction, # incident_slowness, # TODO # incident_sloth, - # incident_wavelength, + incident_wavelength, # incident_wavenumber, # incident_wavevector, # incident_energy, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 5d410a2ba..ae5cda286 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -453,7 +453,6 @@ def add_energy_coordinates(sample_events, ki_params, kf_params): events_with_energy_axes = sample_events.transform_coords( 'incident_energy', graph=incident_graph, - keep_inputs=False, keep_intermediate=False, ) pipeline[IncidentEnergy] = events_with_energy_axes.bins.coords['incident_energy'] @@ -465,7 +464,7 @@ def add_energy_coordinates(sample_events, ki_params, kf_params): return events_with_energy_axes -def add_momentum_axes(ki_params, kf_params, events, a3: Variable): +def add_momentum_coordinates(ki_params, kf_params, events, a3: Variable): """Extract momentum transfer in the lab and sample-table coordinate systems Parameters @@ -526,7 +525,7 @@ def add_momentum_axes(ki_params, kf_params, events, a3: Variable): return events -def add_wavelength_axes(ki_params, kf_params, events, monitor, monitor_name): +def add_wavelength_coordinate(ki_params, kf_params, events, monitor, monitor_name): """Convert to incident wavelength per event and independent monitor axis Parameters @@ -554,6 +553,8 @@ def add_wavelength_axes(ki_params, kf_params, events, monitor, monitor_name): And the monitor with 'incident_wavelength' coordinate. """ from sciline import Pipeline + from scippneutron.conversion.graph import beamline + from scippneutron.conversion.tof import wavelength_from_tof from ..types import ( FrameTimeMonitor, @@ -566,16 +567,36 @@ def add_wavelength_axes(ki_params, kf_params, events, monitor, monitor_name): from .ki import providers as ki_providers from .normalisation import providers as monitor_providers - params = { - MonitorName: monitor_name, - FrameTimeMonitor: monitor, + # TODO unwrap tof for monitor using LUT and remove existing WavelengthMonitor computation + pipeline = Pipeline(ki_providers, params=ki_params) + + incident_graph = { + 'incident_wavelength': wavelength_from_tof, + # TODO remove once L1 is precomputed + 'L1': lambda: pipeline.compute(SourceSamplePathLength), + 'Ltotal': 'L1', # using sample times + 'tof': 'sample_tof', } - params.update(ki_params) - params.update(kf_params) - pipeline = Pipeline(monitor_providers + ki_providers + kf_providers, params=params) - wavelength_monitor = pipeline.compute(WavelengthMonitor) - events.bins.coords['incident_wavelength'] = pipeline.compute(IncidentWavelength) - return events, wavelength_monitor + events_with_wavelength = events.transform_coords( + 'incident_wavelength', + graph=incident_graph, + keep_inputs=False, + keep_intermediate=False, + keep_aliases=False, + ) + + monitor_graph = { + **beamline.beamline(scatter=False), + 'incident_wavelength': wavelength_from_tof, + } + wavelength_monitor = monitor.transform_coords( + 'incident_wavelength', + graph=monitor_graph, + keep_intermediate=False, + keep_aliases=False, + ) + + return events_with_wavelength, wavelength_monitor def get_geometric_a4(kf_params): @@ -830,18 +851,19 @@ def one_setting( logger.warning("No a3 present in setting, assuming 0 a3") a3 = scalar(0, unit='deg') - # events = add_momentum_axes(ki_params, kf_params, events, a3) - # - # # Set up the normalisation by adding a 'incident_wavelength' coordinate to - # # the individual events and the normalisation monitor - # events, monitor = add_wavelength_axes( - # ki_params, kf_params, events, norm_monitor, names['monitor'] + # unwrapped_sample_events = add_momentum_coordinates( + # ki_params, kf_params, unwrapped_sample_events, a3 # ) + + # Set up the normalisation by adding an 'incident_wavelength' coordinate to + # the individual events and the normalisation monitor + unwrapped_sample_events, monitor = add_wavelength_coordinate( + ki_params, kf_params, unwrapped_sample_events, norm_monitor, names['monitor'] + ) a4 = triplet_events.coords['a4'] unwrapped_sample_events.save_hdf5( f"data/new/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5" ) - # events.save_hdf5(f"data/reference/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5") raise RuntimeError("abort") norm_events = normalise_wavelength_events( From e9a34c1c7325b3f365086f2988896dcee82a0b42 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 11 Mar 2025 14:55:17 +0100 Subject: [PATCH 091/330] Unwrap monitor time --- .../spectroscopy/indirect/normalisation.py | 25 ++++++++++ .../src/ess/spectroscopy/indirect/workflow.py | 48 ++++++++++++++++++- .../src/ess/spectroscopy/types.py | 2 + 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index c7d394e00..c640a409c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -1,8 +1,11 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +import sciline from scipp import DataArray +from ess.reduce import time_of_flight + from ..types import ( Filename, FrameTimeMonitor, @@ -20,6 +23,8 @@ SourceMonitorFlightTime, SourceMonitorPathLength, SourcePosition, + TimeOfFlightLookupTable, + TofMonitor, WallTimeMonitor, WavelengthBins, WavelengthEvents, @@ -285,7 +290,26 @@ def normalise( return binned +def unwrap_monitor( + monitor: FrameTimeMonitor, + table: TimeOfFlightLookupTable, + length: SourceMonitorPathLength, +) -> TofMonitor: + tof_wf = sciline.Pipeline( + (*time_of_flight.providers(), time_of_flight.resample_tof_data), + params={ + **time_of_flight.default_parameters(), + time_of_flight.TimeOfFlightLookupTable: table, + time_of_flight.Ltotal: length, + time_of_flight.RawData: monitor.rename(frame_time='tof'), + }, + ) + unwrapped = tof_wf.compute(time_of_flight.ResampledTofData) + return TofMonitor(unwrapped) + + providers = ( + # TODO remove monitor-related functions incident_monitor_normalization, monitor_pivot_time, monitor_wall_time, @@ -295,4 +319,5 @@ def normalise( monitor_position, source_monitor_path_length, normalise, + unwrap_monitor, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index ae5cda286..c6c124286 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -375,6 +375,40 @@ def get_unwrapped_sample_events( return params, events, None # primary +def get_unwrapped_monitor( + filename, monitor: sc.DataArray, source_name, tof_lookup_table +) -> sc.DataArray: + from sciline import Pipeline + + from ..types import ( + Filename, + FrameTimeMonitor, + MonitorPosition, + SourceDelay, + SourceDuration, + SourceFrequency, + SourceName, + SourceVelocities, + TofMonitor, + ) + from .ki import source_position + from .normalisation import providers + + params = { + Filename: filename, + FrameTimeMonitor: monitor, + MonitorPosition: monitor.coords['position'], + SourceName: source_name, + SourceDelay: ess_source_delay(), + SourceDuration: ess_source_duration(), + SourceFrequency: ess_source_frequency(), + SourceVelocities: ess_source_velocities(), + TimeOfFlightLookupTable: tof_lookup_table, + } + pipeline = Pipeline((*providers, source_position), params=params) + return pipeline.compute(TofMonitor) + + def get_normalization_monitor(monitors, monitor_component, collapse: bool = False): """Get the data of the named monitor component, converting frame_time to nanoseconds to match event_time_offset @@ -835,6 +869,14 @@ def one_setting( names['focus'], tof_lookup_table, ) + + unwrapped_norm_monitor = get_unwrapped_monitor( + filename, + norm_monitor, + names['source'], + tof_lookup_table, + ) + unwrapped_sample_events = add_energy_coordinates( unwrapped_sample_events, ki_params, kf_params ) @@ -858,7 +900,11 @@ def one_setting( # Set up the normalisation by adding an 'incident_wavelength' coordinate to # the individual events and the normalisation monitor unwrapped_sample_events, monitor = add_wavelength_coordinate( - ki_params, kf_params, unwrapped_sample_events, norm_monitor, names['monitor'] + ki_params, + kf_params, + unwrapped_sample_events, + unwrapped_norm_monitor, + names['monitor'], ) a4 = triplet_events.coords['a4'] unwrapped_sample_events.save_hdf5( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 28d60d95c..9a10512c4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -152,3 +152,5 @@ class InstrumentAngles( SampleEvents = NewType('Sampleevents', sc.DataArray) TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable TofSampleEvents = NewType('TofSampleEvents', sc.DataArray) + +TofMonitor = NewType('TofMonitor', sc.DataArray) From ff4168cd6493303aac10f2e8bb9ce97df400dcec Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 09:34:37 +0100 Subject: [PATCH 092/330] Compute momentum transfer --- .../src/ess/spectroscopy/indirect/ki.py | 3 +- .../src/ess/spectroscopy/indirect/workflow.py | 70 +++++++++++-------- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 08de89e77..31b0d33ed 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -393,6 +393,7 @@ def incident_sloth( return range_normalized(slowness, sc.min(min_max), sc.max(min_max)) +# TODO remove def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: """Calculate the incident wavelength from the incident slowness for each neutron""" from scipp.constants import Planck, neutron_mass @@ -446,7 +447,7 @@ def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: incident_direction, # incident_slowness, # TODO # incident_sloth, - incident_wavelength, + # incident_wavelength, # incident_wavenumber, # incident_wavevector, # incident_energy, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index c6c124286..23cfb0734 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -524,15 +524,16 @@ def add_momentum_coordinates(ki_params, kf_params, events, a3: Variable): from sciline import Pipeline from ..types import ( - LabMomentumTransfer, - LabMomentumTransferX, - LabMomentumTransferZ, + FinalWavevector, + IncidentDirection, SampleTableAngle, - TableMomentumTransfer, - TableMomentumTransferX, - TableMomentumTransferZ, ) - from .conservation import providers + from .conservation import ( + PARALLEL, + PERP, + providers, + sample_table_momentum_vector, + ) if a3.size != 1: raise ValueError(f'Expected a3 to have 1-entry, not {a3.size}') @@ -544,19 +545,36 @@ def add_momentum_coordinates(ki_params, kf_params, events, a3: Variable): params[SampleTableAngle] = a3 pipeline = Pipeline(providers, params=params) - pipeline[LabMomentumTransfer] = pipeline.get(LabMomentumTransfer).compute() + intermediates = pipeline.compute((IncidentDirection, FinalWavevector)) + incident_direction = intermediates[IncidentDirection] + final_wavevector = intermediates[FinalWavevector] - events.bins.coords['lab_momentum_x'] = pipeline.get(LabMomentumTransferX).compute() - events.bins.coords['lab_momentum_z'] = pipeline.get(LabMomentumTransferZ).compute() + def compute_lab_momentum_transfer(incident_wavelength: sc.Variable) -> sc.Variable: + return final_wavevector - 2 * np.pi * incident_direction / incident_wavelength - pipeline[TableMomentumTransfer] = pipeline.get(TableMomentumTransfer).compute() - events.bins.coords['table_momentum_x'] = ( - pipeline.get(TableMomentumTransferX).compute().transpose(events.dims) - ) - events.bins.coords['table_momentum_z'] = ( - pipeline.get(TableMomentumTransferZ).compute().transpose(events.dims) + graph = { + 'lab_momentum_transfer': compute_lab_momentum_transfer, + 'lab_momentum_x': lambda lab_momentum_transfer: sc.dot( + PERP, lab_momentum_transfer + ), + 'lab_momentum_z': lambda lab_momentum_transfer: sc.dot( + PARALLEL, lab_momentum_transfer + ), + 'table_momentum_transfer': lambda lab_momentum_transfer: sample_table_momentum_vector( + a3, lab_momentum_transfer + ), + 'table_momentum_x': lambda table_momentum_transfer: sc.dot( + PERP, table_momentum_transfer + ), + 'table_momentum_z': lambda table_momentum_transfer: sc.dot( + PARALLEL, table_momentum_transfer + ), + } + return events.transform_coords( + ('lab_momentum_x', 'lab_momentum_z', 'table_momentum_x', 'table_momentum_z'), + graph=graph, + keep_intermediate=False, ) - return events def add_wavelength_coordinate(ki_params, kf_params, events, monitor, monitor_name): @@ -590,18 +608,8 @@ def add_wavelength_coordinate(ki_params, kf_params, events, monitor, monitor_nam from scippneutron.conversion.graph import beamline from scippneutron.conversion.tof import wavelength_from_tof - from ..types import ( - FrameTimeMonitor, - # SlownessMonitor, - IncidentWavelength, - MonitorName, - WavelengthMonitor, - ) - from .kf import providers as kf_providers from .ki import providers as ki_providers - from .normalisation import providers as monitor_providers - # TODO unwrap tof for monitor using LUT and remove existing WavelengthMonitor computation pipeline = Pipeline(ki_providers, params=ki_params) incident_graph = { @@ -893,10 +901,6 @@ def one_setting( logger.warning("No a3 present in setting, assuming 0 a3") a3 = scalar(0, unit='deg') - # unwrapped_sample_events = add_momentum_coordinates( - # ki_params, kf_params, unwrapped_sample_events, a3 - # ) - # Set up the normalisation by adding an 'incident_wavelength' coordinate to # the individual events and the normalisation monitor unwrapped_sample_events, monitor = add_wavelength_coordinate( @@ -906,6 +910,10 @@ def one_setting( unwrapped_norm_monitor, names['monitor'], ) + unwrapped_sample_events = add_momentum_coordinates( + ki_params, kf_params, unwrapped_sample_events, a3 + ) + a4 = triplet_events.coords['a4'] unwrapped_sample_events.save_hdf5( f"data/new/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5" From a2eadd2de715f45c2df74314add3d526c5e3314f Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 10:30:07 +0100 Subject: [PATCH 093/330] Pass unwrapped events to normalization function --- .../src/ess/spectroscopy/indirect/workflow.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 23cfb0734..461c66de7 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -914,19 +914,18 @@ def one_setting( ki_params, kf_params, unwrapped_sample_events, a3 ) + norm_events = normalise_wavelength_events( + ki_params, kf_params, unwrapped_sample_events, monitor + ) + a4 = triplet_events.coords['a4'] unwrapped_sample_events.save_hdf5( f"data/new/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5" ) - raise RuntimeError("abort") - - norm_events = normalise_wavelength_events( - ki_params, kf_params, sample_events, monitor - ) return { 'triplet_events': triplet_events, - 'events': sample_events, + 'events': unwrapped_sample_events, 'norm_monitor': norm_monitor, 'sample_detector_flight_time': sample_detector_flight_time, 'analyzers': analyzers, From 3fafb71678b7a9ee571e208ed70aaf8734a90aa8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 10:43:39 +0100 Subject: [PATCH 094/330] Add notebook to compute tof table --- .../tools/bifrost-make-tof-lookup-table.ipynb | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb diff --git a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb new file mode 100644 index 000000000..bdcda3bed --- /dev/null +++ b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb @@ -0,0 +1,210 @@ +{ + "cells": [ + { + "metadata": {}, + "cell_type": "markdown", + "source": "# Create a time-of-flight lookup table for BIFROST", + "id": "27e8c3bb0ec1c3e7" + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "from ess.reduce import time_of_flight\n", + "import sciline\n", + "import scipp as sc\n", + "from scippneutron.chopper import DiskChopper\n", + "from ess.spectroscopy.indirect.workflow import load_everything\n", + "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon" + ], + "id": "a1d9f191c6591dc1", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Load data", + "id": "cfe5a99d73c3ddf8" + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "input_filename = simulated_elastic_incoherent_with_phonon()\n", + "sample, triplets, _, raw_choppers, monitors, _ = load_everything(input_filename)" + ], + "id": "4f97b015b4223693", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "source_position = next(iter(triplets.values())).coords['source_position']\n", + "sample_position = sample['position']" + ], + "id": "36d2823679d3b364", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Process choppers", + "id": "5ba2d3ee26e1bbc9" + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "def parse_choppers(raw_choppers, source_position):\n", + " choppers = sc.DataGroup()\n", + " for name, chopper in raw_choppers.items():\n", + " processed = chopper.copy()\n", + " # These are constant in the simulated data.\n", + " processed['rotation_speed'] = processed['rotation_speed'].data.mean()\n", + " processed['phase'] = processed['phase'].data.mean()\n", + " # Guessing here as this is not stored in the file.\n", + " processed['beam_position'] = sc.scalar(0.0, unit='deg')\n", + " # ess.reduce.time_of_flight.simulate_beamline requires the\n", + " # positions to be relative to the source.\n", + " processed['position'] = chopper['position'] - source_position\n", + " choppers[name] = DiskChopper.from_nexus(processed)\n", + " return choppers" + ], + "id": "1a4b39813c5e42bf", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": "choppers = parse_choppers(raw_choppers, source_position)", + "id": "ba75aa5f37de788a", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Setting up the workflow", + "id": "6d4fcd7f9e6dd0ee" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "The table needs to cover the range of distances for both sample and monitor.\n", + "Here, the shifts of 0.1m are arbitrarily chosen to make sure the table covers `l1` and `l_monitor`.\n", + "We could probably save space by making 2 smaller tables for narrow ranges around `l1` and `l_monitor`, respectively." + ], + "id": "d7f394d7190beb5c" + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "norm_monitor = monitors['110_frame_3']\n", + "l_monitor = sc.norm(source_position - norm_monitor.coords['position'])\n", + "l1 = sc.norm(source_position - sample_position)\n", + "l_min = l_monitor - sc.scalar(0.1, unit='m')\n", + "l_max = l1 + sc.scalar(0.1, unit='m')" + ], + "id": "c5abcaeda08be071", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "simulation_results = time_of_flight.simulate_beamline(\n", + " choppers=choppers, neutrons=5_000_000\n", + ")" + ], + "id": "afbad3941fc86505", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "wf = sciline.Pipeline(\n", + " time_of_flight.providers(),\n", + " params={\n", + " **time_of_flight.default_parameters(),\n", + " time_of_flight.LtotalRange: (l_min, l_max),\n", + " time_of_flight.SimulationResults: simulation_results,\n", + " time_of_flight.DistanceResolution: sc.scalar(0.1, unit='m'),\n", + " },\n", + ")" + ], + "id": "31ab97976486dcf4", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Compute the table", + "id": "a1ddd3a8beb8cffb" + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "table = wf.compute(time_of_flight.TimeOfFlightLookupTable)\n", + "table" + ], + "id": "6cb6cbcf17da6a8", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": "table.squeeze().plot()", + "id": "abdf5132aada2a95", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Save to file", + "id": "b8eecb5535b4fbdb" + }, + { + "metadata": {}, + "cell_type": "code", + "source": "table.save_hdf5('BIFROST-simulation-tof-lookup-table.h5')", + "id": "574759a738312e1", + "outputs": [], + "execution_count": null + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 7c9182cf16f7f7a68a14d44ea8d3c817e2f1f856 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 10:51:38 +0100 Subject: [PATCH 095/330] Add tof table to data --- packages/essspectroscopy/src/ess/bifrost/data.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 884e16382..9c8d07b0a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -18,6 +18,7 @@ def _make_pooch(): version=_version, registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", + "BIFROST-simulation-tof-lookup-table.h5": "md5:9469b7b8c50463b1110bfbdffa2989d5", }, ) @@ -38,3 +39,8 @@ def get_path(name: str) -> str: def simulated_elastic_incoherent_with_phonon() -> str: """Simulated data for elastic incoherent scattering including a phonon.""" return get_path("BIFROST_20240914T053723.h5") + + +def tof_lookup_table_simulation() -> str: + """Time-of-flight lookup table for the simulated BIFROST data.""" + return get_path("BIFROST-simulation-tof-lookup-table.h5") From fcdc253ac7693e23af7e47c18dc98e9adf9c299c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 14:03:54 +0100 Subject: [PATCH 096/330] Remove file saving for debugging --- .../src/ess/spectroscopy/indirect/workflow.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 461c66de7..90ae49240 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -918,11 +918,6 @@ def one_setting( ki_params, kf_params, unwrapped_sample_events, monitor ) - a4 = triplet_events.coords['a4'] - unwrapped_sample_events.save_hdf5( - f"data/new/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5" - ) - return { 'triplet_events': triplet_events, 'events': unwrapped_sample_events, From 1ad357810fba3a403804c3dc305bfd00f57788fd Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 14:09:18 +0100 Subject: [PATCH 097/330] Add skeleton for user guide --- packages/essspectroscopy/docs/index.md | 1 + .../bifrost/bifrost-reduction.ipynb | 73 ++++++++ .../docs/user-guide/bifrost/index.md | 9 + .../essspectroscopy/docs/user-guide/index.md | 9 + .../docs/user-guide/installation.md | 16 ++ .../tools/bifrost-make-tof-lookup-table.ipynb | 164 ++++++++++-------- 6 files changed, 199 insertions(+), 73 deletions(-) create mode 100644 packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb create mode 100644 packages/essspectroscopy/docs/user-guide/bifrost/index.md create mode 100644 packages/essspectroscopy/docs/user-guide/index.md create mode 100644 packages/essspectroscopy/docs/user-guide/installation.md diff --git a/packages/essspectroscopy/docs/index.md b/packages/essspectroscopy/docs/index.md index 15605d644..4a8b112a5 100644 --- a/packages/essspectroscopy/docs/index.md +++ b/packages/essspectroscopy/docs/index.md @@ -10,6 +10,7 @@ hidden: --- +user-guide/index api-reference/index developer/index about/index diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb new file mode 100644 index 000000000..585de3848 --- /dev/null +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -0,0 +1,73 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# BIFROST reduction of simulated data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import scipp as sc\n", + "\n", + "from ess.bifrost.data import (\n", + " # simulated_elastic_incoherent_with_phonon,\n", + " tof_lookup_table_simulation,\n", + ")\n", + "# from ess.spectroscopy.indirect.workflow import bifrost" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "tof_lookup_table = sc.io.load_hdf5(tof_lookup_table_simulation())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "# reduced = bifrost(\n", + "# simulated_elastic_incoherent_with_phonon(),\n", + "# tof_lookup_table=tof_lookup_table,\n", + "# is_simulated=True,\n", + "# )" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/index.md b/packages/essspectroscopy/docs/user-guide/bifrost/index.md new file mode 100644 index 000000000..ff3d9855e --- /dev/null +++ b/packages/essspectroscopy/docs/user-guide/bifrost/index.md @@ -0,0 +1,9 @@ +# BIFROST + +```{toctree} +--- +maxdepth: 1 +--- + +bifrost-reduction +``` diff --git a/packages/essspectroscopy/docs/user-guide/index.md b/packages/essspectroscopy/docs/user-guide/index.md new file mode 100644 index 000000000..bf1746fe2 --- /dev/null +++ b/packages/essspectroscopy/docs/user-guide/index.md @@ -0,0 +1,9 @@ +# User guide + +```{toctree} +--- +maxdepth: 1 +--- +installation +bifrost/index +``` diff --git a/packages/essspectroscopy/docs/user-guide/installation.md b/packages/essspectroscopy/docs/user-guide/installation.md new file mode 100644 index 000000000..f448732d0 --- /dev/null +++ b/packages/essspectroscopy/docs/user-guide/installation.md @@ -0,0 +1,16 @@ +# Installation + +To install ESSspectroscopy and all of its dependencies, use + +`````{tab-set} +````{tab-item} pip +```sh +pip install essspectroscopy +``` +```` +````{tab-item} conda +```sh +conda install -c conda-forge -c scipp essspectroscopy +``` +```` +````` diff --git a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb index bdcda3bed..1f4111983 100644 --- a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb @@ -1,14 +1,19 @@ { "cells": [ { - "metadata": {}, "cell_type": "markdown", - "source": "# Create a time-of-flight lookup table for BIFROST", - "id": "27e8c3bb0ec1c3e7" + "id": "0", + "metadata": {}, + "source": [ + "# Create a time-of-flight lookup table for BIFROST" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], "source": [ "from ess.reduce import time_of_flight\n", "import sciline\n", @@ -16,48 +21,52 @@ "from scippneutron.chopper import DiskChopper\n", "from ess.spectroscopy.indirect.workflow import load_everything\n", "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon" - ], - "id": "a1d9f191c6591dc1", - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "## Load data", - "id": "cfe5a99d73c3ddf8" + "id": "2", + "metadata": {}, + "source": [ + "## Load data" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], "source": [ "input_filename = simulated_elastic_incoherent_with_phonon()\n", "sample, triplets, _, raw_choppers, monitors, _ = load_everything(input_filename)" - ], - "id": "4f97b015b4223693", - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], "source": [ "source_position = next(iter(triplets.values())).coords['source_position']\n", "sample_position = sample['position']" - ], - "id": "36d2823679d3b364", - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "## Process choppers", - "id": "5ba2d3ee26e1bbc9" + "id": "5", + "metadata": {}, + "source": [ + "## Process choppers" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], "source": [ "def parse_choppers(raw_choppers, source_position):\n", " choppers = sc.DataGroup()\n", @@ -73,64 +82,68 @@ " processed['position'] = chopper['position'] - source_position\n", " choppers[name] = DiskChopper.from_nexus(processed)\n", " return choppers" - ], - "id": "1a4b39813c5e42bf", - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", - "source": "choppers = parse_choppers(raw_choppers, source_position)", - "id": "ba75aa5f37de788a", + "execution_count": null, + "id": "7", + "metadata": {}, "outputs": [], - "execution_count": null + "source": [ + "choppers = parse_choppers(raw_choppers, source_position)" + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "## Setting up the workflow", - "id": "6d4fcd7f9e6dd0ee" + "id": "8", + "metadata": {}, + "source": [ + "## Setting up the workflow" + ] }, { - "metadata": {}, "cell_type": "markdown", + "id": "9", + "metadata": {}, "source": [ "The table needs to cover the range of distances for both sample and monitor.\n", "Here, the shifts of 0.1m are arbitrarily chosen to make sure the table covers `l1` and `l_monitor`.\n", "We could probably save space by making 2 smaller tables for narrow ranges around `l1` and `l_monitor`, respectively." - ], - "id": "d7f394d7190beb5c" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], "source": [ "norm_monitor = monitors['110_frame_3']\n", "l_monitor = sc.norm(source_position - norm_monitor.coords['position'])\n", "l1 = sc.norm(source_position - sample_position)\n", "l_min = l_monitor - sc.scalar(0.1, unit='m')\n", "l_max = l1 + sc.scalar(0.1, unit='m')" - ], - "id": "c5abcaeda08be071", - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], "source": [ "simulation_results = time_of_flight.simulate_beamline(\n", " choppers=choppers, neutrons=5_000_000\n", ")" - ], - "id": "afbad3941fc86505", - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], "source": [ "wf = sciline.Pipeline(\n", " time_of_flight.providers(),\n", @@ -141,49 +154,54 @@ " time_of_flight.DistanceResolution: sc.scalar(0.1, unit='m'),\n", " },\n", ")" - ], - "id": "31ab97976486dcf4", - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "## Compute the table", - "id": "a1ddd3a8beb8cffb" + "id": "13", + "metadata": {}, + "source": [ + "## Compute the table" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], "source": [ "table = wf.compute(time_of_flight.TimeOfFlightLookupTable)\n", "table" - ], - "id": "6cb6cbcf17da6a8", - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", - "source": "table.squeeze().plot()", - "id": "abdf5132aada2a95", + "execution_count": null, + "id": "15", + "metadata": {}, "outputs": [], - "execution_count": null + "source": [ + "table.squeeze().plot()" + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "## Save to file", - "id": "b8eecb5535b4fbdb" + "id": "16", + "metadata": {}, + "source": [ + "## Save to file" + ] }, { - "metadata": {}, "cell_type": "code", - "source": "table.save_hdf5('BIFROST-simulation-tof-lookup-table.h5')", - "id": "574759a738312e1", + "execution_count": null, + "id": "17", + "metadata": {}, "outputs": [], - "execution_count": null + "source": [ + "table.save_hdf5('BIFROST-simulation-tof-lookup-table.h5')" + ] } ], "metadata": { From eddaf7449d45f27e69a11d599f1ea7032a872db1 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 14:11:04 +0100 Subject: [PATCH 098/330] Clean up --- .../ess/spectroscopy/indirect/conservation.py | 2 -- .../src/ess/spectroscopy/indirect/workflow.py | 21 +++++++------------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index b633afb46..631894acc 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -6,10 +6,8 @@ from ..types import ( EnergyTransfer, FinalEnergy, - FinalWavenumber, FinalWavevector, IncidentEnergy, - IncidentWavenumber, IncidentWavevector, LabMomentumTransfer, LabMomentumTransferX, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 90ae49240..5c40337a9 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -11,8 +11,6 @@ from loguru import logger from scipp import Variable -from ess.reduce import time_of_flight - from ..types import ( Analyzers, Choppers, @@ -268,7 +266,6 @@ def extract(obj): def find_sample_detector_flight_time(sample, analyzers, detector_positions): """Use sciline to find the sample to detector flight time per detector pixel""" - import numpy as np from sciline import Pipeline from ..types import ( @@ -342,7 +339,6 @@ def get_unwrapped_sample_events( from ..types import ( Filename, FocusComponentNames, - PrimarySpectrometerObject, SampleName, SourceDelay, SourceDuration, @@ -560,7 +556,7 @@ def compute_lab_momentum_transfer(incident_wavelength: sc.Variable) -> sc.Variab 'lab_momentum_z': lambda lab_momentum_transfer: sc.dot( PARALLEL, lab_momentum_transfer ), - 'table_momentum_transfer': lambda lab_momentum_transfer: sample_table_momentum_vector( + 'table_momentum_transfer': lambda lab_momentum_transfer: sample_table_momentum_vector( # noqa: E501 a3, lab_momentum_transfer ), 'table_momentum_x': lambda table_momentum_transfer: sc.dot( @@ -577,15 +573,13 @@ def compute_lab_momentum_transfer(incident_wavelength: sc.Variable) -> sc.Variab ) -def add_wavelength_coordinate(ki_params, kf_params, events, monitor, monitor_name): +def add_wavelength_coordinate(ki_params, events, monitor): """Convert to incident wavelength per event and independent monitor axis Parameters ---------- ki_params: A dictionary of parameters needed by the incident-spectrometer sciline pipeline - kf_params: - A dictionary of parameters needed by the secondary-spectrometer sciline pipeline events: Event data, presumably with per-event incident energy (or wavelength, or inverse velocity == slowness) already calculated; the basis for the returned @@ -594,9 +588,6 @@ def add_wavelength_coordinate(ki_params, kf_params, events, monitor, monitor_nam A beam monitor with one independent axis (time since last pulse as measured). The monitor intensity is expected to be a histogram along the one independent axis, but event monitor data should work as well. - monitor_name: - The name of the provided beam monitor, used to get its position in the - primary spectrometer Returns ------- @@ -905,10 +896,8 @@ def one_setting( # the individual events and the normalisation monitor unwrapped_sample_events, monitor = add_wavelength_coordinate( ki_params, - kf_params, unwrapped_sample_events, unwrapped_norm_monitor, - names['monitor'], ) unwrapped_sample_events = add_momentum_coordinates( ki_params, kf_params, unwrapped_sample_events, a3 @@ -1049,6 +1038,9 @@ def bifrost( ---------- filename: The name of the NeXus file to load + tof_lookup_table: + Time-of-flight lookup table as produced by + `ESSreduce `_. source_component: The group name under 'entry/instrument' in the NeXus file containing source information @@ -1121,6 +1113,9 @@ def bifrost_single( ---------- filename: The name of the NeXus file to load + tof_lookup_table: + Time-of-flight lookup table as produced by + `ESSreduce `_. source_component: The group name under 'entry/instrument' in the NeXus file containing source information From 78ad50d6e83c0044f31fd44e8166c8797d2d1915 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 14:34:26 +0100 Subject: [PATCH 099/330] Purge old frame unwrapping code --- .../essspectroscopy/src/ess/bifrost/data.py | 4 +- .../ess/spectroscopy/indirect/conservation.py | 81 +---- .../src/ess/spectroscopy/indirect/kf.py | 2 +- .../src/ess/spectroscopy/indirect/ki.py | 290 +----------------- .../spectroscopy/indirect/normalisation.py | 191 +----------- .../src/ess/spectroscopy/indirect/workflow.py | 47 +-- .../src/ess/spectroscopy/types.py | 33 +- .../tests/bifrost/workflow_test.py | 2 +- .../essspectroscopy/tests/indirect_test.py | 2 +- 9 files changed, 10 insertions(+), 642 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 9c8d07b0a..011192981 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) """Data for tests and documentation with BIFROST.""" @@ -18,7 +18,7 @@ def _make_pooch(): version=_version, registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "BIFROST-simulation-tof-lookup-table.h5": "md5:9469b7b8c50463b1110bfbdffa2989d5", + "BIFROST-simulation-tof-lookup-table.h5": "md5:9469b7b8c50463b1110bfbdffa2989d5", # noqa: E501 }, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index 631894acc..9469ccf9a 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -1,23 +1,15 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) from scipp import vector from ..types import ( EnergyTransfer, FinalEnergy, - FinalWavevector, IncidentEnergy, - IncidentWavevector, LabMomentumTransfer, - LabMomentumTransferX, - LabMomentumTransferY, - LabMomentumTransferZ, SampleTableAngle, TableMomentumTransfer, - TableMomentumTransferX, - TableMomentumTransferY, - TableMomentumTransferZ, ) from .kf import providers as kf_providers from .ki import providers as ki_providers @@ -26,49 +18,6 @@ PERP, VERT, PARALLEL = (vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])) -def lab_momentum_vector( - ki: IncidentWavevector, kf: FinalWavevector -) -> LabMomentumTransfer: - """Return the momentum transferred to the sample in the laboratory coordinate system - - The laboratory coordinate system is independent of sample angle - - Parameters - ---------- - ki: - incident wavevector of the neutron - kf: - final wavevector of the neutron - - Returns - ------- - : - The difference kf - ki - """ - return kf - ki - - -def lab_momentum_x(q: LabMomentumTransfer) -> LabMomentumTransferX: - """Return the X coordinate of the momentum transfer in the lab coordinate system""" - from scipp import dot - - return dot(PERP, q) - - -def lab_momentum_y(q: LabMomentumTransfer) -> LabMomentumTransferY: - """Return the Y coordinate of the momentum transfer in the lab coordinate system""" - from scipp import dot - - return dot(VERT, q) - - -def lab_momentum_z(q: LabMomentumTransfer) -> LabMomentumTransferZ: - """Return the Z coordinate of the momentum transfer in the lab coordinate system""" - from scipp import dot - - return dot(PARALLEL, q) - - def sample_table_momentum_vector( a3: SampleTableAngle, q: LabMomentumTransfer ) -> TableMomentumTransfer: @@ -95,27 +44,6 @@ def sample_table_momentum_vector( return rotations_from_rotvecs(-a3 * VERT) * q -def sample_table_momentum_x(q: TableMomentumTransfer) -> TableMomentumTransferX: - """Return the X coordinate of the momentum transfer in the sample-table system""" - from scipp import dot - - return dot(PERP, q) - - -def sample_table_momentum_y(q: TableMomentumTransfer) -> TableMomentumTransferY: - """Return the Y coordinate of the momentum transfer in the sample-table system""" - from scipp import dot - - return dot(VERT, q) - - -def sample_table_momentum_z(q: TableMomentumTransfer) -> TableMomentumTransferZ: - """Return the Z coordinate of the momentum transfer in the sample-table system""" - from scipp import dot - - return dot(PARALLEL, q) - - def energy_transfer( incident_energy: IncidentEnergy, final_energy: FinalEnergy ) -> EnergyTransfer: @@ -125,13 +53,6 @@ def energy_transfer( providers = ( *ki_providers, *kf_providers, - lab_momentum_vector, - lab_momentum_x, - lab_momentum_y, - lab_momentum_z, sample_table_momentum_vector, - sample_table_momentum_x, - sample_table_momentum_y, - sample_table_momentum_z, energy_transfer, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 07c556414..1daf1c6df 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import scipp as sc from ess.spectroscopy.types import ( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 31b0d33ed..612fdd382 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) """Utilities for the primary spectrometer of an indirect geometry time-of-flight spectrometer @@ -8,36 +8,18 @@ from __future__ import annotations import sciline -import scipp as sc from scippnexus import Group from ess.reduce import time_of_flight from ess.spectroscopy.types import ( Filename, - FocusComponentName, - FocusComponentNames, IncidentDirection, - IncidentEnergy, - IncidentSloth, - IncidentSlowness, - IncidentWavelength, - IncidentWavenumber, - IncidentWavevector, - PrimaryFocusDistance, - PrimaryFocusTime, - PrimarySpectrometerObject, SampleEvents, SampleName, SamplePosition, - SampleTime, - SourceDelay, - SourceDuration, - SourceFrequency, SourceName, SourcePosition, - SourceSampleFlightTime, SourceSamplePathLength, - SourceVelocities, TimeOfFlightLookupTable, TofSampleEvents, ) @@ -102,56 +84,6 @@ def guess_sample_name(file: Filename) -> SampleName: return SampleName(name) -def guess_focus_component_names(file: Filename) -> FocusComponentNames: - """Guess the component names which define the focus of a Primary Spectrometer - - Note - ---- - The order of components in the NeXus file must be consistent with the order of - components along the beamline. This assumes that only NXdisk_chopper are used to - define a focus distance, and that the first chopper or choppers along the beamline, - within a fixed small distance, can define the focus distance. The component type, - primacy, and allowed distance range could be user configurable inputs. - - Parameters - ---------- - file: NeXusFileName - The (HDF5) NeXus file name that contains an 'entry/instrument' group with - one or more `scippnexus.NXdisk_chopper` groups inside - - Returns - ------- - : - The name or names of the time-focus-defining choppers, given the restrictions - noted above - """ - from scipp import scalar - from scippnexus import File, NXdisk_chopper, compute_positions - - allowance = scalar(0.5, unit='m') - - with File(file) as data: - instrument = data['entry/instrument'] - choppers = { - k: compute_positions(v[...])['position'] - for k, v in instrument[NXdisk_chopper].items() - } - - names = list(choppers.keys()) - focus_names = [FocusComponentName(names[0])] - last = choppers[names[0]]['position'] - distance = 0 * allowance - for name in names[1:]: - x = choppers[name]['position'] - distance += sc.norm(x - last) - last = x - if distance <= allowance: - focus_names.append(FocusComponentName(name)) - else: - break - return FocusComponentNames(focus_names) - - def source_position(file: Filename, source: SourceName) -> SourcePosition: """Extract the position of the named source from a NeXus file""" from scippnexus import File, compute_positions @@ -168,54 +100,6 @@ def sample_position(file: Filename, sample: SampleName) -> SamplePosition: return compute_positions(data['entry/instrument'][sample][...])['position'] -def focus_distance( - file: Filename, origin: SourcePosition, names: FocusComponentNames -) -> PrimaryFocusDistance: - """Find the average distance from the source position to the named components - - Warnings - -------- - This distance is straight-line distance which may not precisely match the - path-length that the neutrons take due to curved guides or other reflecting - components. Care should be taken if the primary spectrometer includes any such - components to ensure that the difference in flight path and straight-line path - is not important - - Parameters - ---------- - file: NeXusFileName - The name of the HDF5 NeXus file containing the 'entry/instrument' group - with the named components - origin: - The position of the source, likely obtained from the same NeXus file - names: list - The name(s) of the components whose average distance is calculated - - Returns - ------- - : - The average straight-line distance from the source position to the named - component(s) - """ - from scippnexus import File, compute_positions - - pos = 0 * origin - with File(file) as data: - for name in names: - pos += compute_positions(data['entry/instrument'][name][...])['position'] - pos /= len(names) - return sc.norm(pos - origin) - - -def focus_time( - primary: PrimarySpectrometerObject, distance: PrimaryFocusDistance -) -> PrimaryFocusTime: - """Return the time relative to the pulse time that neutrons pass the focus""" - from choppera.nexus import primary_focus_time - - return primary_focus_time(primary, distance) - - # TODO insert this as l1 into the events to make sure to use the correct length def primary_path_length( file: Filename, source: SourcePosition, sample: SamplePosition @@ -241,86 +125,6 @@ def primary_path_length( return sum(sqrt(dot(diff, diff))) -def primary_spectrometer( - file: Filename, - source: SourceName, - sample: SampleName, - frequency: SourceFrequency, - duration: SourceDuration, - delay: SourceDelay, - velocities: SourceVelocities, -) -> PrimarySpectrometerObject: - """Construct and return a choppera.PrimarySpectrometer object - - Parameters - ---------- - file: - The HDF5 NeXus file with information about the primary spectrometer - under 'entry/instrument' - source: - The name of the source component in the NeXus instrument group - sample: - The name of the sample component in the NeXus instrument group - frequency: - The frequency of the source, e.g., scipp.scalar(14.0, unit='Hz') for ESS - duration: - The source pulse duration, e.g., approximately scipp.scalar(3.0, unit='msec') - for ESS - delay: - The velocity dependent time delay between source pulse time and neutrons - exiting the moderator, should be 1-D (with dim='wavelength') and have values - corresponding to the provided `velocities` - velocities: - The velocities of neutrons produced by the source; must be 1-D - (with dim='wavelength') with at least two values. The velocities and delay - times should be the same length, with a 1:1 correspondence. These values are - then used to define the time-slowness phase space polygon produced by - each source pulse. - - Returns - ------- - : - A choppera.PrimarySpectrometer object representing the NeXus file contents - """ - from choppera.nexus import primary_spectrometer - from scippnexus import File - - with File(file) as data: - instrument = data['entry/instrument'] - if source not in instrument: - raise KeyError(f"The source '{source}' is not in the instrument group") - if sample not in instrument: - raise KeyError(f"The sample '{sample}' is not in the instrument group") - return primary_spectrometer( - instrument, source, sample, frequency, duration, delay, velocities - ) - - -def primary_pivot_time(primary: PrimarySpectrometerObject) -> SourceSampleFlightTime: - """Return a time, relative to the source pulse time, between neutron-arrival-periods - - Notes - ----- - The determined pivot time is be before the earliest arrival time of neutrons - produced in a source pulse that then are transmitted through the primary - spectrometer, while also being after the latest arrival time from the preceding - pulse. - - Parameters - ---------- - primary: - The choppera.PrimarySpectrometer object - - Returns - ------- - : - The determined pivot time - """ - from choppera.nexus import primary_pivot_time as primary_time - - return primary_time(primary) - - def unwrap_sample_time( sample_events: SampleEvents, table: TimeOfFlightLookupTable, @@ -344,72 +148,6 @@ def unwrap_sample_time( return TofSampleEvents(result) -# TODO remove -def incident_slowness( - length: SourceSamplePathLength, - time: SampleTime, - distance: PrimaryFocusDistance, - focus: PrimaryFocusTime, -) -> IncidentSlowness: - """Find the slowness of neutrons which pass through the primary spectrometer - - Parameters - ---------- - length: - The path length travelled by neutrons which go through the primary spectrometer - time: - The unwrapped 'wall' time for each event, relative to their producing source - pulse - distance: - How far along the primary spectrometer the neutrons travelled before - reaching the time-focus point - focus: - The 'wall' time relative to a source pulse time at which all neutrons must - have passed the time-focus point - - Returns - ------- - : - The inverse of the velocity for each neutron, that is its 'slowness', which - is proportional to wavelength - """ - from ..utils import in_same_unit - - tof = time - in_same_unit(focus, to=time) - slowness = tof / (length - distance) # slowness _is_ inverse velocity - return slowness - - -# TODO remove -def incident_sloth( - primary: PrimarySpectrometerObject, slowness: IncidentSlowness -) -> IncidentSloth: - import scipp as sc - from choppera.nexus import primary_slowness - - from ..utils import range_normalized - - min_max = primary_slowness(primary) - return range_normalized(slowness, sc.min(min_max), sc.max(min_max)) - - -# TODO remove -def incident_wavelength(slowness: IncidentSlowness) -> IncidentWavelength: - """Calculate the incident wavelength from the incident slowness for each neutron""" - from scipp.constants import Planck, neutron_mass - - return (slowness * Planck / neutron_mass).to(unit='angstrom') - - -# TODO remove -def incident_wavenumber(slowness: IncidentSlowness) -> IncidentWavenumber: - """Calculate the incident wave number from the incident slowness for each neutron""" - from scipp.constants import hbar, neutron_mass - - return (neutron_mass / hbar / slowness).to(unit='1/angstrom') - - -# TODO remove def incident_direction() -> IncidentDirection: """Return the incident neutron direction in the laboratory frame""" from scipp import vector @@ -417,38 +155,12 @@ def incident_direction() -> IncidentDirection: return vector([0, 0, 1.0]) -# TODO remove -def incident_wavevector( - ki_magnitude: IncidentWavenumber, direction: IncidentDirection -) -> IncidentWavevector: - """Find the incident wavevector from its magnitude and direction""" - return ki_magnitude * direction - - -def incident_energy(ki: IncidentWavenumber) -> IncidentEnergy: - """Convert the incident wavenumber to incident energy in meV""" - from scipp.constants import hbar, neutron_mass - - return ((hbar * hbar / 2 / neutron_mass) * ki * ki).to(unit='meV') - - providers = ( sample_position, source_position, guess_sample_name, guess_source_name, - guess_focus_component_names, - focus_distance, - focus_time, primary_path_length, - primary_spectrometer, - primary_pivot_time, unwrap_sample_time, incident_direction, - # incident_slowness, # TODO - # incident_sloth, - # incident_wavelength, - # incident_wavenumber, - # incident_wavevector, - # incident_energy, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index c640a409c..2b49a83a8 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -1,49 +1,26 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import sciline -from scipp import DataArray from ess.reduce import time_of_flight from ..types import ( Filename, FrameTimeMonitor, - IncidentSlowness, MonitorName, - MonitorNormalisation, MonitorPosition, NormWavelengthEvents, - PrimaryFocusDistance, - PrimaryFocusTime, - PrimarySpectrometerObject, - SlothMonitor, - SlownessMonitor, - SourceFrequency, - SourceMonitorFlightTime, SourceMonitorPathLength, SourcePosition, TimeOfFlightLookupTable, TofMonitor, - WallTimeMonitor, WavelengthBins, WavelengthEvents, WavelengthMonitor, ) -def incident_monitor_normalization( - slowness: IncidentSlowness, monitor: SlownessMonitor -) -> MonitorNormalisation: - """For each event, return the corresponding monitor intensity""" - from scipp import lookup - - coords = list(monitor.coords) - if len(coords) != 1: - raise ValueError(f'Monitor expected to have exactly 1 coordinate, has {coords}') - return lookup(monitor, dim=coords[0])[slowness] - - def monitor_position(file: Filename, monitor: MonitorName) -> MonitorPosition: """Extract the position of the named monitor from a NeXus file""" from scippnexus import File, compute_positions @@ -86,165 +63,6 @@ def source_monitor_path_length( return sc.sum(sc.norm(diff)) -def monitor_pivot_time( - primary: PrimarySpectrometerObject, length: SourceMonitorPathLength -) -> SourceMonitorFlightTime: - """Find the pivot time between source-pulse arrival times at the monitor position""" - from choppera.nexus import primary_pivot_time_at - - return primary_pivot_time_at(primary, length) - - -def monitor_wall_time( - monitor: FrameTimeMonitor, - frequency: SourceFrequency, - least: SourceMonitorFlightTime, -) -> WallTimeMonitor: - """Convert the independent 'frame_time' coordinate of a histogram DataArray to - the equivalent unwrapped 'wall_time' - - Parameters - ---------- - monitor: - A histogram beam monitor which has with recorded 'frame time' relative to - the most-recent source pulse - frequency: - The source repetition frequency - least: - The minimum wall time between source pulse and arrival at the monitor position - - Returns - ------- - : - The same intensities with independent axis converted to the likely time since - neutron-producing proton pulse - """ - from choppera.nexus import unwrap, unwrap_histogram - - frame = 'frame_time' - if frame not in monitor.coords: - raise RuntimeError(f'A FrameTimeMonitor must have coordinate "{frame}"') - wall = 'wall_time' - names = {frame: wall} - if monitor.coords.is_edges(frame, dim=frame): - coord, values = unwrap_histogram( - monitor.coords[frame], monitor.data, frequency, least - ) - else: - values = monitor.data - coord = unwrap(monitor.coord[frame], frequency, least) - - return DataArray(values.rename(names), coords={wall: coord.rename(names)}) - - -def monitor_slowness( - monitor: WallTimeMonitor, - length: SourceMonitorPathLength, - distance: PrimaryFocusDistance, - focus: PrimaryFocusTime, -) -> SlownessMonitor: - """Convert the independent 'wall_time' coordinate of a histogram DataArray to - the equivalent slowness - - Parameters - ---------- - monitor: - A histogram beam monitor which has been converted from recorded 'frame time' to - time since producing proton pulse - length: - The path length from the source to the monitor - distance: - The distance from the source to the time-of-flight defining (chopper) position - focus: - The (mean) time from proton pulse to when all neutrons passed the tof - defining point - - Returns - ------- - : - The same intensities with independent axis converted to the inverse velocity - of the neutrons, which scales linearly with wall time - """ - from ..utils import in_same_unit - - wall = 'wall_time' - if wall not in monitor.coords: - raise RuntimeError(f'A WallTimeMonitor must have coordinate "{wall}"') - slow = 'slowness' - names = {wall: slow} - wall_time = monitor.coords[wall] - duration = wall_time - in_same_unit(focus, to=wall_time) - slowness = (duration / (length - distance)).rename(names).to(unit='s/m') - return DataArray(monitor.data.rename(names), coords={slow: slowness}) - - -def monitor_wavelength(monitor: SlownessMonitor) -> WavelengthMonitor: - """Convert the independent 'slowness' coordinate of a histogram DataArray to the - equivalent wavelength - - Parameters - ---------- - monitor: - A histogram beam monitor which has been converted from recorded 'frame time' - to inverse neutron velocity - - Returns - ------- - : - The same intensities with independent axis converted to wavelength - """ - from scipp.constants import Planck, neutron_mass - - c = Planck / neutron_mass - slow = 'slowness' - # wavelength = 'incident_wavelength' - if slow not in monitor.coords: - raise RuntimeError(f'A SlownessMonitor must have the coordinate "{slow}"') - - def converter(slowness): - return (c * slowness).to(unit='angstrom') - - # names = {slow: wavelength} - converted = monitor.transform_coords(incident_wavelength=converter) - return converted - - -def monitor_sloth( - primary: PrimarySpectrometerObject, monitor: SlownessMonitor -) -> SlothMonitor: - """Convert the independent 'slowness' coordinate of a histogram DataArray to the - equivalent sloth, which is -- equivalently -- normalised slowness, normalised - inverse velocity, or normalised (incident) wavelength - - Parameters - ---------- - primary: - The primary spectrometer object describing the choppers and guide setting(s) - monitor: - A histogram beam monitor which has been converted from recorded 'frame time' to - inverse neutron velocity - - Returns - ------- - : - The same intensities with independent axis converted to the sloth, - which is the normalised slowness, inverse velocity, and incident wavelength - """ - import scipp as sc - from choppera.nexus import primary_slowness - - from ..utils import range_normalized - - slow = 'slowness' - if slow not in monitor.coords: - raise RuntimeError(f'A SlownessMonitor must have the coordinate "{slow}"') - sloth = 'sloth' - names = {slow: sloth} - min_max = primary_slowness(primary) - normed = range_normalized(monitor.coords[slow], sc.min(min_max), sc.max(min_max)) - return DataArray(monitor.data.rename(names), coords={sloth: normed.rename(names)}) - - def normalise( events: WavelengthEvents, monitor: WavelengthMonitor, @@ -309,13 +127,6 @@ def unwrap_monitor( providers = ( - # TODO remove monitor-related functions - incident_monitor_normalization, - monitor_pivot_time, - monitor_wall_time, - monitor_slowness, - monitor_wavelength, - monitor_sloth, monitor_position, source_monitor_path_length, normalise, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 5c40337a9..e92110708 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) from __future__ import annotations @@ -330,7 +330,6 @@ def get_unwrapped_sample_events( source_name, sample_name, sample_events, - focus_components, tof_lookup_table, ): """Shift frame_time at sample events to time-since-pulse events at sample""" @@ -338,13 +337,8 @@ def get_unwrapped_sample_events( from ..types import ( Filename, - FocusComponentNames, SampleName, - SourceDelay, - SourceDuration, - SourceFrequency, SourceName, - SourceVelocities, ) from .ki import providers as ki_providers @@ -352,19 +346,10 @@ def get_unwrapped_sample_events( Filename: filename, SampleName: sample_name, SourceName: source_name, - SourceDelay: ess_source_delay(), - SourceDuration: ess_source_duration(), - SourceFrequency: ess_source_frequency(), - SourceVelocities: ess_source_velocities(), SampleEvents: sample_events, - FocusComponentNames: focus_components, TimeOfFlightLookupTable: tof_lookup_table, } pipeline = Pipeline(ki_providers, params=params) - # TODO remove? - # primary = pipeline.get(PrimarySpectrometerObject).compute() - # pipeline[PrimarySpectrometerObject] = primary - # params[PrimarySpectrometerObject] = primary events = pipeline.compute(TofSampleEvents) events = events.bins.drop_coords(('event_time_zero', 'event_time_offset')) @@ -380,11 +365,7 @@ def get_unwrapped_monitor( Filename, FrameTimeMonitor, MonitorPosition, - SourceDelay, - SourceDuration, - SourceFrequency, SourceName, - SourceVelocities, TofMonitor, ) from .ki import source_position @@ -395,10 +376,6 @@ def get_unwrapped_monitor( FrameTimeMonitor: monitor, MonitorPosition: monitor.coords['position'], SourceName: source_name, - SourceDelay: ess_source_delay(), - SourceDuration: ess_source_duration(), - SourceFrequency: ess_source_frequency(), - SourceVelocities: ess_source_velocities(), TimeOfFlightLookupTable: tof_lookup_table, } pipeline = Pipeline((*providers, source_position), params=params) @@ -865,7 +842,6 @@ def one_setting( names['source'], names['sample'], sample_events, - names['focus'], tof_lookup_table, ) @@ -969,7 +945,6 @@ def load_precompute( def component_names( source_component: str | None = None, sample_component: str | None = None, - focus_components: list[str] | None = None, monitor_component: str | None = None, is_simulated: bool = False, ): @@ -983,9 +958,6 @@ def component_names( sample_component: str The user-provided sample component name, should exist at 'entry/instrument/{sample_component}' in the datafile - focus_components: list[str] - The user-provided set of component names defining the time-focus position, - each should exist under 'entry/instrument' in the datafile monitor_component: str The user-provided normalization monitor component name, should exist at 'entry/instrument/{monitor_component}' @@ -998,12 +970,9 @@ def component_names( : A dictionary mapping component type name to group name """ - from ..types import FocusComponentName - names = { 'source': source_component, 'sample': sample_component, - 'focus': focus_components, 'monitor': monitor_component, } if is_simulated: @@ -1011,10 +980,6 @@ def component_names( 'source': '001_ESS_source', 'sample': '114_sample_stack', 'monitor': '110_frame_3', - 'focus': [ - FocusComponentName('005_PulseShapingChopper'), - FocusComponentName('006_PulseShapingChopper2'), - ], } for k, v in sim_components.items(): if names[k] is None: @@ -1027,7 +992,6 @@ def bifrost( tof_lookup_table: TimeOfFlightLookupTable, source_component: str | None = None, sample_component: str | None = None, - focus_components: list[str] | None = None, monitor_component: str | None = None, is_simulated: bool = False, ): @@ -1047,9 +1011,6 @@ def bifrost( sample_component: The group name under 'entry/instrument' in the NeXus file containing sample information - focus_components: - The group name or group names under 'entry/instrument' in the NeXus file - which define the focus-time monitor_component: The group name under 'entry/instrument' in the NeXus file containing normalization monitor information @@ -1071,7 +1032,6 @@ def bifrost( named_components = component_names( source_component, sample_component, - focus_components, monitor_component, is_simulated, ) @@ -1101,7 +1061,6 @@ def bifrost_single( tof_lookup_table: TimeOfFlightLookupTable, source_component: str | None = None, sample_component: str | None = None, - focus_components: list[str] | None = None, monitor_component: str | None = None, is_simulated: bool = False, extras: bool = False, @@ -1122,9 +1081,6 @@ def bifrost_single( sample_component: The group name under 'entry/instrument' in the NeXus file containing sample information - focus_components: - The group name or group names under 'entry/instrument' in the NeXus file - which define the focus-time monitor_component: The group name under 'entry/instrument' in the NeXus file containing normalization monitor information @@ -1144,7 +1100,6 @@ def bifrost_single( named_components = component_names( source_component, sample_component, - focus_components, monitor_component, is_simulated, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 9a10512c4..4fb571eba 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,10 +1,9 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) from typing import NewType, TypeVar import sciline import scipp as sc -from choppera.primary import PrimarySpectrometer from ess.reduce import time_of_flight from ess.reduce.nexus import types as reduce_t @@ -70,11 +69,6 @@ class InstrumentAngles( ReciprocalLatticeVectorAbsolute = variable_type('ReciprocalLatticeVectorAbsolute') ReciprocalLatticeSpacing = variable_type('ReciprocalLatticeSpacing') IncidentDirection = variable_type('IncidentDirection') -IncidentSlowness = variable_type('IncidentSlowness') -IncidentSloth = variable_type('IncidentSloth') -IncidentWavelength = variable_type('IncidentWavelength') -IncidentWavenumber = variable_type('IncidentWavenumber') -IncidentWavevector = variable_type('IncidentWavevector') IncidentEnergy = variable_type('IncidentEnergy') FinalDirection = variable_type('FinalDirection') FinalSlowness = variable_type('FinalSlowness') @@ -83,51 +77,26 @@ class InstrumentAngles( FinalWavevector = variable_type('FinalWavevector') FinalEnergy = variable_type('FinalEnergy') SourceSamplePathLength = variable_type('SourceSamplePathLength') -SourceSampleFlightTime = variable_type('SourceSampleFlightTime') SampleDetectorPathLength = variable_type('SampleDetectorPathLength') SampleDetectorFlightTime = variable_type('SampleDetectorFlightTime') SampleFrameTime = variable_type('SampleFrameTime') -SampleTime = variable_type('SampleTime') DetectorFrameTime = variable_type('DetectorFrameTime') DetectorTime = variable_type('DetectorTime') SourceTime = variable_type('SourceTime') SampleName = NewType('SampleName', str) SourceName = NewType('SourceName', str) -SourceFrequency = variable_type('SourceFrequency') -SourceDuration = variable_type('SourceDuration') -SourceDelay = variable_type('SourceDelay') -SourceVelocities = variable_type('SourceVelocities') - -PrimarySpectrometerObject = NewType('PrimarySpectrometerObject', PrimarySpectrometer) - -FocusComponentName = NewType('FocusComponentName', str) -FocusComponentNames = NewType('FocusComponentNames', list[FocusComponentName]) -PrimaryFocusDistance = variable_type('PrimaryFocusDistance') -PrimaryFocusTime = variable_type('PrimaryFocusTime') MonitorName = NewType('MonitorName', str) MonitorPosition = variable_type('MonitorPosition') SourceMonitorPathLength = variable_type('SourceMonitorPathLength') -SourceMonitorFlightTime = variable_type('SourceMonitorFlightTime') FrameTimeMonitor = data_array_type('FrameTimeMonitor') -WallTimeMonitor = data_array_type('WallTimeMonitor') -SlownessMonitor = data_array_type('SlownessMonitor') WavelengthMonitor = data_array_type('WavelengthMonitor') -SlothMonitor = data_array_type('SlothMonitor') - -MonitorNormalisation = variable_type('MonitorNormalisation') LabMomentumTransfer = variable_type('LabMomentumTransfer') -LabMomentumTransferX = variable_type("LabMomentumTransferX") -LabMomentumTransferY = variable_type("LabMomentumTransferY") -LabMomentumTransferZ = variable_type("LabMomentumTransferZ") SampleTableAngle = variable_type("SampleTableAngle") TableMomentumTransfer = variable_type('TableMomentumTransfer') -TableMomentumTransferX = variable_type("TableMomentumTransferX") -TableMomentumTransferY = variable_type("TableMomentumTransferY") -TableMomentumTransferZ = variable_type("TableMomentumTransferZ") SampleMomentumTransfer = variable_type('SampleMomentumTransfer') SampleMomentumTransferX = variable_type("SampleMomentumTransferX") diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 089c218c2..4daa3aa51 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) from ess import bifrost from ess.bifrost.data import simulated_elastic_incoherent_with_phonon diff --git a/packages/essspectroscopy/tests/indirect_test.py b/packages/essspectroscopy/tests/indirect_test.py index 18712eb1b..d42aed25b 100644 --- a/packages/essspectroscopy/tests/indirect_test.py +++ b/packages/essspectroscopy/tests/indirect_test.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import scipp as sc from scipp import array, scalar, sqrt, vector From 219be8d56f3cde67430af3db93a9108183791400 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 12 Mar 2025 15:03:08 +0100 Subject: [PATCH 100/330] Add pooch docs dependency --- .../essspectroscopy/requirements/base.txt | 2 +- packages/essspectroscopy/requirements/ci.txt | 4 ++-- packages/essspectroscopy/requirements/dev.txt | 6 +++--- packages/essspectroscopy/requirements/docs.in | 1 + .../essspectroscopy/requirements/docs.txt | 20 ++++++++++++------- .../essspectroscopy/requirements/nightly.txt | 7 +++++-- .../essspectroscopy/requirements/static.txt | 4 ++-- 7 files changed, 27 insertions(+), 17 deletions(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 7c146c289..5db684328 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -60,7 +60,7 @@ packaging==24.2 # matplotlib pillow==11.1.0 # via matplotlib -plopp==25.2.0 +plopp==25.3.0 # via # scippneutron # tof diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 1faaceaf1..9a0cd4667 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -48,11 +48,11 @@ tomli==2.2.1 # via # pyproject-api # tox -tox==4.24.1 +tox==4.24.2 # via -r ci.in typing-extensions==4.12.2 # via tox urllib3==2.3.0 # via requests -virtualenv==20.29.2 +virtualenv==20.29.3 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index c456d48f3..e9600c7a7 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -30,7 +30,7 @@ click==8.1.8 # via # pip-compile-multi # pip-tools -copier==9.5.0 +copier==9.6.0 # via -r dev.in dunamai==1.23.0 # via copier @@ -79,7 +79,7 @@ overrides==7.7.0 # via jupyter-server pathspec==0.12.1 # via copier -pip-compile-multi==2.7.1 +pip-compile-multi==2.8.0 # via -r dev.in pip-tools==7.4.1 # via pip-compile-multi @@ -89,7 +89,7 @@ prometheus-client==0.21.1 # via jupyter-server pycparser==2.22 # via cffi -python-json-logger==3.2.1 +python-json-logger==3.3.0 # via jupyter-events questionary==2.1.0 # via copier diff --git a/packages/essspectroscopy/requirements/docs.in b/packages/essspectroscopy/requirements/docs.in index e542e53ba..898f0cd49 100644 --- a/packages/essspectroscopy/requirements/docs.in +++ b/packages/essspectroscopy/requirements/docs.in @@ -3,6 +3,7 @@ ipykernel ipython!=8.7.0 # Breaks syntax highlighting in Jupyter code cells. myst-parser nbsphinx +pooch pydata-sphinx-theme>=0.14 sphinx sphinx-autodoc-typehints diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 607608954..90e3d512f 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -1,4 +1,4 @@ -# SHA1:2175813590b5d31dc1cdf3e3c820f699647e9043 +# SHA1:76d668ce06113541571e62da41baa0b2dc6b65be # # This file is autogenerated by pip-compile-multi # To update, run: @@ -12,7 +12,7 @@ alabaster==1.0.0 # via sphinx asttokens==3.0.0 # via stack-data -attrs==25.1.0 +attrs==25.2.0 # via # jsonschema # referencing @@ -54,13 +54,13 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.33.0 +ipython==8.34.0 # via # -r docs.in # ipykernel jedi==0.19.2 # via ipython -jinja2==3.1.5 +jinja2==3.1.6 # via # myst-parser # nbconvert @@ -123,7 +123,11 @@ parso==0.8.4 pexpect==4.9.0 # via ipython platformdirs==4.3.6 - # via jupyter-core + # via + # jupyter-core + # pooch +pooch==1.8.2 + # via -r docs.in prompt-toolkit==3.0.50 # via ipython psutil==7.0.0 @@ -143,7 +147,7 @@ pygments==2.19.1 # sphinx pyyaml==6.0.2 # via myst-parser -pyzmq==26.2.1 +pyzmq==26.3.0 # via # ipykernel # jupyter-client @@ -152,7 +156,9 @@ referencing==0.36.2 # jsonschema # jsonschema-specifications requests==2.32.3 - # via sphinx + # via + # pooch + # sphinx rpds-py==0.23.1 # via # jsonschema diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 3e7498724..99e2585ea 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -86,9 +86,9 @@ pluggy==1.5.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.11.0a2 +pydantic==2.11.0b1 # via scippneutron -pydantic-core==2.29.0 +pydantic-core==2.31.1 # via pydantic pyparsing==3.2.1 # via matplotlib @@ -138,5 +138,8 @@ typing-extensions==4.12.2 # via # pydantic # pydantic-core + # typing-inspection +typing-inspection==0.4.0 + # via pydantic urllib3==2.3.0 # via requests diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 098c4f5a0..3471aadfb 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -11,7 +11,7 @@ distlib==0.3.9 # via virtualenv filelock==3.17.0 # via virtualenv -identify==2.6.8 +identify==2.6.9 # via pre-commit nodeenv==1.9.1 # via pre-commit @@ -21,5 +21,5 @@ pre-commit==4.1.0 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.29.2 +virtualenv==20.29.3 # via pre-commit From b0ba31bd5a008fde6f0ff78dae81e45e7c7390cf Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 13 Mar 2025 15:17:32 +0100 Subject: [PATCH 101/330] Improve the documentation based on review --- .../src/ess/spectroscopy/indirect/ki.py | 20 +++++++++++++++++-- .../src/ess/spectroscopy/indirect/workflow.py | 4 ++-- .../tools/bifrost-make-tof-lookup-table.ipynb | 3 +-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 612fdd382..ac4378151 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -130,8 +130,24 @@ def unwrap_sample_time( table: TimeOfFlightLookupTable, l1: SourceSamplePathLength, ) -> TofSampleEvents: - """Use the pivot time to shift neutron event time offsets, recovering 'real' - time after source pulse per event""" + """Compute time-of-flight at the sample using a lookup table. + + Parameters + ---------- + sample_events: + Binned data with 'event_time_offset' and 'event_time_zero' coordinates + describing the time-of-arrival at the sample. + table: + A time-of-flight lookup table. + l1: + Distance from the source to the sample. + + Returns + ------- + : + A copy of `sample_events` with a 'sample_tof' coordinate containing + the time-of-flight at the sample. + """ pipeline = sciline.Pipeline( time_of_flight.providers(), diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index e92110708..a047224ce 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -107,8 +107,8 @@ def convert_simulated_time_to_event_time_offset(data): primary spectrometer is necessary to find any time-of-flight This function takes event data with per-event coordinate event_time_offset - (actually McStas time-of-flight) and converts the coordinate to be - the time-of-flight modulo the source repetition period. + (actually McStas time-of-arrival) and converts the coordinate to be + the time-of-arrival modulo the source repetition period. Notes ----- diff --git a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb index 1f4111983..96143beca 100644 --- a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb @@ -108,8 +108,7 @@ "metadata": {}, "source": [ "The table needs to cover the range of distances for both sample and monitor.\n", - "Here, the shifts of 0.1m are arbitrarily chosen to make sure the table covers `l1` and `l_monitor`.\n", - "We could probably save space by making 2 smaller tables for narrow ranges around `l1` and `l_monitor`, respectively." + "Here, the shifts of 0.1m are arbitrarily chosen to make sure the table covers `l1` and `l_monitor`." ] }, { From b9930af39cc10c2dd58d6a8fc2344ce1433ab40f Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 13 Mar 2025 15:19:34 +0100 Subject: [PATCH 102/330] Use keyword args --- .../src/ess/spectroscopy/indirect/workflow.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index a047224ce..1601223e7 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -838,18 +838,18 @@ def one_setting( ) sample_events = get_sample_events(triplet_events, sample_detector_flight_time) ki_params, unwrapped_sample_events, primary = get_unwrapped_sample_events( - filename, - names['source'], - names['sample'], - sample_events, - tof_lookup_table, + filename=filename, + source_name=names['source'], + sample_name=names['sample'], + sample_events=sample_events, + tof_lookup_table=tof_lookup_table, ) unwrapped_norm_monitor = get_unwrapped_monitor( - filename, - norm_monitor, - names['source'], - tof_lookup_table, + filename=filename, + monitor=norm_monitor, + source_name=names['source'], + tof_lookup_table=tof_lookup_table, ) unwrapped_sample_events = add_energy_coordinates( From 6ff6a7243cfd1b385ba5e6a0b91b352730facd71 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 13 Mar 2025 15:20:29 +0100 Subject: [PATCH 103/330] Fix new type name --- packages/essspectroscopy/src/ess/spectroscopy/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 4fb571eba..122b3d872 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -118,7 +118,7 @@ class InstrumentAngles( NXspeFileName = NewType('NXspeFileName', str) NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) -SampleEvents = NewType('Sampleevents', sc.DataArray) +SampleEvents = NewType('SampleEvents', sc.DataArray) TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable TofSampleEvents = NewType('TofSampleEvents', sc.DataArray) From 6e16e5f401ee2a1336033b74e70e6fb89be04530 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 12:03:57 +0000 Subject: [PATCH 104/330] Bump scipp from 25.2.0 to 25.3.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 25.2.0 to 25.3.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/25.02.0...25.03.0) --- updated-dependencies: - dependency-name: scipp dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 5db684328..d3f2b54ae 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -79,7 +79,7 @@ sciline==24.10.0 # via # -r base.in # essreduce -scipp==25.2.0 +scipp==25.3.0 # via # -r base.in # essreduce From 1f3d88d208e8ee53058ee31f4d9127ded7fd45a0 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 27 Mar 2025 15:33:54 +0100 Subject: [PATCH 105/330] Add correct zenodo link --- packages/essspectroscopy/docs/about/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/about/index.md b/packages/essspectroscopy/docs/about/index.md index fbe164476..d0ce25744 100644 --- a/packages/essspectroscopy/docs/about/index.md +++ b/packages/essspectroscopy/docs/about/index.md @@ -12,7 +12,7 @@ ESSspectroscopy is available as open source under the [BSD-3 license](https://op Please cite the following: -[![DOI](https://zenodo.org/badge/FIXME.svg)](https://zenodo.org/doi/10.5281/zenodo.FIXME) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14943875.svg)](https://zenodo.org/doi/10.5281/zenodo.14943875) To cite a specific version of ESSspectroscopy, select the desired version on Zenodo to get the corresponding DOI. From 8df3f9640398e6fe25216c60a37b07e1900d7183 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 14 Mar 2025 14:55:21 +0100 Subject: [PATCH 106/330] Move mcstas handling into workflow --- .../src/ess/bifrost/io/mcstas.py | 78 +++++++++++++++++++ .../essspectroscopy/src/ess/bifrost/types.py | 9 ++- .../src/ess/bifrost/workflow.py | 17 +++- .../src/ess/spectroscopy/indirect/workflow.py | 45 +---------- .../src/ess/spectroscopy/types.py | 7 +- 5 files changed, 107 insertions(+), 49 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/bifrost/io/mcstas.py diff --git a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py new file mode 100644 index 000000000..f5a99fb63 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py @@ -0,0 +1,78 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""McStas input for BIFROST.""" + +import scipp as sc +import scippnexus as snx + +from ess.spectroscopy.types import ( + CalibratedBeamline, + DetectorData, + NeXusData, + PulsePeriod, + RunType, +) + +from ..types import McStasDetectorData + + +def assemble_detector_data( + detector: CalibratedBeamline[RunType], + event_data: NeXusData[snx.NXdetector, RunType], +) -> McStasDetectorData[RunType]: + """Custom assemble function that returns McStasDetectorData.""" + from ess.reduce.nexus.workflow import assemble_detector_data as reduce_assemble + + return McStasDetectorData[RunType](reduce_assemble(detector, event_data)) + + +def convert_simulated_time_to_event_time_offset( + mcstas_data: McStasDetectorData[RunType], + pulse_period: PulsePeriod, +) -> DetectorData[RunType]: + """Helper to make McStas simulated event data look more like real data + + McStas has the ability to track the time-of-flight from source to detector for + every probabilistic neutron ray. This is very helpful, but unfortunately real + instrument at ESS are not able to record the same information due to how the + timing and data collection systems work. + + Real neutron events will record their event_time_zero most-recent-pulse reference + time, and their event_time_offset detection time relative to that reference time. + These two values added together give a real wall time; and information about the + primary spectrometer is necessary to find any time-of-flight + + This function takes event data with per-event coordinate event_time_offset + (actually McStas time-of-arrival) and converts the coordinate to be + the time-of-arrival modulo the source repetition period. + + Notes + ----- + If the input data has realistic event_time_offset values, this function should + be a noop. + + Returns + ------- + : + A copy of the data with realistic per-event coordinate event_time_offset. + """ + + def wrap_event_time_offset(event_time_offset: sc.Variable) -> sc.Variable: + return event_time_offset % pulse_period.to(unit=event_time_offset.bins.unit) + + res = mcstas_data.transform_coords( + frame_time=wrap_event_time_offset, + rename_dims=False, + keep_intermediate=False, + keep_inputs=False, + ) + return DetectorData[RunType]( + res.transform_coords(event_time_offset='frame_time', keep_inputs=False) + ) + + +providers = ( + assemble_detector_data, + convert_simulated_time_to_event_time_offset, +) diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 724ee6024..1941b6e07 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -1,13 +1,18 @@ from typing import NewType -from scipp import Variable +import sciline +import scipp as sc from ess.reduce.nexus import types as reduce_t +from ess.spectroscopy.types import RunType -ArcNumber = NewType('ArcNumber', Variable) +ArcNumber = NewType('ArcNumber', sc.Variable) # See https://github.com/scipp/essreduce/issues/105 about monitor names FrameMonitor0 = reduce_t.Monitor1 FrameMonitor1 = reduce_t.Monitor2 FrameMonitor2 = reduce_t.Monitor3 FrameMonitor3 = reduce_t.Monitor4 + + +class McStasDetectorData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 8759aae53..641a2fc4a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -1,21 +1,23 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) from typing import Any import sciline import scippnexus as snx +from ess.reduce import time_of_flight from ess.spectroscopy.types import ( CalibratedDetector, DetectorPositionOffset, NeXusComponent, NeXusMonitorName, NeXusTransformation, + PulsePeriod, RunType, ) -from .io import nexus +from .io import mcstas, nexus from .types import ( FrameMonitor0, FrameMonitor1, @@ -71,18 +73,27 @@ def get_calibrated_detector_bifrost( def default_parameters() -> dict[type, Any]: + tof_params = time_of_flight.default_parameters() return { NeXusMonitorName[FrameMonitor0]: '007_frame_0', NeXusMonitorName[FrameMonitor1]: '090_frame_1', NeXusMonitorName[FrameMonitor2]: '097_frame_2', NeXusMonitorName[FrameMonitor3]: '110_frame_3', + PulsePeriod: tof_params[PulsePeriod], } +_SIMULATION_PROVIDERS = ( + get_calibrated_detector_bifrost, + *mcstas.providers, +) + + def BifrostSimulationWorkflow() -> sciline.Pipeline: """Data reduction workflow for simulated BIFROST data.""" workflow = nexus.LoadNeXusWorkflow() - workflow.insert(get_calibrated_detector_bifrost) + for provider in _SIMULATION_PROVIDERS: + workflow.insert(provider) for key, val in default_parameters().items(): workflow[key] = val return workflow diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 1601223e7..9d069bf6e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -93,42 +93,6 @@ def ess_source_velocities(): return array(values=[100, 1e4], dims=['wavelength'], unit='m/s') -def convert_simulated_time_to_event_time_offset(data): - """Helper to make McStas simulated event data look more like real data - - McStas has the ability to track the time-of-flight from source to detector for - every probabilistic neutron ray. This is very helpful, but unfortunately real - instrument at ESS are not able to record the same information due to how the - timing and data collection systems work. - - Real neutron events will record their event_time_zero most-recent-pulse reference - time, and their event_time_offset detection time relative to that reference time. - These two values added together give a real wall time; and information about the - primary spectrometer is necessary to find any time-of-flight - - This function takes event data with per-event coordinate event_time_offset - (actually McStas time-of-arrival) and converts the coordinate to be - the time-of-arrival modulo the source repetition period. - - Notes - ----- - If the input data has realistic event_time_offset values, this function should - be a noop. - - Returns - ------- - : - A copy of the data with realistic per-event coordinate event_time_offset. - """ - res = data.transform_coords( - frame_time=lambda event_time_offset: event_time_offset % ess_source_period(), - rename_dims=False, - keep_intermediate=False, - keep_inputs=False, - ) - return res.transform_coords(event_time_offset='frame_time', keep_inputs=False) - - def analyzer_per_detector(analyzers: list[str], triplets: list[str]) -> dict[str, str]: """Find the right analyzer name for each detector @@ -897,7 +861,6 @@ def one_setting( def load_precompute( filename: Filename, named_components: dict[str, str], - is_simulated: bool = False, ): """Load data from a NeXus file and perform (a3, a4) independent calculations @@ -930,10 +893,6 @@ def load_precompute( """ sample, triplets, analyzers, choppers, monitors, logs = load_everything(filename) - if is_simulated: - for name in triplets: - triplets[name] = convert_simulated_time_to_event_time_offset(triplets[name]) - analyzers = combine_analyzers(analyzers, triplets) # detectors = combine_detectors(triplets) triplet_events = get_triplet_events(triplets.values()) @@ -1036,7 +995,7 @@ def bifrost( is_simulated, ) sample, analyzers, triplet_events, norm_monitor, logs = load_precompute( - filename, named_components, is_simulated + filename, named_components ) settings = split(triplet_events, analyzers, norm_monitor, logs) data = [ @@ -1104,7 +1063,7 @@ def bifrost_single( is_simulated, ) sample, analyzers, triplet_events, norm_monitor, logs = load_precompute( - filename, named_components, is_simulated + filename, named_components ) if 'time' in norm_monitor.sizes: norm_monitor = norm_monitor.sum('time') diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 122b3d872..875c8e691 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -21,6 +21,7 @@ def typer(named: str) -> type[scipp_type]: AllNeXusComponents = reduce_t.AllNeXusComponents Analyzers = reduce_t.Analyzers +CalibratedBeamline = reduce_t.CalibratedBeamline CalibratedDetector = reduce_t.CalibratedDetector Choppers = reduce_t.Choppers DetectorData = reduce_t.DetectorData @@ -31,6 +32,7 @@ def typer(named: str) -> type[scipp_type]: NeXusClass = reduce_t.NeXusClass NeXusComponentLocationSpec = reduce_t.NeXusComponentLocationSpec NeXusComponent = reduce_t.NeXusComponent +NeXusData = reduce_t.NeXusData NeXusDetectorName = reduce_t.NeXusDetectorName NeXusFileSpec = reduce_t.NeXusFileSpec NeXusMonitorName = reduce_t.NeXusName @@ -51,6 +53,10 @@ def typer(named: str) -> type[scipp_type]: reduce_t.Monitor4, ) +PulseStride = time_of_flight.PulseStride +PulsePeriod = time_of_flight.PulsePeriod +TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable + class InstrumentAngles( sciline.Scope[RunType, sc.DataGroup[sc.DataArray]], sc.DataGroup[sc.DataArray] @@ -119,7 +125,6 @@ class InstrumentAngles( NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) SampleEvents = NewType('SampleEvents', sc.DataArray) -TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable TofSampleEvents = NewType('TofSampleEvents', sc.DataArray) TofMonitor = NewType('TofMonitor', sc.DataArray) From cc2a081e52a76b6affcc7b7d5c346fa8b3a26cd9 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 14 Mar 2025 16:19:57 +0100 Subject: [PATCH 107/330] Load analyzers per detector --- .../src/ess/bifrost/io/nexus.py | 66 ++++++++++++++++++- .../src/ess/spectroscopy/types.py | 5 +- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 4e4c415ab..7b7359119 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -3,14 +3,19 @@ """NeXus input/output for BIFROST.""" +from collections.abc import Iterable + import sciline import scipp as sc import scippnexus as snx from ess.reduce.nexus.workflow import GenericNeXusWorkflow from ess.spectroscopy.types import ( + Analyzer, InstrumentAngles, NeXusClass, + NeXusComponentLocationSpec, + NeXusDetectorName, NeXusFileSpec, RunType, SampleRun, @@ -50,6 +55,63 @@ def load_instrument_angles( ) +def _analyzer_name_for_detector_name( + detector_name: NeXusDetectorName, all_names: Iterable[str] +) -> str: + detector_index = int(detector_name.split('_', 1)[0]) + analyzer_index = str(detector_index - 2) + for name in all_names: + if name.startswith(analyzer_index): + return name + raise RuntimeError(f"No analyzer found for detector {detector_name}") + + +def load_analyzer_for_detector( + detector_location: NeXusComponentLocationSpec[snx.NXdetector, RunType], +) -> Analyzer[RunType]: + """Find and load the right analyzer for a detector triplet. + + Note + ---- + Depends heavily on the names of components being preceded by an in-instrument index, + and the analyzer and detector components being separated in index by 2. + If either condition changes this function will need to be modified. + + Parameters + ---------- + detector_location: + The location of an NXdetector in the NeXus file. + The analyzer is identified based on this location. + + Returns + ------- + : + The loaded analyzer for the given detector triplet. + Only a subset of fields is returned. + """ + from ess.reduce.nexus._nexus_loader import _open_component_parent + + with _open_component_parent(detector_location, nx_class=snx.NXcrystal) as parent: + analyzer_name = _analyzer_name_for_detector_name( + detector_location.component_name, parent.keys() + ) + analyzer = snx.compute_positions( + parent[analyzer_name][()], store_transform='transform' + ) + return Analyzer[RunType]( + sc.DataGroup( + {name: analyzer[name] for name in ('d_spacing', 'position', 'transform')} + ) + ) + + +_PROVIDERS = ( + load_analyzer_for_detector, + load_instrument_angles, + moderator_class_for_source, +) + + def LoadNeXusWorkflow() -> sciline.Pipeline: """Workflow for loading BIFROST NeXus files.""" workflow = GenericNeXusWorkflow( @@ -61,6 +123,6 @@ def LoadNeXusWorkflow() -> sciline.Pipeline: FrameMonitor3, ), ) - workflow.insert(moderator_class_for_source) - workflow.insert(load_instrument_angles) + for provider in _PROVIDERS: + workflow.insert(provider) return workflow diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 875c8e691..ab8e35cc4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) -from typing import NewType, TypeVar +from typing import Any, NewType, TypeVar import sciline import scipp as sc @@ -64,6 +64,9 @@ class InstrumentAngles( """Instrument angles for the sample orientation as a function of time.""" +class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): ... + + AnalyzerPosition = variable_type('AnalyzerPosition') DetectorPosition = variable_type('DetectorPosition') SamplePosition = variable_type('SamplePosition') From 283d029d5a8e10f1f0a0b2f4fbba4559a29e61eb Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 17 Mar 2025 16:38:24 +0100 Subject: [PATCH 108/330] Use coord transform to compute final energy --- .../src/ess/bifrost/io/mcstas.py | 4 +- .../src/ess/bifrost/io/nexus.py | 4 +- .../src/ess/bifrost/workflow.py | 3 + .../src/ess/spectroscopy/indirect/kf.py | 125 ++++++++++++++---- .../src/ess/spectroscopy/indirect/workflow.py | 4 +- .../src/ess/spectroscopy/types.py | 10 +- 6 files changed, 116 insertions(+), 34 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py index f5a99fb63..5428d8b35 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py @@ -7,7 +7,7 @@ import scippnexus as snx from ess.spectroscopy.types import ( - CalibratedBeamline, + BeamlineWithSecondarSpecCoords, DetectorData, NeXusData, PulsePeriod, @@ -18,7 +18,7 @@ def assemble_detector_data( - detector: CalibratedBeamline[RunType], + detector: BeamlineWithSecondarSpecCoords[RunType], event_data: NeXusData[snx.NXdetector, RunType], ) -> McStasDetectorData[RunType]: """Custom assemble function that returns McStasDetectorData.""" diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 7b7359119..c95a728f4 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -100,7 +100,9 @@ def load_analyzer_for_detector( ) return Analyzer[RunType]( sc.DataGroup( - {name: analyzer[name] for name in ('d_spacing', 'position', 'transform')} + dspacing=analyzer['d_spacing'], + position=analyzer['position'], + transform=analyzer['transform'], ) ) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 641a2fc4a..42ba4f97e 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -7,6 +7,7 @@ import scippnexus as snx from ess.reduce import time_of_flight +from ess.spectroscopy.indirect import kf from ess.spectroscopy.types import ( CalibratedDetector, DetectorPositionOffset, @@ -86,6 +87,8 @@ def default_parameters() -> dict[type, Any]: _SIMULATION_PROVIDERS = ( get_calibrated_detector_bifrost, *mcstas.providers, + kf.secondary_spectrometer_coordinate_transformation_graph, + kf.add_secondary_spectrometer_coords, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 1daf1c6df..e8388d3de 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -1,32 +1,38 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +import numpy as np import scipp as sc from ess.spectroscopy.types import ( + Analyzer, AnalyzerDetectorVector, + AnalyzerDspacing, AnalyzerOrientation, AnalyzerPosition, + BeamlineWithSecondarSpecCoords, + CalibratedBeamline, DetectorFrameTime, DetectorGeometricA4, DetectorPosition, FinalEnergy, FinalWavenumber, FinalWavevector, - ReciprocalLatticeSpacing, ReciprocalLatticeVectorAbsolute, + RunType, SampleAnalyzerDirection, SampleAnalyzerVector, SampleDetectorFlightTime, SampleDetectorPathLength, SampleFrameTime, SamplePosition, + SecondarySpecCoordTransformGraph, ) def sample_analyzer_vector( sample_position: SamplePosition, analyzer_position: AnalyzerPosition, - analyzer_orientation: AnalyzerOrientation, + analyzer_transform: AnalyzerOrientation, detector_position: DetectorPosition, ) -> SampleAnalyzerVector: """Determine the sample to analyzer-reflection-point vector per detector element @@ -44,7 +50,7 @@ def sample_analyzer_vector( The (probably singular) sample position, typically (0, 0, 0) analyzer_position: scipp.DType.vector3 The nominal center of the central analyzer blade *surface* - analyzer_orientation: scipp.DType.rotate3 + analyzer_transform: scipp.DType.rotate3 The orienting quaternion of the analyzer, used to identify the crystal y-axis detector_position: scipp.DType.vector3 The position of the detector element @@ -60,11 +66,11 @@ def sample_analyzer_vector( # Scipp does not distinguish between coordinates and directions, so we need to do # some extra legwork to ensure we can apply the orientation transformation # _and_ obtain a dimensionless direction vector - o = vector([0, 0, 0], unit=analyzer_orientation.unit) + o = vector([0, 0, 0], unit=analyzer_transform.unit) y = vector( - [0, 1, 0], unit=analyzer_orientation.unit + [0, 1, 0], unit=analyzer_transform.unit ) # and y perpendicular to the scattering plane - yhat = analyzer_orientation * y - analyzer_orientation * o + yhat = analyzer_transform * y - analyzer_transform * o yhat /= sc.norm(yhat) sample_analyzer_center_vector = analyzer_position - sample_position @@ -118,11 +124,11 @@ def detector_geometric_a4(vec: SampleAnalyzerVector) -> DetectorGeometricA4: def analyzer_detector_vector( sample_position: SamplePosition, - sample_analyzer_vec: SampleAnalyzerVector, + sample_analyzer_vector: SampleAnalyzerVector, detector_position: DetectorPosition, ) -> AnalyzerDetectorVector: """Calculate the analyzer-detector vector""" - return detector_position - (sample_position + sample_analyzer_vec) + return detector_position - (sample_position + sample_analyzer_vector) def kf_hat(sample_analyzer_vec: SampleAnalyzerVector) -> SampleAnalyzerDirection: @@ -136,9 +142,9 @@ def reciprocal_lattice_spacing(tau_vector: ReciprocalLatticeVectorAbsolute): def final_wavenumber( - sample_analyzer_vec: SampleAnalyzerVector, - analyzer_detector_vec: AnalyzerDetectorVector, - tau: ReciprocalLatticeSpacing, + sample_analyzer_vector: SampleAnalyzerVector, + analyzer_detector_vector: AnalyzerDetectorVector, + analyzer_dspacing: AnalyzerDspacing, ) -> FinalWavenumber: """Find the wave number of the neutrons reflected to each detector-element @@ -147,15 +153,14 @@ def final_wavenumber( Parameters ---------- - sample_analyzer_vec : scipp.DType.vector3 + sample_analyzer_vector : scipp.DType.vector3 The vector from the sample to the analyzer interaction point for each detector element - analyzer_detector_vec: scipp.DType.vector3 + analyzer_detector_vector: scipp.DType.vector3 The vector from the analyzer interaction point to its detector element, for each detector element - tau: float-like - The reciprocal lattice plane spacing of the analyzer crystal, - likely in inverse angstrom + analyzer_dspacing: float-like + The lattice plane spacing of the analyzer crystal. Returns ------- @@ -165,23 +170,25 @@ def final_wavenumber( from scipp import sqrt # law of Cosines gives the scattering angle based on distances: - l_sa = sc.norm(sample_analyzer_vec) - l_ad = sc.norm(analyzer_detector_vec) - l_diff = sc.norm(sample_analyzer_vec + analyzer_detector_vec) + l_sa = sc.norm(sample_analyzer_vector) + l_ad = sc.norm(analyzer_detector_vector) + l_diff = sc.norm(sample_analyzer_vector + analyzer_detector_vector) # 2 theta is measured from the direction S-A, so the internal angle is # (pi - 2 theta) and the normal law of Cosines is modified accordingly to be # -cos(2 theta) instead of cos(pi - 2 theta) cos2theta = (l_diff * l_diff - l_sa * l_sa - l_ad * l_ad) / (2 * l_sa * l_ad) # law of Cosines gives the Bragg reflected wavevector magnitude - return tau / sqrt(2 - 2 * cos2theta) + return 2 * np.pi / analyzer_dspacing / sqrt(2 - 2 * cos2theta) -def final_energy(kf: FinalWavenumber) -> FinalEnergy: +def final_energy(final_wavenumber: FinalWavenumber) -> FinalEnergy: """Converts (final) wave number to (final) energy""" from scipp.constants import hbar, neutron_mass - return ((hbar * hbar / 2 / neutron_mass) * kf * kf).to(unit='meV') + return ((hbar * hbar / 2 / neutron_mass) * final_wavenumber * final_wavenumber).to( + unit='meV' + ) def final_wavevector( @@ -192,21 +199,21 @@ def final_wavevector( def secondary_flight_path_length( - sample_analyzer_vec: SampleAnalyzerVector, - analyzer_detector_vec: AnalyzerDetectorVector, + sample_analyzer_vector: SampleAnalyzerVector, + analyzer_detector_vector: AnalyzerDetectorVector, ) -> SampleDetectorPathLength: """Returns the path-length-distance between the sample and each detector element""" - return sc.norm(sample_analyzer_vec) + sc.norm(analyzer_detector_vec) + return sc.norm(sample_analyzer_vector) + sc.norm(analyzer_detector_vector) def secondary_flight_time( - secondary_flight_distance: SampleDetectorPathLength, kf_magnitude: FinalWavenumber + L2: SampleDetectorPathLength, final_wavenumber: FinalWavenumber ) -> SampleDetectorFlightTime: """Calculates the most-likely time-of-flight between the sample and each pixel""" from scipp.constants import hbar, neutron_mass - velocity = kf_magnitude * hbar / neutron_mass - return secondary_flight_distance / velocity + velocity = final_wavenumber * (hbar / neutron_mass) + return sc.to_unit(L2 / velocity, 'ms', copy=False) def sample_frame_time( @@ -216,6 +223,68 @@ def sample_frame_time( return detector_time - secondary_time +def secondary_spectrometer_coordinate_transformation_graph( + analyzer: Analyzer[RunType], +) -> SecondarySpecCoordTransformGraph[RunType]: + """Return a coordinate transformation graph for the secondary spectrometer. + + Parameters + ---------- + analyzer: + Data group with analyzer parameters. + + Returns + ------- + : + Coordinate transformation graph for the secondary spectrometer. + The graph captures the relevant parameters of ``analyzer``. + """ + return SecondarySpecCoordTransformGraph[RunType]( + { + "analyzer_dspacing": lambda: analyzer["dspacing"], + "analyzer_position": lambda: analyzer["position"], + "analyzer_transform": lambda: analyzer["transform"], + "detector_position": "position", + "sample_analyzer_vector": sample_analyzer_vector, + "analyzer_detector_vector": analyzer_detector_vector, + "final_energy": final_energy, + "final_wavenumber": final_wavenumber, + "L2": secondary_flight_path_length, + "secondary_flight_time": secondary_flight_time, + } + ) + + +def add_secondary_spectrometer_coords( + data: CalibratedBeamline[RunType], graph: SecondarySpecCoordTransformGraph[RunType] +) -> BeamlineWithSecondarSpecCoords[RunType]: + """Compute and add coordinates for the secondary spectrometer. + + Parameters + ---------- + data: + Data array with beamline coordinates "position", "source_position", and + "sample_position". + Does not need to contain events or flight times. + graph: + Coordinate transformation graph for the secondary spectrometer. + Must be a closure over analyzer parameters. + And those parameters must have a compatible shape with ``data``. + + Returns + ------- + : + Input data with added "final_energy" and "secondary_flight_time" coordinates. + """ + return data.transform_coords( + ("final_energy", "secondary_flight_time"), + graph=graph, + keep_intermediate=False, + keep_aliases=False, + rename_dims=False, + ) + + providers = ( sample_analyzer_vector, analyzer_detector_vector, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index 9d069bf6e..b9258c326 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -233,10 +233,10 @@ def find_sample_detector_flight_time(sample, analyzers, detector_positions): from sciline import Pipeline from ..types import ( + AnalyzerDspacing, AnalyzerOrientation, AnalyzerPosition, DetectorPosition, - ReciprocalLatticeSpacing, SampleDetectorFlightTime, SamplePosition, ) @@ -247,7 +247,7 @@ def find_sample_detector_flight_time(sample, analyzers, detector_positions): AnalyzerPosition: analyzers['position'].data, DetectorPosition: detector_positions, # detectors['position'].data, AnalyzerOrientation: analyzers['transform'].data, - ReciprocalLatticeSpacing: 2 * np.pi / analyzers['d_spacing'].data, + AnalyzerDspacing: analyzers['spacing'].data, } return params, Pipeline(kf_providers, params=params).get( SampleDetectorFlightTime diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index ab8e35cc4..8d67470e9 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -76,7 +76,7 @@ class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): .. AnalyzerDetectorVector = variable_type('AnalyzerDetectorVector') SampleAnalyzerDirection = variable_type('SampleAnalyzerDirection') ReciprocalLatticeVectorAbsolute = variable_type('ReciprocalLatticeVectorAbsolute') -ReciprocalLatticeSpacing = variable_type('ReciprocalLatticeSpacing') +AnalyzerDspacing = variable_type('Dspacing') IncidentDirection = variable_type('IncidentDirection') IncidentEnergy = variable_type('IncidentEnergy') FinalDirection = variable_type('FinalDirection') @@ -131,3 +131,11 @@ class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): .. TofSampleEvents = NewType('TofSampleEvents', sc.DataArray) TofMonitor = NewType('TofMonitor', sc.DataArray) + + +class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... + + +class BeamlineWithSecondarSpecCoords( + sciline.Scope[RunType, sc.DataArray], sc.DataArray +): ... From 6f9d54ea547bd00240f74aa155f5d6173c6f0f3f Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 17 Mar 2025 16:47:28 +0100 Subject: [PATCH 109/330] Merge triplets in workflow --- .../src/ess/bifrost/detector.py | 80 ++++++++++++++++++- .../src/ess/bifrost/workflow.py | 68 ++++------------ 2 files changed, 90 insertions(+), 58 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index faf2f5980..737daa7df 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -1,4 +1,16 @@ -from ..spectroscopy.types import FinalEnergy +import scipp as sc +import scippnexus as snx + +from ess.spectroscopy.types import ( + CalibratedDetector, + DetectorData, + DetectorPositionOffset, + FinalEnergy, + NeXusComponent, + NeXusTransformation, + RunType, +) + from .types import ArcNumber @@ -24,11 +36,71 @@ def arc_number(final_energy: FinalEnergy) -> ArcNumber: : The arc index of the analyzer from which the neutron scattered """ - import scipp as sc - minimum = sc.scalar(2.7, unit='meV') step = sc.scalar(0.575, unit='meV') return sc.round((final_energy - minimum) / step).to(dtype='int') -providers = (arc_number,) +def get_calibrated_detector_bifrost( + detector: NeXusComponent[snx.NXdetector, RunType], + *, + transform: NeXusTransformation[snx.NXdetector, RunType], + offset: DetectorPositionOffset[RunType], +) -> CalibratedDetector[RunType]: + """Extract the data array corresponding to a detector's signal field. + + The returned data array includes coords and masks pertaining directly to the + signal values array, but not additional information about the detector. + The data array is reshaped to the logical detector shape. + + This function is specific to BIFROST and differs from the generic + :func:`ess.reduce.nexus.workflow.get_calibrated_detector` in that it does not + fold the detectors into logical dimensions because the files already contain + the detectors in the correct shape. + + Parameters + ---------- + detector: + Loaded NeXus detector. + transform: + Transformation that determines the detector position. + offset: + Offset to add to the detector position. + + Returns + ------- + : + Detector data. + """ + + from ess.reduce.nexus.types import DetectorBankSizes + from ess.reduce.nexus.workflow import get_calibrated_detector + + da = get_calibrated_detector( + detector=detector, + transform=transform, + offset=offset, + # The detectors are folded in the file, no need to do that here. + bank_sizes=DetectorBankSizes({}), + ) + da = da.rename(dim_0='tube', dim_1='length') + return CalibratedDetector[RunType](da) + + +def merge_triplets(*triplets: DetectorData[RunType]) -> DetectorData[RunType]: + """Merge BIFROST detector triplets into a single data array. + + Parameters + ---------- + triplets: + Data arrays to merge. + + Returns + ------- + : + Input data arrays stacked along the "triplet" dimension. + """ + return DetectorData[RunType](sc.concat(triplets, dim="triplet")) + + +providers = (arc_number, get_calibrated_detector_bifrost) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 42ba4f97e..848c4120c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -4,20 +4,19 @@ from typing import Any import sciline -import scippnexus as snx from ess.reduce import time_of_flight from ess.spectroscopy.indirect import kf from ess.spectroscopy.types import ( - CalibratedDetector, - DetectorPositionOffset, - NeXusComponent, + DetectorData, + NeXusDetectorName, NeXusMonitorName, - NeXusTransformation, PulsePeriod, - RunType, + SampleRun, ) +from .detector import merge_triplets +from .detector import providers as detector_providers from .io import mcstas, nexus from .types import ( FrameMonitor0, @@ -27,52 +26,6 @@ ) -def get_calibrated_detector_bifrost( - detector: NeXusComponent[snx.NXdetector, RunType], - *, - transform: NeXusTransformation[snx.NXdetector, RunType], - offset: DetectorPositionOffset[RunType], -) -> CalibratedDetector[RunType]: - """Extract the data array corresponding to a detector's signal field. - - The returned data array includes coords and masks pertaining directly to the - signal values array, but not additional information about the detector. - The data array is reshaped to the logical detector shape. - - This function is specific to BIFROST and differs from the generic - :func:`ess.reduce.nexus.workflow.get_calibrated_detector` in that it does not - fold the detectors into logical dimensions because the files already contain - the detectors in the correct shape. - - Parameters - ---------- - detector: - Loaded NeXus detector. - transform: - Transformation that determines the detector position. - offset: - Offset to add to the detector position. - - Returns - ------- - : - Detector data. - """ - - from ess.reduce.nexus.types import DetectorBankSizes - from ess.reduce.nexus.workflow import get_calibrated_detector - - da = get_calibrated_detector( - detector=detector, - transform=transform, - offset=offset, - # The detectors are folded in the file, no need to do that here. - bank_sizes=DetectorBankSizes({}), - ) - da = da.rename(dim_0='tube', dim_1='length') - return CalibratedDetector[RunType](da) - - def default_parameters() -> dict[type, Any]: tof_params = time_of_flight.default_parameters() return { @@ -85,18 +38,25 @@ def default_parameters() -> dict[type, Any]: _SIMULATION_PROVIDERS = ( - get_calibrated_detector_bifrost, *mcstas.providers, + *detector_providers, kf.secondary_spectrometer_coordinate_transformation_graph, kf.add_secondary_spectrometer_coords, ) -def BifrostSimulationWorkflow() -> sciline.Pipeline: +def BifrostSimulationWorkflow(detector_names: NeXusDetectorName) -> sciline.Pipeline: """Data reduction workflow for simulated BIFROST data.""" workflow = nexus.LoadNeXusWorkflow() for provider in _SIMULATION_PROVIDERS: workflow.insert(provider) for key, val in default_parameters().items(): workflow[key] = val + + workflow[DetectorData[SampleRun]] = ( + workflow[DetectorData[SampleRun]] + .map({NeXusDetectorName: detector_names}) + .reduce(func=merge_triplets) + ) + return workflow From 5ecedfbfc28de828d7ecae0fc73374b6f679607a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 18 Mar 2025 16:17:54 +0100 Subject: [PATCH 110/330] Add unwrapping to workflow --- .../src/ess/bifrost/detector.py | 41 ++++++++++- .../src/ess/bifrost/io/mcstas.py | 4 +- .../src/ess/bifrost/workflow.py | 8 ++- .../src/ess/spectroscopy/indirect/kf.py | 45 ++++++------ .../src/ess/spectroscopy/indirect/ki.py | 72 +++++++++---------- .../src/ess/spectroscopy/indirect/workflow.py | 14 ++-- .../src/ess/spectroscopy/types.py | 13 +++- 7 files changed, 129 insertions(+), 68 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 737daa7df..9d2f193bf 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -2,13 +2,17 @@ import scippnexus as snx from ess.spectroscopy.types import ( + BeamlineWithSpectrometerCoords, + CalibratedBeamline, CalibratedDetector, DetectorData, DetectorPositionOffset, FinalEnergy, NeXusComponent, NeXusTransformation, + PrimarySpecCoordTransformGraph, RunType, + SecondarySpecCoordTransformGraph, ) from .types import ArcNumber @@ -87,6 +91,41 @@ def get_calibrated_detector_bifrost( return CalibratedDetector[RunType](da) +def add_spectrometer_coords( + data: CalibratedBeamline[RunType], + primary_graph: PrimarySpecCoordTransformGraph[RunType], + secondary_graph: SecondarySpecCoordTransformGraph[RunType], +) -> BeamlineWithSpectrometerCoords[RunType]: + """Compute and add coordinates for the spectrometer. + + Parameters + ---------- + data: + Data array with beamline coordinates "position", "source_position", and + "sample_position". + Does not need to contain events or flight times. + primary_graph: + Coordinate transformation graph for the primary spectrometer. + secondary_graph: + Coordinate transformation graph for the secondary spectrometer. + Must be a closure over analyzer parameters. + And those parameters must have a compatible shape with ``data``. + + Returns + ------- + : + Input data with added spectrometer coordinates. + This includes "final_energy", "secondary_flight_time", and "L1". + """ + return data.transform_coords( + ("final_energy", "L1", "secondary_flight_time"), + graph={**primary_graph, **secondary_graph}, + keep_intermediate=False, + keep_aliases=False, + rename_dims=False, + ) + + def merge_triplets(*triplets: DetectorData[RunType]) -> DetectorData[RunType]: """Merge BIFROST detector triplets into a single data array. @@ -103,4 +142,4 @@ def merge_triplets(*triplets: DetectorData[RunType]) -> DetectorData[RunType]: return DetectorData[RunType](sc.concat(triplets, dim="triplet")) -providers = (arc_number, get_calibrated_detector_bifrost) +providers = (add_spectrometer_coords, arc_number, get_calibrated_detector_bifrost) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py index 5428d8b35..8867f0fb6 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py @@ -7,7 +7,7 @@ import scippnexus as snx from ess.spectroscopy.types import ( - BeamlineWithSecondarSpecCoords, + BeamlineWithSpectrometerCoords, DetectorData, NeXusData, PulsePeriod, @@ -18,7 +18,7 @@ def assemble_detector_data( - detector: BeamlineWithSecondarSpecCoords[RunType], + detector: BeamlineWithSpectrometerCoords[RunType], event_data: NeXusData[snx.NXdetector, RunType], ) -> McStasDetectorData[RunType]: """Custom assemble function that returns McStasDetectorData.""" diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 848c4120c..9afaa1825 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -6,7 +6,7 @@ import sciline from ess.reduce import time_of_flight -from ess.spectroscopy.indirect import kf +from ess.spectroscopy.indirect import kf, ki from ess.spectroscopy.types import ( DetectorData, NeXusDetectorName, @@ -40,8 +40,12 @@ def default_parameters() -> dict[type, Any]: _SIMULATION_PROVIDERS = ( *mcstas.providers, *detector_providers, + # TODO use ki.providers + ki.primary_spectrometer_coordinate_transformation_graph, + ki.unwrap_sample_time, + # TODO use kf.providers kf.secondary_spectrometer_coordinate_transformation_graph, - kf.add_secondary_spectrometer_coords, + kf.move_time_to_sample, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index e8388d3de..29213de19 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -9,14 +9,15 @@ AnalyzerDspacing, AnalyzerOrientation, AnalyzerPosition, - BeamlineWithSecondarSpecCoords, - CalibratedBeamline, + DataAtSample, + DetectorData, DetectorFrameTime, DetectorGeometricA4, DetectorPosition, FinalEnergy, FinalWavenumber, FinalWavevector, + PulsePeriod, ReciprocalLatticeVectorAbsolute, RunType, SampleAnalyzerDirection, @@ -28,6 +29,8 @@ SecondarySpecCoordTransformGraph, ) +from ..utils import in_same_unit + def sample_analyzer_vector( sample_position: SamplePosition, @@ -255,33 +258,35 @@ def secondary_spectrometer_coordinate_transformation_graph( ) -def add_secondary_spectrometer_coords( - data: CalibratedBeamline[RunType], graph: SecondarySpecCoordTransformGraph[RunType] -) -> BeamlineWithSecondarSpecCoords[RunType]: - """Compute and add coordinates for the secondary spectrometer. +def move_time_to_sample( + data: DetectorData[RunType], pulse_period: PulsePeriod +) -> DataAtSample[RunType]: + """Return the events with the event_time_offset coordinate offset to time at sample. Parameters ---------- data: - Data array with beamline coordinates "position", "source_position", and - "sample_position". - Does not need to contain events or flight times. - graph: - Coordinate transformation graph for the secondary spectrometer. - Must be a closure over analyzer parameters. - And those parameters must have a compatible shape with ``data``. + Data array with "event_time_offset" and "secondary_flight_time" coordinates. + pulse_period: + Duration of a neutron pulse. Returns ------- : - Input data with added "final_energy" and "secondary_flight_time" coordinates. + A shallow copy of ``data`` where the "event_time_offset" coordinate has been + shifted to the time at the sample. """ - return data.transform_coords( - ("final_energy", "secondary_flight_time"), - graph=graph, - keep_intermediate=False, - keep_aliases=False, - rename_dims=False, + offset = in_same_unit( + data.coords['secondary_flight_time'], data.bins.coords['event_time_offset'] + ) + time = data.bins.coords['event_time_offset'] - offset + time %= in_same_unit(pulse_period, time) + return DataAtSample[RunType]( + data + # These are the detector positions and they no longer match the time: + .drop_coords(('position', 'x_pixel_offset', 'y_pixel_offset')) + # Use bins.assign_coords to avoid modifying the original data: + .bins.assign_coords(event_time_offset=time) ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index ac4378151..e3cb186e0 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -12,16 +12,17 @@ from ess.reduce import time_of_flight from ess.spectroscopy.types import ( + DataAtSample, Filename, IncidentDirection, - SampleEvents, + PrimarySpecCoordTransformGraph, + RunType, SampleName, SamplePosition, SourceName, SourcePosition, - SourceSamplePathLength, TimeOfFlightLookupTable, - TofSampleEvents, + TofData, ) @@ -100,52 +101,52 @@ def sample_position(file: Filename, sample: SampleName) -> SamplePosition: return compute_positions(data['entry/instrument'][sample][...])['position'] -# TODO insert this as l1 into the events to make sure to use the correct length -def primary_path_length( - file: Filename, source: SourcePosition, sample: SamplePosition -) -> SourceSamplePathLength: - """Compute the primary spectrometer path length from source to sample positions +def primary_spectrometer_coordinate_transformation_graph() -> ( + PrimarySpecCoordTransformGraph[RunType] +): + """Return a coordinate transformation graph for the primary spectrometer. - Note: - This *requires* that the instrument group *is sorted* along the beam path. - HDF5 group entries are sorted alphabetically, so you should ensure that - the NeXus file was constructed with this in mind. + Returns + ------- + : + Coordinate transformation graph for the primary spectrometer. """ - from scipp import concat, dot, sqrt, sum - from scippnexus import File, NXguide, compute_positions - - with File(file) as data: - positions = [ - compute_positions(v[...])['position'] - for v in data['entry/instrument'][NXguide].values() - ] - - positions = concat((source, *positions, sample), dim='path') - diff = positions['path', 1:] - positions['path', :-1] - return sum(sqrt(dot(diff, diff))) + # For the incident beam, the original implementation here used the guides to + # determine a more accurate estimate of the path length. + # See function `primary_path_length` in + # commit 929ef7f97e00a1e26c254fd5f08c8a3346255970 + # The result differs by <1mm from the straight line distance. + # This should be well below the measurement accuracy. + # So we use the simpler straight line distance here. + + from scippneutron.conversion.beamline import L1, straight_incident_beam + + return PrimarySpecCoordTransformGraph[RunType]( + { + "incident_beam": straight_incident_beam, + "L1": L1, + } + ) def unwrap_sample_time( - sample_events: SampleEvents, + sample_data: DataAtSample[RunType], table: TimeOfFlightLookupTable, - l1: SourceSamplePathLength, -) -> TofSampleEvents: +) -> TofData[RunType]: """Compute time-of-flight at the sample using a lookup table. Parameters ---------- - sample_events: - Binned data with 'event_time_offset' and 'event_time_zero' coordinates + sample_data: + Data with 'event_time_offset' and 'event_time_zero' coordinates describing the time-of-arrival at the sample. table: A time-of-flight lookup table. - l1: - Distance from the source to the sample. Returns ------- : - A copy of `sample_events` with a 'sample_tof' coordinate containing + A copy of ``sample_data`` with a "sample_tof" coordinate containing the time-of-flight at the sample. """ @@ -154,14 +155,14 @@ def unwrap_sample_time( params={ **time_of_flight.default_parameters(), time_of_flight.TimeOfFlightLookupTable: table, - time_of_flight.Ltotal: l1, - time_of_flight.RawData: sample_events, + time_of_flight.Ltotal: sample_data.coords['L1'], + time_of_flight.RawData: sample_data, }, ) result = pipeline.compute(time_of_flight.TofData) # This is time-of-flight at the sample. result.bins.coords['sample_tof'] = result.bins.coords.pop('tof') - return TofSampleEvents(result) + return TofData(result) def incident_direction() -> IncidentDirection: @@ -176,7 +177,6 @@ def incident_direction() -> IncidentDirection: source_position, guess_sample_name, guess_source_name, - primary_path_length, unwrap_sample_time, incident_direction, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py index b9258c326..78aa41134 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py @@ -14,6 +14,7 @@ from ..types import ( Analyzers, Choppers, + DataAtSample, DetectorData, Filename, InstrumentAngles, @@ -24,11 +25,10 @@ NXspeFileName, Position, PreopenNeXusFile, - SampleEvents, SampleRun, SourceSamplePathLength, TimeOfFlightLookupTable, - TofSampleEvents, + TofData, ) PIXEL_NAME = 'detector_number' @@ -310,12 +310,12 @@ def get_unwrapped_sample_events( Filename: filename, SampleName: sample_name, SourceName: source_name, - SampleEvents: sample_events, + DataAtSample: sample_events, TimeOfFlightLookupTable: tof_lookup_table, } pipeline = Pipeline(ki_providers, params=params) - events = pipeline.compute(TofSampleEvents) + events = pipeline.compute(TofData) events = events.bins.drop_coords(('event_time_zero', 'event_time_offset')) return params, events, None # primary @@ -843,6 +843,12 @@ def one_setting( ki_params, kf_params, unwrapped_sample_events, a3 ) + a4 = triplet_events.coords['a4'] + unwrapped_sample_events.save_hdf5( + f'data/combined-workflow/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5' + ) + raise RuntimeError("abort") + norm_events = normalise_wavelength_events( ki_params, kf_params, unwrapped_sample_events, monitor ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 8d67470e9..bb531d687 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -127,15 +127,22 @@ class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): .. NXspeFileName = NewType('NXspeFileName', str) NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) -SampleEvents = NewType('SampleEvents', sc.DataArray) -TofSampleEvents = NewType('TofSampleEvents', sc.DataArray) TofMonitor = NewType('TofMonitor', sc.DataArray) +class TofData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... -class BeamlineWithSecondarSpecCoords( +class PrimarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... + + +class BeamlineWithSpectrometerCoords( sciline.Scope[RunType, sc.DataArray], sc.DataArray ): ... + + +class DataAtSample(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... From e4d6ab4e9d892be8c85dfb46995a27bc5b7191ef Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 19 Mar 2025 10:55:58 +0100 Subject: [PATCH 111/330] Unwrap monitor times --- .../src/ess/bifrost/workflow.py | 5 ++- .../spectroscopy/indirect/normalisation.py | 38 +++++++++++++++---- .../src/ess/spectroscopy/types.py | 8 +++- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 9afaa1825..7a588834a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -6,7 +6,7 @@ import sciline from ess.reduce import time_of_flight -from ess.spectroscopy.indirect import kf, ki +from ess.spectroscopy.indirect import kf, ki, normalisation from ess.spectroscopy.types import ( DetectorData, NeXusDetectorName, @@ -46,6 +46,9 @@ def default_parameters() -> dict[type, Any]: # TODO use kf.providers kf.secondary_spectrometer_coordinate_transformation_graph, kf.move_time_to_sample, + # TODO use imported `providers` + normalisation.unwrap_monitor, + normalisation.monitor_coordinate_transformation_graph, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index 2b49a83a8..ab5cc05f6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -2,15 +2,19 @@ # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import sciline +import scipp as sc from ess.reduce import time_of_flight from ..types import ( Filename, - FrameTimeMonitor, + MonitorCoordTransformGraph, + MonitorData, MonitorName, MonitorPosition, + MonitorType, NormWavelengthEvents, + RunType, SourceMonitorPathLength, SourcePosition, TimeOfFlightLookupTable, @@ -21,6 +25,17 @@ ) +def monitor_coordinate_transformation_graph() -> MonitorCoordTransformGraph: + from scippneutron.conversion.graph import beamline, tof + + return MonitorCoordTransformGraph( + { + **beamline.beamline(scatter=False), + **tof.elastic_wavelength(start='tof'), + } + ) + + def monitor_position(file: Filename, monitor: MonitorName) -> MonitorPosition: """Extract the position of the named monitor from a NeXus file""" from scippnexus import File, compute_positions @@ -39,7 +54,6 @@ def source_monitor_path_length( HDF5 group entries are sorted alphabetically, so you should ensure that the NeXus file was constructed with this in mind. """ - import scipp as sc from scippnexus import File, NXguide, compute_positions with File(file) as data: @@ -109,21 +123,29 @@ def normalise( def unwrap_monitor( - monitor: FrameTimeMonitor, + monitor: MonitorData[RunType, MonitorType], table: TimeOfFlightLookupTable, - length: SourceMonitorPathLength, -) -> TofMonitor: + coord_transform_graph: MonitorCoordTransformGraph, +) -> TofMonitor[RunType, MonitorType]: + path_length = monitor.transform_coords( + 'Ltotal', + graph=coord_transform_graph, + keep_intermediate=False, + keep_aliases=False, + rename_dims=False, + ).coords['Ltotal'] + tof_wf = sciline.Pipeline( (*time_of_flight.providers(), time_of_flight.resample_tof_data), params={ **time_of_flight.default_parameters(), time_of_flight.TimeOfFlightLookupTable: table, - time_of_flight.Ltotal: length, - time_of_flight.RawData: monitor.rename(frame_time='tof'), + time_of_flight.Ltotal: path_length, + time_of_flight.RawData: monitor.rename(t='tof'), }, ) unwrapped = tof_wf.compute(time_of_flight.ResampledTofData) - return TofMonitor(unwrapped) + return TofMonitor[RunType, MonitorType](unwrapped) providers = ( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index bb531d687..8c9c26296 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -99,7 +99,6 @@ class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): .. MonitorName = NewType('MonitorName', str) MonitorPosition = variable_type('MonitorPosition') SourceMonitorPathLength = variable_type('SourceMonitorPathLength') -FrameTimeMonitor = data_array_type('FrameTimeMonitor') WavelengthMonitor = data_array_type('WavelengthMonitor') LabMomentumTransfer = variable_type('LabMomentumTransfer') @@ -128,7 +127,9 @@ class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): .. NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) -TofMonitor = NewType('TofMonitor', sc.DataArray) +class TofMonitor( + sciline.ScopeTwoParams[RunType, MonitorType, sc.DataArray], sc.DataArray +): ... class TofData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... @@ -140,6 +141,9 @@ class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... class PrimarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... +MonitorCoordTransformGraph = NewType('MonitorCoordTransformGraph', dict) + + class BeamlineWithSpectrometerCoords( sciline.Scope[RunType, sc.DataArray], sc.DataArray ): ... From 53088af8cef67fbe4d01ac2bef34f2c5416372cc Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 19 Mar 2025 13:38:28 +0100 Subject: [PATCH 112/330] Group data by rotation --- .../src/ess/bifrost/detector.py | 7 +++-- .../src/ess/bifrost/io/nexus.py | 2 +- .../src/ess/bifrost/slicing.py | 28 +++++++++++++++++++ .../src/ess/bifrost/workflow.py | 10 ++++--- .../src/ess/spectroscopy/indirect/kf.py | 4 +-- .../src/ess/spectroscopy/types.py | 3 ++ 6 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/bifrost/slicing.py diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 9d2f193bf..74198a7c1 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -5,7 +5,6 @@ BeamlineWithSpectrometerCoords, CalibratedBeamline, CalibratedDetector, - DetectorData, DetectorPositionOffset, FinalEnergy, NeXusComponent, @@ -126,7 +125,9 @@ def add_spectrometer_coords( ) -def merge_triplets(*triplets: DetectorData[RunType]) -> DetectorData[RunType]: +def merge_triplets( + *triplets: sc.DataArray, +) -> sc.DataArray: """Merge BIFROST detector triplets into a single data array. Parameters @@ -139,7 +140,7 @@ def merge_triplets(*triplets: DetectorData[RunType]) -> DetectorData[RunType]: : Input data arrays stacked along the "triplet" dimension. """ - return DetectorData[RunType](sc.concat(triplets, dim="triplet")) + return sc.concat(triplets, dim="triplet") providers = (add_spectrometer_coords, arc_number, get_calibrated_detector_bifrost) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index c95a728f4..6b234ceba 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) """NeXus input/output for BIFROST.""" diff --git a/packages/essspectroscopy/src/ess/bifrost/slicing.py b/packages/essspectroscopy/src/ess/bifrost/slicing.py new file mode 100644 index 000000000..cd4c692e4 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/slicing.py @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +import scipp as sc + +from ess.spectroscopy.types import ( + DataGroupedByRotation, + DetectorData, + InstrumentAngles, + RunType, +) + + +def group_by_rotation( + data: DetectorData[RunType], + angles: InstrumentAngles[RunType], +) -> DataGroupedByRotation[RunType]: + a3 = sc.lookup(angles['a3'], 'time') + a4 = sc.lookup(angles['a4'], 'time') + graph = { + 'a3': lambda event_time_zero: a3[event_time_zero], + 'a4': lambda event_time_zero: a4[event_time_zero], + } + grouped = data.transform_coords(('a3', 'a4'), graph=graph).group('a3', 'a4') + return DataGroupedByRotation[RunType](grouped) + + +providers = (group_by_rotation,) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 7a588834a..cb77dba2c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -8,7 +8,7 @@ from ess.reduce import time_of_flight from ess.spectroscopy.indirect import kf, ki, normalisation from ess.spectroscopy.types import ( - DetectorData, + DataGroupedByRotation, NeXusDetectorName, NeXusMonitorName, PulsePeriod, @@ -18,6 +18,7 @@ from .detector import merge_triplets from .detector import providers as detector_providers from .io import mcstas, nexus +from .slicing import providers as slicing_providers from .types import ( FrameMonitor0, FrameMonitor1, @@ -38,8 +39,9 @@ def default_parameters() -> dict[type, Any]: _SIMULATION_PROVIDERS = ( - *mcstas.providers, *detector_providers, + *mcstas.providers, + *slicing_providers, # TODO use ki.providers ki.primary_spectrometer_coordinate_transformation_graph, ki.unwrap_sample_time, @@ -60,8 +62,8 @@ def BifrostSimulationWorkflow(detector_names: NeXusDetectorName) -> sciline.Pipe for key, val in default_parameters().items(): workflow[key] = val - workflow[DetectorData[SampleRun]] = ( - workflow[DetectorData[SampleRun]] + workflow[DataGroupedByRotation[SampleRun]] = ( + workflow[DataGroupedByRotation[SampleRun]] .map({NeXusDetectorName: detector_names}) .reduce(func=merge_triplets) ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 29213de19..b79beaa9a 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -10,7 +10,7 @@ AnalyzerOrientation, AnalyzerPosition, DataAtSample, - DetectorData, + DataGroupedByRotation, DetectorFrameTime, DetectorGeometricA4, DetectorPosition, @@ -259,7 +259,7 @@ def secondary_spectrometer_coordinate_transformation_graph( def move_time_to_sample( - data: DetectorData[RunType], pulse_period: PulsePeriod + data: DataGroupedByRotation[RunType], pulse_period: PulsePeriod ) -> DataAtSample[RunType]: """Return the events with the event_time_offset coordinate offset to time at sample. diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 8c9c26296..f2e66923b 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -150,3 +150,6 @@ class BeamlineWithSpectrometerCoords( class DataAtSample(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + +class DataGroupedByRotation(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... From bddd25309f4e9eadd1ec8405848ddc94159af847 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 19 Mar 2025 16:31:20 +0100 Subject: [PATCH 113/330] Convert to transfer coordinates --- .../src/ess/bifrost/detector.py | 41 +---- .../src/ess/bifrost/workflow.py | 2 + .../ess/spectroscopy/indirect/conservation.py | 11 +- .../ess/spectroscopy/indirect/conversion.py | 161 ++++++++++++++++++ .../src/ess/spectroscopy/indirect/kf.py | 5 +- .../src/ess/spectroscopy/indirect/ki.py | 2 + .../src/ess/spectroscopy/types.py | 4 + 7 files changed, 174 insertions(+), 52 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 74198a7c1..464e65046 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -2,16 +2,12 @@ import scippnexus as snx from ess.spectroscopy.types import ( - BeamlineWithSpectrometerCoords, - CalibratedBeamline, CalibratedDetector, DetectorPositionOffset, FinalEnergy, NeXusComponent, NeXusTransformation, - PrimarySpecCoordTransformGraph, RunType, - SecondarySpecCoordTransformGraph, ) from .types import ArcNumber @@ -90,41 +86,6 @@ def get_calibrated_detector_bifrost( return CalibratedDetector[RunType](da) -def add_spectrometer_coords( - data: CalibratedBeamline[RunType], - primary_graph: PrimarySpecCoordTransformGraph[RunType], - secondary_graph: SecondarySpecCoordTransformGraph[RunType], -) -> BeamlineWithSpectrometerCoords[RunType]: - """Compute and add coordinates for the spectrometer. - - Parameters - ---------- - data: - Data array with beamline coordinates "position", "source_position", and - "sample_position". - Does not need to contain events or flight times. - primary_graph: - Coordinate transformation graph for the primary spectrometer. - secondary_graph: - Coordinate transformation graph for the secondary spectrometer. - Must be a closure over analyzer parameters. - And those parameters must have a compatible shape with ``data``. - - Returns - ------- - : - Input data with added spectrometer coordinates. - This includes "final_energy", "secondary_flight_time", and "L1". - """ - return data.transform_coords( - ("final_energy", "L1", "secondary_flight_time"), - graph={**primary_graph, **secondary_graph}, - keep_intermediate=False, - keep_aliases=False, - rename_dims=False, - ) - - def merge_triplets( *triplets: sc.DataArray, ) -> sc.DataArray: @@ -143,4 +104,4 @@ def merge_triplets( return sc.concat(triplets, dim="triplet") -providers = (add_spectrometer_coords, arc_number, get_calibrated_detector_bifrost) +providers = (arc_number, get_calibrated_detector_bifrost) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index cb77dba2c..59e4583e6 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -7,6 +7,7 @@ from ess.reduce import time_of_flight from ess.spectroscopy.indirect import kf, ki, normalisation +from ess.spectroscopy.indirect.conversion import providers as conversion_providers from ess.spectroscopy.types import ( DataGroupedByRotation, NeXusDetectorName, @@ -39,6 +40,7 @@ def default_parameters() -> dict[type, Any]: _SIMULATION_PROVIDERS = ( + *conversion_providers, *detector_providers, *mcstas.providers, *slicing_providers, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py index 9469ccf9a..eaf3270b7 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py @@ -4,9 +4,6 @@ from scipp import vector from ..types import ( - EnergyTransfer, - FinalEnergy, - IncidentEnergy, LabMomentumTransfer, SampleTableAngle, TableMomentumTransfer, @@ -18,6 +15,7 @@ PERP, VERT, PARALLEL = (vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])) +# TODO remove def sample_table_momentum_vector( a3: SampleTableAngle, q: LabMomentumTransfer ) -> TableMomentumTransfer: @@ -44,15 +42,8 @@ def sample_table_momentum_vector( return rotations_from_rotvecs(-a3 * VERT) * q -def energy_transfer( - incident_energy: IncidentEnergy, final_energy: FinalEnergy -) -> EnergyTransfer: - return incident_energy - final_energy - - providers = ( *ki_providers, *kf_providers, sample_table_momentum_vector, - energy_transfer, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py new file mode 100644 index 000000000..895b68080 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -0,0 +1,161 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +import numpy as np +import scipp as sc +from scippneutron.conversion.tof import energy_from_wavelength, wavelength_from_tof + +from ..types import ( + BeamlineWithSpectrometerCoords, + CalibratedBeamline, + EnergyData, + GravityVector, + InelasticCoordTransformGraph, + PrimarySpecCoordTransformGraph, + RunType, + SecondarySpecCoordTransformGraph, + TofData, +) +from ..utils import in_same_unit + + +def incident_energy_from_wavelength(*, incident_wavelength: sc.Variable) -> sc.Variable: + return energy_from_wavelength(wavelength=incident_wavelength) + + +def incident_wavelength_from_tof( + *, sample_tof: sc.Variable, L1: sc.Variable +) -> sc.Variable: + return wavelength_from_tof(tof=sample_tof, Ltotal=L1) + + +def incident_wavevector_from_incident_wavelength( + *, incident_wavelength: sc.Variable, incident_beam: sc.Variable +) -> sc.Variable: + return 2 * np.pi * incident_beam / sc.norm(incident_beam) / incident_wavelength + + +def energy_transfer( + *, incident_energy: sc.Variable, final_energy: sc.Variable +) -> sc.Variable: + return incident_energy - final_energy + + +def lab_momentum_transfer_from_wavevectors( + incident_wavevector: sc.Variable, final_wavevector: sc.Variable +) -> sc.Variable: + return in_same_unit(final_wavevector, incident_wavevector) - incident_wavevector + + +def rotate_to_sample_table_momentum_transfer( + *, + a3: sc.Variable, + lab_momentum_transfer: sc.Variable, + gravity: sc.Variable, +) -> sc.Variable: + """Rotate the momentum transfer vector into the sample-table coordinate system + + Notes + ----- + When a3 is zero, the sample-table and lab coordinate systems are the same. + That is, Z is along the incident beam, Y is opposite the gravitational force, + and X completes the right-handed coordinate system. The sample-table angle, a3, + has a rotation vector along Y, such that a positive 90-degree rotation places the + sample-table Z along the lab X. + + Parameters + ---------- + a3: + The rotation angle of the sample table around the laboratory Y axis + lab_momentum_transfer: + The momentum transfer in the laboratory coordinate system + gravity: + The gravity vector which indicates the vertical axis. + """ + vertical = -gravity / sc.norm(gravity) + # negative a3 since we rotate coordinates not axes here + return sc.spatial.rotations_from_rotvecs(-a3 * vertical) * lab_momentum_transfer + + +def inelastic_coordinate_transformation_graph_at_sample( + gravity: GravityVector, +) -> InelasticCoordTransformGraph: + return InelasticCoordTransformGraph( + { + 'energy_transfer': energy_transfer, + 'incident_energy': incident_energy_from_wavelength, + 'incident_wavelength': incident_wavelength_from_tof, + 'incident_wavevector': incident_wavevector_from_incident_wavelength, + 'gravity': lambda: gravity, + 'lab_momentum_transfer': lab_momentum_transfer_from_wavevectors, + 'sample_table_momentum_transfer': rotate_to_sample_table_momentum_transfer, + } + ) + + +def add_inelastic_coordinates( + data: TofData[RunType], graph: InelasticCoordTransformGraph +) -> EnergyData[RunType]: + transformed = data.transform_coords( + [ + # TODO pick minimal list of coords + 'energy_transfer', + 'incident_wavelength', + 'incident_energy', + 'lab_momentum_transfer', + 'sample_table_momentum_transfer', + ], + graph=graph, + keep_aliases=False, + keep_inputs=False, + keep_intermediate=False, + ) + return EnergyData[RunType](transformed) + + +def add_spectrometer_coords( + data: CalibratedBeamline[RunType], + primary_graph: PrimarySpecCoordTransformGraph[RunType], + secondary_graph: SecondarySpecCoordTransformGraph[RunType], +) -> BeamlineWithSpectrometerCoords[RunType]: + """Compute and add coordinates for the spectrometer. + + Parameters + ---------- + data: + Data array with beamline coordinates "position", "source_position", and + "sample_position". + Does not need to contain events or flight times. + primary_graph: + Coordinate transformation graph for the primary spectrometer. + secondary_graph: + Coordinate transformation graph for the secondary spectrometer. + Must be a closure over analyzer parameters. + And those parameters must have a compatible shape with ``data``. + + Returns + ------- + : + Input data with added spectrometer coordinates. + This includes "final_energy", "secondary_flight_time", and "L1". + """ + return data.transform_coords( + ( + "final_energy", + "final_wavevector", + "incident_beam", + "L1", + "secondary_flight_time", + ), + graph={**primary_graph, **secondary_graph}, + keep_intermediate=False, + keep_aliases=False, + rename_dims=False, + ) + + +providers = ( + add_inelastic_coordinates, + add_spectrometer_coords, + inelastic_coordinate_transformation_graph_at_sample, +) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index b79beaa9a..bf967b8d6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -195,10 +195,10 @@ def final_energy(final_wavenumber: FinalWavenumber) -> FinalEnergy: def final_wavevector( - kf_direction: SampleAnalyzerDirection, kf_magnitude: FinalWavenumber + sample_analyzer_vector: SampleAnalyzerVector, final_wavenumber: FinalWavenumber ) -> FinalWavevector: """Constructs the final wave vector form its direction and magnitude""" - return kf_direction * kf_magnitude + return sample_analyzer_vector / sc.norm(sample_analyzer_vector) * final_wavenumber def secondary_flight_path_length( @@ -252,6 +252,7 @@ def secondary_spectrometer_coordinate_transformation_graph( "analyzer_detector_vector": analyzer_detector_vector, "final_energy": final_energy, "final_wavenumber": final_wavenumber, + "final_wavevector": final_wavevector, "L2": secondary_flight_path_length, "secondary_flight_time": secondary_flight_time, } diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index e3cb186e0..2911d6af8 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -162,6 +162,8 @@ def unwrap_sample_time( result = pipeline.compute(time_of_flight.TofData) # This is time-of-flight at the sample. result.bins.coords['sample_tof'] = result.bins.coords.pop('tof') + del result.bins.coords['event_time_offset'] + del result.bins.coords['event_time_zero'] return TofData(result) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index f2e66923b..df1f810bc 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -135,12 +135,16 @@ class TofMonitor( class TofData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class EnergyData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... class PrimarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... +InelasticCoordTransformGraph = NewType('InelasticCoordTransformGraph', dict) MonitorCoordTransformGraph = NewType('MonitorCoordTransformGraph', dict) From 98f78e915a223e4f76add0b61c2d5ced53c8de83 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 19 Mar 2025 16:47:43 +0100 Subject: [PATCH 114/330] Convert to inelastic coords --- .../src/ess/bifrost/workflow.py | 1 - .../ess/spectroscopy/indirect/conversion.py | 41 ++++++++++++++++--- .../spectroscopy/indirect/normalisation.py | 11 ----- .../src/ess/spectroscopy/types.py | 6 ++- 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 59e4583e6..1f6cc1bd5 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -52,7 +52,6 @@ def default_parameters() -> dict[type, Any]: kf.move_time_to_sample, # TODO use imported `providers` normalisation.unwrap_monitor, - normalisation.monitor_coordinate_transformation_graph, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 895b68080..b8d0b4df4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -11,10 +11,14 @@ EnergyData, GravityVector, InelasticCoordTransformGraph, + MonitorCoordTransformGraph, + MonitorType, PrimarySpecCoordTransformGraph, RunType, SecondarySpecCoordTransformGraph, TofData, + TofMonitor, + WavelengthMonitor, ) from ..utils import in_same_unit @@ -104,11 +108,15 @@ def add_inelastic_coordinates( 'incident_energy', 'lab_momentum_transfer', 'sample_table_momentum_transfer', + # These are inputs but we want to preserve them + 'a3', + 'a4', ], graph=graph, keep_aliases=False, keep_inputs=False, keep_intermediate=False, + rename_dims=False, ) return EnergyData[RunType](transformed) @@ -141,11 +149,11 @@ def add_spectrometer_coords( """ return data.transform_coords( ( - "final_energy", - "final_wavevector", - "incident_beam", - "L1", - "secondary_flight_time", + 'final_energy', + 'final_wavevector', + 'incident_beam', + 'L1', + 'secondary_flight_time', ), graph={**primary_graph, **secondary_graph}, keep_intermediate=False, @@ -154,8 +162,31 @@ def add_spectrometer_coords( ) +def monitor_coordinate_transformation_graph() -> MonitorCoordTransformGraph: + from scippneutron.conversion.graph import beamline, tof + + return MonitorCoordTransformGraph( + { + **beamline.beamline(scatter=False), + **tof.elastic_wavelength(start='tof'), + } + ) + + +def add_monitor_wavelength_coords( + monitor: TofMonitor[RunType, MonitorType], graph: MonitorCoordTransformGraph +) -> WavelengthMonitor[RunType, MonitorType]: + return WavelengthMonitor[RunType, MonitorType]( + monitor.transform_coords( + 'wavelength', graph=graph, keep_intermediate=False, keep_aliases=False + ) + ) + + providers = ( add_inelastic_coordinates, + add_monitor_wavelength_coords, add_spectrometer_coords, inelastic_coordinate_transformation_graph_at_sample, + monitor_coordinate_transformation_graph, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py index ab5cc05f6..144bda860 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py @@ -25,17 +25,6 @@ ) -def monitor_coordinate_transformation_graph() -> MonitorCoordTransformGraph: - from scippneutron.conversion.graph import beamline, tof - - return MonitorCoordTransformGraph( - { - **beamline.beamline(scatter=False), - **tof.elastic_wavelength(start='tof'), - } - ) - - def monitor_position(file: Filename, monitor: MonitorName) -> MonitorPosition: """Extract the position of the named monitor from a NeXus file""" from scippnexus import File, compute_positions diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index df1f810bc..b2b0c37cf 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -99,7 +99,6 @@ class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): .. MonitorName = NewType('MonitorName', str) MonitorPosition = variable_type('MonitorPosition') SourceMonitorPathLength = variable_type('SourceMonitorPathLength') -WavelengthMonitor = data_array_type('WavelengthMonitor') LabMomentumTransfer = variable_type('LabMomentumTransfer') @@ -132,6 +131,11 @@ class TofMonitor( ): ... +class WavelengthMonitor( + sciline.ScopeTwoParams[RunType, MonitorType, sc.DataArray], sc.DataArray +): ... + + class TofData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... From b4339e279cb8ad301e87353da6b18c5cd4f248ff Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 10:58:55 +0100 Subject: [PATCH 115/330] Fix workflow tests --- .../tests/bifrost/workflow_test.py | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 4daa3aa51..8c7c5455c 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -1,5 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +import pytest +import sciline +import scippnexus as snx from ess import bifrost from ess.bifrost.data import simulated_elastic_incoherent_with_phonon @@ -15,11 +18,27 @@ ) +@pytest.fixture(scope='module') +def simulation_detector_names() -> list[NeXusDetectorName]: + with snx.File(simulated_elastic_incoherent_with_phonon()) as f: + names = list(f['entry']['instrument'][snx.NXdetector].keys()) + return names[:5] # These should be enough to test the workflow. + + +@pytest.fixture +def workflow(simulation_detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: + workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) + workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() + return workflow + + def test_simulation_workflow_can_load_detector() -> None: - workflow = bifrost.BifrostSimulationWorkflow() + workflow = bifrost.BifrostSimulationWorkflow( + [NeXusDetectorName("125_channel_1_1_triplet")] + ) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[NeXusDetectorName] = "125_channel_1_1_triplet" - result = workflow.compute(DetectorData[SampleRun]) + results = sciline.compute_mapped(workflow, DetectorData[SampleRun]) + result = results.iloc[0] assert result.bins is not None assert set(result.dims) == {'tube', 'length'} @@ -29,9 +48,7 @@ def test_simulation_workflow_can_load_detector() -> None: assert 'source_position' in result.coords -def test_simulation_workflow_can_load_monitor() -> None: - workflow = bifrost.BifrostSimulationWorkflow() - workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() +def test_simulation_workflow_can_load_monitor(workflow: sciline.Pipeline) -> None: result = workflow.compute(MonitorData[SampleRun, FrameMonitor3]) assert result.bins is None @@ -40,9 +57,7 @@ def test_simulation_workflow_can_load_monitor() -> None: assert 'source_position' in result.coords -def test_simulation_workflow_can_load_analyzers() -> None: - workflow = bifrost.BifrostSimulationWorkflow() - workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() +def test_simulation_workflow_can_load_analyzers(workflow: sciline.Pipeline) -> None: analyzers = workflow.compute(Analyzers[SampleRun]) assert len(analyzers) == 45 @@ -51,9 +66,7 @@ def test_simulation_workflow_can_load_analyzers() -> None: assert 'd_spacing' in first -def test_simulation_workflow_can_load_choppers() -> None: - workflow = bifrost.BifrostSimulationWorkflow() - workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() +def test_simulation_workflow_can_load_choppers(workflow: sciline.Pipeline) -> None: choppers = workflow.compute(Choppers[SampleRun]) assert choppers.keys() == { From 0f77c2675fbf72372bd637e5db39716fe337e25a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 11:06:25 +0100 Subject: [PATCH 116/330] Test that workflow produces expected coords --- .../src/ess/bifrost/workflow.py | 4 +- .../tests/bifrost/workflow_test.py | 39 ++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 1f6cc1bd5..e35c47ebe 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -55,7 +55,9 @@ def default_parameters() -> dict[type, Any]: ) -def BifrostSimulationWorkflow(detector_names: NeXusDetectorName) -> sciline.Pipeline: +def BifrostSimulationWorkflow( + detector_names: list[NeXusDetectorName], +) -> sciline.Pipeline: """Data reduction workflow for simulated BIFROST data.""" workflow = nexus.LoadNeXusWorkflow() for provider in _SIMULATION_PROVIDERS: diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 8c7c5455c..cf276970b 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -2,19 +2,25 @@ # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import pytest import sciline +import scipp as sc import scippnexus as snx from ess import bifrost -from ess.bifrost.data import simulated_elastic_incoherent_with_phonon +from ess.bifrost.data import ( + simulated_elastic_incoherent_with_phonon, + tof_lookup_table_simulation, +) from ess.bifrost.types import FrameMonitor3 from ess.spectroscopy.types import ( Analyzers, Choppers, DetectorData, + EnergyData, Filename, MonitorData, NeXusDetectorName, SampleRun, + TimeOfFlightLookupTable, ) @@ -29,6 +35,7 @@ def simulation_detector_names() -> list[NeXusDetectorName]: def workflow(simulation_detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() + workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation()) return workflow @@ -81,3 +88,33 @@ def test_simulation_workflow_can_load_choppers(workflow: sciline.Pipeline) -> No assert 'position' in first assert 'rotation_speed' in first assert first['slit_edges'].shape == (2,) + + +def test_simulation_workflow_can_compute_energy_data( + workflow: sciline.Pipeline, +) -> None: + energy_data = workflow.compute(EnergyData[SampleRun]) + + assert energy_data.sizes == { + 'triplet': 5, + 'tube': 3, + 'length': 100, + 'a3': 180, + 'a4': 1, + } + expected_coords = {'a3', 'a4', 'detector_number'} + assert expected_coords.issubset(energy_data.coords) + expected_event_coords = { + 'incident_wavelength', + 'energy_transfer', + 'lab_momentum_transfer', + 'sample_table_momentum_transfer', + } + assert expected_event_coords.issubset(energy_data.bins.coords) + + # Check that conversions do not raise, i.e., units have expected dimensions. + energy_data.coords['a3'].to(unit='rad') + energy_data.coords['a4'].to(unit='rad') + energy_data.bins.coords['energy_transfer'].to(unit='meV') + energy_data.bins.coords['lab_momentum_transfer'].to(unit='1/Ã…') + energy_data.bins.coords['sample_table_momentum_transfer'].to(unit='1/Ã…') From e965b461879f5455b102dee7df36fc6ba36e7508 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 11:15:14 +0100 Subject: [PATCH 117/330] Test that monitor can be converted --- .../essspectroscopy/tests/bifrost/workflow_test.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index cf276970b..15295f29a 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -21,6 +21,7 @@ NeXusDetectorName, SampleRun, TimeOfFlightLookupTable, + WavelengthMonitor, ) @@ -118,3 +119,13 @@ def test_simulation_workflow_can_compute_energy_data( energy_data.bins.coords['energy_transfer'].to(unit='meV') energy_data.bins.coords['lab_momentum_transfer'].to(unit='1/Ã…') energy_data.bins.coords['sample_table_momentum_transfer'].to(unit='1/Ã…') + + +def test_simulation_workflow_can_compute_wavelength_monitor( + workflow: sciline.Pipeline, +) -> None: + monitor = workflow.compute(WavelengthMonitor[SampleRun, FrameMonitor3]) + assert set(monitor.dims) == {'time', 'wavelength'} + expected_coords = {'position', 'wavelength', 'time'} + assert expected_coords.issubset(monitor.coords) + assert monitor.bins is None From bec3bf7a129b3d996e57f3bd0b03536b792fc74b Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 11:26:15 +0100 Subject: [PATCH 118/330] Remove unused functions and types --- .../src/ess/bifrost/detector.py | 14 +- .../essspectroscopy/src/ess/bifrost/types.py | 7 +- .../src/ess/bifrost/workflow.py | 15 +- .../src/ess/spectroscopy/indirect/__init__.py | 10 +- .../ess/spectroscopy/indirect/conservation.py | 49 - .../src/ess/spectroscopy/indirect/io.py | 4 +- .../src/ess/spectroscopy/indirect/kf.py | 171 ++- .../src/ess/spectroscopy/indirect/ki.py | 95 +- .../spectroscopy/indirect/normalisation.py | 145 --- .../spectroscopy/indirect/normalization.py | 44 + .../src/ess/spectroscopy/indirect/workflow.py | 1120 ----------------- .../src/ess/spectroscopy/types.py | 121 +- .../src/ess/spectroscopy/utils.py | 30 +- 13 files changed, 172 insertions(+), 1653 deletions(-) delete mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py delete mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py delete mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 464e65046..62c081261 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -2,9 +2,9 @@ import scippnexus as snx from ess.spectroscopy.types import ( + BeamlineWithSpectrometerCoords, CalibratedDetector, DetectorPositionOffset, - FinalEnergy, NeXusComponent, NeXusTransformation, RunType, @@ -13,7 +13,9 @@ from .types import ArcNumber -def arc_number(final_energy: FinalEnergy) -> ArcNumber: +def arc_number( + beamline: BeamlineWithSpectrometerCoords[RunType], +) -> ArcNumber[RunType]: """Calculate BIFROST arc index number from pixel final energy The BIFROST analyzers are each set to diffract an @@ -27,8 +29,9 @@ def arc_number(final_energy: FinalEnergy) -> ArcNumber: Parameters ---------- - final_energy: scipp.Variable - The per-pixel (or event) final neutron energy + beamline: + A data array with a 'final_energy' coordinate which is the + per-pixel (or event) final neutron energy. Returns ------- @@ -37,7 +40,8 @@ def arc_number(final_energy: FinalEnergy) -> ArcNumber: """ minimum = sc.scalar(2.7, unit='meV') step = sc.scalar(0.575, unit='meV') - return sc.round((final_energy - minimum) / step).to(dtype='int') + final_energy = beamline.coords['final_energy'] + return ArcNumber[RunType](sc.round((final_energy - minimum) / step).to(dtype='int')) def get_calibrated_detector_bifrost( diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 1941b6e07..e6cb4dbf1 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -1,4 +1,5 @@ -from typing import NewType +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import sciline import scipp as sc @@ -6,7 +7,9 @@ from ess.reduce.nexus import types as reduce_t from ess.spectroscopy.types import RunType -ArcNumber = NewType('ArcNumber', sc.Variable) + +class ArcNumber(sciline.Scope[RunType, sc.Variable], sc.Variable): ... + # See https://github.com/scipp/essreduce/issues/105 about monitor names FrameMonitor0 = reduce_t.Monitor1 diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index e35c47ebe..a95f1001b 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -6,8 +6,10 @@ import sciline from ess.reduce import time_of_flight -from ess.spectroscopy.indirect import kf, ki, normalisation from ess.spectroscopy.indirect.conversion import providers as conversion_providers +from ess.spectroscopy.indirect.kf import providers as kf_providers +from ess.spectroscopy.indirect.ki import providers as ki_providers +from ess.spectroscopy.indirect.normalization import providers as normalisation_providers from ess.spectroscopy.types import ( DataGroupedByRotation, NeXusDetectorName, @@ -44,14 +46,9 @@ def default_parameters() -> dict[type, Any]: *detector_providers, *mcstas.providers, *slicing_providers, - # TODO use ki.providers - ki.primary_spectrometer_coordinate_transformation_graph, - ki.unwrap_sample_time, - # TODO use kf.providers - kf.secondary_spectrometer_coordinate_transformation_graph, - kf.move_time_to_sample, - # TODO use imported `providers` - normalisation.unwrap_monitor, + *ki_providers, + *kf_providers, + *normalisation_providers, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py index 1803430db..2d643f861 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py @@ -1,10 +1,2 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) - -from .workflow import bifrost, bifrost_single, bifrost_to_nxspe - -__all__ = ( - "bifrost", - "bifrost_single", - "bifrost_to_nxspe", -) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py deleted file mode 100644 index eaf3270b7..000000000 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conservation.py +++ /dev/null @@ -1,49 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) - -from scipp import vector - -from ..types import ( - LabMomentumTransfer, - SampleTableAngle, - TableMomentumTransfer, -) -from .kf import providers as kf_providers -from .ki import providers as ki_providers - -# Directions relative to the incident beam coordinate system -PERP, VERT, PARALLEL = (vector(v) for v in ([1, 0, 0], [0, 1, 0], [0, 0, 1])) - - -# TODO remove -def sample_table_momentum_vector( - a3: SampleTableAngle, q: LabMomentumTransfer -) -> TableMomentumTransfer: - """Rotate the momentum transfer vector into the sample-table coordinate system - - Notes - ----- - When a3 is zero, the sample-table and lab coordinate systems are the same. - That is, Z is along the incident beam, Y is opposite the gravitational force, - and X completes the right-handed coordinate system. The sample-table angle, a3, - has a rotation vector along Y, such that a positive 90-degree rotation places the - sample-table Z along the lab X. - - Parameters - ---------- - a3: - The rotation angle of the sample table around the laboratory Y axis - q: - The momentum transfer in the laboratory coordinate system - """ - from scipp.spatial import rotations_from_rotvecs - - # negative a3 since we rotate coordinates not axes here - return rotations_from_rotvecs(-a3 * VERT) * q - - -providers = ( - *ki_providers, - *kf_providers, - sample_table_momentum_vector, -) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index 2175457f1..fe2c59ba6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -8,10 +8,10 @@ import scippnexus from scipp import DataArray -from ..types import NormWavelengthEvents, NXspeFileName, NXspeFileNames +from ..types import EnergyData, NXspeFileName, NXspeFileNames, SampleRun -def to_nxspe(events: NormWavelengthEvents, base: NXspeFileName) -> NXspeFileNames: +def to_nxspe(events: EnergyData[SampleRun], base: NXspeFileName) -> NXspeFileNames: """Take events, which have been binned in incident wavelength and have monitor counts per bin, and output one NXspe file per setting diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index bf967b8d6..cdc5936b2 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -2,30 +2,16 @@ # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import numpy as np import scipp as sc +from scippneutron.conversion.beamline import ( + BeamAlignedUnitVectors, +) from ess.spectroscopy.types import ( Analyzer, - AnalyzerDetectorVector, - AnalyzerDspacing, - AnalyzerOrientation, - AnalyzerPosition, DataAtSample, DataGroupedByRotation, - DetectorFrameTime, - DetectorGeometricA4, - DetectorPosition, - FinalEnergy, - FinalWavenumber, - FinalWavevector, PulsePeriod, - ReciprocalLatticeVectorAbsolute, RunType, - SampleAnalyzerDirection, - SampleAnalyzerVector, - SampleDetectorFlightTime, - SampleDetectorPathLength, - SampleFrameTime, - SamplePosition, SecondarySpecCoordTransformGraph, ) @@ -33,11 +19,11 @@ def sample_analyzer_vector( - sample_position: SamplePosition, - analyzer_position: AnalyzerPosition, - analyzer_transform: AnalyzerOrientation, - detector_position: DetectorPosition, -) -> SampleAnalyzerVector: + sample_position: sc.Variable, + analyzer_position: sc.Variable, + analyzer_transform: sc.Variable, + detector_position: sc.Variable, +) -> sc.Variable: """Determine the sample to analyzer-reflection-point vector per detector element Note @@ -49,28 +35,27 @@ def sample_analyzer_vector( Parameters ---------- - sample_position: scipp.DType.vector3 - The (probably singular) sample position, typically (0, 0, 0) - analyzer_position: scipp.DType.vector3 - The nominal center of the central analyzer blade *surface* - analyzer_transform: scipp.DType.rotate3 - The orienting quaternion of the analyzer, used to identify the crystal y-axis - detector_position: scipp.DType.vector3 - The position of the detector element + sample_position: + The (probably scalar) sample position, typically vector (0, 0, 0). + analyzer_position: + The nominal center of the central analyzer blade *surface*. + analyzer_transform: + The transform that places and rotates the analyzer in lab space. + Only the rotation is extracted to identify the crystal y-axis. + detector_position: + The position of the detector element. Returns ------- : The vector from the sample position to the interaction point on the analyzer - for each detector element + for each detector element. """ - from scipp import dot, vector - # Scipp does not distinguish between coordinates and directions, so we need to do # some extra legwork to ensure we can apply the orientation transformation # _and_ obtain a dimensionless direction vector - o = vector([0, 0, 0], unit=analyzer_transform.unit) - y = vector( + o = sc.vector([0, 0, 0], unit=analyzer_transform.unit) + y = sc.vector( [0, 1, 0], unit=analyzer_transform.unit ) # and y perpendicular to the scattering plane yhat = analyzer_transform * y - analyzer_transform * o @@ -79,7 +64,7 @@ def sample_analyzer_vector( sample_analyzer_center_vector = analyzer_position - sample_position sample_detector_vector = detector_position - sample_position - sd_out_of_plane = dot(sample_detector_vector, yhat) + sd_out_of_plane = sc.dot(sample_detector_vector, yhat) # the sample-detector vector is the sum of sample-analyzer, # analyzer-detector-center, the out-of-plane vector analyzer_detector_center_vector = ( @@ -102,76 +87,73 @@ def sample_analyzer_vector( return sample_analyzer_center_vector + sa_out_of_plane * yhat -def detector_geometric_a4(vec: SampleAnalyzerVector) -> DetectorGeometricA4: +def detector_geometric_a4( + *, + sample_analyzer_vector: sc.Variable, + beam_aligned_unit_vectors: BeamAlignedUnitVectors, +) -> sc.Variable: """Calculate the scattering angle from the incident beam to each detector element Parameters ---------- - vec : scipp.DType.vector3 + sample_analyzer_vector: The per detector element analyzer interaction position, as determined - by `sample_analyzer_vector` + by :func:`sample_analyzer_vector`. + beam_aligned_unit_vectors: + Unit vectors defining the coordinate system aligned with the incident beam + and gravity. + See :func:`scippneutron.conversion.beamline.beam_aligned_unit_vectors`. Returns ------- : The per detector element scattering angle, a4, in degrees. """ - from scipp import atan2, dot, vector - - lab_x = vector( - [1, 0, 0] - ) # perpendicular to the incident beam, in the horizontal plane - lab_z = vector([0, 0, 1]) # along the incident beam direction - return atan2(y=dot(lab_x, vec), x=dot(lab_z, vec)).to(unit='deg') + lab_x = beam_aligned_unit_vectors['beam_aligned_unit_x'] + lab_z = beam_aligned_unit_vectors['beam_aligned_unit_z'] + x = sc.dot(lab_x, sample_analyzer_vector) + z = sc.dot(lab_z, sample_analyzer_vector) + return sc.atan2(y=x, x=z).to(unit='deg') def analyzer_detector_vector( - sample_position: SamplePosition, - sample_analyzer_vector: SampleAnalyzerVector, - detector_position: DetectorPosition, -) -> AnalyzerDetectorVector: + sample_position: sc.Variable, + sample_analyzer_vector: sc.Variable, + detector_position: sc.Variable, +) -> sc.Variable: """Calculate the analyzer-detector vector""" return detector_position - (sample_position + sample_analyzer_vector) -def kf_hat(sample_analyzer_vec: SampleAnalyzerVector) -> SampleAnalyzerDirection: - """Calculate the direction of the neutrons for each detector-element""" - return sample_analyzer_vec / sc.norm(sample_analyzer_vec) - - -def reciprocal_lattice_spacing(tau_vector: ReciprocalLatticeVectorAbsolute): - """Calculate the distance between lattice planes in, e.g., the analyzer""" - return sc.norm(tau_vector) - - def final_wavenumber( - sample_analyzer_vector: SampleAnalyzerVector, - analyzer_detector_vector: AnalyzerDetectorVector, - analyzer_dspacing: AnalyzerDspacing, -) -> FinalWavenumber: - """Find the wave number of the neutrons reflected to each detector-element + sample_analyzer_vector: sc.Variable, + analyzer_detector_vector: sc.Variable, + analyzer_dspacing: sc.Variable, +) -> sc.Variable: + r"""Find the wave number of the neutrons reflected to each detector-element. The wave number and wavelength are inversely proportional with - wavelength = 2 * pi / wavenumber + + .. math:: + + \text{wavelength} = 2 * \pi / \text{wavenumber} Parameters ---------- - sample_analyzer_vector : scipp.DType.vector3 + sample_analyzer_vector: The vector from the sample to the analyzer interaction point for each - detector element - analyzer_detector_vector: scipp.DType.vector3 + detector element. + analyzer_detector_vector: The vector from the analyzer interaction point to its detector element, - for each detector element - analyzer_dspacing: float-like + for each detector element. + analyzer_dspacing: The lattice plane spacing of the analyzer crystal. Returns ------- : - The magnitude of the reflected neutron wave vector for each detector element + The magnitude of the reflected neutron wave vector for each detector element. """ - from scipp import sqrt - # law of Cosines gives the scattering angle based on distances: l_sa = sc.norm(sample_analyzer_vector) l_ad = sc.norm(analyzer_detector_vector) @@ -182,10 +164,10 @@ def final_wavenumber( cos2theta = (l_diff * l_diff - l_sa * l_sa - l_ad * l_ad) / (2 * l_sa * l_ad) # law of Cosines gives the Bragg reflected wavevector magnitude - return 2 * np.pi / analyzer_dspacing / sqrt(2 - 2 * cos2theta) + return 2 * np.pi / analyzer_dspacing / sc.sqrt(2 - 2 * cos2theta) -def final_energy(final_wavenumber: FinalWavenumber) -> FinalEnergy: +def final_energy(final_wavenumber: sc.Variable) -> sc.Variable: """Converts (final) wave number to (final) energy""" from scipp.constants import hbar, neutron_mass @@ -195,23 +177,23 @@ def final_energy(final_wavenumber: FinalWavenumber) -> FinalEnergy: def final_wavevector( - sample_analyzer_vector: SampleAnalyzerVector, final_wavenumber: FinalWavenumber -) -> FinalWavevector: + sample_analyzer_vector: sc.Variable, final_wavenumber: sc.Variable +) -> sc.Variable: """Constructs the final wave vector form its direction and magnitude""" return sample_analyzer_vector / sc.norm(sample_analyzer_vector) * final_wavenumber def secondary_flight_path_length( - sample_analyzer_vector: SampleAnalyzerVector, - analyzer_detector_vector: AnalyzerDetectorVector, -) -> SampleDetectorPathLength: + sample_analyzer_vector: sc.Variable, + analyzer_detector_vector: sc.Variable, +) -> sc.Variable: """Returns the path-length-distance between the sample and each detector element""" return sc.norm(sample_analyzer_vector) + sc.norm(analyzer_detector_vector) def secondary_flight_time( - L2: SampleDetectorPathLength, final_wavenumber: FinalWavenumber -) -> SampleDetectorFlightTime: + L2: sc.Variable, final_wavenumber: sc.Variable +) -> sc.Variable: """Calculates the most-likely time-of-flight between the sample and each pixel""" from scipp.constants import hbar, neutron_mass @@ -219,13 +201,6 @@ def secondary_flight_time( return sc.to_unit(L2 / velocity, 'ms', copy=False) -def sample_frame_time( - detector_time: DetectorFrameTime, secondary_time: SampleDetectorFlightTime -) -> SampleFrameTime: - """Return the time each neutron likely interacted with the sample""" - return detector_time - secondary_time - - def secondary_spectrometer_coordinate_transformation_graph( analyzer: Analyzer[RunType], ) -> SecondarySpecCoordTransformGraph[RunType]: @@ -242,11 +217,15 @@ def secondary_spectrometer_coordinate_transformation_graph( Coordinate transformation graph for the secondary spectrometer. The graph captures the relevant parameters of ``analyzer``. """ + from scippneutron.conversion.beamline import beam_aligned_unit_vectors + return SecondarySpecCoordTransformGraph[RunType]( { + "a4": detector_geometric_a4, "analyzer_dspacing": lambda: analyzer["dspacing"], "analyzer_position": lambda: analyzer["position"], "analyzer_transform": lambda: analyzer["transform"], + "beam_aligned_unit_vectors": beam_aligned_unit_vectors, "detector_position": "position", "sample_analyzer_vector": sample_analyzer_vector, "analyzer_detector_vector": analyzer_detector_vector, @@ -292,14 +271,6 @@ def move_time_to_sample( providers = ( - sample_analyzer_vector, - analyzer_detector_vector, - kf_hat, - final_wavenumber, - final_wavevector, - secondary_flight_path_length, - secondary_flight_time, - sample_frame_time, - final_energy, - detector_geometric_a4, + secondary_spectrometer_coordinate_transformation_graph, + move_time_to_sample, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 2911d6af8..c684b0020 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -8,99 +8,17 @@ from __future__ import annotations import sciline -from scippnexus import Group from ess.reduce import time_of_flight from ess.spectroscopy.types import ( DataAtSample, - Filename, - IncidentDirection, PrimarySpecCoordTransformGraph, RunType, - SampleName, - SamplePosition, - SourceName, - SourcePosition, TimeOfFlightLookupTable, TofData, ) -def determine_name_with_type( - instrument: Group, name: str | None, options: list, type_name: str -) -> str: - """Investigate an open NeXus file group for objects with matching name or base type - - Parameter - --------- - instrument: scippnexus.Group - The group to investigate, likely /entry/instrument - name: str - A preferred object name, will be returned if present in the scippnexus.Group - options: list - Should be scippnexus define NeXus object types, e.g., scippnexus.NXdetector - type_name: str - Candidate group members contain this name - - Returns - ------- - : - The matching group-member name - - Raises - ------ - ValueError - If no group member has the specified `name`, - contains the specified `type_name` or is of the specified `option` type - """ - if name is not None and name in instrument: - return name - found = {x for x in instrument if type_name in x.lower()} - for option in options: - found.update(set(instrument[option])) - if len(found) != 1: - raise ValueError(f"Could not determine {type_name} name: {found}") - return next(iter(found)) - - -def guess_source_name(file: Filename) -> SourceName: - """Guess the name of the source in the NeXus instrument file""" - from scippnexus import File, NXmoderator, NXsource - - with File(file) as data: - instrument = data['entry/instrument'] - name = determine_name_with_type( - instrument, None, [NXsource, NXmoderator], 'source' - ) - return SourceName(name) - - -def guess_sample_name(file: Filename) -> SampleName: - """Guess the name of the sample in the NeXus instrument file""" - from scippnexus import File, NXsample - - with File(file) as data: - instrument = data['entry/instrument'] - name = determine_name_with_type(instrument, None, [NXsample], 'sample') - return SampleName(name) - - -def source_position(file: Filename, source: SourceName) -> SourcePosition: - """Extract the position of the named source from a NeXus file""" - from scippnexus import File, compute_positions - - with File(file) as data: - return compute_positions(data['entry/instrument'][source][...])['position'] - - -def sample_position(file: Filename, sample: SampleName) -> SamplePosition: - """Extract the position of the named sample from a NeXus file""" - from scippnexus import File, compute_positions - - with File(file) as data: - return compute_positions(data['entry/instrument'][sample][...])['position'] - - def primary_spectrometer_coordinate_transformation_graph() -> ( PrimarySpecCoordTransformGraph[RunType] ): @@ -167,18 +85,7 @@ def unwrap_sample_time( return TofData(result) -def incident_direction() -> IncidentDirection: - """Return the incident neutron direction in the laboratory frame""" - from scipp import vector - - return vector([0, 0, 1.0]) - - providers = ( - sample_position, - source_position, - guess_sample_name, - guess_source_name, + primary_spectrometer_coordinate_transformation_graph, unwrap_sample_time, - incident_direction, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py deleted file mode 100644 index 144bda860..000000000 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalisation.py +++ /dev/null @@ -1,145 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) - -import sciline -import scipp as sc - -from ess.reduce import time_of_flight - -from ..types import ( - Filename, - MonitorCoordTransformGraph, - MonitorData, - MonitorName, - MonitorPosition, - MonitorType, - NormWavelengthEvents, - RunType, - SourceMonitorPathLength, - SourcePosition, - TimeOfFlightLookupTable, - TofMonitor, - WavelengthBins, - WavelengthEvents, - WavelengthMonitor, -) - - -def monitor_position(file: Filename, monitor: MonitorName) -> MonitorPosition: - """Extract the position of the named monitor from a NeXus file""" - from scippnexus import File, compute_positions - - with File(file) as data: - return compute_positions(data['entry/instrument'][monitor][...])['position'] - - -def source_monitor_path_length( - file: Filename, source: SourcePosition, monitor: MonitorPosition -) -> SourceMonitorPathLength: - """Compute the primary spectrometer path length from source to monitor positions - - Note: - This *requires* that the instrument group *is sorted* along the beam path. - HDF5 group entries are sorted alphabetically, so you should ensure that - the NeXus file was constructed with this in mind. - """ - from scippnexus import File, NXguide, compute_positions - - with File(file) as data: - positions = [ - compute_positions(v[...])['position'] - for v in data['entry/instrument'][NXguide].values() - ] - - # Find the closest guide to the monitor position, ignoring the possibility that - # a guide could be _beyond_ the monitor _and_ closest :( - closest = 0 - distance = sc.norm(source - monitor) - for i, position in enumerate(positions): - d = sc.norm(position - monitor) - if d < distance: - distance = d - closest = i - - positions = sc.concat((source, *positions[:closest], monitor), dim='path') - diff = positions['path', 1:] - positions['path', :-1] - return sc.sum(sc.norm(diff)) - - -def normalise( - events: WavelengthEvents, - monitor: WavelengthMonitor, - edges: WavelengthBins, -) -> NormWavelengthEvents: - """Ensure the WavelengthEvents are binned according to the WavelengthBins, then use - the WavelengthMonitor as a lookup table to record the per-bin normalization. - - Parameters - ---------- - events - Event data which includes a per-event sloth coordinate - monitor - (Probably) 1-D histogram data with a sloth coordinate - edges - 1-D bin boundaries for the event data - - Returns - ------- - : - Event data binned by sloth, with a coordinate that is the per-bin normalization - """ - from scipp import lookup - - dim = 'incident_wavelength' - centres = (edges[:-1] + edges[1:]) / 2 - variances = None - if monitor.variances is not None: - monitor = monitor.copy() - variances = monitor.copy() - variances.values = monitor.variances - monitor.variances = None - variances.variances = None - counts = lookup(monitor, dim)[centres] - if variances is not None: - # Bad form, maybe. But two events with the same sloth bin are normalized - # by the same monitor counts -- which has a known uncertainty -- and scipp - # refuses to allow lookup on data which has variances defined. - counts.variances = (lookup(variances, dim)[centres]).values - - binned = events.bin(**{dim: edges}) - binned.coords['monitor'] = counts - return binned - - -def unwrap_monitor( - monitor: MonitorData[RunType, MonitorType], - table: TimeOfFlightLookupTable, - coord_transform_graph: MonitorCoordTransformGraph, -) -> TofMonitor[RunType, MonitorType]: - path_length = monitor.transform_coords( - 'Ltotal', - graph=coord_transform_graph, - keep_intermediate=False, - keep_aliases=False, - rename_dims=False, - ).coords['Ltotal'] - - tof_wf = sciline.Pipeline( - (*time_of_flight.providers(), time_of_flight.resample_tof_data), - params={ - **time_of_flight.default_parameters(), - time_of_flight.TimeOfFlightLookupTable: table, - time_of_flight.Ltotal: path_length, - time_of_flight.RawData: monitor.rename(t='tof'), - }, - ) - unwrapped = tof_wf.compute(time_of_flight.ResampledTofData) - return TofMonitor[RunType, MonitorType](unwrapped) - - -providers = ( - monitor_position, - source_monitor_path_length, - normalise, - unwrap_monitor, -) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py new file mode 100644 index 000000000..787d4c2c4 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +import sciline + +from ess.reduce import time_of_flight + +from ..types import ( + MonitorCoordTransformGraph, + MonitorData, + MonitorType, + RunType, + TimeOfFlightLookupTable, + TofMonitor, +) + + +def unwrap_monitor( + monitor: MonitorData[RunType, MonitorType], + table: TimeOfFlightLookupTable, + coord_transform_graph: MonitorCoordTransformGraph, +) -> TofMonitor[RunType, MonitorType]: + path_length = monitor.transform_coords( + 'Ltotal', + graph=coord_transform_graph, + keep_intermediate=False, + keep_aliases=False, + rename_dims=False, + ).coords['Ltotal'] + + tof_wf = sciline.Pipeline( + (*time_of_flight.providers(), time_of_flight.resample_tof_data), + params={ + **time_of_flight.default_parameters(), + time_of_flight.TimeOfFlightLookupTable: table, + time_of_flight.Ltotal: path_length, + time_of_flight.RawData: monitor.rename(t='tof'), + }, + ) + unwrapped = tof_wf.compute(time_of_flight.ResampledTofData) + return TofMonitor[RunType, MonitorType](unwrapped) + + +providers = (unwrap_monitor,) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py deleted file mode 100644 index 78aa41134..000000000 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/workflow.py +++ /dev/null @@ -1,1120 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) - -from __future__ import annotations - -from collections.abc import Iterable - -import numpy as np -import scipp as sc -import scippnexus as snx -from loguru import logger -from scipp import Variable - -from ..types import ( - Analyzers, - Choppers, - DataAtSample, - DetectorData, - Filename, - InstrumentAngles, - MonitorData, - NeXusDetectorName, - NeXusMonitorName, - NormWavelengthEvents, - NXspeFileName, - Position, - PreopenNeXusFile, - SampleRun, - SourceSamplePathLength, - TimeOfFlightLookupTable, - TofData, -) - -PIXEL_NAME = 'detector_number' - - -def _load_all(group, obj_type): - """Helper to find and load all subgroups of a specific scippnexus type""" - return {name: obj[...] for name, obj in group[obj_type].items()} - - -def _load_named(group, obj_type, names): - """Helper to find and load all subgroups of a specific scippnexus type with - group name in an allowed set""" - return {name: obj[...] for name, obj in group[obj_type].items() if name in names} - - -def ess_source_frequency(): - """Input for a sciline workflow, returns the ESS source frequency of 14 Hz""" - from scipp import scalar - - return scalar(14.0, unit='Hz') - - -def ess_source_period(): - """Input for a sciline workflow, returns the ESS source period of 1/(14 Hz)""" - return (1 / ess_source_frequency()).to(unit='ns') - - -def ess_source_delay(): - """Input for a sciline workflow, returns per-wavelength source delays of 0 s""" - from scipp import array - - return array(values=[0, 0.0], dims=['wavelength'], unit='sec', dtype='float64') - - -def ess_source_duration(): - """Input for a sciline workflow, returns source pulse duration of 3 msec""" - from scipp import scalar - - return scalar(3.0, unit='msec').to(unit='sec') - - -def ess_source_velocities(): - """Input for a sciline workflow, returns per-wavelength source velocity limits - - Notes - ----- - The chosen limits are not based on any properties of the source, but rather - entirely on the equivalent energy range, which is chosen to be - ~53 micro electron volts to 530 milli electron volts. This energy range should - be sufficient for all intended incident energies of the ESS spectrometer suite, - but may not be sufficient to capture spurious energies that pass through - the real instruments. - - Returns - ------- - : - A 1-D scipp Variable with values=[100, 10000] m/s - """ - from scipp import array - - return array(values=[100, 1e4], dims=['wavelength'], unit='m/s') - - -def analyzer_per_detector(analyzers: list[str], triplets: list[str]) -> dict[str, str]: - """Find the right analyzer name for each detector - - Notes - ----- - Depends heavily on the names of components being preceded by an in-instrument index, - and the analyzer and detector components being separated in index by 2. - If either condition changes this function will need to be modified. - - Parameters - ---------- - analyzers: list[str] - The names of analyzer components, typically generated from the keys of a dict - triplets: dict - The names of triplet detector components, typically generated from the - keys of a dict - - Returns - ------- - : - A dictionary with detector name keys and their associated analyzer name values - """ - - # TODO Update this function if the NeXus structure changes. - def correct_index(d, a): - detector_index = int(d.split('_', 1)[0]) - analyzer_index = detector_index - 2 - return a.startswith(str(analyzer_index)) - - return {d: next(x for x in analyzers if correct_index(d, x)) for d in triplets} - - -def detector_per_pixel(triplets: dict) -> dict[int, str]: - """Find the right detector name for every pixel index - - Parameters - ---------- - triplets: dict[str, scipp.DataGroup] - A mapping of detector component name to a loaded scippnexus.NXdetector group, - with 'data' group member that has a 'detector_number' coordinate - - Returns - ------- - : - The mapping of detector_number to detector component name - """ - return { - i: name - for name, det in triplets.items() - for i in det.coords['detector_number'].values.flatten() - } - - -def combine_analyzers(analyzers: dict, triplets: sc.DataGroup[sc.DataArray]): - """Combine needed analyzer properties into a single array, - duplicating information, to have per-pixel data - - BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, - N. Calculations for the properties of neutrons which make it to each detector pixel - need per-pixel data about the analyzer associated with that pixel. This function - collects the required data and combines it into a single array. - - Analyzer information required to determine the secondary-spectrometer neutron - properties are the center-of-mass position of the analyzer, the orientation of - the analyzer, and the lattice spacing separating crystal planes in the analyzer. - - Notes - ----- - Since there are N pixels per detector, the returned array is strictly N-times - larger than necessary, but the optimization to use only minimal information is - left for the future - - Parameters - ---------- - analyzers: dict[str, scipp.DataGroup] - Maps analyzer component name to loaded scippnexus.NXcrystal group - triplets: dict[str, scipp.DataGroup] - Maps detector component name to loaded scippnexus.NXdetector group - - Returns - ------- - : - A single array with pixel dimension and the per-pixel analyzer information - """ - from scipp import Dataset, array, concat - from scippnexus import compute_positions - - def analyzer_extract(obj): - obj = compute_positions(obj, store_transform='transform') - return Dataset(data={k: obj[k] for k in ('position', 'transform', 'd_spacing')}) - - extracted = {k: analyzer_extract(v) for k, v in analyzers.items()} - d2a = analyzer_per_detector(list(analyzers.keys()), list(triplets.keys())) - p2d = detector_per_pixel(triplets) - - p2a = {k: extracted[d2a[v]] for k, v in p2d.items()} - pixels = sorted(p2a) - data = concat([p2a[p] for p in pixels], dim=PIXEL_NAME) - data[PIXEL_NAME] = array(values=pixels, dims=[PIXEL_NAME], unit=None) - return data - - -def combine_detectors(triplets: sc.DataGroup[sc.DataArray]): - """Combine needed detector properties into a single array - - BIFROST has 45 analyzers and 45 triplet detectors, each with some number of pixels, - N. Calculations for the properties of neutrons which make it to each detector pixel - need per-pixel data. This function collects the required data and combines it into - a single array. - - Detector information required to determine the secondary-spectrometer neutron - properties are the center-of-mass position of each pixel. - - Parameters - ---------- - triplets: dict[str, scipp.DataGroup] - Maps detector component name to loaded scippnexus.NXdetector group - - Returns - ------- - : - A single array with pixel dimension and the per-pixel center of mass position - """ - from scipp import Dataset, concat, sort - - def extract(obj): - pixels = obj.coords['detector_number'] - midpoints = obj.coords['position'] - return Dataset(data={PIXEL_NAME: pixels, 'position': midpoints}) - - data = concat([extract(v) for v in triplets.values()], dim='arm') - data = Dataset({k: v.flatten(to=PIXEL_NAME) for k, v in data.items()}) - return sort(data, data[PIXEL_NAME].data) - - -def find_sample_detector_flight_time(sample, analyzers, detector_positions): - """Use sciline to find the sample to detector flight time per detector pixel""" - from sciline import Pipeline - - from ..types import ( - AnalyzerDspacing, - AnalyzerOrientation, - AnalyzerPosition, - DetectorPosition, - SampleDetectorFlightTime, - SamplePosition, - ) - from .kf import providers as kf_providers - - params = { - SamplePosition: sample['position'], - AnalyzerPosition: analyzers['position'].data, - DetectorPosition: detector_positions, # detectors['position'].data, - AnalyzerOrientation: analyzers['transform'].data, - AnalyzerDspacing: analyzers['spacing'].data, - } - return params, Pipeline(kf_providers, params=params).get( - SampleDetectorFlightTime - ).compute().to(unit='ms') - - -def get_triplet_events(triplets: Iterable[sc.DataArray]): - """Extract and combine the events from loaded scippneutron.NXdetector groups - - Parameters - ---------- - triplets: - An iterable container of loaded NXdetector groups, each with a 'data' member - which contains the pixel data -- possibly multiple detector-specific - (but consistent) dimensions -- with a coordinate identifying the - 'detector_number' - - Returns - ------- - : - The events from each triplet concatenated and sorted by the 'detector_number' - """ - from scipp import concat, sort - - events = concat(list(triplets), dim='arm').flatten(to=PIXEL_NAME) - events = sort(events, events.coords['detector_number']) - return events - - -def get_sample_events(triplet_events: sc.DataArray, sample_detector_flight_times): - """Return the events with the frame_time coordinate offset to time at the sample""" - events = triplet_events.drop_coords( - ('position', 'x_pixel_offset', 'y_pixel_offset') - ) - events.bins.coords['event_time_offset'] -= sample_detector_flight_times.to( - unit='ns' - ) - events.bins.coords['event_time_offset'] %= ess_source_period() - return events - - -def get_unwrapped_sample_events( - filename, - source_name, - sample_name, - sample_events, - tof_lookup_table, -): - """Shift frame_time at sample events to time-since-pulse events at sample""" - from sciline import Pipeline - - from ..types import ( - Filename, - SampleName, - SourceName, - ) - from .ki import providers as ki_providers - - params = { - Filename: filename, - SampleName: sample_name, - SourceName: source_name, - DataAtSample: sample_events, - TimeOfFlightLookupTable: tof_lookup_table, - } - pipeline = Pipeline(ki_providers, params=params) - - events = pipeline.compute(TofData) - events = events.bins.drop_coords(('event_time_zero', 'event_time_offset')) - return params, events, None # primary - - -def get_unwrapped_monitor( - filename, monitor: sc.DataArray, source_name, tof_lookup_table -) -> sc.DataArray: - from sciline import Pipeline - - from ..types import ( - Filename, - FrameTimeMonitor, - MonitorPosition, - SourceName, - TofMonitor, - ) - from .ki import source_position - from .normalisation import providers - - params = { - Filename: filename, - FrameTimeMonitor: monitor, - MonitorPosition: monitor.coords['position'], - SourceName: source_name, - TimeOfFlightLookupTable: tof_lookup_table, - } - pipeline = Pipeline((*providers, source_position), params=params) - return pipeline.compute(TofMonitor) - - -def get_normalization_monitor(monitors, monitor_component, collapse: bool = False): - """Get the data of the named monitor component, converting frame_time to nanoseconds - to match event_time_offset - - Parameters - ---------- - monitors: - A dictionary mapping monitor component name to loaded scippneutron.NXmonitor - groups - monitor_component: - The name of the monitor component to access - collapse: bool - For some simulated experiments, a parameter was scanned which should not be - treated as separate time points. When provided True, these points are integrated - over the 'time' dimension. - - Returns - ------- - : - Monitor data with frame_time converted to nanoseconds to match the timescale - used for events - """ - normalization = monitors[monitor_component] - if collapse: - # This is very specialized to how the simulated scans are done, - # it needs to be generalized? - normalization = normalization.sum(dim='time') - # rescale the frame_time axis. Why does it need to be done this way? - return normalization.transform_coords( - ['frame_time'], graph={'frame_time': lambda t: t.to(unit='nanosecond')} - ) - - -def add_energy_coordinates(sample_events, ki_params, kf_params): - """Extract incident_energy, final_energy, and energy_transfer - - Parameters - ---------- - sample_events: - Events with time of flight to the sample. - ki_params: - A dictionary of parameters needed by the incident-spectrometer sciline pipeline - kf_params: - A dictionary of parameters needed by the secondary-spectrometer sciline pipeline - - Returns - ------- - : - ``sample_events`` with added 'incident_energy', 'final_energy', and - 'energy_transfer' coordinates. - """ - from sciline import Pipeline - from scippneutron.conversion.tof import energy_from_tof - - from ..types import ( - EnergyTransfer, - FinalEnergy, - FinalWavenumber, - IncidentEnergy, - ) - from .conservation import providers - - params = {} - params.update(ki_params) - params.update(kf_params) - pipeline = Pipeline(providers, params=params) - pipeline[FinalWavenumber] = pipeline.get(FinalWavenumber).compute() - - incident_graph = { - 'incident_energy': lambda sample_tof, L1: energy_from_tof( - tof=sample_tof, Ltotal=L1 - ), - # TODO remove once L1 is precomputed - 'L1': lambda: pipeline.compute(SourceSamplePathLength), - } - events_with_energy_axes = sample_events.transform_coords( - 'incident_energy', - graph=incident_graph, - keep_intermediate=False, - ) - pipeline[IncidentEnergy] = events_with_energy_axes.bins.coords['incident_energy'] - energies = pipeline.compute((EnergyTransfer, FinalEnergy)) - events_with_energy_axes.bins.coords['energy_transfer'] = energies[ - EnergyTransfer - ].to(unit='meV') - events_with_energy_axes.coords['final_energy'] = energies[FinalEnergy] - return events_with_energy_axes - - -def add_momentum_coordinates(ki_params, kf_params, events, a3: Variable): - """Extract momentum transfer in the lab and sample-table coordinate systems - - Parameters - ---------- - ki_params: - A dictionary of parameters needed by the incident-spectrometer sciline pipeline - kf_params: - A dictionary of parameters needed by the secondary-spectrometer sciline pipeline - events: - The event data to which the calculated momentum components are appended - a3: - The scalar value of the sample rotation angle describing the events - - Returns - ------- - : - The event data with the two horizontal plane components of the - momentum transfer added in the laboratory coordinate system (independent of a3) - and the sample-table coordinate system (rotated by a3 around y). - These new coordinates are named 'lab_momentum_x', 'lab_momentum_z', - 'table_momentum_x' and 'table_momentum_z' - """ - from sciline import Pipeline - - from ..types import ( - FinalWavevector, - IncidentDirection, - SampleTableAngle, - ) - from .conservation import ( - PARALLEL, - PERP, - providers, - sample_table_momentum_vector, - ) - - if a3.size != 1: - raise ValueError(f'Expected a3 to have 1-entry, not {a3.size}') - - params = {} - # First we must add the lab momentum vector, since it is not a3 dependent - params.update(ki_params) - params.update(kf_params) - params[SampleTableAngle] = a3 - - pipeline = Pipeline(providers, params=params) - intermediates = pipeline.compute((IncidentDirection, FinalWavevector)) - incident_direction = intermediates[IncidentDirection] - final_wavevector = intermediates[FinalWavevector] - - def compute_lab_momentum_transfer(incident_wavelength: sc.Variable) -> sc.Variable: - return final_wavevector - 2 * np.pi * incident_direction / incident_wavelength - - graph = { - 'lab_momentum_transfer': compute_lab_momentum_transfer, - 'lab_momentum_x': lambda lab_momentum_transfer: sc.dot( - PERP, lab_momentum_transfer - ), - 'lab_momentum_z': lambda lab_momentum_transfer: sc.dot( - PARALLEL, lab_momentum_transfer - ), - 'table_momentum_transfer': lambda lab_momentum_transfer: sample_table_momentum_vector( # noqa: E501 - a3, lab_momentum_transfer - ), - 'table_momentum_x': lambda table_momentum_transfer: sc.dot( - PERP, table_momentum_transfer - ), - 'table_momentum_z': lambda table_momentum_transfer: sc.dot( - PARALLEL, table_momentum_transfer - ), - } - return events.transform_coords( - ('lab_momentum_x', 'lab_momentum_z', 'table_momentum_x', 'table_momentum_z'), - graph=graph, - keep_intermediate=False, - ) - - -def add_wavelength_coordinate(ki_params, events, monitor): - """Convert to incident wavelength per event and independent monitor axis - - Parameters - ---------- - ki_params: - A dictionary of parameters needed by the incident-spectrometer sciline pipeline - events: - Event data, presumably with per-event incident energy (or wavelength, or - inverse velocity == slowness) already calculated; the basis for the returned - events - monitor: - A beam monitor with one independent axis (time since last pulse as measured). - The monitor intensity is expected to be a histogram along the one independent - axis, but event monitor data should work as well. - - Returns - ------- - : - The events with a new coordinate, 'incident_wavelength'. - And the monitor with 'incident_wavelength' coordinate. - """ - from sciline import Pipeline - from scippneutron.conversion.graph import beamline - from scippneutron.conversion.tof import wavelength_from_tof - - from .ki import providers as ki_providers - - pipeline = Pipeline(ki_providers, params=ki_params) - - incident_graph = { - 'incident_wavelength': wavelength_from_tof, - # TODO remove once L1 is precomputed - 'L1': lambda: pipeline.compute(SourceSamplePathLength), - 'Ltotal': 'L1', # using sample times - 'tof': 'sample_tof', - } - events_with_wavelength = events.transform_coords( - 'incident_wavelength', - graph=incident_graph, - keep_inputs=False, - keep_intermediate=False, - keep_aliases=False, - ) - - monitor_graph = { - **beamline.beamline(scatter=False), - 'incident_wavelength': wavelength_from_tof, - } - wavelength_monitor = monitor.transform_coords( - 'incident_wavelength', - graph=monitor_graph, - keep_intermediate=False, - keep_aliases=False, - ) - - return events_with_wavelength, wavelength_monitor - - -def get_geometric_a4(kf_params): - from sciline import Pipeline - - from ..types import DetectorGeometricA4 - from .kf import providers - - pipeline = Pipeline(providers, params=kf_params) - geometric_a4 = pipeline.compute(DetectorGeometricA4) - return geometric_a4 - - -def normalise_wavelength_events(ki_params, kf_params, events, monitor): - from sciline import Pipeline - - from ..types import ( - WavelengthBins, - WavelengthEvents, - WavelengthMonitor, - ) - from .normalisation import providers - - params = { - WavelengthEvents: events, - WavelengthMonitor: monitor, - WavelengthBins: monitor.coords['incident_wavelength'], - } - params.update(ki_params) - params.update(kf_params) - pipeline = Pipeline(providers, params=params) - events = pipeline.compute(NormWavelengthEvents) - return events - - -def split( - triplets, - analyzers, - monitors, - logs, - a3_name: str | None = None, - a4_name: str | None = None, -): - """Use the (a3, a4) logged value pairs to split triplet, analyzer, and monitor data - into single-setting sets - - Parameters - ---------- - triplets: DataArray - The triplet positions _should_ change with a4 (if simulated, this is certainly - not implemented correctly yet). The event data they contain depends on - (a3, a4) [plus any other time-dependent parameter] so must be split. - analyzers: - The analyzer position _should_ change with a4 - (if simulated, this is certainly not implemented correctly yet) - monitors: DataArray - The histogram (simulated, or real current beam monitor) or event - (real fission monitor, etc.?) data is time-dependent and used to normalize - the detector data. It must therefore be split into (a3, a4) sets - logs: DataGroup - Entries built from NXlogs in the real or simulated instrument - a3_name: str - The name of the sample table angle log entry in `logs`, 'a3' for simulated data - a4_name: str - The name of the detector tank angle log entry in `logs`, 'a4' for simulated data - - Returns - ------- - : - A list[[triplet, analyzer, monitor]] of individual (a3, a4) setting(s) - """ - from scipp import lookup - - from ..utils import is_in_coords - - if a3_name is None: - a3_name = 'a3' - if a4_name is None: - a4_name = 'a4' - - if a3_name not in logs or a4_name not in logs: - logger.warning('Missing a3 or a4, so split performed') - return [[triplets, analyzers, monitors]] - - a3 = lookup(logs[a3_name], 'time') - a4 = lookup(logs[a4_name], 'time') - - event_graph = { - 'a3': lambda event_time_zero: a3[event_time_zero], - 'a4': lambda event_time_zero: a4[event_time_zero], - } - histogram_graph = {'a3': lambda time: a3[time], 'a4': lambda time: a4[time]} - - def do_split(x, time_name): - graph = event_graph if 'event_time_zero' == time_name else histogram_graph - if is_in_coords(x, time_name): - x = x.transform_coords(('a3', 'a4'), graph=graph) - if x.bins is not None: - x = x.group('a3', 'a4') - return x - - vals = [ - do_split(x, t) - for x, t in ( - (triplets, 'event_time_zero'), - (analyzers, 'time'), - (monitors, 'time'), - ) - ] - - # FIXME this only works because v.sizes['a4'] is always 1 at the moment - vals = [ - v.flatten(['a3', 'a4'], to='time') if 'a3' in v.dims and 'a4' in v.dims else v - for v in vals - ] - - n_time = [v.sizes['time'] for v in vals if 'time' in v.dims] - if len(n_time): - if not all(n == n_time[0] for n in n_time): - raise ValueError("Not all values have the same 'time' dimension") - n_time = n_time[0] - vals = [ - [v['time', i] if 'time' in v.dims else v for v in vals] - for i in range(n_time) - ] - else: - vals = [vals] - - return vals - - -def _get_detector_names(filename: Filename) -> list[str]: - with snx.File(filename) as f: - return list(f['entry/instrument'][snx.NXdetector]) - - -def load_everything(filename: Filename): - """Load all needed information from the named NeXus HDF5 file - - Parameters - ---------- - filename: - The name of the file to load data from, must have both and 'instrument' - and 'parameters' group under 'entry' - - Returns - ------- - sample: - The loaded sample component group - triplets: - All scippnexus.NXdetector groups under 'entry/instrument' - analyzers: - All scippnexus.NXcrystal groups under 'entry/instrument' - choppers: - All scippnexus.NXdisk_chopper groups under 'entry/instrument' - monitors: - All scippnexus.NXmonitor groups under 'entry/instrument' - logs: - The scippnexus.NXlog groups named 'a3' and 'a4' under 'entry/parameters' - """ - from ess.bifrost.types import ( - FrameMonitor0, - FrameMonitor1, - FrameMonitor2, - FrameMonitor3, - ) - from ess.bifrost.workflow import BifrostSimulationWorkflow - - monitor_keys = ( - FrameMonitor0, - FrameMonitor1, - FrameMonitor2, - FrameMonitor3, - ) - detector_names = _get_detector_names(filename) - - workflow = BifrostSimulationWorkflow() - # Use [SampleRun] for now until we process multiple runs together. - workflow[Filename[SampleRun]] = filename - workflow[PreopenNeXusFile] = PreopenNeXusFile(True) - workflow[DetectorData[SampleRun]] = ( - workflow[DetectorData[SampleRun]] - .map({NeXusDetectorName: detector_names}) - .reduce(func=lambda *x: x) - ) - - loaded = workflow.compute( - [ - DetectorData[SampleRun], - Position[snx.NXsample, SampleRun], - Analyzers[SampleRun], - Choppers[SampleRun], - InstrumentAngles[SampleRun], - *(MonitorData[SampleRun, key] for key in monitor_keys), - *(NeXusMonitorName[key] for key in monitor_keys), - ] - ) - sample = sc.DataGroup(position=loaded[Position[snx.NXsample, SampleRun]]) - analyzers = loaded[Analyzers[SampleRun]] - choppers = loaded[Choppers[SampleRun]] - monitors = sc.DataGroup( - { - loaded[NeXusMonitorName[key]]: loaded[MonitorData[SampleRun, key]] - for key in monitor_keys - } - ) - triplets = sc.DataGroup( - zip(detector_names, loaded[DetectorData[SampleRun]], strict=True) - ) - instrument_angles = loaded[InstrumentAngles[SampleRun]] - - return sample, triplets, analyzers, choppers, monitors, instrument_angles - - -def one_setting( - sample, - triplet_events, - analyzers, - norm_monitor, - filename, - names, - tof_lookup_table, - warn_about_a3=True, -): - """Calculate the event properties for a single (a3, a4) setting""" - detector_positions = triplet_events.coords['position'] - kf_params, sample_detector_flight_time = find_sample_detector_flight_time( - sample, analyzers, detector_positions - ) - sample_events = get_sample_events(triplet_events, sample_detector_flight_time) - ki_params, unwrapped_sample_events, primary = get_unwrapped_sample_events( - filename=filename, - source_name=names['source'], - sample_name=names['sample'], - sample_events=sample_events, - tof_lookup_table=tof_lookup_table, - ) - - unwrapped_norm_monitor = get_unwrapped_monitor( - filename=filename, - monitor=norm_monitor, - source_name=names['source'], - tof_lookup_table=tof_lookup_table, - ) - - unwrapped_sample_events = add_energy_coordinates( - unwrapped_sample_events, ki_params, kf_params - ) - unwrapped_sample_events.coords['theta'] = get_geometric_a4(kf_params) - - if 'a3' in triplet_events.coords: - # this _should_ be one (a3, a4) setting, - # with a single a3 value on triple_events (and norm_monitor) - a3 = triplet_events.coords['a3'] - else: - from scipp import scalar - - if warn_about_a3: - logger.warning("No a3 present in setting, assuming 0 a3") - a3 = scalar(0, unit='deg') - - # Set up the normalisation by adding an 'incident_wavelength' coordinate to - # the individual events and the normalisation monitor - unwrapped_sample_events, monitor = add_wavelength_coordinate( - ki_params, - unwrapped_sample_events, - unwrapped_norm_monitor, - ) - unwrapped_sample_events = add_momentum_coordinates( - ki_params, kf_params, unwrapped_sample_events, a3 - ) - - a4 = triplet_events.coords['a4'] - unwrapped_sample_events.save_hdf5( - f'data/combined-workflow/events.a3_{a3.value:.1f}.a4_{a4.value:.1f}.h5' - ) - raise RuntimeError("abort") - - norm_events = normalise_wavelength_events( - ki_params, kf_params, unwrapped_sample_events, monitor - ) - - return { - 'triplet_events': triplet_events, - 'events': unwrapped_sample_events, - 'norm_monitor': norm_monitor, - 'sample_detector_flight_time': sample_detector_flight_time, - 'analyzers': analyzers, - 'wavelength_monitor': monitor, - 'norm_events': norm_events, - } - - -def load_precompute( - filename: Filename, - named_components: dict[str, str], -): - """Load data from a NeXus file and perform (a3, a4) independent calculations - - Parameters - ---------- - filename: - The file which contains the data to load - named_components: - The file-specific names of (at least) the source, sample and normalization - monitor group names under 'entry/instrument' - is_simulated: - A flag to indicate if the file comes from a McStas simulation, such that - the event_time_offset needs to be modified to look like real data. - - Returns - ------- - sample: - The sample group loaded from the NeXus file - analyzers: - A single array with all analyzer information needed to calculate - secondary-spectrometer parameters - triplet_events: - A single array with the events and detector-pixel information needed - to calculate parameters - norm_monitor: - The normalization monitor data with frame_time converted to nanoseconds - logs: - A dictionary of the 'a3' and 'a4' logs from the 'entry/parameter' group - in the NeXus file - """ - sample, triplets, analyzers, choppers, monitors, logs = load_everything(filename) - - analyzers = combine_analyzers(analyzers, triplets) - # detectors = combine_detectors(triplets) - triplet_events = get_triplet_events(triplets.values()) - - norm_monitor = get_normalization_monitor(monitors, named_components['monitor']) - return sample, analyzers, triplet_events, norm_monitor, logs - - -def component_names( - source_component: str | None = None, - sample_component: str | None = None, - monitor_component: str | None = None, - is_simulated: bool = False, -): - """Return a dictionary mapping component type to component name - - Parameters - ---------- - source_component: str - The user-provided source component name, should exist at - 'entry/instrument/{source_component}' in the datafile - sample_component: str - The user-provided sample component name, should exist at - 'entry/instrument/{sample_component}' in the datafile - monitor_component: str - The user-provided normalization monitor component name, should exist at - 'entry/instrument/{monitor_component}' - is_simulated: bool - If true, user-provided names will be augmented with the McStas component - names for the specific types. - - Returns - ------- - : - A dictionary mapping component type name to group name - """ - names = { - 'source': source_component, - 'sample': sample_component, - 'monitor': monitor_component, - } - if is_simulated: - sim_components = { - 'source': '001_ESS_source', - 'sample': '114_sample_stack', - 'monitor': '110_frame_3', - } - for k, v in sim_components.items(): - if names[k] is None: - names[k] = v - return names - - -def bifrost( - filename: Filename, - tof_lookup_table: TimeOfFlightLookupTable, - source_component: str | None = None, - sample_component: str | None = None, - monitor_component: str | None = None, - is_simulated: bool = False, -): - """Load a BIFROST data file and convert to S(Q,E) - in the sample-table coordinate system - - Parameters - ---------- - filename: - The name of the NeXus file to load - tof_lookup_table: - Time-of-flight lookup table as produced by - `ESSreduce `_. - source_component: - The group name under 'entry/instrument' in the NeXus file containing - source information - sample_component: - The group name under 'entry/instrument' in the NeXus file containing - sample information - monitor_component: - The group name under 'entry/instrument' in the NeXus file containing - normalization monitor information - is_simulated: - Whether the NeXus file comes from a McStas simulation, in which case default - component names are set if not provided and the data is modified to - look like real data - - Returns - ------- - A dictionary of data from the workflow, concatenated along a 'setting' dimension - corresponding to separate (a3, a4) grouped data. The entries in the dictionary - may not all be useful, and are subject to pruning as experience is gained with - the workflow. - """ - from scipp import concat - from tqdm import tqdm - - named_components = component_names( - source_component, - sample_component, - monitor_component, - is_simulated, - ) - sample, analyzers, triplet_events, norm_monitor, logs = load_precompute( - filename, named_components - ) - settings = split(triplet_events, analyzers, norm_monitor, logs) - data = [ - one_setting( - sample, - one_triplet_events, - one_analyzers, - one_monitor, - filename, - named_components, - tof_lookup_table=tof_lookup_table, - ) - for one_triplet_events, one_analyzers, one_monitor in tqdm( - settings, desc='(a3, a4) settings' - ) - ] - return {k: concat([d[k] for d in data], 'setting') for k in data[0]} - - -def bifrost_single( - filename: Filename, - tof_lookup_table: TimeOfFlightLookupTable, - source_component: str | None = None, - sample_component: str | None = None, - monitor_component: str | None = None, - is_simulated: bool = False, - extras: bool = False, -): - """Load a BIFROST data file and convert to S(Q,E) - in the laboratory coordinate system - - Parameters - ---------- - filename: - The name of the NeXus file to load - tof_lookup_table: - Time-of-flight lookup table as produced by - `ESSreduce `_. - source_component: - The group name under 'entry/instrument' in the NeXus file containing - source information - sample_component: - The group name under 'entry/instrument' in the NeXus file containing - sample information - monitor_component: - The group name under 'entry/instrument' in the NeXus file containing - normalization monitor information - is_simulated: - Whether the NeXus file comes from a McStas simulation, in which case default - component names are set if not provided and the data is modified to look like - real data - extras: - If true, the loaded sample group and 'a3' and 'a4' logs will be returned in - the dictionary - - Returns - ------- - A dictionary of data from the workflow. The entries in the dictionary may not - all be useful, and are subject to pruning as experience is gained with the workflow. - """ - named_components = component_names( - source_component, - sample_component, - monitor_component, - is_simulated, - ) - sample, analyzers, triplet_events, norm_monitor, logs = load_precompute( - filename, named_components - ) - if 'time' in norm_monitor.sizes: - norm_monitor = norm_monitor.sum('time') - - data = one_setting( - sample, - triplet_events, - analyzers, - norm_monitor, - filename, - named_components, - tof_lookup_table=tof_lookup_table, - warn_about_a3=False, - ) - - if extras: - data['sample'] = sample - data['logs'] = logs - - return data - - -def bifrost_to_nxspe( - *, - output: NXspeFileName, - filename: Filename[SampleRun] | None = None, - events: NormWavelengthEvents | None = None, - **kwargs, -): - from sciline import Pipeline - - from ..types import NXspeFileNames - from .io import providers as io_providers - - if filename is None and events is None: - raise ValueError("Provide events, or filename to read and reduce file") - if events is None: - reduced = bifrost(filename, **kwargs) - events = reduced['norm_events'] - - pipeline = Pipeline( - providers=io_providers, - params={ - NXspeFileName: output, - NormWavelengthEvents: events, - }, - ) - return pipeline.compute(NXspeFileNames) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index b2b0c37cf..d71c23bd5 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -8,22 +8,10 @@ from ess.reduce import time_of_flight from ess.reduce.nexus import types as reduce_t +# NeXus types -def make_scipp_named_typer(scipp_type): - def typer(named: str) -> type[scipp_type]: - return NewType(named, scipp_type) - - return typer - - -variable_type = make_scipp_named_typer(sc.Variable) -data_array_type = make_scipp_named_typer(sc.DataArray) - -AllNeXusComponents = reduce_t.AllNeXusComponents -Analyzers = reduce_t.Analyzers CalibratedBeamline = reduce_t.CalibratedBeamline CalibratedDetector = reduce_t.CalibratedDetector -Choppers = reduce_t.Choppers DetectorData = reduce_t.DetectorData DetectorPositionOffset = reduce_t.DetectorPositionOffset GravityVector = reduce_t.GravityVector @@ -41,6 +29,8 @@ def typer(named: str) -> type[scipp_type]: PreopenNeXusFile = reduce_t.PreopenNeXusFile SampleRun = reduce_t.SampleRun +# Type vars + # Include BackgroundRun because a single constraint is not allowed. # We will eventually have more than one... RunType = TypeVar("RunType", SampleRun, reduce_t.BackgroundRun) @@ -53,111 +43,62 @@ def typer(named: str) -> type[scipp_type]: reduce_t.Monitor4, ) +# Time-of-flight types + PulseStride = time_of_flight.PulseStride PulsePeriod = time_of_flight.PulsePeriod TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable - -class InstrumentAngles( - sciline.Scope[RunType, sc.DataGroup[sc.DataArray]], sc.DataGroup[sc.DataArray] -): - """Instrument angles for the sample orientation as a function of time.""" +# Custom types class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): ... -AnalyzerPosition = variable_type('AnalyzerPosition') -DetectorPosition = variable_type('DetectorPosition') -SamplePosition = variable_type('SamplePosition') -SourcePosition = variable_type('SourcePosition') -AnalyzerOrientation = variable_type('AnalyzerOrientation') -SampleAnalyzerVector = variable_type('SampleAnalyzerVector') -AnalyzerDetectorVector = variable_type('AnalyzerDetectorVector') -SampleAnalyzerDirection = variable_type('SampleAnalyzerDirection') -ReciprocalLatticeVectorAbsolute = variable_type('ReciprocalLatticeVectorAbsolute') -AnalyzerDspacing = variable_type('Dspacing') -IncidentDirection = variable_type('IncidentDirection') -IncidentEnergy = variable_type('IncidentEnergy') -FinalDirection = variable_type('FinalDirection') -FinalSlowness = variable_type('FinalSlowness') -FinalWavelength = variable_type('FinalWavelength') -FinalWavenumber = variable_type('FinalWavenumber') -FinalWavevector = variable_type('FinalWavevector') -FinalEnergy = variable_type('FinalEnergy') -SourceSamplePathLength = variable_type('SourceSamplePathLength') -SampleDetectorPathLength = variable_type('SampleDetectorPathLength') -SampleDetectorFlightTime = variable_type('SampleDetectorFlightTime') -SampleFrameTime = variable_type('SampleFrameTime') -DetectorFrameTime = variable_type('DetectorFrameTime') -DetectorTime = variable_type('DetectorTime') -SourceTime = variable_type('SourceTime') - -SampleName = NewType('SampleName', str) -SourceName = NewType('SourceName', str) - -MonitorName = NewType('MonitorName', str) -MonitorPosition = variable_type('MonitorPosition') -SourceMonitorPathLength = variable_type('SourceMonitorPathLength') - -LabMomentumTransfer = variable_type('LabMomentumTransfer') - -SampleTableAngle = variable_type("SampleTableAngle") -TableMomentumTransfer = variable_type('TableMomentumTransfer') - -SampleMomentumTransfer = variable_type('SampleMomentumTransfer') -SampleMomentumTransferX = variable_type("SampleMomentumTransferX") -SampleMomentumTransferY = variable_type("SampleMomentumTransferY") -SampleMomentumTransferZ = variable_type("SampleMomentumTransferZ") - -EnergyTransfer = variable_type('EnergyTransfer') - -DetectorGeometricA4 = variable_type("DetectorGeometricA4") - -SlothEvents = data_array_type('SlothEvents') -SlothBins = variable_type('SlothBins') -NormSlothEvents = data_array_type('NormSlothEvents') - -WavelengthEvents = data_array_type('WavelengthEvents') -WavelengthBins = variable_type('WavelengthBins') -NormWavelengthEvents = data_array_type('NormWavelengthEvents') +class BeamlineWithSpectrometerCoords( + sciline.Scope[RunType, sc.DataArray], sc.DataArray +): ... -NXspeFileName = NewType('NXspeFileName', str) -NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) +class DataAtSample(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -class TofMonitor( - sciline.ScopeTwoParams[RunType, MonitorType, sc.DataArray], sc.DataArray -): ... +class DataGroupedByRotation(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -class WavelengthMonitor( - sciline.ScopeTwoParams[RunType, MonitorType, sc.DataArray], sc.DataArray -): ... +class EnergyData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -class TofData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + +InelasticCoordTransformGraph = NewType('InelasticCoordTransformGraph', dict) -class EnergyData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class InstrumentAngles( + sciline.Scope[RunType, sc.DataGroup[sc.DataArray]], sc.DataGroup[sc.DataArray] +): + """Instrument angles for the sample orientation as a function of time.""" -class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... +MonitorCoordTransformGraph = NewType('MonitorCoordTransformGraph', dict) + + +NXspeFileName = NewType('NXspeFileName', str) +NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) class PrimarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... -InelasticCoordTransformGraph = NewType('InelasticCoordTransformGraph', dict) -MonitorCoordTransformGraph = NewType('MonitorCoordTransformGraph', dict) +class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... -class BeamlineWithSpectrometerCoords( - sciline.Scope[RunType, sc.DataArray], sc.DataArray -): ... +class TofData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -class DataAtSample(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class TofMonitor( + sciline.ScopeTwoParams[RunType, MonitorType, sc.DataArray], sc.DataArray +): ... -class DataGroupedByRotation(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class WavelengthMonitor( + sciline.ScopeTwoParams[RunType, MonitorType, sc.DataArray], sc.DataArray +): ... diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py index 7650171be..369e88676 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/utils.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) -from scipp import DataArray, Variable +from scipp import Variable def in_same_unit(b: Variable, to: Variable | None = None) -> Variable: @@ -22,29 +22,3 @@ def unit(x): if a_unit != b_unit: b = b.to(unit=a_unit) return b - - -def range_normalized(variable: Variable, minimum: Variable, maximum: Variable): - """Convert a variable to a normalized range - - Parameters - ---------- - variable: scipp.Variable - The values to be normalized - minimum: scipp.Variable - The minimal value that the input `variable` could take - maximum: scipp.Variable - The maximal value that the input `variable` could take - - Returns - ------- - : - The input `variable` rescaled by the range of allowed values - """ - full = maximum - minimum - minimum, full = (in_same_unit(x, to=variable) for x in (minimum, full)) - return (variable - minimum) / full - - -def is_in_coords(x: DataArray, name: str): - return name in x.coords or (x.bins is not None and name in x.bins.coords) From 164d15c02fcb43b45dcad43257c0f952c12be3a3 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 11:27:40 +0100 Subject: [PATCH 119/330] Remove obsolete tests --- .../tests/bifrost/workflow_test.py | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 15295f29a..e0f8dc23d 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -12,8 +12,6 @@ ) from ess.bifrost.types import FrameMonitor3 from ess.spectroscopy.types import ( - Analyzers, - Choppers, DetectorData, EnergyData, Filename, @@ -65,32 +63,6 @@ def test_simulation_workflow_can_load_monitor(workflow: sciline.Pipeline) -> Non assert 'source_position' in result.coords -def test_simulation_workflow_can_load_analyzers(workflow: sciline.Pipeline) -> None: - analyzers = workflow.compute(Analyzers[SampleRun]) - - assert len(analyzers) == 45 - first = next(iter(analyzers.values())) - assert 'position' in first - assert 'd_spacing' in first - - -def test_simulation_workflow_can_load_choppers(workflow: sciline.Pipeline) -> None: - choppers = workflow.compute(Choppers[SampleRun]) - - assert choppers.keys() == { - '005_PulseShapingChopper', - '006_PulseShapingChopper2', - '019_FOC1', - '048_FOC2', - '095_BWC1', - '096_BWC2', - } - first = next(iter(choppers.values())) - assert 'position' in first - assert 'rotation_speed' in first - assert first['slit_edges'].shape == (2,) - - def test_simulation_workflow_can_compute_energy_data( workflow: sciline.Pipeline, ) -> None: From 1232524e421d4fe069f524cba138ff1c06356b43 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 11:28:17 +0100 Subject: [PATCH 120/330] Add missing to data.__all__ --- packages/essspectroscopy/src/ess/bifrost/data.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 011192981..deed31724 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -5,8 +5,6 @@ _version = "1" -__all__ = ["get_path"] - def _make_pooch(): import pooch @@ -44,3 +42,10 @@ def simulated_elastic_incoherent_with_phonon() -> str: def tof_lookup_table_simulation() -> str: """Time-of-flight lookup table for the simulated BIFROST data.""" return get_path("BIFROST-simulation-tof-lookup-table.h5") + + +__all__ = [ + "get_path", + "simulated_elastic_incoherent_with_phonon", + "tof_lookup_table_simulation", +] From 5a7d947417636bfd20dac35b6a6dba5999279050 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 16:23:41 +0100 Subject: [PATCH 121/330] Document choice of transfers --- .../ess/spectroscopy/indirect/conversion.py | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index b8d0b4df4..f7132bde0 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -42,12 +42,60 @@ def incident_wavevector_from_incident_wavelength( def energy_transfer( *, incident_energy: sc.Variable, final_energy: sc.Variable ) -> sc.Variable: + r"""Compute the energy transfer. + + Here, the energy transfer is defined the same as in ScippNeutron + (https://scipp.github.io/scippneutron/user-guide/coordinate-transformations.html) + to be + + .. math:: + + \Delta E = E_i - E_f + + Note that the energy *loss*, while :func:`lab_momentum_transfer_from_wavevectors` + returns the momentum *gain*. + + Parameters + ---------- + incident_energy: + The neutron energy :math:`E_i` before scattering. + final_energy: + The neutron energy :math:`E_f` after scattering. + + Returns + ------- + : + The energy transfer :math:`\Delta E`. + """ return incident_energy - final_energy def lab_momentum_transfer_from_wavevectors( incident_wavevector: sc.Variable, final_wavevector: sc.Variable ) -> sc.Variable: + r"""Compute the momentum transfer in the lab frame. + + Here, the momentum transfer is defined as + + .. math:: + + \vec{Q} = \vec{k_f} - \vec{k_i} + + Note that the momentum *gain*, while :func:`energy_transfer` + returns the energy *loss*. + + Parameters + ---------- + incident_wavevector: + The neutron wavevector :math:`\vec{k_i}` before scattering. + final_wavevector: + The neutron wavevector :math:`\vec{k_f}` after scattering. + + Returns + ------- + : + The momentum transfer :math:`\vec{Q}` in the lab frame. + """ return in_same_unit(final_wavevector, incident_wavevector) - incident_wavevector @@ -59,8 +107,14 @@ def rotate_to_sample_table_momentum_transfer( ) -> sc.Variable: """Rotate the momentum transfer vector into the sample-table coordinate system - Notes - ----- + Here, the momentum transfer is defined as + + .. math:: + + \vec{Q} = \vec{k_f} - \vec{k_i} + + Note + ---- When a3 is zero, the sample-table and lab coordinate systems are the same. That is, Z is along the incident beam, Y is opposite the gravitational force, and X completes the right-handed coordinate system. The sample-table angle, a3, @@ -75,6 +129,11 @@ def rotate_to_sample_table_momentum_transfer( The momentum transfer in the laboratory coordinate system gravity: The gravity vector which indicates the vertical axis. + + Returns + ------- + : + The momentum transfer in the sample-table coordinate system. """ vertical = -gravity / sc.norm(gravity) # negative a3 since we rotate coordinates not axes here From 22f3088b7876454f0b68e7b0235f1d6ef0101300 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 16:24:02 +0100 Subject: [PATCH 122/330] Structure test like src --- packages/essspectroscopy/tests/package_test.py | 5 +++-- .../tests/{ => spectroscopy/indirect}/indirect_test.py | 0 2 files changed, 3 insertions(+), 2 deletions(-) rename packages/essspectroscopy/tests/{ => spectroscopy/indirect}/indirect_test.py (100%) diff --git a/packages/essspectroscopy/tests/package_test.py b/packages/essspectroscopy/tests/package_test.py index f47925443..4f2f34a7c 100644 --- a/packages/essspectroscopy/tests/package_test.py +++ b/packages/essspectroscopy/tests/package_test.py @@ -7,11 +7,12 @@ contain multiple packages. """ -from ess import spectroscopy as pkg +from ess import bifrost, spectroscopy def test_has_version(): - assert hasattr(pkg, '__version__') + assert hasattr(bifrost, '__version__') + assert hasattr(spectroscopy, '__version__') # This is for CI package tests. They need to run tests with minimal dependencies, diff --git a/packages/essspectroscopy/tests/indirect_test.py b/packages/essspectroscopy/tests/spectroscopy/indirect/indirect_test.py similarity index 100% rename from packages/essspectroscopy/tests/indirect_test.py rename to packages/essspectroscopy/tests/spectroscopy/indirect/indirect_test.py From a2f40f5dc3d30fee377cff191340899adf7fb69c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 16:31:45 +0100 Subject: [PATCH 123/330] Add regression test --- packages/essspectroscopy/src/ess/bifrost/data.py | 7 +++++++ .../essspectroscopy/tests/bifrost/workflow_test.py | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index deed31724..debcceeb8 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -16,6 +16,7 @@ def _make_pooch(): version=_version, registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", + "computed_energy_data_simulated.h5": "md5:926d7e4215fbe97b9c87fb8e84e34c0d", "BIFROST-simulation-tof-lookup-table.h5": "md5:9469b7b8c50463b1110bfbdffa2989d5", # noqa: E501 }, ) @@ -44,7 +45,13 @@ def tof_lookup_table_simulation() -> str: return get_path("BIFROST-simulation-tof-lookup-table.h5") +def computed_energy_data_simulated() -> str: + """Energy and momentum transfer computed from the simulated BIFROST data.""" + return get_path("computed_energy_data_simulated.h5") + + __all__ = [ + "computed_energy_data_simulated", "get_path", "simulated_elastic_incoherent_with_phonon", "tof_lookup_table_simulation", diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index e0f8dc23d..949a6f84f 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -3,10 +3,12 @@ import pytest import sciline import scipp as sc +import scipp.testing import scippnexus as snx from ess import bifrost from ess.bifrost.data import ( + computed_energy_data_simulated, simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation, ) @@ -101,3 +103,11 @@ def test_simulation_workflow_can_compute_wavelength_monitor( expected_coords = {'position', 'wavelength', 'time'} assert expected_coords.issubset(monitor.coords) assert monitor.bins is None + + +def test_simulation_workflow_produces_the_same_data_as_before( + workflow: sciline.Pipeline, +) -> None: + energy_data = workflow.compute(EnergyData[SampleRun]) + expected = sc.io.load_hdf5(computed_energy_data_simulated()) + sc.testing.assert_allclose(energy_data, expected) From 8baf6409a477217bbb5ae6aa944bd0367d347fd8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 17:08:14 +0100 Subject: [PATCH 124/330] Fill in bifrost user guide --- .../bifrost/bifrost-reduction.ipynb | 184 ++++++++++++++++-- .../src/ess/bifrost/workflow.py | 14 +- 2 files changed, 183 insertions(+), 15 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index 585de3848..6ffefdaf3 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -5,7 +5,10 @@ "id": "0", "metadata": {}, "source": [ - "# BIFROST reduction of simulated data" + "# BIFROST reduction of simulated data\n", + "\n", + "This notebook demonstrates the basic data reduction workflow for BIFROST.\n", + "It uses data that was simulated with McStas and a dedicated workflow that can process McStas data." ] }, { @@ -16,36 +19,189 @@ "outputs": [], "source": [ "import scipp as sc\n", + "import sciline\n", + "from ess import bifrost\n", + "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation\n", + "from ess.spectroscopy.types import *\n", + "import scippnexus as snx\n", "\n", - "from ess.bifrost.data import (\n", - " # simulated_elastic_incoherent_with_phonon,\n", - " tof_lookup_table_simulation,\n", - ")\n", - "# from ess.spectroscopy.indirect.workflow import bifrost" + "from ess.spectroscopy.types import SampleRun" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "BIFROST NeXus files store detector data in 45 separate NXdetector groups, one per detector triplet.\n", + "For the time being, we need to specify the names of these NXdetector groups when creating the workflow.\n", + "So load them from the input file:" ] }, { "cell_type": "code", "execution_count": null, - "id": "2", + "id": "3", "metadata": {}, "outputs": [], "source": [ - "tof_lookup_table = sc.io.load_hdf5(tof_lookup_table_simulation())" + "with snx.File(simulated_elastic_incoherent_with_phonon()) as f:\n", + " detector_names = list(f['entry/instrument'][snx.NXdetector])" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "Generally, we would use all triplets, but for this example, we only use the first two.\n", + "This reduces the size of the data and the time to compute it." ] }, { "cell_type": "code", "execution_count": null, - "id": "3", + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "detector_names = detector_names[:2]" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "Next, construct the workflow which is a [sciline.Pipeline](https://scipp.github.io/sciline/generated/classes/sciline.Pipeline.html) and encodes the entire reduction procedure.\n", + "We need to provide a couple of parameters so we can run the workflow:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", + "# Set the input file name:\n", + "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", + "# Set the lookup table for frame unwrapping:\n", + "workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation())\n", + "# We need to read many objects from the file,\n", + "# keeping it open improves performance: (optional)\n", + "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "Next, draw the workflow as a graph to inspect the steps it will take to reduce the data.\n", + "Note the groups where entries are labeled with `triplet=x`.\n", + "In this example, there are only two triplets but, as explained above, in a realistic case, there would be 45." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "workflow.visualize(EnergyData[SampleRun], graph_attr={\"rankdir\": \"LR\"})" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "We are ready to compute the reduced data.\n", + "We use the naive scheduler of sciline because it tends to perform better for BIFROST than the [Dask](https://docs.dask.org/en/stable/index.html) scheduler.\n", + "But this is optional." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "scheduler = sciline.scheduler.NaiveScheduler()\n", + "data = workflow.compute(EnergyData[SampleRun], scheduler=scheduler)" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "The result contains coordinates for the sample table and detector rotation angles `a3` and `a4`, respectively.\n", + "It also contains event coordinates for `energy_transfer` and two momentum transfers, one in the lab frame and one in the sample table frame." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "data" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "We can plot the counts as a function of energy transfer and $a_3$ by removing the unused dimensions.\n", + "As expected, it is independent of $a_3$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "(\n", + " data['a4', 0]\n", + " .bins.concat(['triplet', 'tube', 'length'])\n", + " .hist(energy_transfer=sc.linspace('energy_transfer', -0.05, 0.05, 200, unit='meV'))\n", + ").plot()" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "We can also plot the counts as a function of the momentum transfer in the sample table frame $Q$.\n", + "For this, we first need to create a 2D slice of $Q$.\n", + "For simplicity, we use the x and z axes (see https://scipp.github.io/scippneutron/user-guide/coordinate-transformations.html for definitions).\n", + "But we could use any other normalised, orthogonal vectors in the dot products.\n", + "The plot is a bit coarse because we only used 2 triplets." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", "metadata": {}, "outputs": [], "source": [ - "# reduced = bifrost(\n", - "# simulated_elastic_incoherent_with_phonon(),\n", - "# tof_lookup_table=tof_lookup_table,\n", - "# is_simulated=True,\n", - "# )" + "d = data['a4', 0].bins.concat().copy()\n", + "x = sc.vector([1, 0, 0])\n", + "z = sc.vector([0, 0, 1])\n", + "d.bins.coords['Qx'] = sc.dot(x, d.bins.coords['sample_table_momentum_transfer'])\n", + "d.bins.coords['Qz'] = sc.dot(z, d.bins.coords['sample_table_momentum_transfer'])\n", + "d.hist(Qz=200, Qx=200).plot(norm='log')" ] } ], diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index a95f1001b..69de2aca9 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -64,8 +64,20 @@ def BifrostSimulationWorkflow( workflow[DataGroupedByRotation[SampleRun]] = ( workflow[DataGroupedByRotation[SampleRun]] - .map({NeXusDetectorName: detector_names}) + .map(_make_detector_name_mapping(detector_names)) .reduce(func=merge_triplets) ) return workflow + + +def _make_detector_name_mapping(detector_names: list[NeXusDetectorName]) -> Any: + # Use Pandas if possible to label the index. + try: + import pandas + + return pandas.DataFrame({NeXusDetectorName: detector_names}).rename_axis( + index='triplet' + ) + except ModuleNotFoundError: + return {NeXusDetectorName: detector_names} From f434a07ab650405d9fd4cdaaa995e36e0cee40d8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 17:21:13 +0100 Subject: [PATCH 125/330] Change momentum transfer convention Now, we use Q = ki - kf which seems to be compatible with HORACE. --- packages/essspectroscopy/src/ess/bifrost/data.py | 2 +- .../src/ess/spectroscopy/indirect/conversion.py | 12 +++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index debcceeb8..28a6b43dd 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -16,7 +16,7 @@ def _make_pooch(): version=_version, registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated.h5": "md5:926d7e4215fbe97b9c87fb8e84e34c0d", + "computed_energy_data_simulated.h5": "md5:ba3e4834d12bd5153c9f1bf88f4848a1", "BIFROST-simulation-tof-lookup-table.h5": "md5:9469b7b8c50463b1110bfbdffa2989d5", # noqa: E501 }, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index f7132bde0..ee1c5ab28 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -52,9 +52,6 @@ def energy_transfer( \Delta E = E_i - E_f - Note that the energy *loss*, while :func:`lab_momentum_transfer_from_wavevectors` - returns the momentum *gain*. - Parameters ---------- incident_energy: @@ -79,10 +76,7 @@ def lab_momentum_transfer_from_wavevectors( .. math:: - \vec{Q} = \vec{k_f} - \vec{k_i} - - Note that the momentum *gain*, while :func:`energy_transfer` - returns the energy *loss*. + \vec{Q} = \vec{k_i} - \vec{k_f} Parameters ---------- @@ -96,7 +90,7 @@ def lab_momentum_transfer_from_wavevectors( : The momentum transfer :math:`\vec{Q}` in the lab frame. """ - return in_same_unit(final_wavevector, incident_wavevector) - incident_wavevector + return in_same_unit(incident_wavevector, final_wavevector) - final_wavevector def rotate_to_sample_table_momentum_transfer( @@ -111,7 +105,7 @@ def rotate_to_sample_table_momentum_transfer( .. math:: - \vec{Q} = \vec{k_f} - \vec{k_i} + \vec{Q} = \vec{k_i} - \vec{k_f} Note ---- From 5e8c7fa6bc12bbcdc5153ea7a18883aba23ee486 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Mar 2025 17:29:15 +0100 Subject: [PATCH 126/330] Require pandas for docs --- .../user-guide/bifrost/bifrost-reduction.ipynb | 2 +- packages/essspectroscopy/requirements/base.txt | 6 +++--- packages/essspectroscopy/requirements/basetest.txt | 4 ++-- packages/essspectroscopy/requirements/ci.txt | 4 ++-- packages/essspectroscopy/requirements/dev.txt | 8 ++++---- packages/essspectroscopy/requirements/docs.in | 1 + packages/essspectroscopy/requirements/docs.txt | 14 ++++++++++---- packages/essspectroscopy/requirements/nightly.txt | 14 +++++++------- packages/essspectroscopy/requirements/static.txt | 6 +++--- 9 files changed, 33 insertions(+), 26 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index 6ffefdaf3..26cfe306d 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -100,7 +100,7 @@ "metadata": {}, "source": [ "Next, draw the workflow as a graph to inspect the steps it will take to reduce the data.\n", - "Note the groups where entries are labeled with `triplet=x`.\n", + "Note the groups where entries are labeled with `triplet=x`. (These labels will be `dim_0=x` if you don't have [Pandas](https://pandas.pydata.org/) installed.)\n", "In this example, there are only two triplets but, as explained above, in a realistic case, there would be 45." ] }, diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index d3f2b54ae..e66c37cbb 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -17,7 +17,7 @@ dnspython==2.7.0 # via email-validator email-validator==2.2.0 # via scippneutron -essreduce==25.3.0 +essreduce==25.3.1 # via -r base.in fonttools==4.56.0 # via matplotlib @@ -45,7 +45,7 @@ mpltoolbox==24.5.1 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.3 +numpy==2.2.4 # via # contourpy # h5py @@ -68,7 +68,7 @@ pydantic==2.10.6 # via scippneutron pydantic-core==2.27.2 # via pydantic -pyparsing==3.2.1 +pyparsing==3.2.2 # via matplotlib python-dateutil==2.9.0.post0 # via diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 929e397d6..d592d5dc6 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -13,13 +13,13 @@ exceptiongroup==1.2.2 # via pytest idna==3.10 # via requests -iniconfig==2.0.0 +iniconfig==2.1.0 # via pytest packaging==24.2 # via # pooch # pytest -platformdirs==4.3.6 +platformdirs==4.3.7 # via pooch pluggy==1.5.0 # via pytest diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 9a0cd4667..230929a76 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -17,7 +17,7 @@ colorama==0.4.6 # via tox distlib==0.3.9 # via virtualenv -filelock==3.17.0 +filelock==3.18.0 # via # tox # virtualenv @@ -32,7 +32,7 @@ packaging==24.2 # -r ci.in # pyproject-api # tox -platformdirs==4.3.6 +platformdirs==4.3.7 # via # tox # virtualenv diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index e9600c7a7..eff3d0b37 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -12,7 +12,7 @@ -r static.txt -r test.txt -r wheels.txt -anyio==4.8.0 +anyio==4.9.0 # via # httpx # jupyter-server @@ -22,7 +22,7 @@ argon2-cffi-bindings==21.2.0 # via argon2-cffi arrow==1.3.0 # via isoduration -async-lru==2.0.4 +async-lru==2.0.5 # via jupyterlab cffi==1.17.1 # via argon2-cffi-bindings @@ -32,7 +32,7 @@ click==8.1.8 # pip-tools copier==9.6.0 # via -r dev.in -dunamai==1.23.0 +dunamai==1.23.1 # via copier fqdn==1.5.1 # via jsonschema @@ -69,7 +69,7 @@ jupyter-server==2.15.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.3.5 +jupyterlab==4.3.6 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab diff --git a/packages/essspectroscopy/requirements/docs.in b/packages/essspectroscopy/requirements/docs.in index 898f0cd49..4e3d51032 100644 --- a/packages/essspectroscopy/requirements/docs.in +++ b/packages/essspectroscopy/requirements/docs.in @@ -3,6 +3,7 @@ ipykernel ipython!=8.7.0 # Breaks syntax highlighting in Jupyter code cells. myst-parser nbsphinx +pandas pooch pydata-sphinx-theme>=0.14 sphinx diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 90e3d512f..cafb4f5fa 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -1,4 +1,4 @@ -# SHA1:76d668ce06113541571e62da41baa0b2dc6b65be +# SHA1:d3c0de19a558da7484a806c760b01e423c9c1da7 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -12,7 +12,7 @@ alabaster==1.0.0 # via sphinx asttokens==3.0.0 # via stack-data -attrs==25.2.0 +attrs==25.3.0 # via # jsonschema # referencing @@ -99,7 +99,7 @@ mdit-py-plugins==0.4.2 # via myst-parser mdurl==0.1.2 # via markdown-it-py -mistune==3.1.2 +mistune==3.1.3 # via nbconvert myst-parser==4.0.1 # via -r docs.in @@ -116,13 +116,15 @@ nbsphinx==0.9.7 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel +pandas==2.2.3 + # via -r docs.in pandocfilters==1.5.1 # via nbconvert parso==0.8.4 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.3.6 +platformdirs==4.3.7 # via # jupyter-core # pooch @@ -145,6 +147,8 @@ pygments==2.19.1 # nbconvert # pydata-sphinx-theme # sphinx +pytz==2025.1 + # via pandas pyyaml==6.0.2 # via myst-parser pyzmq==26.3.0 @@ -216,6 +220,8 @@ traitlets==5.14.3 # nbconvert # nbformat # nbsphinx +tzdata==2025.2 + # via pandas urllib3==2.3.0 # via requests wcwidth==0.2.13 diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 99e2585ea..a09bcdf71 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -40,7 +40,7 @@ idna==3.10 # requests importlib-resources==6.5.2 # via tof -iniconfig==2.0.0 +iniconfig==2.1.0 # via pytest kiwisolver==1.4.8 # via matplotlib @@ -58,7 +58,7 @@ mpltoolbox==24.5.1 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.3 +numpy==2.2.4 # via # contourpy # h5py @@ -75,7 +75,7 @@ packaging==24.2 # pytest pillow==11.1.0 # via matplotlib -platformdirs==4.3.6 +platformdirs==4.3.7 # via pooch plopp @ git+https://github.com/scipp/plopp@main # via @@ -86,11 +86,11 @@ pluggy==1.5.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.11.0b1 +pydantic==2.11.0b2 # via scippneutron -pydantic-core==2.31.1 +pydantic-core==2.32.0 # via pydantic -pyparsing==3.2.1 +pyparsing==3.2.2 # via matplotlib pytest==8.3.5 # via -r nightly.in @@ -134,7 +134,7 @@ tomli==2.2.1 # via pytest tqdm==4.67.1 # via -r nightly.in -typing-extensions==4.12.2 +typing-extensions==4.13.0rc1 # via # pydantic # pydantic-core diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 3471aadfb..bf84eda07 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,15 +9,15 @@ cfgv==3.4.0 # via pre-commit distlib==0.3.9 # via virtualenv -filelock==3.17.0 +filelock==3.18.0 # via virtualenv identify==2.6.9 # via pre-commit nodeenv==1.9.1 # via pre-commit -platformdirs==4.3.6 +platformdirs==4.3.7 # via virtualenv -pre-commit==4.1.0 +pre-commit==4.2.0 # via -r static.in pyyaml==6.0.2 # via pre-commit From db046965c0eef537e09eb581829a57f7f9e3c2eb Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 25 Mar 2025 09:25:52 +0100 Subject: [PATCH 127/330] Use public function --- packages/essspectroscopy/src/ess/bifrost/io/nexus.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 6b234ceba..9a9072463 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -40,9 +40,9 @@ def load_instrument_angles( ) -> InstrumentAngles[RunType]: # TODO need mechanism in ESSreduce to load specific components of non-unique # class by name - from ess.reduce.nexus._nexus_loader import _open_nexus_file, _unique_child_group + from ess.reduce.nexus._nexus_loader import _unique_child_group, open_nexus_file - with _open_nexus_file(file_spec.value) as file: + with open_nexus_file(file_spec.value) as file: parameters = _unique_child_group( _unique_child_group(file, snx.NXentry, name=None), snx.NXparameters, From cfb6bfb6b7e2be391dda48cb65634ecfac02caaa Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 26 Mar 2025 15:55:14 +0100 Subject: [PATCH 128/330] Use new unit handling of scipp>=25.3.0 --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- packages/essspectroscopy/requirements/base.txt | 6 +++--- packages/essspectroscopy/requirements/ci.txt | 2 +- packages/essspectroscopy/requirements/docs.txt | 4 ++-- packages/essspectroscopy/requirements/nightly.txt | 4 ++-- packages/essspectroscopy/src/ess/bifrost/io/mcstas.py | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index fb832cda7..6eaee1abe 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -34,7 +34,7 @@ dependencies = [ "essreduce>=25.02.4", "loguru", "sciline>=24.6.3", - "scipp>=24.9.1", + "scipp>=25.3.0", "scippneutron>=24.8.0", "scippnexus>=24.9.0", "tof>=25.01.2", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 862746c50..18d92a262 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -5,7 +5,7 @@ essreduce>=25.02.4 loguru sciline>=24.6.3 -scipp>=24.9.1 +scipp>=25.3.0 scippneutron>=24.8.0 scippnexus>=24.9.0 tof>=25.01.2 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index e66c37cbb..f45fa5c91 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:7257c564a37a68f9db3c7126051d084c01df47d8 +# SHA1:4a5c6a95ab1fe864759ba6185a490e25573a0f53 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -68,7 +68,7 @@ pydantic==2.10.6 # via scippneutron pydantic-core==2.27.2 # via pydantic -pyparsing==3.2.2 +pyparsing==3.2.3 # via matplotlib python-dateutil==2.9.0.post0 # via @@ -106,7 +106,7 @@ tof==25.2.0 # via -r base.in tqdm==4.67.1 # via -r base.in -typing-extensions==4.12.2 +typing-extensions==4.13.0 # via # pydantic # pydantic-core diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 230929a76..87052409c 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -50,7 +50,7 @@ tomli==2.2.1 # tox tox==4.24.2 # via -r ci.in -typing-extensions==4.12.2 +typing-extensions==4.13.0 # via tox urllib3==2.3.0 # via requests diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index cafb4f5fa..0b11103ab 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -147,7 +147,7 @@ pygments==2.19.1 # nbconvert # pydata-sphinx-theme # sphinx -pytz==2025.1 +pytz==2025.2 # via pandas pyyaml==6.0.2 # via myst-parser @@ -163,7 +163,7 @@ requests==2.32.3 # via # pooch # sphinx -rpds-py==0.23.1 +rpds-py==0.24.0 # via # jsonschema # referencing diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index a09bcdf71..d7ab79e0a 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -90,7 +90,7 @@ pydantic==2.11.0b2 # via scippneutron pydantic-core==2.32.0 # via pydantic -pyparsing==3.2.2 +pyparsing==3.2.3 # via matplotlib pytest==8.3.5 # via -r nightly.in @@ -134,7 +134,7 @@ tomli==2.2.1 # via pytest tqdm==4.67.1 # via -r nightly.in -typing-extensions==4.13.0rc1 +typing-extensions==4.13.0 # via # pydantic # pydantic-core diff --git a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py index 8867f0fb6..945e8078e 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py @@ -59,7 +59,7 @@ def convert_simulated_time_to_event_time_offset( """ def wrap_event_time_offset(event_time_offset: sc.Variable) -> sc.Variable: - return event_time_offset % pulse_period.to(unit=event_time_offset.bins.unit) + return event_time_offset % pulse_period.to(unit=event_time_offset.unit) res = mcstas_data.transform_coords( frame_time=wrap_event_time_offset, From ad5cf6f98e76959380d8c81d6635ec6a52b8d72b Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 26 Mar 2025 15:56:54 +0100 Subject: [PATCH 129/330] Remove unused dependencies --- packages/essspectroscopy/pyproject.toml | 2 -- packages/essspectroscopy/requirements/base.in | 2 -- packages/essspectroscopy/requirements/base.txt | 6 +----- packages/essspectroscopy/requirements/nightly.in | 2 -- packages/essspectroscopy/requirements/nightly.txt | 6 +----- 5 files changed, 2 insertions(+), 16 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 6eaee1abe..0e87b8eef 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -32,13 +32,11 @@ requires-python = ">=3.10" # Make sure to list one dependency per line. dependencies = [ "essreduce>=25.02.4", - "loguru", "sciline>=24.6.3", "scipp>=25.3.0", "scippneutron>=24.8.0", "scippnexus>=24.9.0", "tof>=25.01.2", - "tqdm", ] dynamic = ["version"] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 18d92a262..40897e263 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -3,10 +3,8 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! essreduce>=25.02.4 -loguru sciline>=24.6.3 scipp>=25.3.0 scippneutron>=24.8.0 scippnexus>=24.9.0 tof>=25.01.2 -tqdm diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index f45fa5c91..4e63793f4 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:4a5c6a95ab1fe864759ba6185a490e25573a0f53 +# SHA1:e26ba85782e0c5fb55f3b8c93a94283d2b89baf3 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -35,8 +35,6 @@ lazy-loader==0.4 # via # plopp # scippneutron -loguru==0.7.3 - # via -r base.in matplotlib==3.10.1 # via # mpltoolbox @@ -104,8 +102,6 @@ six==1.17.0 # via python-dateutil tof==25.2.0 # via -r base.in -tqdm==4.67.1 - # via -r base.in typing-extensions==4.13.0 # via # pydantic diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 67f7b120a..7bad2def4 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,9 +1,7 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -loguru tof>=25.01.2 -tqdm pooch pytest scipp diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index d7ab79e0a..b9e1404eb 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:535311ce15f018bdb70abaeacbf1bcc612a11614 +# SHA1:1c75f2044cf38d8a6c73ec91ed5b58d78702c20f # # This file is autogenerated by pip-compile-multi # To update, run: @@ -48,8 +48,6 @@ lazy-loader==0.4 # via # plopp # scippneutron -loguru==0.7.3 - # via -r nightly.in matplotlib==3.10.1 # via # mpltoolbox @@ -132,8 +130,6 @@ tof==25.2.0 # via -r nightly.in tomli==2.2.1 # via pytest -tqdm==4.67.1 - # via -r nightly.in typing-extensions==4.13.0 # via # pydantic From 8365df9d72492e53de7b0e59ebd62fc8c9bb74eb Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 31 Mar 2025 10:04:59 +0200 Subject: [PATCH 130/330] Depend on pandas --- packages/essspectroscopy/pyproject.toml | 1 + packages/essspectroscopy/requirements/base.in | 1 + packages/essspectroscopy/requirements/base.txt | 17 ++++++++++++++--- packages/essspectroscopy/requirements/ci.txt | 2 +- packages/essspectroscopy/requirements/docs.txt | 6 ------ .../essspectroscopy/requirements/nightly.in | 1 + .../essspectroscopy/requirements/nightly.txt | 14 +++++++++++--- 7 files changed, 29 insertions(+), 13 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 0e87b8eef..2d15a42cc 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -32,6 +32,7 @@ requires-python = ">=3.10" # Make sure to list one dependency per line. dependencies = [ "essreduce>=25.02.4", + "pandas>=2", "sciline>=24.6.3", "scipp>=25.3.0", "scippneutron>=24.8.0", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 40897e263..9d08d3a0b 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -3,6 +3,7 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! essreduce>=25.02.4 +pandas>=2 sciline>=24.6.3 scipp>=25.3.0 scippneutron>=24.8.0 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 4e63793f4..c3ced724e 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:e26ba85782e0c5fb55f3b8c93a94283d2b89baf3 +# SHA1:3890a084f8e7a68d7ff59955a33472acf8520dcc # # This file is autogenerated by pip-compile-multi # To update, run: @@ -49,6 +49,7 @@ numpy==2.2.4 # h5py # matplotlib # mpltoolbox + # pandas # scipp # scippneutron # scipy @@ -56,23 +57,28 @@ packaging==24.2 # via # lazy-loader # matplotlib +pandas==2.2.3 + # via -r base.in pillow==11.1.0 # via matplotlib plopp==25.3.0 # via # scippneutron # tof -pydantic==2.10.6 +pydantic==2.11.1 # via scippneutron -pydantic-core==2.27.2 +pydantic-core==2.33.0 # via pydantic pyparsing==3.2.3 # via matplotlib python-dateutil==2.9.0.post0 # via # matplotlib + # pandas # scippneutron # scippnexus +pytz==2025.2 + # via pandas sciline==24.10.0 # via # -r base.in @@ -106,3 +112,8 @@ typing-extensions==4.13.0 # via # pydantic # pydantic-core + # typing-inspection +typing-inspection==0.4.0 + # via pydantic +tzdata==2025.2 + # via pandas diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 87052409c..b173c0461 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -48,7 +48,7 @@ tomli==2.2.1 # via # pyproject-api # tox -tox==4.24.2 +tox==4.25.0 # via -r ci.in typing-extensions==4.13.0 # via tox diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 0b11103ab..66ff2123a 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -116,8 +116,6 @@ nbsphinx==0.9.7 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel -pandas==2.2.3 - # via -r docs.in pandocfilters==1.5.1 # via nbconvert parso==0.8.4 @@ -147,8 +145,6 @@ pygments==2.19.1 # nbconvert # pydata-sphinx-theme # sphinx -pytz==2025.2 - # via pandas pyyaml==6.0.2 # via myst-parser pyzmq==26.3.0 @@ -220,8 +216,6 @@ traitlets==5.14.3 # nbconvert # nbformat # nbsphinx -tzdata==2025.2 - # via pandas urllib3==2.3.0 # via requests wcwidth==0.2.13 diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 7bad2def4..27ace1add 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,6 +1,7 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! +pandas>=2 tof>=25.01.2 pooch pytest diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index b9e1404eb..562eb2533 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:1c75f2044cf38d8a6c73ec91ed5b58d78702c20f +# SHA1:306a5ef40573165e2c6c4f812ae9b821f9c991ac # # This file is autogenerated by pip-compile-multi # To update, run: @@ -62,6 +62,7 @@ numpy==2.2.4 # h5py # matplotlib # mpltoolbox + # pandas # scipp # scippneutron # scipy @@ -71,6 +72,8 @@ packaging==24.2 # matplotlib # pooch # pytest +pandas==2.2.3 + # via -r nightly.in pillow==11.1.0 # via matplotlib platformdirs==4.3.7 @@ -84,9 +87,9 @@ pluggy==1.5.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.11.0b2 +pydantic==2.11.1 # via scippneutron -pydantic-core==2.32.0 +pydantic-core==2.33.0 # via pydantic pyparsing==3.2.3 # via matplotlib @@ -95,8 +98,11 @@ pytest==8.3.5 python-dateutil==2.9.0.post0 # via # matplotlib + # pandas # scippneutron # scippnexus +pytz==2025.2 + # via pandas requests==2.32.3 # via pooch sciline @ git+https://github.com/scipp/sciline@main @@ -137,5 +143,7 @@ typing-extensions==4.13.0 # typing-inspection typing-inspection==0.4.0 # via pydantic +tzdata==2025.2 + # via pandas urllib3==2.3.0 # via requests From 435790b6628e54604e9894b6dac46714dbd552c9 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 31 Mar 2025 10:29:10 +0200 Subject: [PATCH 131/330] Depend on graphviz --- packages/essspectroscopy/pyproject.toml | 1 + packages/essspectroscopy/requirements/base.in | 1 + packages/essspectroscopy/requirements/base.txt | 4 +++- packages/essspectroscopy/requirements/nightly.in | 1 + packages/essspectroscopy/requirements/nightly.txt | 4 +++- 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 2d15a42cc..d27e0f7ee 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -32,6 +32,7 @@ requires-python = ">=3.10" # Make sure to list one dependency per line. dependencies = [ "essreduce>=25.02.4", + "graphviz >= 0.20", "pandas>=2", "sciline>=24.6.3", "scipp>=25.3.0", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 9d08d3a0b..46a0cc6ba 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -3,6 +3,7 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! essreduce>=25.02.4 +graphviz >= 0.20 pandas>=2 sciline>=24.6.3 scipp>=25.3.0 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index c3ced724e..d591e0b05 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:3890a084f8e7a68d7ff59955a33472acf8520dcc +# SHA1:c662f67d217de9dde58e49d9fb429c70597a9d89 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -21,6 +21,8 @@ essreduce==25.3.1 # via -r base.in fonttools==4.56.0 # via matplotlib +graphviz==0.20.3 + # via -r base.in h5py==3.13.0 # via # scippneutron diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 27ace1add..d71e70742 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,6 +1,7 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! +graphviz >= 0.20 pandas>=2 tof>=25.01.2 pooch diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 562eb2533..7fbd71f36 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:306a5ef40573165e2c6c4f812ae9b821f9c991ac +# SHA1:96e9d77800968f1c135ad89d6477fa86fe13ff31 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -30,6 +30,8 @@ exceptiongroup==1.2.2 # via pytest fonttools==4.56.0 # via matplotlib +graphviz==0.20.3 + # via -r nightly.in h5py==3.13.0 # via # scippneutron From 88fa01a2bba5aba242aa25a8e66bf433fa160c82 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 31 Mar 2025 10:40:26 +0200 Subject: [PATCH 132/330] Copier update --- packages/essspectroscopy/.copier-answers.yml | 2 +- .../.github/workflows/docs.yml | 4 ++- .../.github/workflows/release.yml | 2 +- packages/essspectroscopy/.gitignore | 1 + packages/essspectroscopy/docs/index.md | 36 +++++++++++++++++-- .../essspectroscopy/docs/user-guide/index.md | 3 +- packages/essspectroscopy/pyproject.toml | 6 ++-- packages/essspectroscopy/tox.ini | 2 ++ 8 files changed, 47 insertions(+), 9 deletions(-) diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index a8c8d295b..10a646243 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 5c4fd02 +_commit: 56c5662 _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.13' diff --git a/packages/essspectroscopy/.github/workflows/docs.yml b/packages/essspectroscopy/.github/workflows/docs.yml index a90bcf100..47294b922 100644 --- a/packages/essspectroscopy/.github/workflows/docs.yml +++ b/packages/essspectroscopy/.github/workflows/docs.yml @@ -65,11 +65,13 @@ jobs: - run: tox -e linkcheck if: ${{ inputs.linkcheck }} - uses: actions/upload-artifact@v4 + id: artifact-upload-step with: name: docs_html path: html/ + - run: echo "::notice::https://remote-unzip.deno.dev/${{ github.repository }}/artifacts/${{ steps.artifact-upload-step.outputs.artifact-id }}" - - uses: JamesIves/github-pages-deploy-action@v4.7.2 + - uses: JamesIves/github-pages-deploy-action@v4.7.3 if: ${{ inputs.publish }} with: branch: gh-pages diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml index 53ca2e0a5..029505f4c 100644 --- a/packages/essspectroscopy/.github/workflows/release.yml +++ b/packages/essspectroscopy/.github/workflows/release.yml @@ -68,7 +68,7 @@ jobs: if: github.event_name == 'release' && github.event.action == 'published' steps: - uses: actions/download-artifact@v4 - - uses: pypa/gh-action-pypi-publish@v1.8.14 + - uses: pypa/gh-action-pypi-publish@v1.12.4 upload_conda: name: Deploy Conda diff --git a/packages/essspectroscopy/.gitignore b/packages/essspectroscopy/.gitignore index 340e6499b..720318ba4 100644 --- a/packages/essspectroscopy/.gitignore +++ b/packages/essspectroscopy/.gitignore @@ -14,6 +14,7 @@ venv .venv # Caches +*.DS_Store .clangd/ *.ipynb_checkpoints __pycache__/ diff --git a/packages/essspectroscopy/docs/index.md b/packages/essspectroscopy/docs/index.md index 4a8b112a5..14657ec2f 100644 --- a/packages/essspectroscopy/docs/index.md +++ b/packages/essspectroscopy/docs/index.md @@ -1,10 +1,42 @@ -# ESSspectroscopy +:::{image} _static/logo.svg +:class: only-light +:alt: ESSspectroscopy +:width: 60% +:align: center +::: +:::{image} _static/logo-dark.svg +:class: only-dark +:alt: ESSspectroscopy +:width: 60% +:align: center +::: - +```{raw} html + +``` + +```{role} transparent +``` + +# {transparent}`ESSspectroscopy` + + Spectroscopy data reduction for the European Spallation Source

+:::{include} user-guide/installation.md +:heading-offset: 1 +::: + +## Get in touch + +- If you have questions that are not answered by these documentation pages, ask on [discussions](https://github.com/scipp/essspectroscopy/discussions). Please include a self-contained reproducible example if possible. +- Report bugs (including unclear, missing, or wrong documentation!), suggest features or view the source code [on GitHub](https://github.com/scipp/essspectroscopy). + ```{toctree} --- hidden: diff --git a/packages/essspectroscopy/docs/user-guide/index.md b/packages/essspectroscopy/docs/user-guide/index.md index bf1746fe2..7aa380fd1 100644 --- a/packages/essspectroscopy/docs/user-guide/index.md +++ b/packages/essspectroscopy/docs/user-guide/index.md @@ -1,9 +1,10 @@ -# User guide +# User Guide ```{toctree} --- maxdepth: 1 --- + installation bifrost/index ``` diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index d27e0f7ee..e161fe42f 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -1,6 +1,6 @@ [build-system] requires = [ - "setuptools>=68", + "setuptools>=77", "setuptools_scm[toml]>=8.0", ] build-backend = "setuptools.build_meta" @@ -9,11 +9,11 @@ build-backend = "setuptools.build_meta" name = "essspectroscopy" description = "Spectroscopy data reduction for the European Spallation Source " authors = [{ name = "Scipp contributors" }] -license = { file = "LICENSE" } +license = "BSD-3-Clause" +license-files = ["LICENSE"] readme = "README.md" classifiers = [ "Intended Audience :: Science/Research", - "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", diff --git a/packages/essspectroscopy/tox.ini b/packages/essspectroscopy/tox.ini index 04d552b19..5b137d891 100644 --- a/packages/essspectroscopy/tox.ini +++ b/packages/essspectroscopy/tox.ini @@ -64,6 +64,8 @@ description = Update dependencies by running pip-compile-multi deps = pip-compile-multi tomli + # Avoid https://github.com/jazzband/pip-tools/issues/2131 + pip==24.2 skip_install = true changedir = requirements commands = python ./make_base.py --nightly scipp,scippneutron,sciline,plopp,scippnexus,essreduce From 33a307bbb36a04bde9ed49c8c26c24504913418e Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 31 Mar 2025 10:41:06 +0200 Subject: [PATCH 133/330] Copier update ESS --- packages/essspectroscopy/.copier-answers.ess.yml | 2 +- packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md diff --git a/packages/essspectroscopy/.copier-answers.ess.yml b/packages/essspectroscopy/.copier-answers.ess.yml index 1ab77e63d..dcad7e5fb 100644 --- a/packages/essspectroscopy/.copier-answers.ess.yml +++ b/packages/essspectroscopy/.copier-answers.ess.yml @@ -1,3 +1,3 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 0951a4b +_commit: d1d5caa _src_path: https://github.com/scipp/ess_template.git diff --git a/packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md b/packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md deleted file mode 100644 index 22a75aeb0..000000000 --- a/packages/essspectroscopy/.github/ISSUE_TEMPLATE/blank.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: Blank -about: General issue that does not fit another category -title: '' -labels: '' -assignees: '' - ---- From 4e6d70400192fa4bc1571fdaa632d327476d7cc3 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 31 Mar 2025 11:24:11 +0200 Subject: [PATCH 134/330] Require setuptools >= 77 --- packages/essspectroscopy/conda/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml index 868f98f79..3ab7d012f 100644 --- a/packages/essspectroscopy/conda/meta.yaml +++ b/packages/essspectroscopy/conda/meta.yaml @@ -14,7 +14,7 @@ source: requirements: build: - - setuptools + - setuptools>=77 - setuptools_scm run: - python>=3.10 From 8b8b3596424e4d5425cde2d4384bdb82e9b7c3c1 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 31 Mar 2025 15:46:43 +0200 Subject: [PATCH 135/330] Copier update Fixes conda builds by reverting to older setuptools --- packages/essspectroscopy/.copier-answers.yml | 2 +- packages/essspectroscopy/pyproject.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index 10a646243..03c7402a9 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 56c5662 +_commit: a021314 _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.13' diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index e161fe42f..d27e0f7ee 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -1,6 +1,6 @@ [build-system] requires = [ - "setuptools>=77", + "setuptools>=68", "setuptools_scm[toml]>=8.0", ] build-backend = "setuptools.build_meta" @@ -9,11 +9,11 @@ build-backend = "setuptools.build_meta" name = "essspectroscopy" description = "Spectroscopy data reduction for the European Spallation Source " authors = [{ name = "Scipp contributors" }] -license = "BSD-3-Clause" -license-files = ["LICENSE"] +license = { file = "LICENSE" } readme = "README.md" classifiers = [ "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", From 883d6faaac78bed3e9c72f78dc27054c65ccd928 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 31 Mar 2025 15:57:33 +0200 Subject: [PATCH 136/330] Remove lower bound on setuptools --- packages/essspectroscopy/conda/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml index 3ab7d012f..868f98f79 100644 --- a/packages/essspectroscopy/conda/meta.yaml +++ b/packages/essspectroscopy/conda/meta.yaml @@ -14,7 +14,7 @@ source: requirements: build: - - setuptools>=77 + - setuptools - setuptools_scm run: - python>=3.10 From ce581b1b37e606fa2799015195f7922cd9b41cb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Apr 2025 11:31:21 +0000 Subject: [PATCH 137/330] Bump scipp from 25.3.0 to 25.4.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 25.3.0 to 25.4.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/25.03.0...25.04.0) --- updated-dependencies: - dependency-name: scipp dependency-version: 25.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index d591e0b05..cd0177035 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -85,7 +85,7 @@ sciline==24.10.0 # via # -r base.in # essreduce -scipp==25.3.0 +scipp==25.4.0 # via # -r base.in # essreduce From 43ee5efc658349ec9e754fc993e80af8a7b421ae Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 10 Apr 2025 10:07:19 +0200 Subject: [PATCH 138/330] Require sciline>=25.4.1 Needed for variadic Scope --- packages/essspectroscopy/pyproject.toml | 4 ++-- packages/essspectroscopy/requirements/base.in | 2 +- .../essspectroscopy/requirements/base.txt | 19 ++++++++++--------- packages/essspectroscopy/requirements/ci.txt | 4 ++-- packages/essspectroscopy/requirements/dev.txt | 4 ++-- .../essspectroscopy/requirements/docs.txt | 4 ++-- .../essspectroscopy/requirements/nightly.txt | 11 ++++++----- .../essspectroscopy/requirements/static.txt | 2 +- 8 files changed, 26 insertions(+), 24 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index d27e0f7ee..4b9e5adc4 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -32,9 +32,9 @@ requires-python = ">=3.10" # Make sure to list one dependency per line. dependencies = [ "essreduce>=25.02.4", - "graphviz >= 0.20", + "graphviz>=0.20", "pandas>=2", - "sciline>=24.6.3", + "sciline>=25.4.1", "scipp>=25.3.0", "scippneutron>=24.8.0", "scippnexus>=24.9.0", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 46a0cc6ba..505738cb3 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -5,7 +5,7 @@ essreduce>=25.02.4 graphviz >= 0.20 pandas>=2 -sciline>=24.6.3 +sciline>=25.4.1 scipp>=25.3.0 scippneutron>=24.8.0 scippnexus>=24.9.0 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index cd0177035..e75875bf9 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:c662f67d217de9dde58e49d9fb429c70597a9d89 +# SHA1:1d8ea5e77878c30bdb0cca0028280310fd41bb07 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -17,9 +17,9 @@ dnspython==2.7.0 # via email-validator email-validator==2.2.0 # via scippneutron -essreduce==25.3.1 +essreduce==25.4.0 # via -r base.in -fonttools==4.56.0 +fonttools==4.57.0 # via matplotlib graphviz==0.20.3 # via -r base.in @@ -67,9 +67,9 @@ plopp==25.3.0 # via # scippneutron # tof -pydantic==2.11.1 +pydantic==2.11.3 # via scippneutron -pydantic-core==2.33.0 +pydantic-core==2.33.1 # via pydantic pyparsing==3.2.3 # via matplotlib @@ -81,7 +81,7 @@ python-dateutil==2.9.0.post0 # scippnexus pytz==2025.2 # via pandas -sciline==24.10.0 +sciline==25.4.1 # via # -r base.in # essreduce @@ -96,7 +96,7 @@ scippneutron==25.2.1 # via # -r base.in # essreduce -scippnexus==24.11.1 +scippnexus==25.4.0 # via # -r base.in # essreduce @@ -108,12 +108,13 @@ scipy==1.15.2 # tof six==1.17.0 # via python-dateutil -tof==25.2.0 +tof==25.4.0 # via -r base.in -typing-extensions==4.13.0 +typing-extensions==4.13.1 # via # pydantic # pydantic-core + # sciline # typing-inspection typing-inspection==0.4.0 # via pydantic diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index b173c0461..176b5124d 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -50,9 +50,9 @@ tomli==2.2.1 # tox tox==4.25.0 # via -r ci.in -typing-extensions==4.13.0 +typing-extensions==4.13.1 # via tox urllib3==2.3.0 # via requests -virtualenv==20.29.3 +virtualenv==20.30.0 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index eff3d0b37..09243eb81 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -48,7 +48,7 @@ isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.10.0 +json5==0.12.0 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema @@ -69,7 +69,7 @@ jupyter-server==2.15.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.3.6 +jupyterlab==4.4.0 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 66ff2123a..0d0af5c7f 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -54,7 +54,7 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.34.0 +ipython==8.35.0 # via # -r docs.in # ipykernel @@ -147,7 +147,7 @@ pygments==2.19.1 # sphinx pyyaml==6.0.2 # via myst-parser -pyzmq==26.3.0 +pyzmq==26.4.0 # via # ipykernel # jupyter-client diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 7fbd71f36..5861c1972 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -28,7 +28,7 @@ essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in exceptiongroup==1.2.2 # via pytest -fonttools==4.56.0 +fonttools==4.57.0 # via matplotlib graphviz==0.20.3 # via -r nightly.in @@ -89,9 +89,9 @@ pluggy==1.5.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.11.1 +pydantic==2.11.3 # via scippneutron -pydantic-core==2.33.0 +pydantic-core==2.33.1 # via pydantic pyparsing==3.2.3 # via matplotlib @@ -134,14 +134,15 @@ scipy==1.15.2 # tof six==1.17.0 # via python-dateutil -tof==25.2.0 +tof==25.4.0 # via -r nightly.in tomli==2.2.1 # via pytest -typing-extensions==4.13.0 +typing-extensions==4.13.1 # via # pydantic # pydantic-core + # sciline # typing-inspection typing-inspection==0.4.0 # via pydantic diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index bf84eda07..c0e73660f 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -21,5 +21,5 @@ pre-commit==4.2.0 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.29.3 +virtualenv==20.30.0 # via pre-commit From 863f688e8a4c424e364f7e89f945f84ed528b20d Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 10 Apr 2025 10:20:20 +0200 Subject: [PATCH 139/330] Use variadic Scope --- packages/essspectroscopy/src/ess/spectroscopy/types.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index d71c23bd5..ab0d22e10 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -94,11 +94,9 @@ class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... class TofData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -class TofMonitor( - sciline.ScopeTwoParams[RunType, MonitorType, sc.DataArray], sc.DataArray -): ... +class TofMonitor(sciline.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray): ... class WavelengthMonitor( - sciline.ScopeTwoParams[RunType, MonitorType, sc.DataArray], sc.DataArray + sciline.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray ): ... From fc5c185383b2ef442632c4f08962d1d14b77b839 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 3 Apr 2025 14:35:29 +0200 Subject: [PATCH 140/330] Remove spaces in image paths --- ...ng => Screenshot_from_2024-08-27T08-20-49.png} | Bin ...ng => Screenshot_from_2024-08-27T08-23-41.png} | Bin ...ng => Screenshot_from_2024-08-27T08-24-50.png} | Bin ...ng => Screenshot_from_2024-08-27T10-54-08.png} | Bin ...ng => Screenshot_from_2024-08-27T10-55-10.png} | Bin ...ng => Screenshot_from_2024-08-27T10-56-40.png} | Bin ...ng => Screenshot_from_2024-08-28T08-12-56.png} | Bin ...ed-issues.md => bifrost-encountered-issues.md} | 14 +++++++------- 8 files changed, 7 insertions(+), 7 deletions(-) rename packages/essspectroscopy/docs/_static/developer/{Screenshot from 2024-08-27 08-20-49.png => Screenshot_from_2024-08-27T08-20-49.png} (100%) rename packages/essspectroscopy/docs/_static/developer/{Screenshot from 2024-08-27 08-23-41.png => Screenshot_from_2024-08-27T08-23-41.png} (100%) rename packages/essspectroscopy/docs/_static/developer/{Screenshot from 2024-08-27 08-24-50.png => Screenshot_from_2024-08-27T08-24-50.png} (100%) rename packages/essspectroscopy/docs/_static/developer/{Screenshot from 2024-08-27 10-54-08.png => Screenshot_from_2024-08-27T10-54-08.png} (100%) rename packages/essspectroscopy/docs/_static/developer/{Screenshot from 2024-08-27 10-55-10.png => Screenshot_from_2024-08-27T10-55-10.png} (100%) rename packages/essspectroscopy/docs/_static/developer/{Screenshot from 2024-08-27 10-56-40.png => Screenshot_from_2024-08-27T10-56-40.png} (100%) rename packages/essspectroscopy/docs/_static/developer/{Screenshot from 2024-08-28 08-12-56.png => Screenshot_from_2024-08-28T08-12-56.png} (100%) rename packages/essspectroscopy/docs/developer/{encountered-issues.md => bifrost-encountered-issues.md} (90%) diff --git a/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-20-49.png b/packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T08-20-49.png similarity index 100% rename from packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-20-49.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T08-20-49.png diff --git a/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-23-41.png b/packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T08-23-41.png similarity index 100% rename from packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-23-41.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T08-23-41.png diff --git a/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-24-50.png b/packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T08-24-50.png similarity index 100% rename from packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 08-24-50.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T08-24-50.png diff --git a/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-54-08.png b/packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T10-54-08.png similarity index 100% rename from packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-54-08.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T10-54-08.png diff --git a/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-55-10.png b/packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T10-55-10.png similarity index 100% rename from packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-55-10.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T10-55-10.png diff --git a/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-56-40.png b/packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T10-56-40.png similarity index 100% rename from packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-27 10-56-40.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-27T10-56-40.png diff --git a/packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-28 08-12-56.png b/packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-28T08-12-56.png similarity index 100% rename from packages/essspectroscopy/docs/_static/developer/Screenshot from 2024-08-28 08-12-56.png rename to packages/essspectroscopy/docs/_static/developer/Screenshot_from_2024-08-28T08-12-56.png diff --git a/packages/essspectroscopy/docs/developer/encountered-issues.md b/packages/essspectroscopy/docs/developer/bifrost-encountered-issues.md similarity index 90% rename from packages/essspectroscopy/docs/developer/encountered-issues.md rename to packages/essspectroscopy/docs/developer/bifrost-encountered-issues.md index 71286ff3b..eb56185ca 100644 --- a/packages/essspectroscopy/docs/developer/encountered-issues.md +++ b/packages/essspectroscopy/docs/developer/bifrost-encountered-issues.md @@ -4,13 +4,13 @@ ### Description Comparing the event times when unwrapped and propagated to the sample with the normalization monitor histogram it appeared that too much time had been removed from the recorded frame-times before unwrapping. -![Screenshot from 2024-08-27 08-24-50.png](../_static/developer/Screenshot%20from%202024-08-27%2008-24-50.png) +![Screenshot from 2024-08-27 08-24-50.png](../_static/developer/Screenshot_from_2024-08-27T08-24-50.png) The calculated time of flight from sample to detector had only been checked relative to an order of magnitude estimate, which was not accurate enough. A more careful estimate shows that neutrons hitting the central pixel of each central tube in the symmetric geometry case should take around 3.3 μsec from sample to detector. -![Screenshot from 2024-08-27 08-20-49.png](../_static/developer/Screenshot%20from%202024-08-27%2008-20-49.png) +![Screenshot from 2024-08-27 08-20-49.png](../_static/developer/Screenshot_from_2024-08-27T08-20-49.png) ### Cause The sample-to-detector time-of-flight depends on the square root of the energy of the neutron, @@ -24,13 +24,13 @@ This then produced the wrong scattering angle, the wrong wavevector magnitude, a ### Resolution Correcting the calculation also corrected the per detector pixel energies -![Screenshot from 2024-08-27 10-54-08.png](../_static/developer/Screenshot%20from%202024-08-27%2010-54-08.png) +![Screenshot from 2024-08-27 10-54-08.png](../_static/developer/Screenshot_from_2024-08-27T10-54-08.png) The calculated sample-to-detector time-of-flights are consistent with the limited hand calculated values -![Screenshot from 2024-08-27 10-55-10.png](../_static/developer/Screenshot%20from%202024-08-27%2010-55-10.png) +![Screenshot from 2024-08-27 10-55-10.png](../_static/developer/Screenshot_from_2024-08-27T10-55-10.png) And the unwrapped time-at-sample seems more consistent with the monitor histogram. -![Screenshot from 2024-08-27 10-56-40.png](../_static/developer/Screenshot%20from%202024-08-27%2010-56-40.png) +![Screenshot from 2024-08-27 10-56-40.png](../_static/developer/Screenshot_from_2024-08-27T10-56-40.png) ## Wrong pixel indexing? @@ -43,7 +43,7 @@ This should mean that the first 900 pixel's events arrive at a later time-of-fli (barring wrap-around at the frame boundary). Instead, the opposite is shown -![Screenshot from 2024-08-28 08-12-56.png](../_static/developer/Screenshot%20from%202024-08-28%2008-12-56.png) +![Screenshot from 2024-08-28 08-12-56.png](../_static/developer/Screenshot_from_2024-08-28T08-12-56.png) ### Cause This could indicate a problem with the read geometry per pixel, but that seems unlikely given @@ -55,4 +55,4 @@ or from EFU pixel identifiers to position in the moreniius translation of McStas ### Solution The charge division was, effectively, reversed by switching the `A` and `B` values used in the McStas simulations. This seems to have fixed the problem, and highlights the need to systematically verify the meaning of signals -through all stages of the real instrument. \ No newline at end of file +through all stages of the real instrument. From 205da2951b962df992690fd3c01df3bd98370e18 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 3 Apr 2025 14:35:43 +0200 Subject: [PATCH 141/330] Add document to toc --- packages/essspectroscopy/docs/developer/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/developer/index.md b/packages/essspectroscopy/docs/developer/index.md index 5ada4dd8f..c735c424f 100644 --- a/packages/essspectroscopy/docs/developer/index.md +++ b/packages/essspectroscopy/docs/developer/index.md @@ -14,5 +14,5 @@ getting-started coding-conventions dependency-management architecture-decision-records +bifrost-encountered-issues ``` - From 4631a02a4561c5286c8a7078b0e8f8c0980c6849 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 3 Apr 2025 14:37:00 +0200 Subject: [PATCH 142/330] Fix indentation --- packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index fe2c59ba6..82b9146fe 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -29,6 +29,9 @@ def to_nxspe(events: EnergyData[SampleRun], base: NXspeFileName) -> NXspeFileNam : The list of filenames containing the NXspe data. If there are N settings in the input DataArray, N filenames are returned. The names are of the form + + .. code-block:: + {base}_{i+1:0{ceil(log10(N+1))}d}.nxspe """ from pathlib import Path From 49d9cacd5b39eb4b5105a66b0f486f3b9a9832f4 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 3 Apr 2025 14:37:14 +0200 Subject: [PATCH 143/330] Make docstring raw --- .../essspectroscopy/src/ess/spectroscopy/indirect/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index ee1c5ab28..6dd974bed 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -99,7 +99,7 @@ def rotate_to_sample_table_momentum_transfer( lab_momentum_transfer: sc.Variable, gravity: sc.Variable, ) -> sc.Variable: - """Rotate the momentum transfer vector into the sample-table coordinate system + r"""Rotate the momentum transfer vector into the sample-table coordinate system Here, the momentum transfer is defined as From ee532eea97a6cedbf7a7c7f177bf20c7dec5cc09 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 3 Apr 2025 14:41:24 +0200 Subject: [PATCH 144/330] Fill in API reference --- .../docs/api-reference/index.md | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/essspectroscopy/docs/api-reference/index.md b/packages/essspectroscopy/docs/api-reference/index.md index c150567cf..f04fbf353 100644 --- a/packages/essspectroscopy/docs/api-reference/index.md +++ b/packages/essspectroscopy/docs/api-reference/index.md @@ -1,29 +1,47 @@ # API Reference -## Classes +## Workflows + +### BIFROST ```{eval-rst} -.. currentmodule:: ess.spectroscopy +.. currentmodule:: ess.bifrost .. autosummary:: - :toctree: ../generated/classes - :template: class-template.rst + :toctree: ../generated/functions :recursive: + + BifrostSimulationWorkflow ``` -## Top-level functions +## Spectroscopy ```{eval-rst} +.. currentmodule:: ess.spectroscopy + .. autosummary:: - :toctree: ../generated/functions + :toctree: ../generated/modules + :template: module-template.rst :recursive: + + indirect + types ``` -## Submodules +## BIFROST ```{eval-rst} +.. currentmodule:: ess.bifrost + .. autosummary:: :toctree: ../generated/modules :template: module-template.rst :recursive: + + data + detector + io + slicing + types + workflow ``` From cd3de0e274fcda34e0e873ab907ef113826a7f4c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 3 Apr 2025 15:07:15 +0200 Subject: [PATCH 145/330] Add missing docstrings --- .../src/ess/bifrost/__init__.py | 2 +- .../src/ess/bifrost/detector.py | 5 +++++ .../src/ess/bifrost/slicing.py | 16 +++++++++++++++ .../essspectroscopy/src/ess/bifrost/types.py | 5 +++++ .../src/ess/bifrost/workflow.py | 20 ++++++++++++++++--- .../src/ess/spectroscopy/__init__.py | 8 ++++++++ .../src/ess/spectroscopy/indirect/__init__.py | 2 ++ .../ess/spectroscopy/indirect/conversion.py | 2 ++ .../src/ess/spectroscopy/indirect/io.py | 2 ++ .../src/ess/spectroscopy/indirect/kf.py | 3 +++ .../src/ess/spectroscopy/indirect/ki.py | 4 +--- .../spectroscopy/indirect/normalization.py | 2 ++ .../src/ess/spectroscopy/types.py | 3 +++ 13 files changed, 67 insertions(+), 7 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py index 2d581f26b..ca6fd7344 100644 --- a/packages/essspectroscopy/src/ess/bifrost/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -2,7 +2,7 @@ # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) # ruff: noqa: E402, F401 -"""Components for BIFROST.""" +"""BIFROST data reduction.""" import importlib.metadata diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 62c081261..1e1f81fda 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -1,3 +1,8 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Detector handling for BIFROST.""" + import scipp as sc import scippnexus as snx diff --git a/packages/essspectroscopy/src/ess/bifrost/slicing.py b/packages/essspectroscopy/src/ess/bifrost/slicing.py index cd4c692e4..458e93cf3 100644 --- a/packages/essspectroscopy/src/ess/bifrost/slicing.py +++ b/packages/essspectroscopy/src/ess/bifrost/slicing.py @@ -1,6 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +"""Cutting BIFROST data.""" + import scipp as sc from ess.spectroscopy.types import ( @@ -15,6 +17,20 @@ def group_by_rotation( data: DetectorData[RunType], angles: InstrumentAngles[RunType], ) -> DataGroupedByRotation[RunType]: + """Group data by rotation angles. + + Parameters + ---------- + data: + Detector events with time coordinates. + angles: + Data group with time-dependent entries "a3" and "a4". + + Returns + ------- + : + ``data`` grouped by rotation angles "a3" and "a4". + """ a3 = sc.lookup(angles['a3'], 'time') a4 = sc.lookup(angles['a4'], 'time') graph = { diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index e6cb4dbf1..407083c67 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -1,6 +1,11 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +"""Domain types for BIFROST. + +This module supplements :mod:`ess.spectroscopy.types` with BIFROST-specific types. +""" + import sciline import scipp as sc diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 69de2aca9..5a4ea32be 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -1,6 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +"""BIFROST workflows.""" + from typing import Any import sciline @@ -30,7 +32,8 @@ ) -def default_parameters() -> dict[type, Any]: +def simulation_default_parameters() -> dict[type, Any]: + """Default parameters for BifrostSimulationWorkflow.""" tof_params = time_of_flight.default_parameters() return { NeXusMonitorName[FrameMonitor0]: '007_frame_0', @@ -55,11 +58,22 @@ def default_parameters() -> dict[type, Any]: def BifrostSimulationWorkflow( detector_names: list[NeXusDetectorName], ) -> sciline.Pipeline: - """Data reduction workflow for simulated BIFROST data.""" + """Data reduction workflow for simulated BIFROST data. + + Parameters + ---------- + detector_names: + Names of ``NXdetector`` groups in the input NeXus file. + + Returns + ------- + : + A pipeline for reducing simulated BIFROST data. + """ workflow = nexus.LoadNeXusWorkflow() for provider in _SIMULATION_PROVIDERS: workflow.insert(provider) - for key, val in default_parameters().items(): + for key, val in simulation_default_parameters().items(): workflow[key] = val workflow[DataGroupedByRotation[SampleRun]] = ( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py index 93c529095..958646415 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py @@ -2,6 +2,14 @@ # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) # ruff: noqa: E402, F401, I +"""Data reduction for ESS spectroscopy experiments. + +This package contains common functionality for spectrometers at ESS. +For instrument-specifics, see + +- :mod:`ess.bifrost` +""" + import importlib.metadata try: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py index 2d643f861..93bcbcca3 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/__init__.py @@ -1,2 +1,4 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Indirect spectroscopy at ESS.""" diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 6dd974bed..6a8e5cf45 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -1,6 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +"""Coordinate conversions for indirect spectroscopy.""" + import numpy as np import scipp as sc from scippneutron.conversion.tof import energy_from_wavelength, wavelength_from_tof diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index 82b9146fe..35633fe9e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -1,6 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +"""Input / output for indirect spectroscopy.""" + from __future__ import annotations import h5py diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index cdc5936b2..91a2079fd 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -1,5 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Handling of final parameters / secondary spectrometer.""" + import numpy as np import scipp as sc from scippneutron.conversion.beamline import ( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index c684b0020..b808425dc 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -1,9 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) -"""Utilities for the primary spectrometer of an -indirect geometry time-of-flight spectrometer -""" +"""Handling of initial parameters / primary spectrometer.""" from __future__ import annotations diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py index 787d4c2c4..8398a88ee 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py @@ -1,6 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +"""Normalization routines.""" + import sciline from ess.reduce import time_of_flight diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index ab0d22e10..9bd6277c6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -1,5 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Domain types for spectroscopy.""" + from typing import Any, NewType, TypeVar import sciline From 58791154039d9be97f3187d73b5c79421186f1b8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 3 Apr 2025 15:07:59 +0200 Subject: [PATCH 146/330] Rename slicing to cutting --- packages/essspectroscopy/docs/api-reference/index.md | 2 +- .../src/ess/bifrost/{slicing.py => cutting.py} | 0 packages/essspectroscopy/src/ess/bifrost/workflow.py | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename packages/essspectroscopy/src/ess/bifrost/{slicing.py => cutting.py} (100%) diff --git a/packages/essspectroscopy/docs/api-reference/index.md b/packages/essspectroscopy/docs/api-reference/index.md index f04fbf353..fe91fdeb4 100644 --- a/packages/essspectroscopy/docs/api-reference/index.md +++ b/packages/essspectroscopy/docs/api-reference/index.md @@ -38,10 +38,10 @@ :template: module-template.rst :recursive: + cutting data detector io - slicing types workflow ``` diff --git a/packages/essspectroscopy/src/ess/bifrost/slicing.py b/packages/essspectroscopy/src/ess/bifrost/cutting.py similarity index 100% rename from packages/essspectroscopy/src/ess/bifrost/slicing.py rename to packages/essspectroscopy/src/ess/bifrost/cutting.py diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 5a4ea32be..88fb9385a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -20,10 +20,10 @@ SampleRun, ) +from .cutting import providers as cutting_providers from .detector import merge_triplets from .detector import providers as detector_providers from .io import mcstas, nexus -from .slicing import providers as slicing_providers from .types import ( FrameMonitor0, FrameMonitor1, @@ -48,7 +48,7 @@ def simulation_default_parameters() -> dict[type, Any]: *conversion_providers, *detector_providers, *mcstas.providers, - *slicing_providers, + *cutting_providers, *ki_providers, *kf_providers, *normalisation_providers, From 6f46a1d0f0ad3d269e7db9788da88822c0b7950b Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 8 May 2025 10:43:03 +0200 Subject: [PATCH 147/330] Use new tof workflow --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 4 +- .../essspectroscopy/requirements/base.txt | 30 +++++++-------- .../essspectroscopy/requirements/basetest.txt | 10 ++--- packages/essspectroscopy/requirements/ci.txt | 14 +++---- packages/essspectroscopy/requirements/dev.txt | 12 +++--- .../essspectroscopy/requirements/docs.txt | 20 +++++----- .../essspectroscopy/requirements/mypy.txt | 2 +- .../essspectroscopy/requirements/nightly.in | 2 +- .../essspectroscopy/requirements/nightly.txt | 32 ++++++++-------- .../essspectroscopy/requirements/static.txt | 6 +-- .../essspectroscopy/requirements/wheels.txt | 2 +- .../essspectroscopy/src/ess/bifrost/data.py | 6 +-- .../ess/spectroscopy/indirect/conversion.py | 8 ++-- .../src/ess/spectroscopy/indirect/ki.py | 15 ++++---- .../spectroscopy/indirect/normalization.py | 24 ++++++++---- .../src/ess/spectroscopy/types.py | 8 +--- .../tools/bifrost-make-tof-lookup-table.ipynb | 38 +++++++++++-------- 18 files changed, 122 insertions(+), 113 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 4b9e5adc4..daec80710 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -31,7 +31,7 @@ requires-python = ">=3.10" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=25.02.4", + "essreduce>=25.05.0", "graphviz>=0.20", "pandas>=2", "sciline>=25.4.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 505738cb3..9449657f7 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,8 +2,8 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=25.02.4 -graphviz >= 0.20 +essreduce>=25.05.0 +graphviz>=0.20 pandas>=2 sciline>=25.4.1 scipp>=25.3.0 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index e75875bf9..970d9d196 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:1d8ea5e77878c30bdb0cca0028280310fd41bb07 +# SHA1:583283177dd4128f99b55a3f9c5588a874d3d5f8 # # This file is autogenerated by pip-compile-multi # To update, run: @@ -7,7 +7,7 @@ # annotated-types==0.7.0 # via pydantic -contourpy==1.3.1 +contourpy==1.3.2 # via matplotlib cyclebane==24.10.0 # via sciline @@ -17,7 +17,7 @@ dnspython==2.7.0 # via email-validator email-validator==2.2.0 # via scippneutron -essreduce==25.4.0 +essreduce==25.5.0 # via -r base.in fonttools==4.57.0 # via matplotlib @@ -29,47 +29,45 @@ h5py==3.13.0 # scippnexus idna==3.10 # via email-validator -importlib-resources==6.5.2 - # via tof kiwisolver==1.4.8 # via matplotlib lazy-loader==0.4 # via # plopp # scippneutron + # tof matplotlib==3.10.1 # via # mpltoolbox # plopp -mpltoolbox==24.5.1 +mpltoolbox==25.4.0 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.4 +numpy==2.2.5 # via # contourpy # h5py # matplotlib - # mpltoolbox # pandas # scipp # scippneutron # scipy -packaging==24.2 +packaging==25.0 # via # lazy-loader # matplotlib pandas==2.2.3 # via -r base.in -pillow==11.1.0 +pillow==11.2.1 # via matplotlib -plopp==25.3.0 +plopp==25.4.1 # via # scippneutron # tof -pydantic==2.11.3 +pydantic==2.11.4 # via scippneutron -pydantic-core==2.33.1 +pydantic-core==2.33.2 # via pydantic pyparsing==3.2.3 # via matplotlib @@ -85,7 +83,7 @@ sciline==25.4.1 # via # -r base.in # essreduce -scipp==25.4.0 +scipp==25.5.0 # via # -r base.in # essreduce @@ -108,9 +106,9 @@ scipy==1.15.2 # tof six==1.17.0 # via python-dateutil -tof==25.4.0 +tof==25.5.0 # via -r base.in -typing-extensions==4.13.1 +typing-extensions==4.13.2 # via # pydantic # pydantic-core diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index d592d5dc6..a1c27d614 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,9 +5,9 @@ # # pip-compile-multi # -certifi==2025.1.31 +certifi==2025.4.26 # via requests -charset-normalizer==3.4.1 +charset-normalizer==3.4.2 # via requests exceptiongroup==1.2.2 # via pytest @@ -15,11 +15,11 @@ idna==3.10 # via requests iniconfig==2.1.0 # via pytest -packaging==24.2 +packaging==25.0 # via # pooch # pytest -platformdirs==4.3.7 +platformdirs==4.3.8 # via pooch pluggy==1.5.0 # via pytest @@ -31,5 +31,5 @@ requests==2.32.3 # via pooch tomli==2.2.1 # via pytest -urllib3==2.3.0 +urllib3==2.4.0 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 176b5124d..1e9481015 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -7,11 +7,11 @@ # cachetools==5.5.2 # via tox -certifi==2025.1.31 +certifi==2025.4.26 # via requests chardet==5.2.0 # via tox -charset-normalizer==3.4.1 +charset-normalizer==3.4.2 # via requests colorama==0.4.6 # via tox @@ -27,12 +27,12 @@ gitpython==3.1.44 # via -r ci.in idna==3.10 # via requests -packaging==24.2 +packaging==25.0 # via # -r ci.in # pyproject-api # tox -platformdirs==4.3.7 +platformdirs==4.3.8 # via # tox # virtualenv @@ -50,9 +50,9 @@ tomli==2.2.1 # tox tox==4.25.0 # via -r ci.in -typing-extensions==4.13.1 +typing-extensions==4.13.2 # via tox -urllib3==2.3.0 +urllib3==2.4.0 # via requests -virtualenv==20.30.0 +virtualenv==20.31.1 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 09243eb81..a03cb5c95 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -30,17 +30,17 @@ click==8.1.8 # via # pip-compile-multi # pip-tools -copier==9.6.0 +copier==9.7.1 # via -r dev.in -dunamai==1.23.1 +dunamai==1.24.0 # via copier fqdn==1.5.1 # via jsonschema funcy==2.0 # via copier -h11==0.14.0 +h11==0.16.0 # via httpcore -httpcore==1.0.7 +httpcore==1.0.9 # via httpx httpx==0.28.1 # via jupyterlab @@ -69,7 +69,7 @@ jupyter-server==2.15.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.4.0 +jupyterlab==4.4.2 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab @@ -79,7 +79,7 @@ overrides==7.7.0 # via jupyter-server pathspec==0.12.1 # via copier -pip-compile-multi==2.8.0 +pip-compile-multi==3.0.0 # via -r dev.in pip-tools==7.4.1 # via pip-compile-multi diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 0d0af5c7f..b01a8d90d 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -20,19 +20,19 @@ babel==2.17.0 # via # pydata-sphinx-theme # sphinx -beautifulsoup4==4.13.3 +beautifulsoup4==4.13.4 # via # nbconvert # pydata-sphinx-theme bleach[css]==6.2.0 # via nbconvert -certifi==2025.1.31 +certifi==2025.4.26 # via requests -charset-normalizer==3.4.1 +charset-normalizer==3.4.2 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.13 +debugpy==1.8.14 # via ipykernel decorator==5.2.1 # via ipython @@ -54,7 +54,7 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.35.0 +ipython==8.36.0 # via # -r docs.in # ipykernel @@ -68,7 +68,7 @@ jinja2==3.1.6 # sphinx jsonschema==4.23.0 # via nbformat -jsonschema-specifications==2024.10.1 +jsonschema-specifications==2025.4.1 # via jsonschema jupyter-client==8.6.3 # via @@ -122,13 +122,13 @@ parso==0.8.4 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.3.7 +platformdirs==4.3.8 # via # jupyter-core # pooch pooch==1.8.2 # via -r docs.in -prompt-toolkit==3.0.50 +prompt-toolkit==3.0.51 # via ipython psutil==7.0.0 # via ipykernel @@ -165,7 +165,7 @@ rpds-py==0.24.0 # referencing snowballstemmer==2.2.0 # via sphinx -soupsieve==2.6 +soupsieve==2.7 # via beautifulsoup4 sphinx==8.1.3 # via @@ -216,7 +216,7 @@ traitlets==5.14.3 # nbconvert # nbformat # nbsphinx -urllib3==2.3.0 +urllib3==2.4.0 # via requests wcwidth==0.2.13 # via prompt-toolkit diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 61d88db19..77e99ca3b 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -8,5 +8,5 @@ -r test.txt mypy==1.15.0 # via -r mypy.in -mypy-extensions==1.0.0 +mypy-extensions==1.1.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index d71e70742..66d3939e4 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -1,7 +1,7 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -graphviz >= 0.20 +graphviz>=0.20 pandas>=2 tof>=25.01.2 pooch diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 5861c1972..36f4ef6ab 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:96e9d77800968f1c135ad89d6477fa86fe13ff31 +# SHA1:553ad7a6d1b1325dfb725c50e93549c5e142e21a # # This file is autogenerated by pip-compile-multi # To update, run: @@ -10,11 +10,11 @@ annotated-types==0.7.0 # via pydantic -certifi==2025.1.31 +certifi==2025.4.26 # via requests -charset-normalizer==3.4.1 +charset-normalizer==3.4.2 # via requests -contourpy==1.3.1 +contourpy==1.3.2 # via matplotlib cyclebane==24.10.0 # via sciline @@ -40,8 +40,6 @@ idna==3.10 # via # email-validator # requests -importlib-resources==6.5.2 - # via tof iniconfig==2.1.0 # via pytest kiwisolver==1.4.8 @@ -50,25 +48,25 @@ lazy-loader==0.4 # via # plopp # scippneutron + # tof matplotlib==3.10.1 # via # mpltoolbox # plopp -mpltoolbox==24.5.1 +mpltoolbox==25.4.0 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.4 +numpy==2.2.5 # via # contourpy # h5py # matplotlib - # mpltoolbox # pandas # scipp # scippneutron # scipy -packaging==24.2 +packaging==25.0 # via # lazy-loader # matplotlib @@ -76,9 +74,9 @@ packaging==24.2 # pytest pandas==2.2.3 # via -r nightly.in -pillow==11.1.0 +pillow==11.2.1 # via matplotlib -platformdirs==4.3.7 +platformdirs==4.3.8 # via pooch plopp @ git+https://github.com/scipp/plopp@main # via @@ -89,9 +87,9 @@ pluggy==1.5.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.11.3 +pydantic==2.11.4 # via scippneutron -pydantic-core==2.33.1 +pydantic-core==2.33.2 # via pydantic pyparsing==3.2.3 # via matplotlib @@ -134,11 +132,11 @@ scipy==1.15.2 # tof six==1.17.0 # via python-dateutil -tof==25.4.0 +tof==25.5.0 # via -r nightly.in tomli==2.2.1 # via pytest -typing-extensions==4.13.1 +typing-extensions==4.13.2 # via # pydantic # pydantic-core @@ -148,5 +146,5 @@ typing-inspection==0.4.0 # via pydantic tzdata==2025.2 # via pandas -urllib3==2.3.0 +urllib3==2.4.0 # via requests diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index c0e73660f..6c735e6b4 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -11,15 +11,15 @@ distlib==0.3.9 # via virtualenv filelock==3.18.0 # via virtualenv -identify==2.6.9 +identify==2.6.10 # via pre-commit nodeenv==1.9.1 # via pre-commit -platformdirs==4.3.7 +platformdirs==4.3.8 # via virtualenv pre-commit==4.2.0 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.30.0 +virtualenv==20.31.1 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index bfae20bff..21d3cb06b 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -7,7 +7,7 @@ # build==1.2.2.post1 # via -r wheels.in -packaging==24.2 +packaging==25.0 # via build pyproject-hooks==1.2.0 # via build diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 28a6b43dd..c9793ca69 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -3,7 +3,7 @@ """Data for tests and documentation with BIFROST.""" -_version = "1" +_version = "2" def _make_pooch(): @@ -16,8 +16,8 @@ def _make_pooch(): version=_version, registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated.h5": "md5:ba3e4834d12bd5153c9f1bf88f4848a1", - "BIFROST-simulation-tof-lookup-table.h5": "md5:9469b7b8c50463b1110bfbdffa2989d5", # noqa: E501 + "computed_energy_data_simulated.h5": "md5:f07197a552b90decb8c8efd5515b6c26", + "BIFROST-simulation-tof-lookup-table.h5": "md5:d9d8173008ce9f03166953da28496488", # noqa: E501 }, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 6a8e5cf45..3e3402da9 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -10,16 +10,16 @@ from ..types import ( BeamlineWithSpectrometerCoords, CalibratedBeamline, + DetectorTofData, EnergyData, GravityVector, InelasticCoordTransformGraph, MonitorCoordTransformGraph, + MonitorTofData, MonitorType, PrimarySpecCoordTransformGraph, RunType, SecondarySpecCoordTransformGraph, - TofData, - TofMonitor, WavelengthMonitor, ) from ..utils import in_same_unit @@ -153,7 +153,7 @@ def inelastic_coordinate_transformation_graph_at_sample( def add_inelastic_coordinates( - data: TofData[RunType], graph: InelasticCoordTransformGraph + data: DetectorTofData[RunType], graph: InelasticCoordTransformGraph ) -> EnergyData[RunType]: transformed = data.transform_coords( [ @@ -229,7 +229,7 @@ def monitor_coordinate_transformation_graph() -> MonitorCoordTransformGraph: def add_monitor_wavelength_coords( - monitor: TofMonitor[RunType, MonitorType], graph: MonitorCoordTransformGraph + monitor: MonitorTofData[RunType, MonitorType], graph: MonitorCoordTransformGraph ) -> WavelengthMonitor[RunType, MonitorType]: return WavelengthMonitor[RunType, MonitorType]( monitor.transform_coords( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index b808425dc..105372cf5 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -7,13 +7,14 @@ import sciline -from ess.reduce import time_of_flight +from ess.reduce import nexus, time_of_flight from ess.spectroscopy.types import ( DataAtSample, + DetectorTofData, PrimarySpecCoordTransformGraph, RunType, + SampleRun, TimeOfFlightLookupTable, - TofData, ) @@ -48,7 +49,7 @@ def primary_spectrometer_coordinate_transformation_graph() -> ( def unwrap_sample_time( sample_data: DataAtSample[RunType], table: TimeOfFlightLookupTable, -) -> TofData[RunType]: +) -> DetectorTofData[RunType]: """Compute time-of-flight at the sample using a lookup table. Parameters @@ -71,16 +72,16 @@ def unwrap_sample_time( params={ **time_of_flight.default_parameters(), time_of_flight.TimeOfFlightLookupTable: table, - time_of_flight.Ltotal: sample_data.coords['L1'], - time_of_flight.RawData: sample_data, + time_of_flight.DetectorLtotal[SampleRun]: sample_data.coords['L1'], + nexus.types.DetectorData[SampleRun]: sample_data, }, ) - result = pipeline.compute(time_of_flight.TofData) + result = pipeline.compute(time_of_flight.DetectorTofData[SampleRun]) # This is time-of-flight at the sample. result.bins.coords['sample_tof'] = result.bins.coords.pop('tof') del result.bins.coords['event_time_offset'] del result.bins.coords['event_time_zero'] - return TofData(result) + return DetectorTofData[RunType](result) providers = ( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py index 8398a88ee..68f1e75bf 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py @@ -5,15 +5,16 @@ import sciline -from ess.reduce import time_of_flight +from ess.reduce import nexus, time_of_flight from ..types import ( MonitorCoordTransformGraph, MonitorData, + MonitorTofData, MonitorType, RunType, + SampleRun, TimeOfFlightLookupTable, - TofMonitor, ) @@ -21,7 +22,7 @@ def unwrap_monitor( monitor: MonitorData[RunType, MonitorType], table: TimeOfFlightLookupTable, coord_transform_graph: MonitorCoordTransformGraph, -) -> TofMonitor[RunType, MonitorType]: +) -> MonitorTofData[RunType, MonitorType]: path_length = monitor.transform_coords( 'Ltotal', graph=coord_transform_graph, @@ -31,16 +32,23 @@ def unwrap_monitor( ).coords['Ltotal'] tof_wf = sciline.Pipeline( - (*time_of_flight.providers(), time_of_flight.resample_tof_data), + ( + *time_of_flight.providers(), + time_of_flight.resample_monitor_time_of_flight_data, + ), params={ **time_of_flight.default_parameters(), time_of_flight.TimeOfFlightLookupTable: table, - time_of_flight.Ltotal: path_length, - time_of_flight.RawData: monitor.rename(t='tof'), + time_of_flight.MonitorLtotal[SampleRun, nexus.types.Monitor1]: path_length, + nexus.types.MonitorData[SampleRun, nexus.types.Monitor1]: monitor.rename( + t='tof' + ), }, ) - unwrapped = tof_wf.compute(time_of_flight.ResampledTofData) - return TofMonitor[RunType, MonitorType](unwrapped) + unwrapped = tof_wf.compute( + time_of_flight.ResampledMonitorTofData[SampleRun, nexus.types.Monitor1] + ) + return MonitorTofData[RunType, MonitorType](unwrapped) providers = (unwrap_monitor,) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 9bd6277c6..d81f75b41 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -48,6 +48,8 @@ # Time-of-flight types +DetectorTofData = time_of_flight.DetectorTofData +MonitorTofData = time_of_flight.MonitorTofData PulseStride = time_of_flight.PulseStride PulsePeriod = time_of_flight.PulsePeriod TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable @@ -94,12 +96,6 @@ class PrimarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... -class TofData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... - - -class TofMonitor(sciline.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray): ... - - class WavelengthMonitor( sciline.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray ): ... diff --git a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb index 96143beca..9976c403e 100644 --- a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb @@ -15,12 +15,16 @@ "metadata": {}, "outputs": [], "source": [ - "from ess.reduce import time_of_flight\n", + "from ess.reduce import time_of_flight, nexus\n", "import sciline\n", "import scipp as sc\n", + "import scippnexus as snx\n", "from scippneutron.chopper import DiskChopper\n", - "from ess.spectroscopy.indirect.workflow import load_everything\n", - "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon" + "\n", + "from ess.bifrost import BifrostSimulationWorkflow\n", + "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon\n", + "from ess.spectroscopy.types import *\n", + "from ess.bifrost.types import *" ] }, { @@ -38,8 +42,8 @@ "metadata": {}, "outputs": [], "source": [ - "input_filename = simulated_elastic_incoherent_with_phonon()\n", - "sample, triplets, _, raw_choppers, monitors, _ = load_everything(input_filename)" + "loader = BifrostSimulationWorkflow(detector_names=['_'])\n", + "loader[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()" ] }, { @@ -49,8 +53,16 @@ "metadata": {}, "outputs": [], "source": [ - "source_position = next(iter(triplets.values())).coords['source_position']\n", - "sample_position = sample['position']" + "data = loader.compute([\n", + " Position[snx.NXsource, SampleRun],\n", + " Position[snx.NXsample, SampleRun],\n", + " nexus.types.Choppers[SampleRun],\n", + " nexus.types.CalibratedMonitor[SampleRun, FrameMonitor3],\n", + "])\n", + "source_position = data[Position[snx.NXsource, SampleRun]]\n", + "sample_position = data[Position[snx.NXsample, SampleRun]]\n", + "raw_choppers = data[nexus.types.Choppers[SampleRun]]\n", + "monitor = data[nexus.types.CalibratedMonitor[SampleRun, FrameMonitor3]]" ] }, { @@ -68,7 +80,7 @@ "metadata": {}, "outputs": [], "source": [ - "def parse_choppers(raw_choppers, source_position):\n", + "def parse_choppers(raw_choppers):\n", " choppers = sc.DataGroup()\n", " for name, chopper in raw_choppers.items():\n", " processed = chopper.copy()\n", @@ -77,9 +89,6 @@ " processed['phase'] = processed['phase'].data.mean()\n", " # Guessing here as this is not stored in the file.\n", " processed['beam_position'] = sc.scalar(0.0, unit='deg')\n", - " # ess.reduce.time_of_flight.simulate_beamline requires the\n", - " # positions to be relative to the source.\n", - " processed['position'] = chopper['position'] - source_position\n", " choppers[name] = DiskChopper.from_nexus(processed)\n", " return choppers" ] @@ -91,7 +100,7 @@ "metadata": {}, "outputs": [], "source": [ - "choppers = parse_choppers(raw_choppers, source_position)" + "choppers = parse_choppers(raw_choppers)" ] }, { @@ -118,8 +127,7 @@ "metadata": {}, "outputs": [], "source": [ - "norm_monitor = monitors['110_frame_3']\n", - "l_monitor = sc.norm(source_position - norm_monitor.coords['position'])\n", + "l_monitor = sc.norm(source_position - monitor.coords['position'])\n", "l1 = sc.norm(source_position - sample_position)\n", "l_min = l_monitor - sc.scalar(0.1, unit='m')\n", "l_max = l1 + sc.scalar(0.1, unit='m')" @@ -133,7 +141,7 @@ "outputs": [], "source": [ "simulation_results = time_of_flight.simulate_beamline(\n", - " choppers=choppers, neutrons=5_000_000\n", + " choppers=choppers, neutrons=5_000_000, source_position=source_position,\n", ")" ] }, From e73f6a6d926e59db93e457aa068f88b19d3b32e8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 14 May 2025 14:49:22 +0200 Subject: [PATCH 148/330] Require essreduce>=25.05.1 --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- packages/essspectroscopy/requirements/base.txt | 18 +++++++++--------- .../essspectroscopy/requirements/basetest.txt | 8 +++++--- packages/essspectroscopy/requirements/ci.txt | 10 +++++----- packages/essspectroscopy/requirements/dev.txt | 10 +++++----- packages/essspectroscopy/requirements/docs.txt | 8 ++++---- packages/essspectroscopy/requirements/mypy.txt | 4 ++-- .../essspectroscopy/requirements/nightly.txt | 13 +++++++------ .../essspectroscopy/requirements/static.txt | 6 +++--- packages/essspectroscopy/requirements/test.txt | 4 ++-- .../essspectroscopy/requirements/wheels.txt | 4 ++-- 12 files changed, 46 insertions(+), 43 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index daec80710..bd71930b9 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -31,7 +31,7 @@ requires-python = ">=3.10" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=25.05.0", + "essreduce>=25.05.1", "graphviz>=0.20", "pandas>=2", "sciline>=25.4.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 9449657f7..2d35ae77e 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=25.05.0 +essreduce>=25.05.1 graphviz>=0.20 pandas>=2 sciline>=25.4.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 970d9d196..66481198d 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,9 +1,9 @@ -# SHA1:583283177dd4128f99b55a3f9c5588a874d3d5f8 +# SHA1:851767a12dccfc39b5a5edd4b017aed72c742c39 # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # annotated-types==0.7.0 # via pydantic @@ -17,9 +17,9 @@ dnspython==2.7.0 # via email-validator email-validator==2.2.0 # via scippneutron -essreduce==25.5.0 +essreduce==25.5.1 # via -r base.in -fonttools==4.57.0 +fonttools==4.58.0 # via matplotlib graphviz==0.20.3 # via -r base.in @@ -36,7 +36,7 @@ lazy-loader==0.4 # plopp # scippneutron # tof -matplotlib==3.10.1 +matplotlib==3.10.3 # via # mpltoolbox # plopp @@ -79,7 +79,7 @@ python-dateutil==2.9.0.post0 # scippnexus pytz==2025.2 # via pandas -sciline==25.4.1 +sciline==25.5.0 # via # -r base.in # essreduce @@ -90,7 +90,7 @@ scipp==25.5.0 # scippneutron # scippnexus # tof -scippneutron==25.2.1 +scippneutron==25.5.0 # via # -r base.in # essreduce @@ -99,7 +99,7 @@ scippnexus==25.4.0 # -r base.in # essreduce # scippneutron -scipy==1.15.2 +scipy==1.15.3 # via # scippneutron # scippnexus diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index a1c27d614..0f1c41858 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -1,15 +1,15 @@ # SHA1:54ed0e3deb2d458e91bae14067e84eaad659f5fd # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # certifi==2025.4.26 # via requests charset-normalizer==3.4.2 # via requests -exceptiongroup==1.2.2 +exceptiongroup==1.3.0 # via pytest idna==3.10 # via requests @@ -31,5 +31,7 @@ requests==2.32.3 # via pooch tomli==2.2.1 # via pytest +typing-extensions==4.13.2 + # via exceptiongroup urllib3==2.4.0 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 1e9481015..5edeca3b6 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -1,9 +1,9 @@ # SHA1:6344d52635ea11dca331a3bc6eb1833c4c64d585 # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # cachetools==5.5.2 # via tox @@ -38,7 +38,7 @@ platformdirs==4.3.8 # virtualenv pluggy==1.5.0 # via tox -pyproject-api==1.9.0 +pyproject-api==1.9.1 # via tox requests==2.32.3 # via -r ci.in @@ -48,11 +48,11 @@ tomli==2.2.1 # via # pyproject-api # tox -tox==4.25.0 +tox==4.26.0 # via -r ci.in typing-extensions==4.13.2 # via tox urllib3==2.4.0 # via requests -virtualenv==20.31.1 +virtualenv==20.31.2 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index a03cb5c95..da51270eb 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -1,9 +1,9 @@ # SHA1:efd19a3a98c69fc3d6d6233ed855de7e4a208f74 # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # -r base.txt -r ci.txt @@ -26,13 +26,13 @@ async-lru==2.0.5 # via jupyterlab cffi==1.17.1 # via argon2-cffi-bindings -click==8.1.8 +click==8.2.0 # via # pip-compile-multi # pip-tools copier==9.7.1 # via -r dev.in -dunamai==1.24.0 +dunamai==1.24.1 # via copier fqdn==1.5.1 # via jsonschema @@ -61,7 +61,7 @@ jupyter-events==0.12.0 # via jupyter-server jupyter-lsp==2.2.5 # via jupyterlab -jupyter-server==2.15.0 +jupyter-server==2.16.0 # via # jupyter-lsp # jupyterlab diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index b01a8d90d..d22f86b47 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -1,9 +1,9 @@ # SHA1:d3c0de19a558da7484a806c760b01e423c9c1da7 # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # -r base.txt accessible-pygments==0.0.5 @@ -44,7 +44,7 @@ docutils==0.21.2 # nbsphinx # pydata-sphinx-theme # sphinx -exceptiongroup==1.2.2 +exceptiongroup==1.3.0 # via ipython executing==2.2.0 # via stack-data @@ -163,7 +163,7 @@ rpds-py==0.24.0 # via # jsonschema # referencing -snowballstemmer==2.2.0 +snowballstemmer==3.0.1 # via sphinx soupsieve==2.7 # via beautifulsoup4 diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 77e99ca3b..bba4ddd07 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -1,9 +1,9 @@ # SHA1:859ef9c15e5e57c6c91510133c01f5751feee941 # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # -r test.txt mypy==1.15.0 diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 36f4ef6ab..36ad2a8fd 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,9 +1,9 @@ # SHA1:553ad7a6d1b1325dfb725c50e93549c5e142e21a # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # --index-url https://pypi.anaconda.org/scipp-nightly-wheels/simple/ --extra-index-url https://pypi.org/simple @@ -26,9 +26,9 @@ email-validator==2.2.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -exceptiongroup==1.2.2 +exceptiongroup==1.3.0 # via pytest -fonttools==4.57.0 +fonttools==4.58.0 # via matplotlib graphviz==0.20.3 # via -r nightly.in @@ -49,7 +49,7 @@ lazy-loader==0.4 # plopp # scippneutron # tof -matplotlib==3.10.1 +matplotlib==3.10.3 # via # mpltoolbox # plopp @@ -125,7 +125,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.15.2 +scipy==1.15.3 # via # scippneutron # scippnexus @@ -138,6 +138,7 @@ tomli==2.2.1 # via pytest typing-extensions==4.13.2 # via + # exceptiongroup # pydantic # pydantic-core # sciline diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 6c735e6b4..b2c56f97e 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -1,9 +1,9 @@ # SHA1:5a0b1bb22ae805d8aebba0f3bf05ab91aceae0d8 # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # cfgv==3.4.0 # via pre-commit @@ -21,5 +21,5 @@ pre-commit==4.2.0 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.31.1 +virtualenv==20.31.2 # via pre-commit diff --git a/packages/essspectroscopy/requirements/test.txt b/packages/essspectroscopy/requirements/test.txt index 3c7454d8a..6817392ee 100644 --- a/packages/essspectroscopy/requirements/test.txt +++ b/packages/essspectroscopy/requirements/test.txt @@ -1,9 +1,9 @@ # SHA1:ef2ee9576d8a9e65b44e2865a26887eed3fc49d1 # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # -r base.txt -r basetest.txt diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 21d3cb06b..651191e54 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -1,9 +1,9 @@ # SHA1:80754af91bfb6d1073585b046fe0a474ce868509 # -# This file is autogenerated by pip-compile-multi +# This file was generated by pip-compile-multi. # To update, run: # -# pip-compile-multi +# requirements upgrade # build==1.2.2.post1 # via -r wheels.in From 809c171f7242c6cb361e281ba7af020ee26d9a67 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 14 May 2025 16:34:32 +0200 Subject: [PATCH 149/330] Incorporate tof workflow Instead of using nested workflows. --- .../essspectroscopy/src/ess/bifrost/data.py | 4 +- .../src/ess/bifrost/io/nexus.py | 28 +-- .../src/ess/bifrost/workflow.py | 14 +- .../src/ess/spectroscopy/indirect/ki.py | 50 +----- .../spectroscopy/indirect/normalization.py | 50 +----- .../spectroscopy/indirect/time_of_flight.py | 162 ++++++++++++++++++ .../src/ess/spectroscopy/types.py | 13 ++ .../tests/bifrost/workflow_test.py | 1 + .../tools/bifrost-make-tof-lookup-table.ipynb | 137 ++++++--------- 9 files changed, 250 insertions(+), 209 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index c9793ca69..5a4354fe0 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -16,8 +16,8 @@ def _make_pooch(): version=_version, registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated.h5": "md5:f07197a552b90decb8c8efd5515b6c26", - "BIFROST-simulation-tof-lookup-table.h5": "md5:d9d8173008ce9f03166953da28496488", # noqa: E501 + "computed_energy_data_simulated.h5": "md5:31b2444042935e99831c3c84a375ccae", + "BIFROST-simulation-tof-lookup-table.h5": "md5:f2c12eb39d0750238805d0e5a5d561f7", # noqa: E501 }, ) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 9a9072463..ff6a925c9 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -5,11 +5,9 @@ from collections.abc import Iterable -import sciline import scipp as sc import scippnexus as snx -from ess.reduce.nexus.workflow import GenericNeXusWorkflow from ess.spectroscopy.types import ( Analyzer, InstrumentAngles, @@ -18,14 +16,6 @@ NeXusDetectorName, NeXusFileSpec, RunType, - SampleRun, -) - -from ..types import ( - FrameMonitor0, - FrameMonitor1, - FrameMonitor2, - FrameMonitor3, ) @@ -107,24 +97,8 @@ def load_analyzer_for_detector( ) -_PROVIDERS = ( +providers = ( load_analyzer_for_detector, load_instrument_angles, moderator_class_for_source, ) - - -def LoadNeXusWorkflow() -> sciline.Pipeline: - """Workflow for loading BIFROST NeXus files.""" - workflow = GenericNeXusWorkflow( - run_types=(SampleRun,), - monitor_types=( - FrameMonitor0, - FrameMonitor1, - FrameMonitor2, - FrameMonitor3, - ), - ) - for provider in _PROVIDERS: - workflow.insert(provider) - return workflow diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 88fb9385a..6341ed02d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -12,6 +12,7 @@ from ess.spectroscopy.indirect.kf import providers as kf_providers from ess.spectroscopy.indirect.ki import providers as ki_providers from ess.spectroscopy.indirect.normalization import providers as normalisation_providers +from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( DataGroupedByRotation, NeXusDetectorName, @@ -45,6 +46,7 @@ def simulation_default_parameters() -> dict[type, Any]: _SIMULATION_PROVIDERS = ( + *nexus.providers, *conversion_providers, *detector_providers, *mcstas.providers, @@ -57,6 +59,7 @@ def simulation_default_parameters() -> dict[type, Any]: def BifrostSimulationWorkflow( detector_names: list[NeXusDetectorName], + tof_lut_provider: time_of_flight.TofLutProvider = time_of_flight.TofLutProvider.FILE, # noqa: E501 ) -> sciline.Pipeline: """Data reduction workflow for simulated BIFROST data. @@ -64,13 +67,22 @@ def BifrostSimulationWorkflow( ---------- detector_names: Names of ``NXdetector`` groups in the input NeXus file. + tof_lut_provider: + Specifies how the time-of-flight lookup table is provided: + - FILE: Read from a file. + - TOF: Computed from chopper settings using the 'tof' package. + - MCSTAS: From McStas simulation (not implemented yet). Returns ------- : A pipeline for reducing simulated BIFROST data. """ - workflow = nexus.LoadNeXusWorkflow() + workflow = TofWorkflow( + run_types=(SampleRun,), + monitor_types=(FrameMonitor0, FrameMonitor1, FrameMonitor2, FrameMonitor3), + tof_lut_provider=tof_lut_provider, + ) for provider in _SIMULATION_PROVIDERS: workflow.insert(provider) for key, val in simulation_default_parameters().items(): diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 105372cf5..8f6faef48 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -5,16 +5,9 @@ from __future__ import annotations -import sciline - -from ess.reduce import nexus, time_of_flight from ess.spectroscopy.types import ( - DataAtSample, - DetectorTofData, PrimarySpecCoordTransformGraph, RunType, - SampleRun, - TimeOfFlightLookupTable, ) @@ -46,45 +39,4 @@ def primary_spectrometer_coordinate_transformation_graph() -> ( ) -def unwrap_sample_time( - sample_data: DataAtSample[RunType], - table: TimeOfFlightLookupTable, -) -> DetectorTofData[RunType]: - """Compute time-of-flight at the sample using a lookup table. - - Parameters - ---------- - sample_data: - Data with 'event_time_offset' and 'event_time_zero' coordinates - describing the time-of-arrival at the sample. - table: - A time-of-flight lookup table. - - Returns - ------- - : - A copy of ``sample_data`` with a "sample_tof" coordinate containing - the time-of-flight at the sample. - """ - - pipeline = sciline.Pipeline( - time_of_flight.providers(), - params={ - **time_of_flight.default_parameters(), - time_of_flight.TimeOfFlightLookupTable: table, - time_of_flight.DetectorLtotal[SampleRun]: sample_data.coords['L1'], - nexus.types.DetectorData[SampleRun]: sample_data, - }, - ) - result = pipeline.compute(time_of_flight.DetectorTofData[SampleRun]) - # This is time-of-flight at the sample. - result.bins.coords['sample_tof'] = result.bins.coords.pop('tof') - del result.bins.coords['event_time_offset'] - del result.bins.coords['event_time_zero'] - return DetectorTofData[RunType](result) - - -providers = ( - primary_spectrometer_coordinate_transformation_graph, - unwrap_sample_time, -) +providers = (primary_spectrometer_coordinate_transformation_graph,) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py index 68f1e75bf..c908b0997 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py @@ -3,52 +3,4 @@ """Normalization routines.""" -import sciline - -from ess.reduce import nexus, time_of_flight - -from ..types import ( - MonitorCoordTransformGraph, - MonitorData, - MonitorTofData, - MonitorType, - RunType, - SampleRun, - TimeOfFlightLookupTable, -) - - -def unwrap_monitor( - monitor: MonitorData[RunType, MonitorType], - table: TimeOfFlightLookupTable, - coord_transform_graph: MonitorCoordTransformGraph, -) -> MonitorTofData[RunType, MonitorType]: - path_length = monitor.transform_coords( - 'Ltotal', - graph=coord_transform_graph, - keep_intermediate=False, - keep_aliases=False, - rename_dims=False, - ).coords['Ltotal'] - - tof_wf = sciline.Pipeline( - ( - *time_of_flight.providers(), - time_of_flight.resample_monitor_time_of_flight_data, - ), - params={ - **time_of_flight.default_parameters(), - time_of_flight.TimeOfFlightLookupTable: table, - time_of_flight.MonitorLtotal[SampleRun, nexus.types.Monitor1]: path_length, - nexus.types.MonitorData[SampleRun, nexus.types.Monitor1]: monitor.rename( - t='tof' - ), - }, - ) - unwrapped = tof_wf.compute( - time_of_flight.ResampledMonitorTofData[SampleRun, nexus.types.Monitor1] - ) - return MonitorTofData[RunType, MonitorType](unwrapped) - - -providers = (unwrap_monitor,) +providers = () diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py new file mode 100644 index 000000000..a100bf256 --- /dev/null +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -0,0 +1,162 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Utilities for computing real neutron time-of-flight for indirect geometry.""" + +from collections.abc import Iterable + +import sciline + +from ess.reduce import time_of_flight as reduce_time_of_flight +from ess.reduce.time_of_flight.types import ( + DetectorLtotal, + DistanceResolution, + LookupTableRelativeErrorThreshold, + LtotalRange, + PulsePeriod, + PulseStride, + SimulationResults, + TimeResolution, +) + +from ..types import ( + DataAtSample, + DetectorData, + DetectorTofData, + L1Range, + MonitorCoordTransformGraph, + MonitorData, + MonitorLtotal, + MonitorTofData, + MonitorType, + PulseStrideOffset, + RunType, + TimeOfFlightLookupTable, +) + + +def TofWorkflow( + *, + run_types: Iterable[sciline.typing.Key], + monitor_types: Iterable[sciline.typing.Key], + tof_lut_provider: reduce_time_of_flight.TofLutProvider, +) -> sciline.Pipeline: + workflow = reduce_time_of_flight.GenericTofWorkflow( + run_types=run_types, + monitor_types=monitor_types, + tof_lut_provider=tof_lut_provider, + ) + for provider in providers: + workflow.insert(provider) + if tof_lut_provider in ( + reduce_time_of_flight.TofLutProvider.MCSTAS, + reduce_time_of_flight.TofLutProvider.TOF, + ): + workflow.insert(compute_tof_lookup_table) + return workflow + + +def compute_tof_lookup_table( + simulation: SimulationResults, + l1_range: L1Range, + distance_resolution: DistanceResolution, + time_resolution: TimeResolution, + pulse_period: PulsePeriod, + pulse_stride: PulseStride, + error_threshold: LookupTableRelativeErrorThreshold, +) -> TimeOfFlightLookupTable: + """Compute a lookup table for time-of-flight as a function of distance and + time-of-arrival. + + This is a wrapper around :func:`ess.reduce.time_of_flight.compute_tof_lookup_table` + for indirect geometry spectrometers. + """ + return reduce_time_of_flight.eto_to_tof.compute_tof_lookup_table( + simulation=simulation, + ltotal_range=LtotalRange(l1_range), + distance_resolution=distance_resolution, + time_resolution=time_resolution, + pulse_period=pulse_period, + pulse_stride=pulse_stride, + error_threshold=error_threshold, + ) + + +def detector_time_of_flight_data( + sample_data: DataAtSample[RunType], + lookup: TimeOfFlightLookupTable, + pulse_stride_offset: PulseStrideOffset, +) -> DetectorTofData[RunType]: + """ + Convert the time-of-arrival data to time-of-flight data using a lookup table. + + The output data will have a time-of-flight coordinate. + + This is a wrapper around + :func:`ess.reduce.time_of_flight.detector_time_of_flight_data` + for indirect geometry spectrometers. + """ + result = reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data( + detector_data=DetectorData[RunType](sample_data), + lookup=lookup, + ltotal=DetectorLtotal(sample_data.coords['L1']), + pulse_stride_offset=pulse_stride_offset, + ) + # This is time-of-flight at the sample. + result.bins.coords['sample_tof'] = result.bins.coords.pop('tof') + del result.bins.coords['event_time_offset'] + del result.bins.coords['event_time_zero'] + return result + + +def monitor_time_of_flight_data( + monitor_data: MonitorData[RunType, MonitorType], + lookup: TimeOfFlightLookupTable, + ltotal: MonitorLtotal[RunType, MonitorType], + pulse_stride_offset: PulseStrideOffset, +) -> MonitorTofData[RunType, MonitorType]: + """ + Convert the time-of-arrival data to time-of-flight data using a lookup table. + + The output data will have a time-of-flight coordinate. + + This is a wrapper around + :func:`ess.reduce.time_of_flight.monitor_time_of_flight_data` + for indirect geometry spectrometers. + """ + result = reduce_time_of_flight.eto_to_tof.monitor_time_of_flight_data( + monitor_data=monitor_data.rename(t='tof'), + lookup=lookup, + ltotal=ltotal, + pulse_stride_offset=pulse_stride_offset, + ) + return result + + +def compute_monitor_ltotal( + monitor_data: MonitorData[RunType, MonitorType], + coord_transform_graph: MonitorCoordTransformGraph, +) -> MonitorLtotal[RunType, MonitorType]: + """Compute the path length from the source to the monitor.""" + return MonitorLtotal[RunType, MonitorType]( + monitor_data.transform_coords( + 'Ltotal', + graph=coord_transform_graph, + keep_intermediate=False, + keep_aliases=False, + rename_dims=False, + ).coords['Ltotal'] + ) + + +providers = ( + compute_monitor_ltotal, + detector_time_of_flight_data, + monitor_time_of_flight_data, +) +"""Providers for time-of-flight calculation on indirect geometry spectrometers. + +The providers here override the default providers of +:class:`ess.reduce.time_of_flight.GenericTofWorkflow` +to customize the workflow for indirect geometry spectrometers. +""" diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index d81f75b41..59b1aa6bf 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -50,9 +50,22 @@ DetectorTofData = time_of_flight.DetectorTofData MonitorTofData = time_of_flight.MonitorTofData +MonitorLtotal = time_of_flight.MonitorLtotal PulseStride = time_of_flight.PulseStride +PulseStrideOffset = time_of_flight.PulseStrideOffset PulsePeriod = time_of_flight.PulsePeriod TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable +TimeOfFlightLookupTableFilename = time_of_flight.TimeOfFlightLookupTableFilename + +L1Range = NewType("L1Range", tuple[sc.Variable, sc.Variable]) +""" +Range (min, max) of the length of the flight path from the source to the sample. + +This type corresponds to :class:`ess.reduce.time_of_flight.types.LtotalRange` +for other instruments. +But for indirect geometry spectrometers, we compute time of flight +to the sample, not the detectors. +""" # Custom types diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 949a6f84f..e0ce2f0a8 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -109,5 +109,6 @@ def test_simulation_workflow_produces_the_same_data_as_before( workflow: sciline.Pipeline, ) -> None: energy_data = workflow.compute(EnergyData[SampleRun]) + energy_data.save_hdf5('computed_energy_data_simulated.h5') expected = sc.io.load_hdf5(computed_energy_data_simulated()) sc.testing.assert_allclose(energy_data, expected) diff --git a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb index 9976c403e..bed6b9d9d 100644 --- a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb @@ -15,16 +15,19 @@ "metadata": {}, "outputs": [], "source": [ - "from ess.reduce import time_of_flight, nexus\n", + "from ess.reduce import nexus\n", "import sciline\n", "import scipp as sc\n", "import scippnexus as snx\n", + "from ess.reduce.nexus.types import RawChoppers, DiskChoppers\n", + "from ess.reduce.time_of_flight import TofLutProvider\n", + "from ess.reduce.time_of_flight.types import *\n", "from scippneutron.chopper import DiskChopper\n", "\n", "from ess.bifrost import BifrostSimulationWorkflow\n", "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon\n", - "from ess.spectroscopy.types import *\n", - "from ess.bifrost.types import *" + "from ess.bifrost.types import *\n", + "from ess.spectroscopy.types import *" ] }, { @@ -32,7 +35,10 @@ "id": "2", "metadata": {}, "source": [ - "## Load data" + "## Prepare the workflow\n", + "\n", + "The choppers in the simulated file need to be processed before they can be used for computing a lookup table.\n", + "The following functions work for the specific simulation but are *not* usable in general." ] }, { @@ -42,35 +48,38 @@ "metadata": {}, "outputs": [], "source": [ - "loader = BifrostSimulationWorkflow(detector_names=['_'])\n", - "loader[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()" + "def extract_chopper_plateau(chopper):\n", + " processed = chopper.copy()\n", + " # These are constant in the simulated data.\n", + " processed['rotation_speed'] = processed['rotation_speed'].data.mean()\n", + " processed['phase'] = processed['phase'].data.mean()\n", + " # Guessing here as this is not stored in the file.\n", + " processed['beam_position'] = sc.scalar(0.0, unit='deg')\n", + " return DiskChopper.from_nexus(processed)\n", + "\n", + "\n", + "def extract_chopper_plateaus(choppers: RawChoppers[RunType]) -> DiskChoppers[RunType]:\n", + " return DiskChoppers[RunType](choppers.apply(extract_chopper_plateau))" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "id": "4", "metadata": {}, - "outputs": [], "source": [ - "data = loader.compute([\n", - " Position[snx.NXsource, SampleRun],\n", - " Position[snx.NXsample, SampleRun],\n", - " nexus.types.Choppers[SampleRun],\n", - " nexus.types.CalibratedMonitor[SampleRun, FrameMonitor3],\n", - "])\n", - "source_position = data[Position[snx.NXsource, SampleRun]]\n", - "sample_position = data[Position[snx.NXsample, SampleRun]]\n", - "raw_choppers = data[nexus.types.Choppers[SampleRun]]\n", - "monitor = data[nexus.types.CalibratedMonitor[SampleRun, FrameMonitor3]]" + "Construct the workflow.\n", + "We only need the detector names for the geometry up to the sample, so choosing a single detector is enough." ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "id": "5", "metadata": {}, + "outputs": [], "source": [ - "## Process choppers" + "with snx.File(simulated_elastic_incoherent_with_phonon()) as f:\n", + " detector_names = list(f['entry/instrument'][snx.NXdetector])" ] }, { @@ -80,57 +89,51 @@ "metadata": {}, "outputs": [], "source": [ - "def parse_choppers(raw_choppers):\n", - " choppers = sc.DataGroup()\n", - " for name, chopper in raw_choppers.items():\n", - " processed = chopper.copy()\n", - " # These are constant in the simulated data.\n", - " processed['rotation_speed'] = processed['rotation_speed'].data.mean()\n", - " processed['phase'] = processed['phase'].data.mean()\n", - " # Guessing here as this is not stored in the file.\n", - " processed['beam_position'] = sc.scalar(0.0, unit='deg')\n", - " choppers[name] = DiskChopper.from_nexus(processed)\n", - " return choppers" + "workflow = BifrostSimulationWorkflow(detector_names=detector_names[:1],\n", + " tof_lut_provider=TofLutProvider.TOF)\n", + "workflow.insert(extract_chopper_plateaus)\n", + "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "id": "7", "metadata": {}, - "outputs": [], "source": [ - "choppers = parse_choppers(raw_choppers)" + "Compute the required distance range:" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "id": "8", "metadata": {}, + "outputs": [], "source": [ - "## Setting up the workflow" + "beamline = sciline.compute_mapped(workflow, BeamlineWithSpectrometerCoords[SampleRun])[0]\n", + "monitor = workflow.compute(nexus.types.CalibratedMonitor[SampleRun, FrameMonitor3])" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "id": "9", "metadata": {}, + "outputs": [], "source": [ - "The table needs to cover the range of distances for both sample and monitor.\n", - "Here, the shifts of 0.1m are arbitrarily chosen to make sure the table covers `l1` and `l_monitor`." + "l_monitor = sc.norm(monitor.coords['source_position'] - monitor.coords['position'])\n", + "l_min = l_monitor\n", + "l_max = beamline.coords['L1']\n", + "workflow[NumberOfSimulatedNeutrons] = 5_000_000\n", + "workflow[L1Range] = (l_min, l_max)" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "id": "10", "metadata": {}, - "outputs": [], "source": [ - "l_monitor = sc.norm(source_position - monitor.coords['position'])\n", - "l1 = sc.norm(source_position - sample_position)\n", - "l_min = l_monitor - sc.scalar(0.1, unit='m')\n", - "l_max = l1 + sc.scalar(0.1, unit='m')" + "## Compute the lookup table" ] }, { @@ -140,9 +143,7 @@ "metadata": {}, "outputs": [], "source": [ - "simulation_results = time_of_flight.simulate_beamline(\n", - " choppers=choppers, neutrons=5_000_000, source_position=source_position,\n", - ")" + "workflow.visualize(TimeOfFlightLookupTable, graph_attr={\"rankdir\": \"LR\"})" ] }, { @@ -152,40 +153,14 @@ "metadata": {}, "outputs": [], "source": [ - "wf = sciline.Pipeline(\n", - " time_of_flight.providers(),\n", - " params={\n", - " **time_of_flight.default_parameters(),\n", - " time_of_flight.LtotalRange: (l_min, l_max),\n", - " time_of_flight.SimulationResults: simulation_results,\n", - " time_of_flight.DistanceResolution: sc.scalar(0.1, unit='m'),\n", - " },\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "13", - "metadata": {}, - "source": [ - "## Compute the table" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "14", - "metadata": {}, - "outputs": [], - "source": [ - "table = wf.compute(time_of_flight.TimeOfFlightLookupTable)\n", + "table = workflow.compute(TimeOfFlightLookupTable)\n", "table" ] }, { "cell_type": "code", "execution_count": null, - "id": "15", + "id": "13", "metadata": {}, "outputs": [], "source": [ @@ -194,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "16", + "id": "14", "metadata": {}, "source": [ "## Save to file" @@ -203,7 +178,7 @@ { "cell_type": "code", "execution_count": null, - "id": "17", + "id": "15", "metadata": {}, "outputs": [], "source": [ From fa4228cd9496208f29360c256582abb833c6ceb4 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 16 May 2025 12:07:30 +0200 Subject: [PATCH 150/330] Remove file output from test --- packages/essspectroscopy/tests/bifrost/workflow_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index e0ce2f0a8..949a6f84f 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -109,6 +109,5 @@ def test_simulation_workflow_produces_the_same_data_as_before( workflow: sciline.Pipeline, ) -> None: energy_data = workflow.compute(EnergyData[SampleRun]) - energy_data.save_hdf5('computed_energy_data_simulated.h5') expected = sc.io.load_hdf5(computed_energy_data_simulated()) sc.testing.assert_allclose(energy_data, expected) From 6cb6c7a5b237ebd428a6eb7883562034c45c86e2 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 20 May 2025 16:31:01 +0200 Subject: [PATCH 151/330] Remove use of removed types --- .../essspectroscopy/src/ess/bifrost/types.py | 8 ------- .../src/ess/bifrost/workflow.py | 10 ++++----- .../src/ess/spectroscopy/types.py | 21 ++++++++++++------- .../tests/bifrost/workflow_test.py | 2 +- 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 407083c67..958aae67d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -9,18 +9,10 @@ import sciline import scipp as sc -from ess.reduce.nexus import types as reduce_t from ess.spectroscopy.types import RunType class ArcNumber(sciline.Scope[RunType, sc.Variable], sc.Variable): ... -# See https://github.com/scipp/essreduce/issues/105 about monitor names -FrameMonitor0 = reduce_t.Monitor1 -FrameMonitor1 = reduce_t.Monitor2 -FrameMonitor2 = reduce_t.Monitor3 -FrameMonitor3 = reduce_t.Monitor4 - - class McStasDetectorData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 6341ed02d..19b70051b 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -15,6 +15,10 @@ from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( DataGroupedByRotation, + FrameMonitor0, + FrameMonitor1, + FrameMonitor2, + FrameMonitor3, NeXusDetectorName, NeXusMonitorName, PulsePeriod, @@ -25,12 +29,6 @@ from .detector import merge_triplets from .detector import providers as detector_providers from .io import mcstas, nexus -from .types import ( - FrameMonitor0, - FrameMonitor1, - FrameMonitor2, - FrameMonitor3, -) def simulation_default_parameters() -> dict[type, Any]: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 59b1aa6bf..562f2192f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -30,20 +30,25 @@ NeXusTransformation = reduce_t.NeXusTransformation Position = reduce_t.Position PreopenNeXusFile = reduce_t.PreopenNeXusFile + + SampleRun = reduce_t.SampleRun +VanadiumRun = reduce_t.VanadiumRun + +FrameMonitor0 = reduce_t.FrameMonitor0 +FrameMonitor1 = reduce_t.FrameMonitor1 +FrameMonitor2 = reduce_t.FrameMonitor2 +FrameMonitor3 = reduce_t.FrameMonitor3 # Type vars -# Include BackgroundRun because a single constraint is not allowed. -# We will eventually have more than one... -RunType = TypeVar("RunType", SampleRun, reduce_t.BackgroundRun) -# Monitor types include all monitors used by instrument packages. +RunType = TypeVar("RunType", SampleRun, VanadiumRun) MonitorType = TypeVar( "MonitorType", - reduce_t.Monitor1, - reduce_t.Monitor2, - reduce_t.Monitor3, - reduce_t.Monitor4, + FrameMonitor0, + FrameMonitor1, + FrameMonitor2, + FrameMonitor3, ) # Time-of-flight types diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 949a6f84f..87451231d 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -12,11 +12,11 @@ simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation, ) -from ess.bifrost.types import FrameMonitor3 from ess.spectroscopy.types import ( DetectorData, EnergyData, Filename, + FrameMonitor3, MonitorData, NeXusDetectorName, SampleRun, From bfd4f029781b9f1a90dad8867902c9987448427d Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 24 Apr 2025 11:27:05 +0200 Subject: [PATCH 152/330] Remove in_same_unit It is obsolete because Scipp can now convert units of binned data directly. --- .../ess/spectroscopy/indirect/conversion.py | 10 ++++---- .../src/ess/spectroscopy/indirect/kf.py | 8 +++---- .../src/ess/spectroscopy/utils.py | 24 ------------------- 3 files changed, 9 insertions(+), 33 deletions(-) delete mode 100644 packages/essspectroscopy/src/ess/spectroscopy/utils.py diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 3e3402da9..75384e477 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -22,7 +22,6 @@ SecondarySpecCoordTransformGraph, WavelengthMonitor, ) -from ..utils import in_same_unit def incident_energy_from_wavelength(*, incident_wavelength: sc.Variable) -> sc.Variable: @@ -92,7 +91,10 @@ def lab_momentum_transfer_from_wavevectors( : The momentum transfer :math:`\vec{Q}` in the lab frame. """ - return in_same_unit(incident_wavevector, final_wavevector) - final_wavevector + return ( + incident_wavevector.to(unit=final_wavevector.unit, copy=False) + - final_wavevector + ) def rotate_to_sample_table_momentum_transfer( @@ -132,7 +134,7 @@ def rotate_to_sample_table_momentum_transfer( The momentum transfer in the sample-table coordinate system. """ vertical = -gravity / sc.norm(gravity) - # negative a3 since we rotate coordinates not axes here + # negative a3 since we rotate coordinates, not axes here return sc.spatial.rotations_from_rotvecs(-a3 * vertical) * lab_momentum_transfer @@ -163,7 +165,7 @@ def add_inelastic_coordinates( 'incident_energy', 'lab_momentum_transfer', 'sample_table_momentum_transfer', - # These are inputs but we want to preserve them + # These are inputs, but we want to preserve them 'a3', 'a4', ], diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 91a2079fd..6f4e06c54 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -18,8 +18,6 @@ SecondarySpecCoordTransformGraph, ) -from ..utils import in_same_unit - def sample_analyzer_vector( sample_position: sc.Variable, @@ -259,11 +257,11 @@ def move_time_to_sample( A shallow copy of ``data`` where the "event_time_offset" coordinate has been shifted to the time at the sample. """ - offset = in_same_unit( - data.coords['secondary_flight_time'], data.bins.coords['event_time_offset'] + offset = data.coords['secondary_flight_time'].to( + unit=data.bins.coords['event_time_offset'].unit, copy=False ) time = data.bins.coords['event_time_offset'] - offset - time %= in_same_unit(pulse_period, time) + time %= pulse_period.to(unit=time.unit) return DataAtSample[RunType]( data # These are the detector positions and they no longer match the time: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/utils.py b/packages/essspectroscopy/src/ess/spectroscopy/utils.py deleted file mode 100644 index 369e88676..000000000 --- a/packages/essspectroscopy/src/ess/spectroscopy/utils.py +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) - -from scipp import Variable - - -def in_same_unit(b: Variable, to: Variable | None = None) -> Variable: - def unit(x): - if x.bins is not None: - return x.bins.unit - return x.unit - - if to is None: - raise ValueError("The to unit-full object must be specified") - - a_unit = unit(to) - b_unit = unit(b) - if a_unit is None and b_unit is None: - return b - if a_unit is None or b_unit is None: - raise ValueError(f"Can not find the units to use for {b} from {to}") - if a_unit != b_unit: - b = b.to(unit=a_unit) - return b From 42b353f1ab76c82e3500e99f504e8adbe4c525e7 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 24 Apr 2025 13:57:57 +0200 Subject: [PATCH 153/330] Manually test components of workflow output Using assert_allclose on the data array directly asserts that the coordinates are identical. But that is not going to be the case when the implementation of the workflow changes. --- .../tests/bifrost/workflow_test.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 87451231d..afd8417c5 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -110,4 +110,18 @@ def test_simulation_workflow_produces_the_same_data_as_before( ) -> None: energy_data = workflow.compute(EnergyData[SampleRun]) expected = sc.io.load_hdf5(computed_energy_data_simulated()) - sc.testing.assert_allclose(energy_data, expected) + + assert not energy_data.masks + assert not energy_data.bins.masks + + assert energy_data.coords.keys() == expected.coords.keys() + for name in energy_data.coords.keys(): + sc.testing.assert_allclose(energy_data.coords[name], expected.coords[name]) + + assert energy_data.bins.coords.keys() == expected.bins.coords.keys() + for name in energy_data.bins.coords.keys(): + sc.testing.assert_allclose( + energy_data.bins.coords[name], expected.bins.coords[name] + ) + + sc.testing.assert_allclose(energy_data.bins.data, expected.bins.data) From e42baf559c4dc687078a73092d08857bf3b20daa Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 24 Apr 2025 14:00:34 +0200 Subject: [PATCH 154/330] Ensure that conversions can handle different units --- .../ess/spectroscopy/indirect/conversion.py | 2 +- .../src/ess/spectroscopy/indirect/kf.py | 27 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 75384e477..2d0bf42ca 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -65,7 +65,7 @@ def energy_transfer( : The energy transfer :math:`\Delta E`. """ - return incident_energy - final_energy + return incident_energy - final_energy.to(unit=incident_energy.unit, copy=False) def lab_momentum_transfer_from_wavevectors( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 6f4e06c54..e62d09aff 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -123,7 +123,10 @@ def analyzer_detector_vector( detector_position: sc.Variable, ) -> sc.Variable: """Calculate the analyzer-detector vector""" - return detector_position - (sample_position + sample_analyzer_vector) + analyzer_position = sample_position + sample_analyzer_vector.to( + unit=sample_analyzer_vector.unit + ) + return detector_position - analyzer_position.to(unit=detector_position.unit) def final_wavenumber( @@ -162,26 +165,30 @@ def final_wavenumber( # 2 theta is measured from the direction S-A, so the internal angle is # (pi - 2 theta) and the normal law of Cosines is modified accordingly to be # -cos(2 theta) instead of cos(pi - 2 theta) - cos2theta = (l_diff * l_diff - l_sa * l_sa - l_ad * l_ad) / (2 * l_sa * l_ad) + cos2theta = (l_diff**2 - l_sa**2 - l_ad**2) / (2 * l_sa * l_ad) # law of Cosines gives the Bragg reflected wavevector magnitude - return 2 * np.pi / analyzer_dspacing / sc.sqrt(2 - 2 * cos2theta) + return ( + 2 * np.pi / sc.sqrt(2 - 2 * cos2theta) / analyzer_dspacing.to(unit='angstrom') + ) def final_energy(final_wavenumber: sc.Variable) -> sc.Variable: """Converts (final) wave number to (final) energy""" from scipp.constants import hbar, neutron_mass - return ((hbar * hbar / 2 / neutron_mass) * final_wavenumber * final_wavenumber).to( - unit='meV' - ) + return ((hbar**2 / 2 / neutron_mass) * final_wavenumber**2).to(unit='meV') def final_wavevector( sample_analyzer_vector: sc.Variable, final_wavenumber: sc.Variable ) -> sc.Variable: - """Constructs the final wave vector form its direction and magnitude""" - return sample_analyzer_vector / sc.norm(sample_analyzer_vector) * final_wavenumber + """Constructs the final wave vector from its direction and magnitude""" + return ( + sample_analyzer_vector + / sc.norm(sample_analyzer_vector) + * final_wavenumber.to(unit='1/angstrom') + ) def secondary_flight_path_length( @@ -189,7 +196,9 @@ def secondary_flight_path_length( analyzer_detector_vector: sc.Variable, ) -> sc.Variable: """Returns the path-length-distance between the sample and each detector element""" - return sc.norm(sample_analyzer_vector) + sc.norm(analyzer_detector_vector) + ad = sc.norm(analyzer_detector_vector) + sa = sc.norm(sample_analyzer_vector).to(unit=ad.unit) + return sa + ad def secondary_flight_time( From 8dbbce36b73305abef1fcc6ed6f538a1fce05e4c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 24 Apr 2025 14:01:23 +0200 Subject: [PATCH 155/330] Use wavevector_from_wavelength from ScippNeutron --- .../src/ess/spectroscopy/indirect/conversion.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 2d0bf42ca..99c43371d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -3,9 +3,12 @@ """Coordinate conversions for indirect spectroscopy.""" -import numpy as np import scipp as sc -from scippneutron.conversion.tof import energy_from_wavelength, wavelength_from_tof +from scippneutron.conversion.tof import ( + energy_from_wavelength, + wavelength_from_tof, + wavevector_from_wavelength, +) from ..types import ( BeamlineWithSpectrometerCoords, @@ -37,7 +40,9 @@ def incident_wavelength_from_tof( def incident_wavevector_from_incident_wavelength( *, incident_wavelength: sc.Variable, incident_beam: sc.Variable ) -> sc.Variable: - return 2 * np.pi * incident_beam / sc.norm(incident_beam) / incident_wavelength + return wavevector_from_wavelength( + wavelength=incident_wavelength, beam=incident_beam + ) def energy_transfer( From 468ca0ad4a84fe18806c6b25942d23d2c1e6ca6d Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 28 May 2025 09:12:27 +0200 Subject: [PATCH 156/330] Copier update --- packages/essspectroscopy/.copier-answers.yml | 2 +- packages/essspectroscopy/docs/conf.py | 3 +++ packages/essspectroscopy/docs/index.md | 4 ++-- packages/essspectroscopy/pyproject.toml | 6 +++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index 03c7402a9..3937fb15e 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: a021314 +_commit: 3f79959 _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.13' diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 665f24910..b67daab91 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -266,6 +266,9 @@ def do_not_plot(*args, **kwargs): linkcheck_ignore = [ # Specific lines in Github blobs cannot be found by linkcheck. r'https?://github\.com/.*?/blob/[a-f0-9]+/.+?#', + # Linkcheck seems to be denied access by some DOI resolvers. + # Since DOIs are supposed to be permanent, we don't need to check them.' + r'https://doi\.org/', # ESS Jira is not publicly accessible. r'https?://jira\.ess\.eu', ] diff --git a/packages/essspectroscopy/docs/index.md b/packages/essspectroscopy/docs/index.md index 14657ec2f..fcab3b1e6 100644 --- a/packages/essspectroscopy/docs/index.md +++ b/packages/essspectroscopy/docs/index.md @@ -23,10 +23,10 @@ # {transparent}`ESSspectroscopy` - +
Spectroscopy data reduction for the European Spallation Source

- +
:::{include} user-guide/installation.md :heading-offset: 1 diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index bd71930b9..a928f103b 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -1,6 +1,6 @@ [build-system] requires = [ - "setuptools>=68", + "setuptools>=77", "setuptools_scm[toml]>=8.0", ] build-backend = "setuptools.build_meta" @@ -9,11 +9,11 @@ build-backend = "setuptools.build_meta" name = "essspectroscopy" description = "Spectroscopy data reduction for the European Spallation Source " authors = [{ name = "Scipp contributors" }] -license = { file = "LICENSE" } +license = "BSD-3-Clause" +license-files = ["LICENSE"] readme = "README.md" classifiers = [ "Intended Audience :: Science/Research", - "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", From 0413e1888da9708a097ccc377aa3a2c162ec444f Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 28 May 2025 09:13:36 +0200 Subject: [PATCH 157/330] Require Python 3.11 --- packages/essspectroscopy/.copier-answers.yml | 2 +- packages/essspectroscopy/.github/workflows/python-version-ci | 2 +- packages/essspectroscopy/.python-version | 2 +- packages/essspectroscopy/conda/meta.yaml | 2 +- packages/essspectroscopy/docs/developer/getting-started.md | 2 +- packages/essspectroscopy/pyproject.toml | 3 +-- packages/essspectroscopy/tox.ini | 2 +- 7 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index 3937fb15e..a4af1bd5a 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -3,7 +3,7 @@ _commit: 3f79959 _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.13' -min_python: '3.10' +min_python: '3.11' namespace_package: ess nightly_deps: scipp,scippneutron,sciline,plopp,scippnexus,essreduce orgname: scipp diff --git a/packages/essspectroscopy/.github/workflows/python-version-ci b/packages/essspectroscopy/.github/workflows/python-version-ci index c8cfe3959..2c0733315 100644 --- a/packages/essspectroscopy/.github/workflows/python-version-ci +++ b/packages/essspectroscopy/.github/workflows/python-version-ci @@ -1 +1 @@ -3.10 +3.11 diff --git a/packages/essspectroscopy/.python-version b/packages/essspectroscopy/.python-version index c8cfe3959..2c0733315 100644 --- a/packages/essspectroscopy/.python-version +++ b/packages/essspectroscopy/.python-version @@ -1 +1 @@ -3.10 +3.11 diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml index 868f98f79..2bcc87f24 100644 --- a/packages/essspectroscopy/conda/meta.yaml +++ b/packages/essspectroscopy/conda/meta.yaml @@ -17,7 +17,7 @@ requirements: - setuptools - setuptools_scm run: - - python>=3.10 + - python>=3.11 {# Conda does not allow spaces between package name and version, so remove them #} {% for package in dependencies %} diff --git a/packages/essspectroscopy/docs/developer/getting-started.md b/packages/essspectroscopy/docs/developer/getting-started.md index a196f562b..a76675116 100644 --- a/packages/essspectroscopy/docs/developer/getting-started.md +++ b/packages/essspectroscopy/docs/developer/getting-started.md @@ -40,7 +40,7 @@ Alternatively, if you want a different workflow, take a look at ``tox.ini`` or ` Run the tests using ```sh -tox -e py310 +tox -e py311 ``` (or just `tox` if you want to run all environments). diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index a928f103b..a9bcc41c8 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -18,14 +18,13 @@ classifiers = [ "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering", "Typing :: Typed", ] -requires-python = ">=3.10" +requires-python = ">=3.11" # IMPORTANT: # Run 'tox -e deps' after making changes here. This will update requirement files. diff --git a/packages/essspectroscopy/tox.ini b/packages/essspectroscopy/tox.ini index 5b137d891..505daf703 100644 --- a/packages/essspectroscopy/tox.ini +++ b/packages/essspectroscopy/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py310 +envlist = py311 isolated_build = true [testenv] From 0da60d2e3b13a8ecdd628509ddebe7a4b17a22ea Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 28 May 2025 09:17:00 +0200 Subject: [PATCH 158/330] Update dependencies --- .../essspectroscopy/requirements/base.txt | 14 ++++++------- .../essspectroscopy/requirements/basetest.txt | 8 +------ packages/essspectroscopy/requirements/ci.txt | 10 ++------- packages/essspectroscopy/requirements/dev.txt | 12 +++++------ .../essspectroscopy/requirements/docs.txt | 17 +++++++-------- .../essspectroscopy/requirements/nightly.txt | 21 +++++++------------ .../essspectroscopy/requirements/static.txt | 2 +- .../essspectroscopy/requirements/wheels.txt | 2 -- 8 files changed, 33 insertions(+), 53 deletions(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 66481198d..589e62a75 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -17,7 +17,7 @@ dnspython==2.7.0 # via email-validator email-validator==2.2.0 # via scippneutron -essreduce==25.5.1 +essreduce==25.5.3 # via -r base.in fonttools==4.58.0 # via matplotlib @@ -40,11 +40,11 @@ matplotlib==3.10.3 # via # mpltoolbox # plopp -mpltoolbox==25.4.0 +mpltoolbox==25.5.0 # via scippneutron networkx==3.4.2 # via cyclebane -numpy==2.2.5 +numpy==2.2.6 # via # contourpy # h5py @@ -61,11 +61,11 @@ pandas==2.2.3 # via -r base.in pillow==11.2.1 # via matplotlib -plopp==25.4.1 +plopp==25.5.0 # via # scippneutron # tof -pydantic==2.11.4 +pydantic==2.11.5 # via scippneutron pydantic-core==2.33.2 # via pydantic @@ -79,7 +79,7 @@ python-dateutil==2.9.0.post0 # scippnexus pytz==2025.2 # via pandas -sciline==25.5.0 +sciline==25.5.2 # via # -r base.in # essreduce @@ -114,7 +114,7 @@ typing-extensions==4.13.2 # pydantic-core # sciline # typing-inspection -typing-inspection==0.4.0 +typing-inspection==0.4.1 # via pydantic tzdata==2025.2 # via pandas diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 0f1c41858..45abe69ef 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -9,8 +9,6 @@ certifi==2025.4.26 # via requests charset-normalizer==3.4.2 # via requests -exceptiongroup==1.3.0 - # via pytest idna==3.10 # via requests iniconfig==2.1.0 @@ -21,7 +19,7 @@ packaging==25.0 # pytest platformdirs==4.3.8 # via pooch -pluggy==1.5.0 +pluggy==1.6.0 # via pytest pooch==1.8.2 # via -r basetest.in @@ -29,9 +27,5 @@ pytest==8.3.5 # via -r basetest.in requests==2.32.3 # via pooch -tomli==2.2.1 - # via pytest -typing-extensions==4.13.2 - # via exceptiongroup urllib3==2.4.0 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 5edeca3b6..e2ef6a5e7 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,7 +5,7 @@ # # requirements upgrade # -cachetools==5.5.2 +cachetools==6.0.0 # via tox certifi==2025.4.26 # via requests @@ -36,7 +36,7 @@ platformdirs==4.3.8 # via # tox # virtualenv -pluggy==1.5.0 +pluggy==1.6.0 # via tox pyproject-api==1.9.1 # via tox @@ -44,14 +44,8 @@ requests==2.32.3 # via -r ci.in smmap==5.0.2 # via gitdb -tomli==2.2.1 - # via - # pyproject-api - # tox tox==4.26.0 # via -r ci.in -typing-extensions==4.13.2 - # via tox urllib3==2.4.0 # via requests virtualenv==20.31.2 diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index da51270eb..eb7575fd4 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -26,7 +26,7 @@ async-lru==2.0.5 # via jupyterlab cffi==1.17.1 # via argon2-cffi-bindings -click==8.2.0 +click==8.2.1 # via # pip-compile-multi # pip-tools @@ -52,7 +52,7 @@ json5==0.12.0 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.23.0 +jsonschema[format-nongpl]==4.24.0 # via # jupyter-events # jupyterlab-server @@ -69,7 +69,7 @@ jupyter-server==2.16.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.4.2 +jupyterlab==4.4.3 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab @@ -79,13 +79,13 @@ overrides==7.7.0 # via jupyter-server pathspec==0.12.1 # via copier -pip-compile-multi==3.0.0 +pip-compile-multi==3.1.0 # via -r dev.in pip-tools==7.4.1 # via pip-compile-multi plumbum==1.9.0 # via copier -prometheus-client==0.21.1 +prometheus-client==0.22.0 # via jupyter-server pycparser==2.22 # via cffi @@ -111,7 +111,7 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.9.0.20241206 +types-python-dateutil==2.9.0.20250516 # via arrow uri-template==1.3.0 # via jsonschema diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index d22f86b47..569739ea6 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -44,8 +44,6 @@ docutils==0.21.2 # nbsphinx # pydata-sphinx-theme # sphinx -exceptiongroup==1.3.0 - # via ipython executing==2.2.0 # via stack-data fastjsonschema==2.21.1 @@ -54,10 +52,12 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==8.36.0 +ipython==9.2.0 # via # -r docs.in # ipykernel +ipython-pygments-lexers==1.1.1 + # via ipython jedi==0.19.2 # via ipython jinja2==3.1.6 @@ -66,7 +66,7 @@ jinja2==3.1.6 # nbconvert # nbsphinx # sphinx -jsonschema==4.23.0 +jsonschema==4.24.0 # via nbformat jsonschema-specifications==2025.4.1 # via jsonschema @@ -74,7 +74,7 @@ jupyter-client==8.6.3 # via # ipykernel # nbclient -jupyter-core==5.7.2 +jupyter-core==5.8.1 # via # ipykernel # jupyter-client @@ -142,6 +142,7 @@ pygments==2.19.1 # via # accessible-pygments # ipython + # ipython-pygments-lexers # nbconvert # pydata-sphinx-theme # sphinx @@ -159,7 +160,7 @@ requests==2.32.3 # via # pooch # sphinx -rpds-py==0.24.0 +rpds-py==0.25.1 # via # jsonschema # referencing @@ -198,9 +199,7 @@ stack-data==0.6.3 # via ipython tinycss2==1.4.0 # via bleach -tomli==2.2.1 - # via sphinx -tornado==6.4.2 +tornado==6.5.1 # via # ipykernel # jupyter-client diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 36ad2a8fd..1f88ec576 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -26,8 +26,6 @@ email-validator==2.2.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -exceptiongroup==1.3.0 - # via pytest fonttools==4.58.0 # via matplotlib graphviz==0.20.3 @@ -53,11 +51,11 @@ matplotlib==3.10.3 # via # mpltoolbox # plopp -mpltoolbox==25.4.0 +mpltoolbox==25.5.0 # via scippneutron -networkx==3.4.2 +networkx==3.5rc0 # via cyclebane -numpy==2.2.5 +numpy==2.3.0rc1 # via # contourpy # h5py @@ -83,11 +81,11 @@ plopp @ git+https://github.com/scipp/plopp@main # -r nightly.in # scippneutron # tof -pluggy==1.5.0 +pluggy==1.6.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.11.4 +pydantic==2.11.5 # via scippneutron pydantic-core==2.33.2 # via pydantic @@ -125,7 +123,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.15.3 +scipy==1.16.0rc1 # via # scippneutron # scippnexus @@ -134,16 +132,13 @@ six==1.17.0 # via python-dateutil tof==25.5.0 # via -r nightly.in -tomli==2.2.1 - # via pytest -typing-extensions==4.13.2 +typing-extensions==4.14.0rc1 # via - # exceptiongroup # pydantic # pydantic-core # sciline # typing-inspection -typing-inspection==0.4.0 +typing-inspection==0.4.1 # via pydantic tzdata==2025.2 # via pandas diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index b2c56f97e..7dbd6032c 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -11,7 +11,7 @@ distlib==0.3.9 # via virtualenv filelock==3.18.0 # via virtualenv -identify==2.6.10 +identify==2.6.12 # via pre-commit nodeenv==1.9.1 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 651191e54..231e8f943 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -11,5 +11,3 @@ packaging==25.0 # via build pyproject-hooks==1.2.0 # via build -tomli==2.2.1 - # via build From b0df6693af5c29a8cc3026faa25532603452ade1 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 28 May 2025 09:18:00 +0200 Subject: [PATCH 159/330] Update pre-commit hooks --- packages/essspectroscopy/.pre-commit-config.yaml | 8 ++++---- .../essspectroscopy/src/ess/spectroscopy/indirect/io.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml index 0f3f9a957..3b7336065 100644 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -16,14 +16,14 @@ repos: args: [ --markdown-linebreak-ext=md ] exclude: '\.svg' - repo: https://github.com/kynan/nbstripout - rev: 0.7.1 + rev: 0.8.1 hooks: - id: nbstripout types: [ "jupyter" ] args: [ "--drop-empty-cells", "--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.0 + rev: v0.11.11 hooks: - id: ruff args: [ --fix ] @@ -31,7 +31,7 @@ repos: - id: ruff-format types_or: [ python, pyi ] - repo: https://github.com/codespell-project/codespell - rev: v2.3.0 + rev: v2.4.1 hooks: - id: codespell additional_dependencies: @@ -47,7 +47,7 @@ repos: - id: rst-inline-touching-normal - id: text-unicode-replacement-char - repo: https://github.com/rhysd/actionlint - rev: v1.7.3 + rev: v1.7.7 hooks: - id: actionlint # Disable because of false-positive SC2046 diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index 35633fe9e..426f5a521 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -48,7 +48,7 @@ def to_nxspe(events: EnergyData[SampleRun], base: NXspeFileName) -> NXspeFileNam for i in range(events.sizes[dim]): ev = events[dim, i] - fn = str(base) + '_' + f'{i+1}'.rjust(length, '0') + '.nxspe' + fn = str(base) + '_' + f'{i + 1}'.rjust(length, '0') + '.nxspe' files.append(NXspeFileName(fn)) _to_one_nxspe(ev, fn) return NXspeFileNames(files) From db4a06dc6fc5f9165ed589d6c0ab8fce82f7f2ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 07:20:32 +0000 Subject: [PATCH 160/330] Bump scipp from 25.5.0 to 25.5.1 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 25.5.0 to 25.5.1. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/25.05.0...25.05.1) --- updated-dependencies: - dependency-name: scipp dependency-version: 25.5.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 589e62a75..b45ae855f 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -83,7 +83,7 @@ sciline==25.5.2 # via # -r base.in # essreduce -scipp==25.5.0 +scipp==25.5.1 # via # -r base.in # essreduce From a672ec4d5719ae58eacd30bcb3c3c80f90ae96c7 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 28 May 2025 09:41:29 +0200 Subject: [PATCH 161/330] Sort notebook imports --- .../user-guide/bifrost/bifrost-reduction.ipynb | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index 26cfe306d..da682c6e7 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -20,12 +20,14 @@ "source": [ "import scipp as sc\n", "import sciline\n", - "from ess import bifrost\n", - "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation\n", - "from ess.spectroscopy.types import *\n", "import scippnexus as snx\n", "\n", - "from ess.spectroscopy.types import SampleRun" + "from ess import bifrost\n", + "from ess.bifrost.data import (\n", + " simulated_elastic_incoherent_with_phonon,\n", + " tof_lookup_table_simulation\n", + ")\n", + "from ess.spectroscopy.types import *" ] }, { @@ -207,21 +209,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.11.10" } }, "nbformat": 4, From ea2056776918ae4a1ce261080597183ad73f51e0 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 28 May 2025 10:19:13 +0200 Subject: [PATCH 162/330] Do not spellcheck SVG --- packages/essspectroscopy/.pre-commit-config.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml index 3b7336065..ed864c10f 100644 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -36,6 +36,8 @@ repos: - id: codespell additional_dependencies: - tomli + exclude_types: + - svg - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: From 3bf6e7d36aaf0bc7492c8cd26a2db989fe59d01e Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 28 May 2025 10:19:28 +0200 Subject: [PATCH 163/330] Use cards in landing pages --- .../thumbnails/bifrost_reduction_dark.svg | 641 ++++++++++++++++++ .../thumbnails/bifrost_reduction_light.svg | 641 ++++++++++++++++++ packages/essspectroscopy/docs/index.md | 11 + .../docs/user-guide/bifrost/index.md | 21 +- .../tools/docs/bifrost-thumbnails.ipynb | 146 ++++ 5 files changed, 1459 insertions(+), 1 deletion(-) create mode 100644 packages/essspectroscopy/docs/_static/thumbnails/bifrost_reduction_dark.svg create mode 100644 packages/essspectroscopy/docs/_static/thumbnails/bifrost_reduction_light.svg create mode 100644 packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb diff --git a/packages/essspectroscopy/docs/_static/thumbnails/bifrost_reduction_dark.svg b/packages/essspectroscopy/docs/_static/thumbnails/bifrost_reduction_dark.svg new file mode 100644 index 000000000..20ab39378 --- /dev/null +++ b/packages/essspectroscopy/docs/_static/thumbnails/bifrost_reduction_dark.svg @@ -0,0 +1,641 @@ + + + + + + + + 2025-05-28T10:11:53.653853 + image/svg+xml + + + Matplotlib v3.10.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/essspectroscopy/docs/_static/thumbnails/bifrost_reduction_light.svg b/packages/essspectroscopy/docs/_static/thumbnails/bifrost_reduction_light.svg new file mode 100644 index 000000000..91f4e2e99 --- /dev/null +++ b/packages/essspectroscopy/docs/_static/thumbnails/bifrost_reduction_light.svg @@ -0,0 +1,641 @@ + + + + + + + + 2025-05-28T10:11:40.618226 + image/svg+xml + + + Matplotlib v3.10.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/essspectroscopy/docs/index.md b/packages/essspectroscopy/docs/index.md index fcab3b1e6..fc93fa8a0 100644 --- a/packages/essspectroscopy/docs/index.md +++ b/packages/essspectroscopy/docs/index.md @@ -28,6 +28,17 @@

+## Quick links + +::::{grid} 3 + +:::{grid-item-card} BIFROST +:link: user-guide/bifrost/index.md + +::: + +:::: + :::{include} user-guide/installation.md :heading-offset: 1 ::: diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/index.md b/packages/essspectroscopy/docs/user-guide/bifrost/index.md index ff3d9855e..aa60c9887 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/index.md +++ b/packages/essspectroscopy/docs/user-guide/bifrost/index.md @@ -1,8 +1,27 @@ # BIFROST +## Reduction Workflows + +::::{grid} 3 + +:::{grid-item-card} BIFROST Reduction +:link: bifrost-reduction.ipynb +:text-align: center + +```{image} ../../_static/thumbnails/bifrost_reduction_light.svg +:class: only-light +:width: 100% +``` +```{image} ../../_static/thumbnails/bifrost_reduction_dark.svg +:class: only-dark +:width: 100% +``` +::: + +:::: ```{toctree} --- -maxdepth: 1 +hidden: --- bifrost-reduction diff --git a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb new file mode 100644 index 000000000..8cd720c7c --- /dev/null +++ b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb @@ -0,0 +1,146 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# BIFROST thumbnails\n", + "\n", + "This notebook generates the thumbnails used in the BIFROST user guide." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": { + "jupyter": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import scipp as sc\n", + "import sciline\n", + "import scippnexus as snx\n", + "\n", + "from ess import bifrost\n", + "from ess.bifrost.data import (\n", + " simulated_elastic_incoherent_with_phonon,\n", + " tof_lookup_table_simulation\n", + ")\n", + "from ess.spectroscopy.types import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "with snx.File(simulated_elastic_incoherent_with_phonon()) as f:\n", + " detector_names = list(f['entry/instrument'][snx.NXdetector])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", + "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", + "workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation())\n", + "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "scheduler = sciline.scheduler.NaiveScheduler()\n", + "data = workflow.compute(EnergyData[SampleRun], scheduler=scheduler)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "def qx_qz_plot(style: str):\n", + " with plt.style.context(style):\n", + " fig, ax = plt.subplots(layout='constrained', figsize=(3, 2.5))\n", + " d = data['a4', 0].bins.concat().copy()\n", + " x = sc.vector([1, 0, 0])\n", + " z = sc.vector([0, 0, 1])\n", + " d.bins.coords['Qx'] = sc.dot(x, d.bins.coords['sample_table_momentum_transfer'])\n", + " d.bins.coords['Qz'] = sc.dot(z, d.bins.coords['sample_table_momentum_transfer'])\n", + " d.hist(Qz=100, Qx=100).plot(ax=ax)\n", + " ax.set_xlabel('$Q_x$ [1/Ã…]')\n", + " ax.set_ylabel('$Q_z$ [1/Ã…]')\n", + " fig.axes[-1].set_ylabel(None)\n", + " return fig" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "fig = qx_qz_plot('default')\n", + "fig.savefig(\n", + " \"../../docs/_static/thumbnails/bifrost_reduction_light.svg\",\n", + " transparent=True,\n", + ")\n", + "fig" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "fig = qx_qz_plot('dark_background')\n", + "fig.savefig(\n", + " \"../../docs/_static/thumbnails/bifrost_reduction_dark.svg\",\n", + " transparent=True,\n", + ")\n", + "fig" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e867de18ea919b1c02d196a9ea75928a2d00d977 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Tue, 17 Jun 2025 12:55:28 +0200 Subject: [PATCH 164/330] copier update --- packages/essspectroscopy/.copier-answers.ess.yml | 2 +- .../.github/ISSUE_TEMPLATE/high-level-requirement.yml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/.copier-answers.ess.yml b/packages/essspectroscopy/.copier-answers.ess.yml index dcad7e5fb..80b1d1f03 100644 --- a/packages/essspectroscopy/.copier-answers.ess.yml +++ b/packages/essspectroscopy/.copier-answers.ess.yml @@ -1,3 +1,3 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: d1d5caa +_commit: 34ca4ba _src_path: https://github.com/scipp/ess_template.git diff --git a/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml b/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml index cedef1d90..4d87603ba 100644 --- a/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml +++ b/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml @@ -79,6 +79,14 @@ body: description: How can we test this requirement? Links to tests data and reference data, or other suggestions. validations: required: true + - type: textarea + id: existingimplementations + attributes: + label: Existing implementations + description: Are there any existing implementations or proof-of-concept implementations that we can imitate? This field is specifically for linking to source code. + placeholder: "Example: See this repository ... This script implements the procedure: https://file-storage.server.eu/script.code." + validations: + required: false - type: textarea id: comments attributes: From ef5153d1fbc0a429e68e4ff688a35e0747bc87d3 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 15 Jul 2025 11:43:01 +0200 Subject: [PATCH 165/330] Update to new TOF workflow --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- .../essspectroscopy/requirements/base.txt | 30 ++--- .../essspectroscopy/requirements/basetest.txt | 10 +- packages/essspectroscopy/requirements/ci.txt | 10 +- packages/essspectroscopy/requirements/dev.txt | 16 ++- .../essspectroscopy/requirements/docs.txt | 14 +-- .../essspectroscopy/requirements/mypy.txt | 4 +- .../essspectroscopy/requirements/nightly.txt | 30 ++--- .../src/ess/bifrost/workflow.py | 12 +- .../spectroscopy/indirect/time_of_flight.py | 20 ++- .../tools/bifrost-make-tof-lookup-table.ipynb | 115 ++++++++++-------- 12 files changed, 139 insertions(+), 126 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index a9bcc41c8..d8f996b40 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,7 +30,7 @@ requires-python = ">=3.11" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=25.05.1", + "essreduce>=25.07.0", "graphviz>=0.20", "pandas>=2", "sciline>=25.4.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 2d35ae77e..0cb8571fe 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=25.05.1 +essreduce>=25.07.0 graphviz>=0.20 pandas>=2 sciline>=25.4.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index b45ae855f..8bf6c8ae8 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:851767a12dccfc39b5a5edd4b017aed72c742c39 +# SHA1:c692d4fc8c4a599ab6114a19ce80dc2bfdd5fa2a # # This file was generated by pip-compile-multi. # To update, run: @@ -17,13 +17,13 @@ dnspython==2.7.0 # via email-validator email-validator==2.2.0 # via scippneutron -essreduce==25.5.3 +essreduce==25.7.0 # via -r base.in -fonttools==4.58.0 +fonttools==4.58.5 # via matplotlib -graphviz==0.20.3 +graphviz==0.21 # via -r base.in -h5py==3.13.0 +h5py==3.14.0 # via # scippneutron # scippnexus @@ -42,9 +42,9 @@ matplotlib==3.10.3 # plopp mpltoolbox==25.5.0 # via scippneutron -networkx==3.4.2 +networkx==3.5 # via cyclebane -numpy==2.2.6 +numpy==2.3.1 # via # contourpy # h5py @@ -57,15 +57,15 @@ packaging==25.0 # via # lazy-loader # matplotlib -pandas==2.2.3 +pandas==2.3.1 # via -r base.in -pillow==11.2.1 +pillow==11.3.0 # via matplotlib -plopp==25.5.0 +plopp==25.6.1 # via # scippneutron # tof -pydantic==2.11.5 +pydantic==2.11.7 # via scippneutron pydantic-core==2.33.2 # via pydantic @@ -90,16 +90,16 @@ scipp==25.5.1 # scippneutron # scippnexus # tof -scippneutron==25.5.0 +scippneutron==25.7.0 # via # -r base.in # essreduce -scippnexus==25.4.0 +scippnexus==25.6.0 # via # -r base.in # essreduce # scippneutron -scipy==1.15.3 +scipy==1.16.0 # via # scippneutron # scippnexus @@ -108,7 +108,7 @@ six==1.17.0 # via python-dateutil tof==25.5.0 # via -r base.in -typing-extensions==4.13.2 +typing-extensions==4.14.1 # via # pydantic # pydantic-core diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 45abe69ef..8fdcbb6d3 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,7 +5,7 @@ # # requirements upgrade # -certifi==2025.4.26 +certifi==2025.7.14 # via requests charset-normalizer==3.4.2 # via requests @@ -23,9 +23,11 @@ pluggy==1.6.0 # via pytest pooch==1.8.2 # via -r basetest.in -pytest==8.3.5 +pygments==2.19.2 + # via pytest +pytest==8.4.1 # via -r basetest.in -requests==2.32.3 +requests==2.32.4 # via pooch -urllib3==2.4.0 +urllib3==2.5.0 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index e2ef6a5e7..a1a1a645d 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,9 +5,9 @@ # # requirements upgrade # -cachetools==6.0.0 +cachetools==6.1.0 # via tox -certifi==2025.4.26 +certifi==2025.7.14 # via requests chardet==5.2.0 # via tox @@ -40,13 +40,13 @@ pluggy==1.6.0 # via tox pyproject-api==1.9.1 # via tox -requests==2.32.3 +requests==2.32.4 # via -r ci.in smmap==5.0.2 # via gitdb -tox==4.26.0 +tox==4.27.0 # via -r ci.in -urllib3==2.4.0 +urllib3==2.5.0 # via requests virtualenv==20.31.2 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index eb7575fd4..cea74a020 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -16,7 +16,7 @@ anyio==4.9.0 # via # httpx # jupyter-server -argon2-cffi==23.1.0 +argon2-cffi==25.1.0 # via jupyter-server argon2-cffi-bindings==21.2.0 # via argon2-cffi @@ -30,9 +30,9 @@ click==8.2.1 # via # pip-compile-multi # pip-tools -copier==9.7.1 +copier==9.8.0 # via -r dev.in -dunamai==1.24.1 +dunamai==1.25.0 # via copier fqdn==1.5.1 # via jsonschema @@ -69,7 +69,7 @@ jupyter-server==2.16.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.4.3 +jupyterlab==4.4.4 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab @@ -77,15 +77,13 @@ notebook-shim==0.2.4 # via jupyterlab overrides==7.7.0 # via jupyter-server -pathspec==0.12.1 - # via copier -pip-compile-multi==3.1.0 +pip-compile-multi==3.2.1 # via -r dev.in pip-tools==7.4.1 # via pip-compile-multi plumbum==1.9.0 # via copier -prometheus-client==0.22.0 +prometheus-client==0.22.1 # via jupyter-server pycparser==2.22 # via cffi @@ -111,7 +109,7 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.9.0.20250516 +types-python-dateutil==2.9.0.20250708 # via arrow uri-template==1.3.0 # via jsonschema diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 569739ea6..bb906abb8 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -26,7 +26,7 @@ beautifulsoup4==4.13.4 # pydata-sphinx-theme bleach[css]==6.2.0 # via nbconvert -certifi==2025.4.26 +certifi==2025.7.14 # via requests charset-normalizer==3.4.2 # via requests @@ -52,7 +52,7 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==9.2.0 +ipython==9.4.0 # via # -r docs.in # ipykernel @@ -138,7 +138,7 @@ pure-eval==0.2.3 # via stack-data pydata-sphinx-theme==0.16.1 # via -r docs.in -pygments==2.19.1 +pygments==2.19.2 # via # accessible-pygments # ipython @@ -148,7 +148,7 @@ pygments==2.19.1 # sphinx pyyaml==6.0.2 # via myst-parser -pyzmq==26.4.0 +pyzmq==27.0.0 # via # ipykernel # jupyter-client @@ -156,11 +156,11 @@ referencing==0.36.2 # via # jsonschema # jsonschema-specifications -requests==2.32.3 +requests==2.32.4 # via # pooch # sphinx -rpds-py==0.25.1 +rpds-py==0.26.0 # via # jsonschema # referencing @@ -215,7 +215,7 @@ traitlets==5.14.3 # nbconvert # nbformat # nbsphinx -urllib3==2.4.0 +urllib3==2.5.0 # via requests wcwidth==0.2.13 # via prompt-toolkit diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index bba4ddd07..3c79935b4 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,7 +6,9 @@ # requirements upgrade # -r test.txt -mypy==1.15.0 +mypy==1.17.0 # via -r mypy.in mypy-extensions==1.1.0 # via mypy +pathspec==0.12.1 + # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 1f88ec576..04287cca5 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -10,7 +10,7 @@ annotated-types==0.7.0 # via pydantic -certifi==2025.4.26 +certifi==2025.7.14 # via requests charset-normalizer==3.4.2 # via requests @@ -26,11 +26,11 @@ email-validator==2.2.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -fonttools==4.58.0 +fonttools==4.58.5 # via matplotlib -graphviz==0.20.3 +graphviz==0.21 # via -r nightly.in -h5py==3.13.0 +h5py==3.14.0 # via # scippneutron # scippnexus @@ -53,9 +53,9 @@ matplotlib==3.10.3 # plopp mpltoolbox==25.5.0 # via scippneutron -networkx==3.5rc0 +networkx==3.5 # via cyclebane -numpy==2.3.0rc1 +numpy==2.3.1 # via # contourpy # h5py @@ -70,9 +70,9 @@ packaging==25.0 # matplotlib # pooch # pytest -pandas==2.2.3 +pandas==2.3.1 # via -r nightly.in -pillow==11.2.1 +pillow==11.3.0 # via matplotlib platformdirs==4.3.8 # via pooch @@ -85,13 +85,15 @@ pluggy==1.6.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.11.5 +pydantic==2.11.7 # via scippneutron pydantic-core==2.33.2 # via pydantic +pygments==2.19.2 + # via pytest pyparsing==3.2.3 # via matplotlib -pytest==8.3.5 +pytest==8.4.1 # via -r nightly.in python-dateutil==2.9.0.post0 # via @@ -101,7 +103,7 @@ python-dateutil==2.9.0.post0 # scippnexus pytz==2025.2 # via pandas -requests==2.32.3 +requests==2.32.4 # via pooch sciline @ git+https://github.com/scipp/sciline@main # via @@ -123,7 +125,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.16.0rc1 +scipy==1.16.0 # via # scippneutron # scippnexus @@ -132,7 +134,7 @@ six==1.17.0 # via python-dateutil tof==25.5.0 # via -r nightly.in -typing-extensions==4.14.0rc1 +typing-extensions==4.14.1 # via # pydantic # pydantic-core @@ -142,5 +144,5 @@ typing-inspection==0.4.1 # via pydantic tzdata==2025.2 # via pandas -urllib3==2.4.0 +urllib3==2.5.0 # via requests diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 19b70051b..f85bf095b 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -6,8 +6,8 @@ from typing import Any import sciline +import scipp as sc -from ess.reduce import time_of_flight from ess.spectroscopy.indirect.conversion import providers as conversion_providers from ess.spectroscopy.indirect.kf import providers as kf_providers from ess.spectroscopy.indirect.ki import providers as ki_providers @@ -33,13 +33,12 @@ def simulation_default_parameters() -> dict[type, Any]: """Default parameters for BifrostSimulationWorkflow.""" - tof_params = time_of_flight.default_parameters() return { NeXusMonitorName[FrameMonitor0]: '007_frame_0', NeXusMonitorName[FrameMonitor1]: '090_frame_1', NeXusMonitorName[FrameMonitor2]: '097_frame_2', NeXusMonitorName[FrameMonitor3]: '110_frame_3', - PulsePeriod: tof_params[PulsePeriod], + PulsePeriod: 1.0 / sc.scalar(14.0, unit="Hz"), } @@ -57,7 +56,6 @@ def simulation_default_parameters() -> dict[type, Any]: def BifrostSimulationWorkflow( detector_names: list[NeXusDetectorName], - tof_lut_provider: time_of_flight.TofLutProvider = time_of_flight.TofLutProvider.FILE, # noqa: E501 ) -> sciline.Pipeline: """Data reduction workflow for simulated BIFROST data. @@ -65,11 +63,6 @@ def BifrostSimulationWorkflow( ---------- detector_names: Names of ``NXdetector`` groups in the input NeXus file. - tof_lut_provider: - Specifies how the time-of-flight lookup table is provided: - - FILE: Read from a file. - - TOF: Computed from chopper settings using the 'tof' package. - - MCSTAS: From McStas simulation (not implemented yet). Returns ------- @@ -79,7 +72,6 @@ def BifrostSimulationWorkflow( workflow = TofWorkflow( run_types=(SampleRun,), monitor_types=(FrameMonitor0, FrameMonitor1, FrameMonitor2, FrameMonitor3), - tof_lut_provider=tof_lut_provider, ) for provider in _SIMULATION_PROVIDERS: workflow.insert(provider) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index a100bf256..af5d0c875 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -8,8 +8,7 @@ import sciline from ess.reduce import time_of_flight as reduce_time_of_flight -from ess.reduce.time_of_flight.types import ( - DetectorLtotal, +from ess.reduce.time_of_flight.lut import ( DistanceResolution, LookupTableRelativeErrorThreshold, LtotalRange, @@ -18,6 +17,7 @@ SimulationResults, TimeResolution, ) +from ess.reduce.time_of_flight.types import DetectorLtotal from ..types import ( DataAtSample, @@ -39,20 +39,19 @@ def TofWorkflow( *, run_types: Iterable[sciline.typing.Key], monitor_types: Iterable[sciline.typing.Key], - tof_lut_provider: reduce_time_of_flight.TofLutProvider, ) -> sciline.Pipeline: workflow = reduce_time_of_flight.GenericTofWorkflow( run_types=run_types, monitor_types=monitor_types, - tof_lut_provider=tof_lut_provider, ) for provider in providers: workflow.insert(provider) - if tof_lut_provider in ( - reduce_time_of_flight.TofLutProvider.MCSTAS, - reduce_time_of_flight.TofLutProvider.TOF, - ): - workflow.insert(compute_tof_lookup_table) + return workflow + + +def TofLookupTableWorkflow() -> sciline.Pipeline: + workflow = reduce_time_of_flight.lut.TofLookupTableWorkflow() + workflow.insert(compute_tof_lookup_table) return workflow @@ -71,7 +70,7 @@ def compute_tof_lookup_table( This is a wrapper around :func:`ess.reduce.time_of_flight.compute_tof_lookup_table` for indirect geometry spectrometers. """ - return reduce_time_of_flight.eto_to_tof.compute_tof_lookup_table( + return reduce_time_of_flight.lut.make_tof_lookup_table( simulation=simulation, ltotal_range=LtotalRange(l1_range), distance_resolution=distance_resolution, @@ -104,7 +103,6 @@ def detector_time_of_flight_data( ) # This is time-of-flight at the sample. result.bins.coords['sample_tof'] = result.bins.coords.pop('tof') - del result.bins.coords['event_time_offset'] del result.bins.coords['event_time_zero'] return result diff --git a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb index bed6b9d9d..49e613e4b 100644 --- a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb @@ -19,15 +19,14 @@ "import sciline\n", "import scipp as sc\n", "import scippnexus as snx\n", - "from ess.reduce.nexus.types import RawChoppers, DiskChoppers\n", - "from ess.reduce.time_of_flight import TofLutProvider\n", - "from ess.reduce.time_of_flight.types import *\n", + "from ess.reduce.nexus.types import RawChoppers, DiskChoppers\n", + "from ess.reduce.time_of_flight.lut import NumberOfSimulatedNeutrons,SourcePosition\n", "from scippneutron.chopper import DiskChopper\n", "\n", "from ess.bifrost import BifrostSimulationWorkflow\n", "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon\n", - "from ess.bifrost.types import *\n", - "from ess.spectroscopy.types import *" + "from ess.spectroscopy.types import *\n", + "from ess.spectroscopy.indirect.time_of_flight import TofLookupTableWorkflow" ] }, { @@ -35,10 +34,10 @@ "id": "2", "metadata": {}, "source": [ - "## Prepare the workflow\n", + "## Load and process beamline parameters\n", "\n", - "The choppers in the simulated file need to be processed before they can be used for computing a lookup table.\n", - "The following functions work for the specific simulation but are *not* usable in general." + "First, load all required beamline parameters from an input NeXus file.\n", + "We only need to know the geometry up to the sample which is the same for all banks, so choosing a single detector is enough." ] }, { @@ -48,38 +47,33 @@ "metadata": {}, "outputs": [], "source": [ - "def extract_chopper_plateau(chopper):\n", - " processed = chopper.copy()\n", - " # These are constant in the simulated data.\n", - " processed['rotation_speed'] = processed['rotation_speed'].data.mean()\n", - " processed['phase'] = processed['phase'].data.mean()\n", - " # Guessing here as this is not stored in the file.\n", - " processed['beam_position'] = sc.scalar(0.0, unit='deg')\n", - " return DiskChopper.from_nexus(processed)\n", - "\n", - "\n", - "def extract_chopper_plateaus(choppers: RawChoppers[RunType]) -> DiskChoppers[RunType]:\n", - " return DiskChoppers[RunType](choppers.apply(extract_chopper_plateau))" + "input_filename = simulated_elastic_incoherent_with_phonon()\n", + "with snx.File(input_filename) as f:\n", + " detector_names = list(f['entry/instrument'][snx.NXdetector])" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "id": "4", "metadata": {}, + "outputs": [], "source": [ - "Construct the workflow.\n", - "We only need the detector names for the geometry up to the sample, so choosing a single detector is enough." + "bifrost_workflow = BifrostSimulationWorkflow(detector_names)\n", + "bifrost_workflow[Filename[SampleRun]] = input_filename\n", + "\n", + "M = nexus.types.CalibratedMonitor[SampleRun, FrameMonitor3]\n", + "C = RawChoppers[SampleRun]\n", + "choppers, monitor = bifrost_workflow.compute((C, M)).values()\n", + "beamline = sciline.compute_mapped(bifrost_workflow, BeamlineWithSpectrometerCoords[SampleRun])[0]" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "id": "5", "metadata": {}, - "outputs": [], "source": [ - "with snx.File(simulated_elastic_incoherent_with_phonon()) as f:\n", - " detector_names = list(f['entry/instrument'][snx.NXdetector])" + "Compute the required distance range to include the monitor and sample:" ] }, { @@ -89,10 +83,9 @@ "metadata": {}, "outputs": [], "source": [ - "workflow = BifrostSimulationWorkflow(detector_names=detector_names[:1],\n", - " tof_lut_provider=TofLutProvider.TOF)\n", - "workflow.insert(extract_chopper_plateaus)\n", - "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()" + "l_monitor = sc.norm(monitor.coords['source_position'] - monitor.coords['position'])\n", + "l_min = l_monitor\n", + "l_max = beamline.coords['L1']" ] }, { @@ -100,7 +93,8 @@ "id": "7", "metadata": {}, "source": [ - "Compute the required distance range:" + "The choppers in the simulated file need to be processed before they can be used for computing a lookup table.\n", + "The following works for the specific simulation but is **not** usable in general." ] }, { @@ -110,22 +104,25 @@ "metadata": {}, "outputs": [], "source": [ - "beamline = sciline.compute_mapped(workflow, BeamlineWithSpectrometerCoords[SampleRun])[0]\n", - "monitor = workflow.compute(nexus.types.CalibratedMonitor[SampleRun, FrameMonitor3])" + "def extract_chopper_plateau(chopper):\n", + " processed = chopper.copy()\n", + " # These are constant in the simulated data.\n", + " processed['rotation_speed'] = processed['rotation_speed'].data.mean()\n", + " processed['phase'] = processed['phase'].data.mean()\n", + " # Guessing here as this is not stored in the file.\n", + " processed['beam_position'] = sc.scalar(0.0, unit='deg')\n", + " return DiskChopper.from_nexus(processed)\n", + "\n", + "\n", + "disk_choppers = choppers.apply(extract_chopper_plateau)" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "id": "9", "metadata": {}, - "outputs": [], "source": [ - "l_monitor = sc.norm(monitor.coords['source_position'] - monitor.coords['position'])\n", - "l_min = l_monitor\n", - "l_max = beamline.coords['L1']\n", - "workflow[NumberOfSimulatedNeutrons] = 5_000_000\n", - "workflow[L1Range] = (l_min, l_max)" + "## Compute the lookup table" ] }, { @@ -133,7 +130,7 @@ "id": "10", "metadata": {}, "source": [ - "## Compute the lookup table" + "Construct a lookup table workflow:" ] }, { @@ -143,7 +140,11 @@ "metadata": {}, "outputs": [], "source": [ - "workflow.visualize(TimeOfFlightLookupTable, graph_attr={\"rankdir\": \"LR\"})" + "workflow = TofLookupTableWorkflow()\n", + "workflow[DiskChoppers] = disk_choppers\n", + "workflow[L1Range] = (l_min, l_max)\n", + "workflow[NumberOfSimulatedNeutrons] = 5_000_000\n", + "workflow[SourcePosition] = beamline.coords['source_position']" ] }, { @@ -152,6 +153,24 @@ "id": "12", "metadata": {}, "outputs": [], + "source": [ + "workflow.visualize(TimeOfFlightLookupTable, graph_attr={\"rankdir\": \"LR\"})" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "Compute a lookup table:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], "source": [ "table = workflow.compute(TimeOfFlightLookupTable)\n", "table" @@ -160,7 +179,7 @@ { "cell_type": "code", "execution_count": null, - "id": "13", + "id": "15", "metadata": {}, "outputs": [], "source": [ @@ -169,7 +188,7 @@ }, { "cell_type": "markdown", - "id": "14", + "id": "16", "metadata": {}, "source": [ "## Save to file" @@ -178,7 +197,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15", + "id": "17", "metadata": {}, "outputs": [], "source": [ From f6c208efbe00d146716ae12d248ba7e4c80ba1c1 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 15 Jul 2025 17:03:52 +0200 Subject: [PATCH 166/330] Remove obsolete tof wrapper --- .../spectroscopy/indirect/time_of_flight.py | 42 ------------------- .../src/ess/spectroscopy/types.py | 10 ----- .../tools/bifrost-make-tof-lookup-table.ipynb | 7 ++-- 3 files changed, 3 insertions(+), 56 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index af5d0c875..f67dc24d9 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -8,22 +8,12 @@ import sciline from ess.reduce import time_of_flight as reduce_time_of_flight -from ess.reduce.time_of_flight.lut import ( - DistanceResolution, - LookupTableRelativeErrorThreshold, - LtotalRange, - PulsePeriod, - PulseStride, - SimulationResults, - TimeResolution, -) from ess.reduce.time_of_flight.types import DetectorLtotal from ..types import ( DataAtSample, DetectorData, DetectorTofData, - L1Range, MonitorCoordTransformGraph, MonitorData, MonitorLtotal, @@ -49,38 +39,6 @@ def TofWorkflow( return workflow -def TofLookupTableWorkflow() -> sciline.Pipeline: - workflow = reduce_time_of_flight.lut.TofLookupTableWorkflow() - workflow.insert(compute_tof_lookup_table) - return workflow - - -def compute_tof_lookup_table( - simulation: SimulationResults, - l1_range: L1Range, - distance_resolution: DistanceResolution, - time_resolution: TimeResolution, - pulse_period: PulsePeriod, - pulse_stride: PulseStride, - error_threshold: LookupTableRelativeErrorThreshold, -) -> TimeOfFlightLookupTable: - """Compute a lookup table for time-of-flight as a function of distance and - time-of-arrival. - - This is a wrapper around :func:`ess.reduce.time_of_flight.compute_tof_lookup_table` - for indirect geometry spectrometers. - """ - return reduce_time_of_flight.lut.make_tof_lookup_table( - simulation=simulation, - ltotal_range=LtotalRange(l1_range), - distance_resolution=distance_resolution, - time_resolution=time_resolution, - pulse_period=pulse_period, - pulse_stride=pulse_stride, - error_threshold=error_threshold, - ) - - def detector_time_of_flight_data( sample_data: DataAtSample[RunType], lookup: TimeOfFlightLookupTable, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 562f2192f..db9a27cb2 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -62,16 +62,6 @@ TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable TimeOfFlightLookupTableFilename = time_of_flight.TimeOfFlightLookupTableFilename -L1Range = NewType("L1Range", tuple[sc.Variable, sc.Variable]) -""" -Range (min, max) of the length of the flight path from the source to the sample. - -This type corresponds to :class:`ess.reduce.time_of_flight.types.LtotalRange` -for other instruments. -But for indirect geometry spectrometers, we compute time of flight -to the sample, not the detectors. -""" - # Custom types diff --git a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb index 49e613e4b..8f2537080 100644 --- a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb @@ -20,13 +20,12 @@ "import scipp as sc\n", "import scippnexus as snx\n", "from ess.reduce.nexus.types import RawChoppers, DiskChoppers\n", - "from ess.reduce.time_of_flight.lut import NumberOfSimulatedNeutrons,SourcePosition\n", + "from ess.reduce.time_of_flight.lut import LtotalRange, NumberOfSimulatedNeutrons, SourcePosition, TofLookupTableWorkflow\n", "from scippneutron.chopper import DiskChopper\n", "\n", "from ess.bifrost import BifrostSimulationWorkflow\n", "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon\n", - "from ess.spectroscopy.types import *\n", - "from ess.spectroscopy.indirect.time_of_flight import TofLookupTableWorkflow" + "from ess.spectroscopy.types import *" ] }, { @@ -142,7 +141,7 @@ "source": [ "workflow = TofLookupTableWorkflow()\n", "workflow[DiskChoppers] = disk_choppers\n", - "workflow[L1Range] = (l_min, l_max)\n", + "workflow[LtotalRange] = (l_min, l_max)\n", "workflow[NumberOfSimulatedNeutrons] = 5_000_000\n", "workflow[SourcePosition] = beamline.coords['source_position']" ] From 3c830ec09041b373ee4cb56a5cc40412b8b41160 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 16 Jul 2025 08:08:41 +0200 Subject: [PATCH 167/330] Move tof tbale notebook into docs --- .../bifrost-make-tof-lookup-table.ipynb | 27 ++++++++++++------- .../docs/user-guide/bifrost/index.md | 10 +++++++ .../essspectroscopy/src/ess/bifrost/data.py | 7 ++++- 3 files changed, 34 insertions(+), 10 deletions(-) rename packages/essspectroscopy/{tools => docs/user-guide/bifrost}/bifrost-make-tof-lookup-table.ipynb (89%) diff --git a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb similarity index 89% rename from packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb rename to packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb index 8f2537080..302c74e34 100644 --- a/packages/essspectroscopy/tools/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb @@ -5,7 +5,9 @@ "id": "0", "metadata": {}, "source": [ - "# Create a time-of-flight lookup table for BIFROST" + "# Create a time-of-flight lookup table for BIFROST\n", + "\n", + "This notebook shows how to create a time-of-flight lookup table for frame unwrapping at BIFROST." ] }, { @@ -20,7 +22,12 @@ "import scipp as sc\n", "import scippnexus as snx\n", "from ess.reduce.nexus.types import RawChoppers, DiskChoppers\n", - "from ess.reduce.time_of_flight.lut import LtotalRange, NumberOfSimulatedNeutrons, SourcePosition, TofLookupTableWorkflow\n", + "from ess.reduce.time_of_flight.lut import (\n", + " LtotalRange,\n", + " NumberOfSimulatedNeutrons,\n", + " SourcePosition,\n", + " TofLookupTableWorkflow,\n", + ")\n", "from scippneutron.chopper import DiskChopper\n", "\n", "from ess.bifrost import BifrostSimulationWorkflow\n", @@ -142,8 +149,10 @@ "workflow = TofLookupTableWorkflow()\n", "workflow[DiskChoppers] = disk_choppers\n", "workflow[LtotalRange] = (l_min, l_max)\n", - "workflow[NumberOfSimulatedNeutrons] = 5_000_000\n", - "workflow[SourcePosition] = beamline.coords['source_position']" + "workflow[SourcePosition] = beamline.coords['source_position']\n", + "\n", + "# Increase this number for more reliable results:\n", + "workflow[NumberOfSimulatedNeutrons] = 200_000" ] }, { @@ -182,7 +191,7 @@ "metadata": {}, "outputs": [], "source": [ - "table.squeeze().plot()" + "table.plot()" ] }, { @@ -206,21 +215,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.11.10" } }, "nbformat": 4, diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/index.md b/packages/essspectroscopy/docs/user-guide/bifrost/index.md index aa60c9887..1a4449278 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/index.md +++ b/packages/essspectroscopy/docs/user-guide/bifrost/index.md @@ -26,3 +26,13 @@ hidden: bifrost-reduction ``` + +## Advanced Tools + +```{toctree} +--- +maxdepth: 1 +--- + +bifrost-make-tof-lookup-table +``` diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 5a4354fe0..fe7057daa 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -41,7 +41,12 @@ def simulated_elastic_incoherent_with_phonon() -> str: def tof_lookup_table_simulation() -> str: - """Time-of-flight lookup table for the simulated BIFROST data.""" + """Time-of-flight lookup table for the simulated BIFROST data. + + This table was computed with [tof](https://github.com/scipp/tof) + using + with ``NumberOfSimulatedNeutrons = 5_000_000``. + """ return get_path("BIFROST-simulation-tof-lookup-table.h5") From ee98cb37cfdfccf1fca8cd2fecfba755c93a2fa2 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 16 Jul 2025 10:05:01 +0200 Subject: [PATCH 168/330] Add missing link --- packages/essspectroscopy/src/ess/bifrost/data.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index fe7057daa..2c8dff2c1 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -43,8 +43,9 @@ def simulated_elastic_incoherent_with_phonon() -> str: def tof_lookup_table_simulation() -> str: """Time-of-flight lookup table for the simulated BIFROST data. - This table was computed with [tof](https://github.com/scipp/tof) - using + This table was computed with `tof `_ + using `Create a time-of-flight lookup table for BIFROST + <../../user-guide/bifrost/bifrost-make-tof-lookup-table.rst>`_ with ``NumberOfSimulatedNeutrons = 5_000_000``. """ return get_path("BIFROST-simulation-tof-lookup-table.h5") From 89ed64d66ff06563e7d79da0acd006305a7ac163 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Thu, 17 Jul 2025 11:00:48 +0200 Subject: [PATCH 169/330] copier update --- packages/essspectroscopy/.copier-answers.yml | 2 +- .../workflows/nightly_at_main_lower_bound.yml | 37 +++++++++++++++++++ .../essspectroscopy/.pre-commit-config.yaml | 2 +- packages/essspectroscopy/docs/about/index.md | 4 +- packages/essspectroscopy/docs/conf.py | 1 + packages/essspectroscopy/requirements/docs.in | 1 + 6 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 packages/essspectroscopy/.github/workflows/nightly_at_main_lower_bound.yml diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index a4af1bd5a..4edd26323 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 3f79959 +_commit: 3561fcd _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.13' diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_main_lower_bound.yml b/packages/essspectroscopy/.github/workflows/nightly_at_main_lower_bound.yml new file mode 100644 index 000000000..c13c3f784 --- /dev/null +++ b/packages/essspectroscopy/.github/workflows/nightly_at_main_lower_bound.yml @@ -0,0 +1,37 @@ +name: Nightly test using lower bound dependencies + +on: + workflow_dispatch: + schedule: + - cron: '30 1 * * 1-5' + +jobs: + setup: + name: Setup variables + runs-on: 'ubuntu-24.04' + outputs: + min_python: ${{ steps.vars.outputs.min_python }} + steps: + - uses: actions/checkout@v4 + - name: Get Python version for other CI jobs + id: vars + run: echo "min_python=$(< .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" + + tests: + name: Tests at lower bound + needs: setup + strategy: + matrix: + os: ['ubuntu-24.04'] + python: + - version: '${{needs.setup.outputs.min_python}}' + runs-on: ${{ matrix.os }} + env: + ESS_PROTECTED_FILESTORE_USERNAME: ${{ secrets.ESS_PROTECTED_FILESTORE_USERNAME }} + ESS_PROTECTED_FILESTORE_PASSWORD: ${{ secrets.ESS_PROTECTED_FILESTORE_PASSWORD }} + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v6 + with: + python-version: ${{ matrix.python.version }} + - run: uv run --extra=test --resolution=lowest-direct pytest diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml index ed864c10f..fb2115688 100644 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: additional_dependencies: - tomli exclude_types: - - svg + - svg - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: diff --git a/packages/essspectroscopy/docs/about/index.md b/packages/essspectroscopy/docs/about/index.md index d0ce25744..20b55ae6c 100644 --- a/packages/essspectroscopy/docs/about/index.md +++ b/packages/essspectroscopy/docs/about/index.md @@ -2,11 +2,11 @@ ## Development -ESSspectroscopy is an open source project by the [European Spallation Source ERIC](https://europeanspallationsource.se/) (ESS). +ESSspectroscopy is an open source project by the [European Spallation Source ERIC](https://ess.eu/) (ESS). ## License -ESSspectroscopy is available as open source under the [BSD-3 license](https://opensource.org/licenses/BSD-3-Clause). +ESSspectroscopy is available as open source under the [BSD-3 license](https://opensource.org/license/BSD-3-Clause). ## Citing ESSspectroscopy diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index b67daab91..8d9f607d8 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -32,6 +32,7 @@ 'sphinx_autodoc_typehints', 'sphinx_copybutton', 'sphinx_design', + 'sphinxcontrib.autodoc_pydantic', 'nbsphinx', 'myst_parser', ] diff --git a/packages/essspectroscopy/requirements/docs.in b/packages/essspectroscopy/requirements/docs.in index 4e3d51032..f4c44bdb1 100644 --- a/packages/essspectroscopy/requirements/docs.in +++ b/packages/essspectroscopy/requirements/docs.in @@ -1,4 +1,5 @@ -r base.in +autodoc-pydantic ipykernel ipython!=8.7.0 # Breaks syntax highlighting in Jupyter code cells. myst-parser From 6aea1caeabc678686a86b8ec21f2dd31ef8e06ef Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Thu, 17 Jul 2025 11:06:31 +0200 Subject: [PATCH 170/330] deps: lower pins --- packages/essspectroscopy/pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index d8f996b40..c469f430d 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -32,10 +32,10 @@ requires-python = ">=3.11" dependencies = [ "essreduce>=25.07.0", "graphviz>=0.20", - "pandas>=2", + "pandas>=2.1.2", "sciline>=25.4.1", "scipp>=25.3.0", - "scippneutron>=24.8.0", + "scippneutron>=25.3.0", "scippnexus>=24.9.0", "tof>=25.01.2", ] @@ -44,8 +44,8 @@ dynamic = ["version"] [project.optional-dependencies] test = [ - "pooch", - "pytest", + "pooch>=1.5", + "pytest>=7.0", ] [project.urls] From 838a1649ecd2c3e1374c1fd2b02469ecc907a0e8 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Thu, 17 Jul 2025 11:07:52 +0200 Subject: [PATCH 171/330] tox -e deps --- packages/essspectroscopy/requirements/base.in | 4 ++-- .../essspectroscopy/requirements/base.txt | 14 ++++++------- .../essspectroscopy/requirements/basetest.in | 4 ++-- .../essspectroscopy/requirements/basetest.txt | 8 +++++++- packages/essspectroscopy/requirements/ci.txt | 6 ++++++ .../essspectroscopy/requirements/docs.txt | 20 +++++++++++++------ .../essspectroscopy/requirements/nightly.in | 6 +++--- .../essspectroscopy/requirements/nightly.txt | 15 +++++++++----- .../essspectroscopy/requirements/wheels.txt | 2 ++ 9 files changed, 53 insertions(+), 26 deletions(-) diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 0cb8571fe..722eecd71 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -4,9 +4,9 @@ # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! essreduce>=25.07.0 graphviz>=0.20 -pandas>=2 +pandas>=2.1.2 sciline>=25.4.1 scipp>=25.3.0 -scippneutron>=24.8.0 +scippneutron>=25.3.0 scippnexus>=24.9.0 tof>=25.01.2 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 8bf6c8ae8..57446cab0 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:c692d4fc8c4a599ab6114a19ce80dc2bfdd5fa2a +# SHA1:2f0e00355fbb2de9650c92550ecaf43171f44146 # # This file was generated by pip-compile-multi. # To update, run: @@ -17,9 +17,9 @@ dnspython==2.7.0 # via email-validator email-validator==2.2.0 # via scippneutron -essreduce==25.7.0 +essreduce==25.7.1 # via -r base.in -fonttools==4.58.5 +fonttools==4.59.0 # via matplotlib graphviz==0.21 # via -r base.in @@ -42,9 +42,9 @@ matplotlib==3.10.3 # plopp mpltoolbox==25.5.0 # via scippneutron -networkx==3.5 +networkx==3.4.2 # via cyclebane -numpy==2.3.1 +numpy==2.2.6 # via # contourpy # h5py @@ -61,7 +61,7 @@ pandas==2.3.1 # via -r base.in pillow==11.3.0 # via matplotlib -plopp==25.6.1 +plopp==25.7.0 # via # scippneutron # tof @@ -99,7 +99,7 @@ scippnexus==25.6.0 # -r base.in # essreduce # scippneutron -scipy==1.16.0 +scipy==1.15.3 # via # scippneutron # scippnexus diff --git a/packages/essspectroscopy/requirements/basetest.in b/packages/essspectroscopy/requirements/basetest.in index 25ac83568..efed8f448 100644 --- a/packages/essspectroscopy/requirements/basetest.in +++ b/packages/essspectroscopy/requirements/basetest.in @@ -7,5 +7,5 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -pooch -pytest +pooch>=1.5 +pytest>=7.0 diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 8fdcbb6d3..1602ae967 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -1,4 +1,4 @@ -# SHA1:54ed0e3deb2d458e91bae14067e84eaad659f5fd +# SHA1:ca39ad2dd07c303d616b3b63afee59b3c41e83fe # # This file was generated by pip-compile-multi. # To update, run: @@ -9,6 +9,8 @@ certifi==2025.7.14 # via requests charset-normalizer==3.4.2 # via requests +exceptiongroup==1.3.0 + # via pytest idna==3.10 # via requests iniconfig==2.1.0 @@ -29,5 +31,9 @@ pytest==8.4.1 # via -r basetest.in requests==2.32.4 # via pooch +tomli==2.2.1 + # via pytest +typing-extensions==4.14.1 + # via exceptiongroup urllib3==2.5.0 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index a1a1a645d..629701a65 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -44,8 +44,14 @@ requests==2.32.4 # via -r ci.in smmap==5.0.2 # via gitdb +tomli==2.2.1 + # via + # pyproject-api + # tox tox==4.27.0 # via -r ci.in +typing-extensions==4.14.1 + # via tox urllib3==2.5.0 # via requests virtualenv==20.31.2 diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index bb906abb8..61ec31189 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -1,4 +1,4 @@ -# SHA1:d3c0de19a558da7484a806c760b01e423c9c1da7 +# SHA1:103aabc5a0c93de8e51263bcbed36d619e1016c3 # # This file was generated by pip-compile-multi. # To update, run: @@ -16,6 +16,8 @@ attrs==25.3.0 # via # jsonschema # referencing +autodoc-pydantic==2.2.0 + # via -r docs.in babel==2.17.0 # via # pydata-sphinx-theme @@ -32,7 +34,7 @@ charset-normalizer==3.4.2 # via requests comm==0.2.2 # via ipykernel -debugpy==1.8.14 +debugpy==1.8.15 # via ipykernel decorator==5.2.1 # via ipython @@ -44,6 +46,8 @@ docutils==0.21.2 # nbsphinx # pydata-sphinx-theme # sphinx +exceptiongroup==1.3.0 + # via ipython executing==2.2.0 # via stack-data fastjsonschema==2.21.1 @@ -52,12 +56,10 @@ imagesize==1.4.1 # via sphinx ipykernel==6.29.5 # via -r docs.in -ipython==9.4.0 +ipython==8.37.0 # via # -r docs.in # ipykernel -ipython-pygments-lexers==1.1.1 - # via ipython jedi==0.19.2 # via ipython jinja2==3.1.6 @@ -136,16 +138,19 @@ ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data +pydantic-settings==2.10.1 + # via autodoc-pydantic pydata-sphinx-theme==0.16.1 # via -r docs.in pygments==2.19.2 # via # accessible-pygments # ipython - # ipython-pygments-lexers # nbconvert # pydata-sphinx-theme # sphinx +python-dotenv==1.1.1 + # via pydantic-settings pyyaml==6.0.2 # via myst-parser pyzmq==27.0.0 @@ -171,6 +176,7 @@ soupsieve==2.7 sphinx==8.1.3 # via # -r docs.in + # autodoc-pydantic # myst-parser # nbsphinx # pydata-sphinx-theme @@ -199,6 +205,8 @@ stack-data==0.6.3 # via ipython tinycss2==1.4.0 # via bleach +tomli==2.2.1 + # via sphinx tornado==6.5.1 # via # ipykernel diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 66d3939e4..9a24172c6 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -2,10 +2,10 @@ # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! graphviz>=0.20 -pandas>=2 +pandas>=2.1.2 tof>=25.01.2 -pooch -pytest +pooch>=1.5 +pytest>=7.0 scipp --index-url=https://pypi.anaconda.org/scipp-nightly-wheels/simple/ --extra-index-url=https://pypi.org/simple diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 04287cca5..0b30c8094 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:553ad7a6d1b1325dfb725c50e93549c5e142e21a +# SHA1:7d08a7086e92d4d2bc1b09d8d1155aeff9738feb # # This file was generated by pip-compile-multi. # To update, run: @@ -26,7 +26,9 @@ email-validator==2.2.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -fonttools==4.58.5 +exceptiongroup==1.3.0 + # via pytest +fonttools==4.59.0 # via matplotlib graphviz==0.21 # via -r nightly.in @@ -53,9 +55,9 @@ matplotlib==3.10.3 # plopp mpltoolbox==25.5.0 # via scippneutron -networkx==3.5 +networkx==3.4.2 # via cyclebane -numpy==2.3.1 +numpy==2.2.6 # via # contourpy # h5py @@ -125,7 +127,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.16.0 +scipy==1.15.3 # via # scippneutron # scippnexus @@ -134,8 +136,11 @@ six==1.17.0 # via python-dateutil tof==25.5.0 # via -r nightly.in +tomli==2.2.1 + # via pytest typing-extensions==4.14.1 # via + # exceptiongroup # pydantic # pydantic-core # sciline diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 231e8f943..651191e54 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -11,3 +11,5 @@ packaging==25.0 # via build pyproject-hooks==1.2.0 # via build +tomli==2.2.1 + # via build From ff87a3a67174b66f9095e1964c712d0f10175d69 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Thu, 24 Jul 2025 10:07:31 +0200 Subject: [PATCH 172/330] fix: make tests resilient to temporary network issues --- packages/essspectroscopy/src/ess/bifrost/data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 2c8dff2c1..c5ed9ed83 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -19,6 +19,7 @@ def _make_pooch(): "computed_energy_data_simulated.h5": "md5:31b2444042935e99831c3c84a375ccae", "BIFROST-simulation-tof-lookup-table.h5": "md5:f2c12eb39d0750238805d0e5a5d561f7", # noqa: E501 }, + retry_if_failed=3, ) From 1482ce0eeb99bc94e071259d060170576338de6a Mon Sep 17 00:00:00 2001 From: Mridul Seth Date: Wed, 6 Aug 2025 14:54:54 +0200 Subject: [PATCH 173/330] Merge pull request #64 from scipp/copierbump Drop python 3.10, bump copier and tox --- packages/essspectroscopy/.copier-answers.yml | 2 +- .../.github/workflows/release.yml | 44 +------------- .../essspectroscopy/.pre-commit-config.yaml | 1 - packages/essspectroscopy/README.md | 2 +- packages/essspectroscopy/conda/meta.yaml | 57 ------------------- packages/essspectroscopy/docs/conf.py | 3 +- .../docs/user-guide/installation.md | 2 +- .../essspectroscopy/requirements/base.txt | 12 ++-- .../essspectroscopy/requirements/basetest.txt | 8 +-- packages/essspectroscopy/requirements/ci.txt | 16 ++---- packages/essspectroscopy/requirements/dev.txt | 18 +++--- .../essspectroscopy/requirements/docs.txt | 22 +++---- .../essspectroscopy/requirements/mypy.txt | 2 +- .../essspectroscopy/requirements/nightly.txt | 22 +++---- .../essspectroscopy/requirements/static.txt | 4 +- .../essspectroscopy/requirements/wheels.txt | 4 +- 16 files changed, 53 insertions(+), 166 deletions(-) delete mode 100644 packages/essspectroscopy/conda/meta.yaml diff --git a/packages/essspectroscopy/.copier-answers.yml b/packages/essspectroscopy/.copier-answers.yml index 4edd26323..939c42603 100644 --- a/packages/essspectroscopy/.copier-answers.yml +++ b/packages/essspectroscopy/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: 3561fcd +_commit: 024a41b _src_path: gh:scipp/copier_template description: 'Spectroscopy data reduction for the European Spallation Source ' max_python: '3.13' diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml index 029505f4c..66b8a9423 100644 --- a/packages/essspectroscopy/.github/workflows/release.yml +++ b/packages/essspectroscopy/.github/workflows/release.yml @@ -10,29 +10,6 @@ defaults: shell: bash -l {0} # required for conda env jobs: - build_conda: - name: Conda build - runs-on: 'ubuntu-24.04' - - steps: - - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 0 # history required so setuptools_scm can determine version - - - uses: mamba-org/setup-micromamba@v1 - with: - environment-name: build-env - create-args: >- - conda-build - boa - - run: conda mambabuild --channel conda-forge --channel scipp --no-anaconda-upload --override-channels --output-folder conda/package conda - - - uses: actions/upload-artifact@v4 - with: - name: conda-package-noarch - path: conda/package/noarch/*.tar.bz2 - build_wheels: name: Wheels runs-on: 'ubuntu-24.04' @@ -60,7 +37,7 @@ jobs: upload_pypi: name: Deploy PyPI - needs: [build_wheels, build_conda] + needs: [build_wheels] runs-on: 'ubuntu-24.04' environment: release permissions: @@ -70,25 +47,8 @@ jobs: - uses: actions/download-artifact@v4 - uses: pypa/gh-action-pypi-publish@v1.12.4 - upload_conda: - name: Deploy Conda - needs: [build_wheels, build_conda] - runs-on: 'ubuntu-24.04' - if: github.event_name == 'release' && github.event.action == 'published' - - steps: - - uses: actions/download-artifact@v4 - - uses: mamba-org/setup-micromamba@v1 - with: - environment-name: upload-env - # frozen python due to breaking removal of 'imp' in 3.12 - create-args: >- - anaconda-client - python=3.11 - - run: anaconda --token ${{ secrets.ANACONDATOKEN }} upload --user scipp --label main $(ls conda-package-noarch/*.tar.bz2) - docs: - needs: [upload_pypi, upload_conda] + needs: [upload_pypi] uses: ./.github/workflows/docs.yml with: publish: ${{ github.event_name == 'release' && github.event.action == 'published' }} diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml index fb2115688..753ce88e1 100644 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ b/packages/essspectroscopy/.pre-commit-config.yaml @@ -10,7 +10,6 @@ repos: - id: check-merge-conflict - id: check-toml - id: check-yaml - exclude: conda/meta.yaml - id: detect-private-key - id: trailing-whitespace args: [ --markdown-linebreak-ext=md ] diff --git a/packages/essspectroscopy/README.md b/packages/essspectroscopy/README.md index e22668035..2ac510a13 100644 --- a/packages/essspectroscopy/README.md +++ b/packages/essspectroscopy/README.md @@ -1,6 +1,6 @@ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) [![PyPI badge](http://img.shields.io/pypi/v/essspectroscopy.svg)](https://pypi.python.org/pypi/essspectroscopy) -[![Anaconda-Server Badge](https://anaconda.org/scipp/essspectroscopy/badges/version.svg)](https://anaconda.org/scipp/essspectroscopy) +[![Anaconda-Server Badge](https://anaconda.org/conda-forge/essspectroscopy/badges/version.svg)](https://anaconda.org/conda-forge/essspectroscopy) [![License: BSD 3-Clause](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](LICENSE) # ESSspectroscopy diff --git a/packages/essspectroscopy/conda/meta.yaml b/packages/essspectroscopy/conda/meta.yaml deleted file mode 100644 index 2bcc87f24..000000000 --- a/packages/essspectroscopy/conda/meta.yaml +++ /dev/null @@ -1,57 +0,0 @@ -package: - name: essspectroscopy - - version: {{ GIT_DESCRIBE_TAG }} - -source: - path: .. - - -{% set pyproject = load_file_data('pyproject.toml') %} -{% set dependencies = pyproject.get('project', {}).get('dependencies', {}) %} -{% set test_dependencies = pyproject.get('project', {}).get('optional-dependencies', {}).get('test', {}) %} - - -requirements: - build: - - setuptools - - setuptools_scm - run: - - python>=3.11 - - {# Conda does not allow spaces between package name and version, so remove them #} - {% for package in dependencies %} - - {% if package == "graphviz" %}python-graphviz{% else %}{{ package|replace(" ", "") }}{% endif %} - {% endfor %} - - -test: - imports: - - ess.spectroscopy - requires: - - {# Conda does not allow spaces between package name and version, so remove them #} - {% for package in test_dependencies %} - - {% if package == "graphviz" %}python-graphviz{% else %}{{ package|replace(" ", "") }}{% endif %} - {% endfor %} - - - source_files: - - pyproject.toml - - tests/ - commands: - # We ignore warnings during release package builds - - python -m pytest -Wignore tests - -build: - noarch: python - script: - - python -m pip install . - -about: - home: https://github.com/scipp/essspectroscopy - license: BSD-3-Clause - summary: Spectroscopy data reduction for the European Spallation Source - description: Spectroscopy data reduction for the European Spallation Source - dev_url: https://github.com/scipp/essspectroscopy - doc_url: https://scipp.github.io/essspectroscopy diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 8d9f607d8..6c7f998a6 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -189,7 +189,7 @@ }, { "name": "Conda", - "url": "https://anaconda.org/scipp/essspectroscopy", + "url": "https://anaconda.org/conda-forge/essspectroscopy", "icon": "fa-custom fa-anaconda", "type": "fontawesome", }, @@ -272,4 +272,5 @@ def do_not_plot(*args, **kwargs): r'https://doi\.org/', # ESS Jira is not publicly accessible. r'https?://jira\.ess\.eu', + r'https?://dx\.doi\.org/', ] diff --git a/packages/essspectroscopy/docs/user-guide/installation.md b/packages/essspectroscopy/docs/user-guide/installation.md index f448732d0..3b03b6cbe 100644 --- a/packages/essspectroscopy/docs/user-guide/installation.md +++ b/packages/essspectroscopy/docs/user-guide/installation.md @@ -10,7 +10,7 @@ pip install essspectroscopy ```` ````{tab-item} conda ```sh -conda install -c conda-forge -c scipp essspectroscopy +conda install -c conda-forge essspectroscopy ``` ```` ````` diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 57446cab0..3cffb406d 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -7,7 +7,7 @@ # annotated-types==0.7.0 # via pydantic -contourpy==1.3.2 +contourpy==1.3.3 # via matplotlib cyclebane==24.10.0 # via sciline @@ -36,15 +36,15 @@ lazy-loader==0.4 # plopp # scippneutron # tof -matplotlib==3.10.3 +matplotlib==3.10.5 # via # mpltoolbox # plopp mpltoolbox==25.5.0 # via scippneutron -networkx==3.4.2 +networkx==3.5 # via cyclebane -numpy==2.2.6 +numpy==2.3.2 # via # contourpy # h5py @@ -61,7 +61,7 @@ pandas==2.3.1 # via -r base.in pillow==11.3.0 # via matplotlib -plopp==25.7.0 +plopp==25.7.1 # via # scippneutron # tof @@ -99,7 +99,7 @@ scippnexus==25.6.0 # -r base.in # essreduce # scippneutron -scipy==1.15.3 +scipy==1.16.1 # via # scippneutron # scippnexus diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 1602ae967..411b708c1 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,12 +5,10 @@ # # requirements upgrade # -certifi==2025.7.14 +certifi==2025.8.3 # via requests charset-normalizer==3.4.2 # via requests -exceptiongroup==1.3.0 - # via pytest idna==3.10 # via requests iniconfig==2.1.0 @@ -31,9 +29,5 @@ pytest==8.4.1 # via -r basetest.in requests==2.32.4 # via pooch -tomli==2.2.1 - # via pytest -typing-extensions==4.14.1 - # via exceptiongroup urllib3==2.5.0 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 629701a65..cf385f77e 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -7,7 +7,7 @@ # cachetools==6.1.0 # via tox -certifi==2025.7.14 +certifi==2025.8.3 # via requests chardet==5.2.0 # via tox @@ -15,7 +15,7 @@ charset-normalizer==3.4.2 # via requests colorama==0.4.6 # via tox -distlib==0.3.9 +distlib==0.4.0 # via virtualenv filelock==3.18.0 # via @@ -23,7 +23,7 @@ filelock==3.18.0 # virtualenv gitdb==4.0.12 # via gitpython -gitpython==3.1.44 +gitpython==3.1.45 # via -r ci.in idna==3.10 # via requests @@ -44,15 +44,9 @@ requests==2.32.4 # via -r ci.in smmap==5.0.2 # via gitdb -tomli==2.2.1 - # via - # pyproject-api - # tox -tox==4.27.0 +tox==4.28.4 # via -r ci.in -typing-extensions==4.14.1 - # via tox urllib3==2.5.0 # via requests -virtualenv==20.31.2 +virtualenv==20.33.1 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index cea74a020..3a743f013 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -12,13 +12,13 @@ -r static.txt -r test.txt -r wheels.txt -anyio==4.9.0 +anyio==4.10.0 # via # httpx # jupyter-server argon2-cffi==25.1.0 # via jupyter-server -argon2-cffi-bindings==21.2.0 +argon2-cffi-bindings==25.1.0 # via argon2-cffi arrow==1.3.0 # via isoduration @@ -30,7 +30,7 @@ click==8.2.1 # via # pip-compile-multi # pip-tools -copier==9.8.0 +copier==9.9.0 # via -r dev.in dunamai==1.25.0 # via copier @@ -52,14 +52,14 @@ json5==0.12.0 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.24.0 +jsonschema[format-nongpl]==4.25.0 # via # jupyter-events # jupyterlab-server # nbformat jupyter-events==0.12.0 # via jupyter-server -jupyter-lsp==2.2.5 +jupyter-lsp==2.2.6 # via jupyterlab jupyter-server==2.16.0 # via @@ -69,17 +69,19 @@ jupyter-server==2.16.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.4.4 +jupyterlab==4.4.5 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab +lark==1.2.2 + # via rfc3987-syntax notebook-shim==0.2.4 # via jupyterlab overrides==7.7.0 # via jupyter-server pip-compile-multi==3.2.1 # via -r dev.in -pip-tools==7.4.1 +pip-tools==7.5.0 # via pip-compile-multi plumbum==1.9.0 # via copier @@ -99,6 +101,8 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events +rfc3987-syntax==1.1.0 + # via jsonschema send2trash==1.8.3 # via jupyter-server sniffio==1.3.1 diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 61ec31189..33ec101d9 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -10,6 +10,8 @@ accessible-pygments==0.0.5 # via pydata-sphinx-theme alabaster==1.0.0 # via sphinx +appnope==0.1.4 + # via ipykernel asttokens==3.0.0 # via stack-data attrs==25.3.0 @@ -28,11 +30,11 @@ beautifulsoup4==4.13.4 # pydata-sphinx-theme bleach[css]==6.2.0 # via nbconvert -certifi==2025.7.14 +certifi==2025.8.3 # via requests charset-normalizer==3.4.2 # via requests -comm==0.2.2 +comm==0.2.3 # via ipykernel debugpy==1.8.15 # via ipykernel @@ -46,20 +48,20 @@ docutils==0.21.2 # nbsphinx # pydata-sphinx-theme # sphinx -exceptiongroup==1.3.0 - # via ipython executing==2.2.0 # via stack-data fastjsonschema==2.21.1 # via nbformat imagesize==1.4.1 # via sphinx -ipykernel==6.29.5 +ipykernel==6.30.1 # via -r docs.in -ipython==8.37.0 +ipython==9.4.0 # via # -r docs.in # ipykernel +ipython-pygments-lexers==1.1.1 + # via ipython jedi==0.19.2 # via ipython jinja2==3.1.6 @@ -68,7 +70,7 @@ jinja2==3.1.6 # nbconvert # nbsphinx # sphinx -jsonschema==4.24.0 +jsonschema==4.25.0 # via nbformat jsonschema-specifications==2025.4.1 # via jsonschema @@ -146,6 +148,7 @@ pygments==2.19.2 # via # accessible-pygments # ipython + # ipython-pygments-lexers # nbconvert # pydata-sphinx-theme # sphinx @@ -153,7 +156,7 @@ python-dotenv==1.1.1 # via pydantic-settings pyyaml==6.0.2 # via myst-parser -pyzmq==27.0.0 +pyzmq==27.0.1 # via # ipykernel # jupyter-client @@ -205,15 +208,12 @@ stack-data==0.6.3 # via ipython tinycss2==1.4.0 # via bleach -tomli==2.2.1 - # via sphinx tornado==6.5.1 # via # ipykernel # jupyter-client traitlets==5.14.3 # via - # comm # ipykernel # ipython # jupyter-client diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 3c79935b4..a2b4de295 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,7 +6,7 @@ # requirements upgrade # -r test.txt -mypy==1.17.0 +mypy==1.17.1 # via -r mypy.in mypy-extensions==1.1.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 0b30c8094..f28ec6924 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -10,11 +10,11 @@ annotated-types==0.7.0 # via pydantic -certifi==2025.7.14 +certifi==2025.8.3 # via requests charset-normalizer==3.4.2 # via requests -contourpy==1.3.2 +contourpy==1.3.3 # via matplotlib cyclebane==24.10.0 # via sciline @@ -26,8 +26,6 @@ email-validator==2.2.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -exceptiongroup==1.3.0 - # via pytest fonttools==4.59.0 # via matplotlib graphviz==0.21 @@ -49,15 +47,15 @@ lazy-loader==0.4 # plopp # scippneutron # tof -matplotlib==3.10.3 +matplotlib==3.10.5 # via # mpltoolbox # plopp mpltoolbox==25.5.0 # via scippneutron -networkx==3.4.2 +networkx==3.5 # via cyclebane -numpy==2.2.6 +numpy==2.3.2 # via # contourpy # h5py @@ -87,9 +85,9 @@ pluggy==1.6.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.11.7 +pydantic==2.12.0a1 # via scippneutron -pydantic-core==2.33.2 +pydantic-core==2.37.2 # via pydantic pygments==2.19.2 # via pytest @@ -102,7 +100,6 @@ python-dateutil==2.9.0.post0 # matplotlib # pandas # scippneutron - # scippnexus pytz==2025.2 # via pandas requests==2.32.4 @@ -127,7 +124,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.15.3 +scipy==1.16.1 # via # scippneutron # scippnexus @@ -136,11 +133,8 @@ six==1.17.0 # via python-dateutil tof==25.5.0 # via -r nightly.in -tomli==2.2.1 - # via pytest typing-extensions==4.14.1 # via - # exceptiongroup # pydantic # pydantic-core # sciline diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 7dbd6032c..3e288557c 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -7,7 +7,7 @@ # cfgv==3.4.0 # via pre-commit -distlib==0.3.9 +distlib==0.4.0 # via virtualenv filelock==3.18.0 # via virtualenv @@ -21,5 +21,5 @@ pre-commit==4.2.0 # via -r static.in pyyaml==6.0.2 # via pre-commit -virtualenv==20.31.2 +virtualenv==20.33.1 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 651191e54..3558aae2e 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -5,11 +5,9 @@ # # requirements upgrade # -build==1.2.2.post1 +build==1.3.0 # via -r wheels.in packaging==25.0 # via build pyproject-hooks==1.2.0 # via build -tomli==2.2.1 - # via build From 9d01bf439c06873fcb07ee66f2a12b9858674085 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Wed, 9 Jul 2025 09:12:56 +0200 Subject: [PATCH 174/330] [Ref] detector merge, angle split order If a detector has no intensity within a measurement period the current `group_by_rotation` implementation 'misses' the null observation. This will cause normalizaiton issues later if not correctly accounted for, but immediately prevents `merge_triplets` from succeeding in the case of different 'misses' per detector. This PR reorders the calls to `merge_triplet` and `group_by_rotation`. The possibility of 'missing' an observation remains, but would require _all_ detectors to record no events. --- packages/essspectroscopy/src/ess/bifrost/workflow.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index f85bf095b..977fff104 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -14,7 +14,7 @@ from ess.spectroscopy.indirect.normalization import providers as normalisation_providers from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( - DataGroupedByRotation, + DetectorData, FrameMonitor0, FrameMonitor1, FrameMonitor2, @@ -78,8 +78,8 @@ def BifrostSimulationWorkflow( for key, val in simulation_default_parameters().items(): workflow[key] = val - workflow[DataGroupedByRotation[SampleRun]] = ( - workflow[DataGroupedByRotation[SampleRun]] + workflow[DetectorData[SampleRun]] = ( + workflow[DetectorData[SampleRun]] .map(_make_detector_name_mapping(detector_names)) .reduce(func=merge_triplets) ) From 55798e103acb52938a3b80ab1d96640f212de58d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:29:21 +0000 Subject: [PATCH 175/330] Bump scipp from 25.5.1 to 25.8.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 25.5.1 to 25.8.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/25.05.1...25.08.0) --- updated-dependencies: - dependency-name: scipp dependency-version: 25.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 3cffb406d..f405955ed 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -83,7 +83,7 @@ sciline==25.5.2 # via # -r base.in # essreduce -scipp==25.5.1 +scipp==25.8.0 # via # -r base.in # essreduce From f957658159e25350e021a38f970d09e68c88d881 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 8 Sep 2025 11:49:51 +0200 Subject: [PATCH 176/330] Support scalar angles in group_by_rotation --- .../essspectroscopy/src/ess/bifrost/cutting.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/cutting.py b/packages/essspectroscopy/src/ess/bifrost/cutting.py index 458e93cf3..9041d493d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/cutting.py +++ b/packages/essspectroscopy/src/ess/bifrost/cutting.py @@ -3,6 +3,8 @@ """Cutting BIFROST data.""" +from collections.abc import Callable + import scipp as sc from ess.spectroscopy.types import ( @@ -24,21 +26,27 @@ def group_by_rotation( data: Detector events with time coordinates. angles: - Data group with time-dependent entries "a3" and "a4". + Data group with entries "a3" and "a4". + Each entry may be time-dependent (1d array with dim "time") or scalar. Returns ------- : ``data`` grouped by rotation angles "a3" and "a4". """ - a3 = sc.lookup(angles['a3'], 'time') - a4 = sc.lookup(angles['a4'], 'time') graph = { - 'a3': lambda event_time_zero: a3[event_time_zero], - 'a4': lambda event_time_zero: a4[event_time_zero], + name: _make_angle_from_time_calculator(angle) for name, angle in angles.items() } grouped = data.transform_coords(('a3', 'a4'), graph=graph).group('a3', 'a4') return DataGroupedByRotation[RunType](grouped) +def _make_angle_from_time_calculator(angle: sc.DataArray) -> Callable[..., sc.Variable]: + if angle.ndim == 0: + return lambda: angle.data + else: + lut = sc.lookup(angle, 'time') + return lambda event_time_zero: lut[event_time_zero] + + providers = (group_by_rotation,) From f5a6af6eae119e53789b344ba07906229beb6ad8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 8 Sep 2025 16:32:00 +0200 Subject: [PATCH 177/330] Test StreamProcessor --- .../src/ess/bifrost/__init__.py | 4 +- .../src/ess/bifrost/workflow.py | 57 +++++ packages/essspectroscopy/streaming.ipynb | 234 ++++++++++++++++++ 3 files changed, 293 insertions(+), 2 deletions(-) create mode 100644 packages/essspectroscopy/streaming.ipynb diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py index ca6fd7344..01feac9f7 100644 --- a/packages/essspectroscopy/src/ess/bifrost/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -8,7 +8,7 @@ from .detector import providers from .io import nexus -from .workflow import BifrostSimulationWorkflow +from .workflow import BifrostSimulationWorkflow, BifrostWorkflow try: __version__ = importlib.metadata.version("essspectroscopy") @@ -17,4 +17,4 @@ del importlib -__all__ = ['BifrostSimulationWorkflow', 'nexus', 'providers'] +__all__ = ['BifrostSimulationWorkflow', 'BifrostWorkflow', 'nexus', 'providers'] diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 977fff104..a3af4a506 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -7,6 +7,7 @@ import sciline import scipp as sc +from scippnexus import NXdetector from ess.spectroscopy.indirect.conversion import providers as conversion_providers from ess.spectroscopy.indirect.kf import providers as kf_providers @@ -14,11 +15,13 @@ from ess.spectroscopy.indirect.normalization import providers as normalisation_providers from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( + BeamlineWithSpectrometerCoords, DetectorData, FrameMonitor0, FrameMonitor1, FrameMonitor2, FrameMonitor3, + NeXusData, NeXusDetectorName, NeXusMonitorName, PulsePeriod, @@ -87,6 +90,60 @@ def BifrostSimulationWorkflow( return workflow +def BifrostWorkflow( + detector_names: list[NeXusDetectorName], +) -> sciline.Pipeline: + """Data reduction workflow for BIFROST.""" + workflow = TofWorkflow( + run_types=(SampleRun,), + monitor_types=(FrameMonitor0, FrameMonitor1, FrameMonitor2, FrameMonitor3), + ) + # TODO change to use non-simulation providers + for provider in _SIMULATION_PROVIDERS: + workflow.insert(provider) + # TODO change to use non-simulation parameters + for key, val in simulation_default_parameters().items(): + workflow[key] = val + + workflow[BeamlineWithSpectrometerCoords[SampleRun]] = ( + workflow[BeamlineWithSpectrometerCoords[SampleRun]] + .map(_make_detector_name_mapping(detector_names)) + .reduce(func=merge_triplets) + ) + + workflow[NeXusData[NXdetector, SampleRun]] = ( + workflow[NeXusData[NXdetector, SampleRun]] + .map(_make_detector_name_mapping(detector_names)) + .reduce(func=concat_event_lists) + ) + + return workflow + + +# TODO remove or move +def concat_event_lists( + *data: sc.DataArray, +) -> sc.DataArray: + """Concatenate binned event lists into a single data array in 'event_time_zero'. + + Note that the output will likely have repeated values for 'event_time_zero'. + E.g., if input 1 has times `[0, 1, 2]` and input 2 has times `[0, 2, 3]`, + the output will have times `[0, 1, 2, 0, 2, 3]`. + + Parameters + ---------- + data: + Data arrays to concatenate. + Must be binned in 'event_time_zero'. + + Returns + ------- + : + Concatenated data array. + """ + return sc.concat(data, dim="event_time_zero") + + def _make_detector_name_mapping(detector_names: list[NeXusDetectorName]) -> Any: # Use Pandas if possible to label the index. try: diff --git a/packages/essspectroscopy/streaming.ipynb b/packages/essspectroscopy/streaming.ipynb new file mode 100644 index 000000000..7fe512504 --- /dev/null +++ b/packages/essspectroscopy/streaming.ipynb @@ -0,0 +1,234 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import NewType\n", + "\n", + "import scipp as sc\n", + "import sciline\n", + "from ess import bifrost\n", + "from ess.bifrost.data import (\n", + " simulated_elastic_incoherent_with_phonon,\n", + " tof_lookup_table_simulation\n", + ")\n", + "from ess.spectroscopy.types import *\n", + "import scippnexus as snx\n", + "from ess.reduce.streaming import StreamProcessor,Accumulator,EternalAccumulator" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "CutAxis1 = NewType('CutAxis1', sc.Variable)\n", + "CutAxis2 = NewType('CutAxis2', sc.Variable)\n", + "CutBins1 = NewType('CutBins1', sc.Variable)\n", + "CutBins2 = NewType('CutBins2', sc.Variable)\n", + "\n", + "class CutData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ...\n", + "\n", + "def cut(data: EnergyData[RunType], *, axis_1: CutAxis1, axis_2: CutAxis2, bins_1: CutBins1, bins_2: CutBins2) -> CutData[RunType]:\n", + " flat = data.bins.concat()\n", + " q = flat.bins.coords['sample_table_momentum_transfer']\n", + " return CutData[RunType](flat.bins.assign_coords({\"Q1\":sc.dot(axis_1, q), \"Q2\":sc.dot(axis_2, q)}).hist(Q2=bins_2, Q1=bins_1))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "fname = simulated_elastic_incoherent_with_phonon()\n", + "with snx.File(fname) as f:\n", + " detector_names = list(f['entry/instrument'][snx.NXdetector])\n", + "detector_names = detector_names[:2]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "workflow = bifrost.BifrostWorkflow(detector_names)\n", + "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", + "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", + "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", + "\n", + "workflow.insert(cut)\n", + "workflow[CutAxis1] = sc.vector([1, 0, 0])\n", + "workflow[CutAxis2] = sc.vector([0, 0, 1])\n", + "workflow[CutBins1] = sc.linspace('Q1', -1.25, 1.25, 200, unit='1/Ã…')\n", + "workflow[CutBins2] = sc.linspace('Q2', -1.25, 1.25, 200, unit='1/Ã…')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "workflow.visualize(CutData[SampleRun], graph_attr={\"rankdir\": \"LR\"}, compact=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "scheduler = sciline.scheduler.NaiveScheduler()\n", + "results = workflow.compute([NeXusData[snx.NXdetector, SampleRun], InstrumentAngles[SampleRun]],\n", + " scheduler=scheduler)\n", + "base_data = results[NeXusData[snx.NXdetector, SampleRun]]\n", + "angles = results[InstrumentAngles[SampleRun]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "# This is similar to `group_by_rotation` but preserves the event_time_zero coord and dim.\n", + "# The elements of `angle_groups` look like NeXusData.\n", + "# For simplicity, it assumes that there is only one a4 value.\n", + "a3 = sc.lookup(angles['a3'], 'time')\n", + "a4 = sc.lookup(angles['a4'], 'time')\n", + "graph = {\n", + " 'a3': lambda event_time_zero: a3[event_time_zero],\n", + " 'a4': lambda event_time_zero: a4[event_time_zero],\n", + "}\n", + "d = base_data.bins.assign_coords({'event_time_zero': sc.bins_like(base_data.data, base_data.coords['event_time_zero'])})\n", + "grouped = d.transform_coords(('a3', 'a4'), graph=graph).group('a3', 'a4')\n", + "angle_groups = [grouped['a3', a3]['a4', 0].group('event_time_zero') for a3 in grouped.coords['a3']]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "from copy import deepcopy\n", + "\n", + "\n", + "class BinAccumulator(Accumulator[sc.DataArray]):\n", + " def __init__(self, **kwargs: Any) -> None:\n", + " super().__init__(preprocess=None, **kwargs)\n", + " self._value = None\n", + "\n", + " @property\n", + " def is_empty(self) -> bool:\n", + " return self._value is None\n", + "\n", + " def _get_value(self):\n", + " return deepcopy(self._value)\n", + "\n", + " def _do_push(self, value) -> None:\n", + " if self._value is None:\n", + " self._value = deepcopy(value)\n", + " else:\n", + " self._value.bins.concatenate(value, out=self._value)\n", + "\n", + " def clear(self) -> None:\n", + " \"\"\"Clear the accumulated value.\"\"\"\n", + " self._value = None\n", + "\n", + "\n", + "sp = StreamProcessor(\n", + " workflow,\n", + " dynamic_keys=(NeXusData[snx.NXdetector, SampleRun],),\n", + " context_keys=(InstrumentAngles[SampleRun],),\n", + " target_keys=(CutData[SampleRun],),\n", + " accumulators={\n", + " # DataGroupedByRotation[SampleRun]: BinAccumulator(),\n", + " CutData[SampleRun]: EternalAccumulator(),\n", + " },\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "for group in angle_groups:\n", + " angles = sc.DataGroup(a3=sc.DataArray(group.coords['a3']), a4=sc.DataArray(group.coords['a4']))\n", + " events = group.drop_coords(['a3', 'a4']) # NeXusData does not have these coords\n", + "\n", + " sp.set_context({InstrumentAngles[SampleRun]: angles})\n", + " sp.accumulate({NeXusData[snx.NXdetector, SampleRun]: events})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "results = sp.finalize()\n", + "data = results[CutData[SampleRun]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "data.plot(norm='log')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From da5de9919817d717337d4fec9de6b3f875564e29 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 9 Sep 2025 15:06:15 +0200 Subject: [PATCH 178/330] More flexible cut param --- packages/essspectroscopy/streaming.ipynb | 122 ++++++++++++++++++----- 1 file changed, 97 insertions(+), 25 deletions(-) diff --git a/packages/essspectroscopy/streaming.ipynb b/packages/essspectroscopy/streaming.ipynb index 7fe512504..5e6e53905 100644 --- a/packages/essspectroscopy/streaming.ipynb +++ b/packages/essspectroscopy/streaming.ipynb @@ -8,9 +8,13 @@ "outputs": [], "source": [ "from typing import NewType\n", + "from dataclasses import dataclass\n", + "from collections.abc import Callable\n", "\n", "import scipp as sc\n", "import sciline\n", + "import matplotlib.pyplot as plt\n", + "import time\n", "from ess import bifrost\n", "from ess.bifrost.data import (\n", " simulated_elastic_incoherent_with_phonon,\n", @@ -28,23 +32,47 @@ "metadata": {}, "outputs": [], "source": [ - "CutAxis1 = NewType('CutAxis1', sc.Variable)\n", - "CutAxis2 = NewType('CutAxis2', sc.Variable)\n", - "CutBins1 = NewType('CutBins1', sc.Variable)\n", - "CutBins2 = NewType('CutBins2', sc.Variable)\n", + "%matplotlib widget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "@dataclass(frozen=True, kw_only=True, slots=True)\n", + "class CutAxis:\n", + " output: str\n", + " fn: Callable[[...], sc.Variable]\n", + " bins: sc.Variable\n", + "\n", + " @classmethod\n", + " def from_q_vector(cls, output: str, vec: sc.Variable, bins: sc.Variable):\n", + " vec = vec / sc.norm(vec)\n", + " return cls(\n", + " output=output,\n", + " fn=lambda sample_table_momentum_transfer: sc.dot(vec, sample_table_momentum_transfer),\n", + " bins=bins\n", + " )\n", + "\n", + "CutAxis1 = NewType('CutAxis1', CutAxis)\n", + "CutAxis2 = NewType('CutAxis2', CutAxis)\n", "\n", "class CutData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ...\n", "\n", - "def cut(data: EnergyData[RunType], *, axis_1: CutAxis1, axis_2: CutAxis2, bins_1: CutBins1, bins_2: CutBins2) -> CutData[RunType]:\n", - " flat = data.bins.concat()\n", - " q = flat.bins.coords['sample_table_momentum_transfer']\n", - " return CutData[RunType](flat.bins.assign_coords({\"Q1\":sc.dot(axis_1, q), \"Q2\":sc.dot(axis_2, q)}).hist(Q2=bins_2, Q1=bins_1))" + "def cut(data: EnergyData[RunType], *, axis_1: CutAxis1, axis_2: CutAxis2) -> CutData[RunType]:\n", + " new_coords = {axis_1.output, axis_2.output}\n", + " projected = data.bins.concat().transform_coords(new_coords, graph={axis_1.output: axis_1.fn, axis_2.output: axis_2.fn},keep_inputs=False)\n", + " projected = projected.drop_coords(list(set(projected.coords.keys()) - new_coords))\n", + " return CutData[RunType](projected.hist({axis_2.output: axis_2.bins, axis_1.output: axis_1.bins}))" ] }, { "cell_type": "code", "execution_count": null, - "id": "2", + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +85,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3", + "id": "4", "metadata": {}, "outputs": [], "source": [ @@ -67,16 +95,34 @@ "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", "\n", "workflow.insert(cut)\n", - "workflow[CutAxis1] = sc.vector([1, 0, 0])\n", - "workflow[CutAxis2] = sc.vector([0, 0, 1])\n", - "workflow[CutBins1] = sc.linspace('Q1', -1.25, 1.25, 200, unit='1/Ã…')\n", - "workflow[CutBins2] = sc.linspace('Q2', -1.25, 1.25, 200, unit='1/Ã…')" + "\n", + "# workflow[CutAxis1] = CutAxis.from_q_vector(\n", + "# output=\"Qx\",\n", + "# vec=sc.vector([1, 0, 0]),\n", + "# bins=sc.linspace('Qx', -3.0, 3.0, 300, unit='1/Ã…')\n", + "# )\n", + "# workflow[CutAxis2] = CutAxis.from_q_vector(\n", + "# output=\"Qz\",\n", + "# vec=sc.vector([0, 0, 1]),\n", + "# bins=sc.linspace('Qz', -3.0, 3.0, 300, unit='1/Ã…')\n", + "# )\n", + "\n", + "workflow[CutAxis1] = CutAxis(\n", + " output=\"|Q|\",\n", + " fn=lambda sample_table_momentum_transfer: sc.norm(sample_table_momentum_transfer),\n", + " bins=sc.linspace('|Q|', 0.9, 3.0, 300, unit='1/Ã…')\n", + ")\n", + "workflow[CutAxis2] = CutAxis(\n", + " output=\"E\",\n", + " fn=lambda energy_transfer: energy_transfer,\n", + " bins=sc.linspace('E', -0.1, 0.1, 300, unit='meV')\n", + ")" ] }, { "cell_type": "code", "execution_count": null, - "id": "4", + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -86,7 +132,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5", + "id": "6", "metadata": {}, "outputs": [], "source": [ @@ -100,7 +146,17 @@ { "cell_type": "code", "execution_count": null, - "id": "6", + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "angles['a3']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +177,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7", + "id": "9", "metadata": {}, "outputs": [], "source": [ @@ -166,22 +222,38 @@ { "cell_type": "code", "execution_count": null, - "id": "8", + "id": "10", "metadata": {}, "outputs": [], "source": [ + "times = []\n", "for group in angle_groups:\n", - " angles = sc.DataGroup(a3=sc.DataArray(group.coords['a3']), a4=sc.DataArray(group.coords['a4']))\n", + " step_angles = sc.DataGroup(a3=sc.DataArray(group.coords['a3']), a4=sc.DataArray(group.coords['a4']))\n", " events = group.drop_coords(['a3', 'a4']) # NeXusData does not have these coords\n", "\n", - " sp.set_context({InstrumentAngles[SampleRun]: angles})\n", - " sp.accumulate({NeXusData[snx.NXdetector, SampleRun]: events})" + " start = time.time()\n", + " sp.set_context({InstrumentAngles[SampleRun]: step_angles})\n", + " sp.accumulate({NeXusData[snx.NXdetector, SampleRun]: events})\n", + " end = time.time()\n", + " times.append(end-start)\n", + "\n", + "print(f\"Sum: {sum(times):.3f}s Mean: {sum(times)/len(times):.3f}s [{min(times):.3f}s, {max(times):.3f}s]\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "9", + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(times)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", "metadata": {}, "outputs": [], "source": [ @@ -192,7 +264,7 @@ { "cell_type": "code", "execution_count": null, - "id": "10", + "id": "13", "metadata": {}, "outputs": [], "source": [ @@ -202,7 +274,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11", + "id": "14", "metadata": {}, "outputs": [], "source": [ From 71e3a34cd90dad7276843403b70244186c3eeb7f Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 17 Sep 2025 10:40:39 +0200 Subject: [PATCH 179/330] Define live workflow in new live module --- .../essspectroscopy/src/ess/bifrost/live.py | 95 ++++++++++++++++ packages/essspectroscopy/streaming.ipynb | 107 +++--------------- 2 files changed, 111 insertions(+), 91 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/bifrost/live.py diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py new file mode 100644 index 000000000..46412f4bc --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Live data reduction workflows for BIFROST.""" + +from collections.abc import Callable +from dataclasses import dataclass +from typing import NewType + +import sciline +import scipp as sc +import scippnexus as snx + +from ess.reduce.streaming import EternalAccumulator, StreamProcessor +from ess.spectroscopy.types import ( + EnergyData, + InstrumentAngles, + NeXusData, + NeXusDetectorName, + RunType, + SampleRun, +) + +from .workflow import BifrostWorkflow + + +@dataclass(frozen=True, kw_only=True, slots=True) +class CutAxis: + """Axis and binds for cutting 4D Q-E data.""" + + output: str + """Name of the output coordinate.""" + fn: Callable[[...], sc.Variable] + """Function to perform the cut. + + Used in :func:`scipp.transform_coords` and so should request input coordinates + by name. + """ + bins: sc.Variable + """Bin edges for the cut.""" + + @classmethod + def from_q_vector(cls, output: str, vec: sc.Variable, bins: sc.Variable): + """Construct from an arbitrary direction in Q.""" + vec = vec / sc.norm(vec) + return cls( + output=output, + fn=lambda sample_table_momentum_transfer: sc.dot( + vec, sample_table_momentum_transfer + ), + bins=bins, + ) + + +CutAxis1 = NewType('CutAxis1', CutAxis) +CutAxis2 = NewType('CutAxis2', CutAxis) + + +class CutData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Data that was cut along CutAxis1 and CutAxis2.""" + + +def cut( + data: EnergyData[RunType], *, axis_1: CutAxis1, axis_2: CutAxis2 +) -> CutData[RunType]: + """Cut data along two axes.""" + new_coords = {axis_1.output, axis_2.output} + projected = data.bins.concat().transform_coords( + new_coords, + graph={axis_1.output: axis_1.fn, axis_2.output: axis_2.fn}, + keep_inputs=False, + ) + projected = projected.drop_coords(list(set(projected.coords.keys()) - new_coords)) + return CutData[RunType]( + projected.hist({axis_2.output: axis_2.bins, axis_1.output: axis_1.bins}) + ) + + +def BIFROSTQCutWorkflow(detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: + """Workflow for BIFROST to compute cuts in Q-E-space.""" + workflow = BifrostWorkflow(detector_names) + workflow.insert(cut) + return workflow + + +def BIFROSTQCutStreamProcessor(workflow: sciline.Pipeline) -> StreamProcessor: + return StreamProcessor( + workflow, + dynamic_keys=(NeXusData[snx.NXdetector, SampleRun],), + context_keys=(InstrumentAngles[SampleRun],), + target_keys=(CutData[SampleRun],), + accumulators={ + CutData[SampleRun]: EternalAccumulator(), + }, + ) diff --git a/packages/essspectroscopy/streaming.ipynb b/packages/essspectroscopy/streaming.ipynb index 5e6e53905..6178f5545 100644 --- a/packages/essspectroscopy/streaming.ipynb +++ b/packages/essspectroscopy/streaming.ipynb @@ -7,10 +7,6 @@ "metadata": {}, "outputs": [], "source": [ - "from typing import NewType\n", - "from dataclasses import dataclass\n", - "from collections.abc import Callable\n", - "\n", "import scipp as sc\n", "import sciline\n", "import matplotlib.pyplot as plt\n", @@ -22,7 +18,7 @@ ")\n", "from ess.spectroscopy.types import *\n", "import scippnexus as snx\n", - "from ess.reduce.streaming import StreamProcessor,Accumulator,EternalAccumulator" + "from ess.bifrost.live import BIFROSTQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData, BIFROSTQCutStreamProcessor" ] }, { @@ -41,40 +37,6 @@ "id": "2", "metadata": {}, "outputs": [], - "source": [ - "@dataclass(frozen=True, kw_only=True, slots=True)\n", - "class CutAxis:\n", - " output: str\n", - " fn: Callable[[...], sc.Variable]\n", - " bins: sc.Variable\n", - "\n", - " @classmethod\n", - " def from_q_vector(cls, output: str, vec: sc.Variable, bins: sc.Variable):\n", - " vec = vec / sc.norm(vec)\n", - " return cls(\n", - " output=output,\n", - " fn=lambda sample_table_momentum_transfer: sc.dot(vec, sample_table_momentum_transfer),\n", - " bins=bins\n", - " )\n", - "\n", - "CutAxis1 = NewType('CutAxis1', CutAxis)\n", - "CutAxis2 = NewType('CutAxis2', CutAxis)\n", - "\n", - "class CutData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ...\n", - "\n", - "def cut(data: EnergyData[RunType], *, axis_1: CutAxis1, axis_2: CutAxis2) -> CutData[RunType]:\n", - " new_coords = {axis_1.output, axis_2.output}\n", - " projected = data.bins.concat().transform_coords(new_coords, graph={axis_1.output: axis_1.fn, axis_2.output: axis_2.fn},keep_inputs=False)\n", - " projected = projected.drop_coords(list(set(projected.coords.keys()) - new_coords))\n", - " return CutData[RunType](projected.hist({axis_2.output: axis_2.bins, axis_1.output: axis_1.bins}))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], "source": [ "fname = simulated_elastic_incoherent_with_phonon()\n", "with snx.File(fname) as f:\n", @@ -85,17 +47,15 @@ { "cell_type": "code", "execution_count": null, - "id": "4", + "id": "3", "metadata": {}, "outputs": [], "source": [ - "workflow = bifrost.BifrostWorkflow(detector_names)\n", + "workflow = BIFROSTQCutWorkflow(detector_names)\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", "\n", - "workflow.insert(cut)\n", - "\n", "# workflow[CutAxis1] = CutAxis.from_q_vector(\n", "# output=\"Qx\",\n", "# vec=sc.vector([1, 0, 0]),\n", @@ -122,7 +82,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5", + "id": "4", "metadata": {}, "outputs": [], "source": [ @@ -132,7 +92,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6", + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -146,7 +106,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7", + "id": "6", "metadata": {}, "outputs": [], "source": [ @@ -156,7 +116,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8", + "id": "7", "metadata": {}, "outputs": [], "source": [ @@ -177,52 +137,17 @@ { "cell_type": "code", "execution_count": null, - "id": "9", + "id": "8", "metadata": {}, "outputs": [], "source": [ - "from copy import deepcopy\n", - "\n", - "\n", - "class BinAccumulator(Accumulator[sc.DataArray]):\n", - " def __init__(self, **kwargs: Any) -> None:\n", - " super().__init__(preprocess=None, **kwargs)\n", - " self._value = None\n", - "\n", - " @property\n", - " def is_empty(self) -> bool:\n", - " return self._value is None\n", - "\n", - " def _get_value(self):\n", - " return deepcopy(self._value)\n", - "\n", - " def _do_push(self, value) -> None:\n", - " if self._value is None:\n", - " self._value = deepcopy(value)\n", - " else:\n", - " self._value.bins.concatenate(value, out=self._value)\n", - "\n", - " def clear(self) -> None:\n", - " \"\"\"Clear the accumulated value.\"\"\"\n", - " self._value = None\n", - "\n", - "\n", - "sp = StreamProcessor(\n", - " workflow,\n", - " dynamic_keys=(NeXusData[snx.NXdetector, SampleRun],),\n", - " context_keys=(InstrumentAngles[SampleRun],),\n", - " target_keys=(CutData[SampleRun],),\n", - " accumulators={\n", - " # DataGroupedByRotation[SampleRun]: BinAccumulator(),\n", - " CutData[SampleRun]: EternalAccumulator(),\n", - " },\n", - ")" + "sp = BIFROSTQCutStreamProcessor(workflow)" ] }, { "cell_type": "code", "execution_count": null, - "id": "10", + "id": "9", "metadata": {}, "outputs": [], "source": [ @@ -235,15 +160,15 @@ " sp.set_context({InstrumentAngles[SampleRun]: step_angles})\n", " sp.accumulate({NeXusData[snx.NXdetector, SampleRun]: events})\n", " end = time.time()\n", - " times.append(end-start)\n", + " times.append(end - start)\n", "\n", - "print(f\"Sum: {sum(times):.3f}s Mean: {sum(times)/len(times):.3f}s [{min(times):.3f}s, {max(times):.3f}s]\")" + "print(f\"Sum: {sum(times):.3f}s Mean: {sum(times) / len(times):.3f}s [{min(times):.3f}s, {max(times):.3f}s]\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "11", + "id": "10", "metadata": {}, "outputs": [], "source": [ @@ -253,7 +178,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12", + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -264,7 +189,7 @@ { "cell_type": "code", "execution_count": null, - "id": "13", + "id": "12", "metadata": {}, "outputs": [], "source": [ @@ -274,7 +199,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14", + "id": "13", "metadata": {}, "outputs": [], "source": [ From a458133b89068fda23bc9949b5209483f9aaac24 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 17 Sep 2025 14:19:14 +0200 Subject: [PATCH 180/330] Explain data pattern more Co-authored-by: Simon Heybrock <12912489+SimonHeybrock@users.noreply.github.com> --- packages/essspectroscopy/src/ess/bifrost/workflow.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index a3af4a506..04538e0bd 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -129,6 +129,8 @@ def concat_event_lists( Note that the output will likely have repeated values for 'event_time_zero'. E.g., if input 1 has times `[0, 1, 2]` and input 2 has times `[0, 2, 3]`, the output will have times `[0, 1, 2, 0, 2, 3]`. + Note that this sawtooth pattern will disappear again after grouping into pixels. + Preserving it will likely actually lead to more efficient memory access patterns when grouping. Parameters ---------- From af4721040c766f02690497e8d15a3a55dfe367cf Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 17 Sep 2025 14:20:19 +0200 Subject: [PATCH 181/330] Simplify accumulator definition Co-authored-by: Simon Heybrock <12912489+SimonHeybrock@users.noreply.github.com> --- packages/essspectroscopy/src/ess/bifrost/live.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index 46412f4bc..6fd0d2727 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -89,7 +89,5 @@ def BIFROSTQCutStreamProcessor(workflow: sciline.Pipeline) -> StreamProcessor: dynamic_keys=(NeXusData[snx.NXdetector, SampleRun],), context_keys=(InstrumentAngles[SampleRun],), target_keys=(CutData[SampleRun],), - accumulators={ - CutData[SampleRun]: EternalAccumulator(), - }, + accumulators=(CutData[SampleRun],), ) From 04d6a65ba9871f0f1f1f998d39cf984884b76373 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 17 Sep 2025 14:20:42 +0200 Subject: [PATCH 182/330] Fix name to avoid all uppercase Co-authored-by: Simon Heybrock <12912489+SimonHeybrock@users.noreply.github.com> --- packages/essspectroscopy/src/ess/bifrost/live.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index 6fd0d2727..c47c1f180 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -76,7 +76,7 @@ def cut( ) -def BIFROSTQCutWorkflow(detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: +def BifrostQCutWorkflow(detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: """Workflow for BIFROST to compute cuts in Q-E-space.""" workflow = BifrostWorkflow(detector_names) workflow.insert(cut) From f8598d3f982a9bca79574aa0c0eedebb4a229037 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 17 Sep 2025 14:37:25 +0200 Subject: [PATCH 183/330] Split InstrumentAngles This should make it easier to pass each angle into the streaming workflfow. --- .../src/ess/bifrost/cutting.py | 18 ++++++++---- .../src/ess/bifrost/io/nexus.py | 28 +++++++++++++------ .../essspectroscopy/src/ess/bifrost/live.py | 7 +++-- .../src/ess/spectroscopy/types.py | 16 ++++++++--- packages/essspectroscopy/streaming.ipynb | 21 +++++++------- 5 files changed, 58 insertions(+), 32 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/cutting.py b/packages/essspectroscopy/src/ess/bifrost/cutting.py index 9041d493d..d924d4452 100644 --- a/packages/essspectroscopy/src/ess/bifrost/cutting.py +++ b/packages/essspectroscopy/src/ess/bifrost/cutting.py @@ -10,14 +10,16 @@ from ess.spectroscopy.types import ( DataGroupedByRotation, DetectorData, - InstrumentAngles, + InstrumentAngle, RunType, + SampleAngle, ) def group_by_rotation( data: DetectorData[RunType], - angles: InstrumentAngles[RunType], + sample_angle: SampleAngle[RunType], + instrument_angle: InstrumentAngle[RunType], ) -> DataGroupedByRotation[RunType]: """Group data by rotation angles. @@ -25,9 +27,12 @@ def group_by_rotation( ---------- data: Detector events with time coordinates. - angles: - Data group with entries "a3" and "a4". - Each entry may be time-dependent (1d array with dim "time") or scalar. + sample_angle: + Sample rotation angle "a3". + May be time-dependent (1d array with dim "time") or scalar. + instrument_angle: + Instrument rotation angle "a4". + May be time-dependent (1d array with dim "time") or scalar. Returns ------- @@ -35,7 +40,8 @@ def group_by_rotation( ``data`` grouped by rotation angles "a3" and "a4". """ graph = { - name: _make_angle_from_time_calculator(angle) for name, angle in angles.items() + 'a3': _make_angle_from_time_calculator(sample_angle), + 'a4': _make_angle_from_time_calculator(instrument_angle), } grouped = data.transform_coords(('a3', 'a4'), graph=graph).group('a3', 'a4') return DataGroupedByRotation[RunType](grouped) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index ff6a925c9..1d34661d7 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -10,12 +10,13 @@ from ess.spectroscopy.types import ( Analyzer, - InstrumentAngles, + InstrumentAngle, NeXusClass, NeXusComponentLocationSpec, NeXusDetectorName, NeXusFileSpec, RunType, + SampleAngle, ) @@ -25,9 +26,21 @@ def moderator_class_for_source() -> NeXusClass[snx.NXsource]: return NeXusClass[snx.NXsource](snx.NXmoderator) -def load_instrument_angles( +def load_sample_angle( file_spec: NeXusFileSpec[RunType], -) -> InstrumentAngles[RunType]: +) -> SampleAngle[RunType]: + return SampleAngle[RunType](_load_experiment_parameter(file_spec, "a3")) + + +def load_instrument_angle( + file_spec: NeXusFileSpec[RunType], +) -> InstrumentAngle[RunType]: + return InstrumentAngle[RunType](_load_experiment_parameter(file_spec, "a4")) + + +def _load_experiment_parameter( + file_spec: NeXusFileSpec[RunType], param_name: str +) -> sc.DataArray: # TODO need mechanism in ESSreduce to load specific components of non-unique # class by name from ess.reduce.nexus._nexus_loader import _unique_child_group, open_nexus_file @@ -38,11 +51,7 @@ def load_instrument_angles( snx.NXparameters, name=None, ) - return InstrumentAngles[RunType]( - sc.DataGroup[sc.DataArray]( - {name: parameters[name][()]['value'] for name in ('a3', 'a4')} - ) - ) + return parameters[param_name][()]['value'] def _analyzer_name_for_detector_name( @@ -99,6 +108,7 @@ def load_analyzer_for_detector( providers = ( load_analyzer_for_detector, - load_instrument_angles, + load_instrument_angle, + load_sample_angle, moderator_class_for_source, ) diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index c47c1f180..7f58ea20c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -11,13 +11,14 @@ import scipp as sc import scippnexus as snx -from ess.reduce.streaming import EternalAccumulator, StreamProcessor +from ess.reduce.streaming import StreamProcessor from ess.spectroscopy.types import ( EnergyData, - InstrumentAngles, + InstrumentAngle, NeXusData, NeXusDetectorName, RunType, + SampleAngle, SampleRun, ) @@ -87,7 +88,7 @@ def BIFROSTQCutStreamProcessor(workflow: sciline.Pipeline) -> StreamProcessor: return StreamProcessor( workflow, dynamic_keys=(NeXusData[snx.NXdetector, SampleRun],), - context_keys=(InstrumentAngles[SampleRun],), + context_keys=(InstrumentAngle[SampleRun], SampleAngle[SampleRun]), target_keys=(CutData[SampleRun],), accumulators=(CutData[SampleRun],), ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index db9a27cb2..6e29425f1 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -85,10 +85,18 @@ class EnergyData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... InelasticCoordTransformGraph = NewType('InelasticCoordTransformGraph', dict) -class InstrumentAngles( - sciline.Scope[RunType, sc.DataGroup[sc.DataArray]], sc.DataGroup[sc.DataArray] -): - """Instrument angles for the sample orientation as a function of time.""" +class SampleAngle(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Rotation angle of the sample, possibly as a function of time. + + For BIFROST, this is angle "a3". + """ + + +class InstrumentAngle(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Rotation angle of the instrument, possibly as a function of time. + + For BIFROST, this is angle "a4". + """ MonitorCoordTransformGraph = NewType('MonitorCoordTransformGraph', dict) diff --git a/packages/essspectroscopy/streaming.ipynb b/packages/essspectroscopy/streaming.ipynb index 6178f5545..bb3ad6638 100644 --- a/packages/essspectroscopy/streaming.ipynb +++ b/packages/essspectroscopy/streaming.ipynb @@ -11,14 +11,13 @@ "import sciline\n", "import matplotlib.pyplot as plt\n", "import time\n", - "from ess import bifrost\n", "from ess.bifrost.data import (\n", " simulated_elastic_incoherent_with_phonon,\n", " tof_lookup_table_simulation\n", ")\n", "from ess.spectroscopy.types import *\n", "import scippnexus as snx\n", - "from ess.bifrost.live import BIFROSTQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData, BIFROSTQCutStreamProcessor" + "from ess.bifrost.live import BifrostQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData, BIFROSTQCutStreamProcessor" ] }, { @@ -51,7 +50,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow = BIFROSTQCutWorkflow(detector_names)\n", + "workflow = BifrostQCutWorkflow(detector_names)\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", @@ -97,10 +96,11 @@ "outputs": [], "source": [ "scheduler = sciline.scheduler.NaiveScheduler()\n", - "results = workflow.compute([NeXusData[snx.NXdetector, SampleRun], InstrumentAngles[SampleRun]],\n", + "results = workflow.compute([NeXusData[snx.NXdetector, SampleRun], InstrumentAngle[SampleRun], SampleAngle[SampleRun]],\n", " scheduler=scheduler)\n", "base_data = results[NeXusData[snx.NXdetector, SampleRun]]\n", - "angles = results[InstrumentAngles[SampleRun]]" + "instrument_angle = results[InstrumentAngle[SampleRun]]\n", + "sample_angle = results[SampleAngle[SampleRun]]" ] }, { @@ -110,7 +110,7 @@ "metadata": {}, "outputs": [], "source": [ - "angles['a3']" + "sample_angle" ] }, { @@ -123,8 +123,8 @@ "# This is similar to `group_by_rotation` but preserves the event_time_zero coord and dim.\n", "# The elements of `angle_groups` look like NeXusData.\n", "# For simplicity, it assumes that there is only one a4 value.\n", - "a3 = sc.lookup(angles['a3'], 'time')\n", - "a4 = sc.lookup(angles['a4'], 'time')\n", + "a3 = sc.lookup(sample_angle, 'time')\n", + "a4 = sc.lookup(instrument_angle, 'time')\n", "graph = {\n", " 'a3': lambda event_time_zero: a3[event_time_zero],\n", " 'a4': lambda event_time_zero: a4[event_time_zero],\n", @@ -153,11 +153,12 @@ "source": [ "times = []\n", "for group in angle_groups:\n", - " step_angles = sc.DataGroup(a3=sc.DataArray(group.coords['a3']), a4=sc.DataArray(group.coords['a4']))\n", + " step_a3 = sc.DataArray(group.coords['a3'])\n", + " step_a4 = sc.DataArray(group.coords['a4'])\n", " events = group.drop_coords(['a3', 'a4']) # NeXusData does not have these coords\n", "\n", " start = time.time()\n", - " sp.set_context({InstrumentAngles[SampleRun]: step_angles})\n", + " sp.set_context({SampleAngle[SampleRun]: step_a3, InstrumentAngle[SampleRun]: step_a4})\n", " sp.accumulate({NeXusData[snx.NXdetector, SampleRun]: events})\n", " end = time.time()\n", " times.append(end - start)\n", From 4583d2969bf44ae2395822b21f5adc78a77c2fb3 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 25 Sep 2025 10:28:31 +0200 Subject: [PATCH 184/330] Remove BIFROSTQCutStreamProcessor --- packages/essspectroscopy/src/ess/bifrost/live.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index 7f58ea20c..0f6234bc9 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -9,17 +9,11 @@ import sciline import scipp as sc -import scippnexus as snx -from ess.reduce.streaming import StreamProcessor from ess.spectroscopy.types import ( EnergyData, - InstrumentAngle, - NeXusData, NeXusDetectorName, RunType, - SampleAngle, - SampleRun, ) from .workflow import BifrostWorkflow @@ -82,13 +76,3 @@ def BifrostQCutWorkflow(detector_names: list[NeXusDetectorName]) -> sciline.Pipe workflow = BifrostWorkflow(detector_names) workflow.insert(cut) return workflow - - -def BIFROSTQCutStreamProcessor(workflow: sciline.Pipeline) -> StreamProcessor: - return StreamProcessor( - workflow, - dynamic_keys=(NeXusData[snx.NXdetector, SampleRun],), - context_keys=(InstrumentAngle[SampleRun], SampleAngle[SampleRun]), - target_keys=(CutData[SampleRun],), - accumulators=(CutData[SampleRun],), - ) From 34978ff4dd136c5e9b019762534e6a452f787e21 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 25 Sep 2025 10:51:17 +0200 Subject: [PATCH 185/330] Document cutting params and function --- .../docs/api-reference/index.md | 1 + .../essspectroscopy/src/ess/bifrost/live.py | 65 ++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/docs/api-reference/index.md b/packages/essspectroscopy/docs/api-reference/index.md index fe91fdeb4..0dbbaaa9b 100644 --- a/packages/essspectroscopy/docs/api-reference/index.md +++ b/packages/essspectroscopy/docs/api-reference/index.md @@ -42,6 +42,7 @@ data detector io + live types workflow ``` diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index 0f6234bc9..b8569372f 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -21,7 +21,45 @@ @dataclass(frozen=True, kw_only=True, slots=True) class CutAxis: - """Axis and binds for cutting 4D Q-E data.""" + """Axis and bins for cutting 4D Q - delta E data. + + Each axis defines a projection of the :math:`Q` - :math:`\\Delta E` space + onto a 1D line as well as bin edges on that line. + + Examples + -------- + Cut along :math:`Q_x`: (see also :meth:`CutAxis.from_q_vector`) + + >>> from ess.bifrost.live import CutAxis + >>> axis = CutAxis( + ... output='Qx', + ... fn=lambda sample_table_momentum_transfer: sc.dot( + ... sc.vector([1, 0, 0]), + ... sample_table_momentum_transfer, + ... ), + ... bins=sc.linspace(dim='Qx', start=-0.5, stop=0.5, num=100, unit='1/Ã…'), + ... ) + + Cut along the norm :math:`|Q|`: + (Note that ``sc.norm`` is wrapped in a lambda to use the + proper name for the input coordinate, see :attr:`CutAxis.fn`.) + + >>> axis = CutAxis( + ... output='|Q|', + ... fn=lambda sample_table_momentum_transfer: sc.norm( + ... sample_table_momentum_transfer + ... ), + ... bins=sc.linspace(dim='|Q|', start=-0.9, stop=3.0, num=100, unit='1/Ã…'), + ... ) + + Cut along :math:`\\Delta E`: + + >>> axis = CutAxis( + ... output='E', + ... fn=lambda energy_transfer: energy_transfer, + ... bins=sc.linspace('E', -0.1, 0.1, 300, unit='meV') + ... ) + """ output: str """Name of the output coordinate.""" @@ -48,7 +86,9 @@ def from_q_vector(cls, output: str, vec: sc.Variable, bins: sc.Variable): CutAxis1 = NewType('CutAxis1', CutAxis) +"""Sciline domain type for cut axis 1.""" CutAxis2 = NewType('CutAxis2', CutAxis) +"""Sciline domain type for cut axis 1.""" class CutData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): @@ -58,7 +98,28 @@ class CutData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): def cut( data: EnergyData[RunType], *, axis_1: CutAxis1, axis_2: CutAxis2 ) -> CutData[RunType]: - """Cut data along two axes.""" + """Cut data along two axes. + + This function projects the input ``data`` expressed in :math:`Q` and + :math:`\\Delta E` onto a 2D surface defined by the cut axes. + This integrates over the other dimensions. + Then, the projected data is histogrammed according to the axis bins. + + Parameters + ---------- + data: + Input data with coordinates "sample_table_momentum_transfer" and + "energy_transfer". + axis_1: + Defines the projection onto and binning in the first axis. + axis_2: + Defines the projection onto and binning in the second axis. + + Returns + ------- + : + ``data`` projected and histogrammed along the cut axes. + """ new_coords = {axis_1.output, axis_2.output} projected = data.bins.concat().transform_coords( new_coords, From c81c1fb8f505f4ae51bee185c49dce6397fca57c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 25 Sep 2025 10:51:34 +0200 Subject: [PATCH 186/330] Remove streaming notebook --- packages/essspectroscopy/streaming.ipynb | 232 ----------------------- 1 file changed, 232 deletions(-) delete mode 100644 packages/essspectroscopy/streaming.ipynb diff --git a/packages/essspectroscopy/streaming.ipynb b/packages/essspectroscopy/streaming.ipynb deleted file mode 100644 index bb3ad6638..000000000 --- a/packages/essspectroscopy/streaming.ipynb +++ /dev/null @@ -1,232 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "0", - "metadata": {}, - "outputs": [], - "source": [ - "import scipp as sc\n", - "import sciline\n", - "import matplotlib.pyplot as plt\n", - "import time\n", - "from ess.bifrost.data import (\n", - " simulated_elastic_incoherent_with_phonon,\n", - " tof_lookup_table_simulation\n", - ")\n", - "from ess.spectroscopy.types import *\n", - "import scippnexus as snx\n", - "from ess.bifrost.live import BifrostQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData, BIFROSTQCutStreamProcessor" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib widget" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "fname = simulated_elastic_incoherent_with_phonon()\n", - "with snx.File(fname) as f:\n", - " detector_names = list(f['entry/instrument'][snx.NXdetector])\n", - "detector_names = detector_names[:2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "workflow = BifrostQCutWorkflow(detector_names)\n", - "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", - "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", - "\n", - "# workflow[CutAxis1] = CutAxis.from_q_vector(\n", - "# output=\"Qx\",\n", - "# vec=sc.vector([1, 0, 0]),\n", - "# bins=sc.linspace('Qx', -3.0, 3.0, 300, unit='1/Ã…')\n", - "# )\n", - "# workflow[CutAxis2] = CutAxis.from_q_vector(\n", - "# output=\"Qz\",\n", - "# vec=sc.vector([0, 0, 1]),\n", - "# bins=sc.linspace('Qz', -3.0, 3.0, 300, unit='1/Ã…')\n", - "# )\n", - "\n", - "workflow[CutAxis1] = CutAxis(\n", - " output=\"|Q|\",\n", - " fn=lambda sample_table_momentum_transfer: sc.norm(sample_table_momentum_transfer),\n", - " bins=sc.linspace('|Q|', 0.9, 3.0, 300, unit='1/Ã…')\n", - ")\n", - "workflow[CutAxis2] = CutAxis(\n", - " output=\"E\",\n", - " fn=lambda energy_transfer: energy_transfer,\n", - " bins=sc.linspace('E', -0.1, 0.1, 300, unit='meV')\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "workflow.visualize(CutData[SampleRun], graph_attr={\"rankdir\": \"LR\"}, compact=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "scheduler = sciline.scheduler.NaiveScheduler()\n", - "results = workflow.compute([NeXusData[snx.NXdetector, SampleRun], InstrumentAngle[SampleRun], SampleAngle[SampleRun]],\n", - " scheduler=scheduler)\n", - "base_data = results[NeXusData[snx.NXdetector, SampleRun]]\n", - "instrument_angle = results[InstrumentAngle[SampleRun]]\n", - "sample_angle = results[SampleAngle[SampleRun]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "sample_angle" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [ - "# This is similar to `group_by_rotation` but preserves the event_time_zero coord and dim.\n", - "# The elements of `angle_groups` look like NeXusData.\n", - "# For simplicity, it assumes that there is only one a4 value.\n", - "a3 = sc.lookup(sample_angle, 'time')\n", - "a4 = sc.lookup(instrument_angle, 'time')\n", - "graph = {\n", - " 'a3': lambda event_time_zero: a3[event_time_zero],\n", - " 'a4': lambda event_time_zero: a4[event_time_zero],\n", - "}\n", - "d = base_data.bins.assign_coords({'event_time_zero': sc.bins_like(base_data.data, base_data.coords['event_time_zero'])})\n", - "grouped = d.transform_coords(('a3', 'a4'), graph=graph).group('a3', 'a4')\n", - "angle_groups = [grouped['a3', a3]['a4', 0].group('event_time_zero') for a3 in grouped.coords['a3']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [ - "sp = BIFROSTQCutStreamProcessor(workflow)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9", - "metadata": {}, - "outputs": [], - "source": [ - "times = []\n", - "for group in angle_groups:\n", - " step_a3 = sc.DataArray(group.coords['a3'])\n", - " step_a4 = sc.DataArray(group.coords['a4'])\n", - " events = group.drop_coords(['a3', 'a4']) # NeXusData does not have these coords\n", - "\n", - " start = time.time()\n", - " sp.set_context({SampleAngle[SampleRun]: step_a3, InstrumentAngle[SampleRun]: step_a4})\n", - " sp.accumulate({NeXusData[snx.NXdetector, SampleRun]: events})\n", - " end = time.time()\n", - " times.append(end - start)\n", - "\n", - "print(f\"Sum: {sum(times):.3f}s Mean: {sum(times) / len(times):.3f}s [{min(times):.3f}s, {max(times):.3f}s]\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10", - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(times)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "11", - "metadata": {}, - "outputs": [], - "source": [ - "results = sp.finalize()\n", - "data = results[CutData[SampleRun]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12", - "metadata": {}, - "outputs": [], - "source": [ - "data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "13", - "metadata": {}, - "outputs": [], - "source": [ - "data.plot(norm='log')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 0e16d2cfd9f5d68989e32d2cb1147c0b702c290e Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 25 Sep 2025 11:10:36 +0200 Subject: [PATCH 187/330] Fix formatting --- packages/essspectroscopy/src/ess/bifrost/workflow.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 04538e0bd..c47f97906 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -130,7 +130,8 @@ def concat_event_lists( E.g., if input 1 has times `[0, 1, 2]` and input 2 has times `[0, 2, 3]`, the output will have times `[0, 1, 2, 0, 2, 3]`. Note that this sawtooth pattern will disappear again after grouping into pixels. - Preserving it will likely actually lead to more efficient memory access patterns when grouping. + Preserving it will likely actually lead to more efficient memory + access patterns when grouping. Parameters ---------- From 5fde4aea7ad7c55018f9d73a20a068cd1e010b46 Mon Sep 17 00:00:00 2001 From: Neil Vaytet <39047984+nvaytet@users.noreply.github.com> Date: Thu, 2 Oct 2025 09:03:37 +0200 Subject: [PATCH 188/330] Remove FrameMonitor0 from the workflow Monitor `007_frame_0` no longer exists in the file. --- packages/essspectroscopy/src/ess/bifrost/workflow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index c47f97906..44a6b7888 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -37,7 +37,6 @@ def simulation_default_parameters() -> dict[type, Any]: """Default parameters for BifrostSimulationWorkflow.""" return { - NeXusMonitorName[FrameMonitor0]: '007_frame_0', NeXusMonitorName[FrameMonitor1]: '090_frame_1', NeXusMonitorName[FrameMonitor2]: '097_frame_2', NeXusMonitorName[FrameMonitor3]: '110_frame_3', From 39228181b05e36ea38b39ea7072641b0c525f64e Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 2 Oct 2025 11:03:08 +0200 Subject: [PATCH 189/330] Extend range of tof lut --- .../bifrost/bifrost-make-tof-lookup-table.ipynb | 9 ++++++--- packages/essspectroscopy/src/ess/bifrost/data.py | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb index 302c74e34..4596430c8 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb @@ -20,6 +20,7 @@ "from ess.reduce import nexus\n", "import sciline\n", "import scipp as sc\n", + "from scippneutron.conversion.graph import beamline as beamline_graph\n", "import scippnexus as snx\n", "from ess.reduce.nexus.types import RawChoppers, DiskChoppers\n", "from ess.reduce.time_of_flight.lut import (\n", @@ -79,7 +80,9 @@ "id": "5", "metadata": {}, "source": [ - "Compute the required distance range to include the monitor and sample:" + "Compute the required distance range to include the monitor and all detectors.\n", + "Strictly speaking, we only need the range from the chosen monitor up to the Bragg peak monitor as we unwrap the regular detector data at the sample position.\n", + "But this implementation is simpler and should work fine." ] }, { @@ -91,7 +94,7 @@ "source": [ "l_monitor = sc.norm(monitor.coords['source_position'] - monitor.coords['position'])\n", "l_min = l_monitor\n", - "l_max = beamline.coords['L1']" + "l_max = beamline.transform_coords('Ltotal', graph=beamline_graph.beamline(scatter=True)).coords['Ltotal'].max()" ] }, { @@ -152,7 +155,7 @@ "workflow[SourcePosition] = beamline.coords['source_position']\n", "\n", "# Increase this number for more reliable results:\n", - "workflow[NumberOfSimulatedNeutrons] = 200_000" + "workflow[NumberOfSimulatedNeutrons] = 600_000" ] }, { diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index c5ed9ed83..f4bae3d3d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -3,7 +3,7 @@ """Data for tests and documentation with BIFROST.""" -_version = "2" +_version = "3" def _make_pooch(): @@ -17,7 +17,7 @@ def _make_pooch(): registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", "computed_energy_data_simulated.h5": "md5:31b2444042935e99831c3c84a375ccae", - "BIFROST-simulation-tof-lookup-table.h5": "md5:f2c12eb39d0750238805d0e5a5d561f7", # noqa: E501 + "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 }, retry_if_failed=3, ) From ab990dfb886964bd88f741db562e9ba547414faa Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 2 Oct 2025 15:44:07 +0200 Subject: [PATCH 190/330] Basic Bragg pea monitor workflow --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 174 ++++++++++++++++++ .../ess/bifrost/single_crystal/__init__.py | 7 + .../ess/bifrost/single_crystal/conversion.py | 54 ++++++ .../src/ess/bifrost/single_crystal/q_map.py | 58 ++++++ .../bifrost/single_crystal/time_of_flight.py | 41 +++++ .../src/ess/bifrost/single_crystal/types.py | 27 +++ .../ess/bifrost/single_crystal/workflow.py | 43 +++++ .../src/ess/spectroscopy/types.py | 6 + 8 files changed, 410 insertions(+) create mode 100644 packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb create mode 100644 packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py create mode 100644 packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb new file mode 100644 index 000000000..5a46487e9 --- /dev/null +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -0,0 +1,174 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# BIFROST Bragg peak monitor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "from ess.bifrost.single_crystal import BifrostBraggPeakMonitorWorkflow\n", + "from ess.spectroscopy.types import *\n", + "from ess.bifrost.types import McStasDetectorData\n", + "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation\n", + "from ess.reduce.nexus.types import NeXusDetectorName\n", + "from ess.reduce.time_of_flight import DetectorLtotal\n", + "import scippnexus as snx\n", + "from ess.bifrost.single_crystal.types import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "workflow = BifrostBraggPeakMonitorWorkflow()\n", + "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", + "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", + "\n", + "workflow[QBinsParallel] = sc.linspace('Q_parallel', -3, 3, 200, unit='1/Ã…')\n", + "workflow[QBinsPerpendicular] = sc.linspace('Q_perpendicular', -3, 3, 200, unit='1/Ã…')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "# Load an inelastic detector as we don't have an actual bragg peak monitor in the file.\n", + "workflow[NeXusDetectorName] = \"309_channel_9_5_triplet\"\n", + "\n", + "\n", + "def assemble_detector_data_flatten(\n", + " detector: CalibratedBeamline[RunType],\n", + " data: NeXusData[snx.NXdetector, RunType],\n", + ") -> McStasDetectorData[RunType]:\n", + " from ess.reduce.nexus.workflow import assemble_detector_data as assemble\n", + " base = assemble(detector, data)\n", + "\n", + " # The monitor only has one pixel, so combine all pixels from the selected bank:\n", + " monitor = base.bins.concat()\n", + " monitor.coords['detector_number'] = sc.index(0)\n", + " # Halfway between the bank and the sample:\n", + " monitor.coords['position'] = base.coords['position'].mean() / 2\n", + " return McStasDetectorData[RunType](monitor)\n", + "\n", + "\n", + "def detector_ltotal_from_straight_line_approximation(\n", + " detector_beamline: DetectorData[RunType],\n", + ") -> DetectorLtotal[RunType]:\n", + " from ess.reduce.time_of_flight import eto_to_tof\n", + " return eto_to_tof.detector_ltotal_from_straight_line_approximation(\n", + " detector_beamline # type: ignore[arg-type]\n", + " )\n", + "\n", + "\n", + "workflow.insert(assemble_detector_data_flatten)\n", + "workflow.insert(detector_ltotal_from_straight_line_approximation)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "workflow.visualize(QMap[SampleRun], graph_attr={\"rankdir\": \"LR\"})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "da = workflow.compute(QMap[SampleRun])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "da" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "da.hist().plot(norm='log')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "da.bins.coords['Q'].min()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "da.bins.coords['Q'].max()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "da.bins.concat().bin(Q=sc.linspace('Q', 2.6, 2.7, 100, unit='1/Ã…')).bins.concat().hist(a3=180).plot()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py new file mode 100644 index 000000000..7ea460fca --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +"""A single crystal reduction workflow for BIFROST's Bragg peak monitor.""" + +from .workflow import BifrostBraggPeakMonitorWorkflow + +__all__ = ["BifrostBraggPeakMonitorWorkflow"] diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py new file mode 100644 index 000000000..df1c59a72 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Coordinate conversions for single crystal diffraction with BIFROST.""" + +from scippneutron.conversion.graph import beamline as beamline_graphs +from scippneutron.conversion.graph import tof as tof_graphs + +from ess.spectroscopy.indirect.conversion import ( + rotate_to_sample_table_momentum_transfer, +) +from ess.spectroscopy.types import ( + DetectorCountsWithQ, + DetectorTofData, + ElasticCoordTransformGraph, + GravityVector, + RunType, +) + + +def single_crystal_coordinate_transformation_graph( + gravity: GravityVector, +) -> ElasticCoordTransformGraph: + """Return the coordinate transformation graph for single crystal diffraction.""" + base = tof_graphs.elastic_Q_vec(start='tof') + base['lab_momentum_transfer'] = base['Q_vec'] + return ElasticCoordTransformGraph( + { + **beamline_graphs.beamline(scatter=True), + **base, + 'gravity': lambda: gravity, + 'sample_table_momentum_transfer': rotate_to_sample_table_momentum_transfer, + } + ) + + +def convert_tof_to_q( + with_tof: DetectorTofData[RunType], + *, + graph: ElasticCoordTransformGraph, +) -> DetectorCountsWithQ[RunType]: + """Convert ToF to Q.""" + transformed = with_tof.transform_coords( + ['a3', 'sample_table_momentum_transfer'], + graph=graph, + keep_intermediate=False, + keep_inputs=False, + keep_aliases=False, + rename_dims=False, # because otherwise, it would rename a3 -> Q + ) + return DetectorCountsWithQ[RunType](transformed) + + +providers = (single_crystal_coordinate_transformation_graph, convert_tof_to_q) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py new file mode 100644 index 000000000..c11d86328 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Build a Q-map for single crystal diffraction.""" + +from collections.abc import Callable + +import scipp as sc + +from ess.spectroscopy.types import DetectorCountsWithQ, RunType + +from .types import QBinsParallel, QBinsPerpendicular, QMap, QProjection + + +def project_onto_q_plane( + counts: DetectorCountsWithQ[RunType], + *, + q_projection: QProjection, + parallel_bins: QBinsParallel, + perpendicular_bins: QBinsPerpendicular, +) -> QMap[RunType]: + transformed = counts.transform_coords( + ['Q_parallel', 'Q_perpendicular', 'Q'], + graph={ + 'Q_parallel': _make_projection(q_projection.parallel), + 'Q_perpendicular': _make_projection(q_projection.perpendicular), + 'Q': lambda sample_table_momentum_transfer: sc.norm( + sample_table_momentum_transfer + ), + }, + keep_inputs=False, + ) + if transformed.bins is not None: + transformed.bins.coords['a3'] = sc.bins_like( + transformed, transformed.coords['a3'] + ) + transformed = transformed.bins.concat() + + binned = transformed.bin( + Q_perpendicular=perpendicular_bins, Q_parallel=parallel_bins + ) + return QMap[RunType](binned) + + +def _make_projection(vector: sc.Variable) -> Callable[..., sc.Variable]: + def projection(sample_table_momentum_transfer: sc.Variable) -> sc.Variable: + return sc.dot(sample_table_momentum_transfer, vector / sc.norm(vector)) + + return projection + + +def default_q_projection() -> QProjection: + return QProjection( + parallel=sc.vector(value=[0, 0, 1]), perpendicular=sc.vector(value=[1, 0, 0]) + ) + + +providers = (default_q_projection, project_onto_q_plane) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py new file mode 100644 index 000000000..ad7c87f97 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Utilities for computing real neutron time-of-flight.""" + +from ess.reduce import time_of_flight as reduce_time_of_flight +from ess.reduce.time_of_flight.types import DetectorLtotal +from ess.spectroscopy.types import ( + DataGroupedByRotation, + DetectorData, + DetectorTofData, + PulseStrideOffset, + RunType, + TimeOfFlightLookupTable, +) + + +def detector_time_of_flight_data( + sample_data: DataGroupedByRotation[RunType], + lookup: TimeOfFlightLookupTable, + ltotal: DetectorLtotal[RunType], + pulse_stride_offset: PulseStrideOffset, +) -> DetectorTofData[RunType]: + """ + Convert the time-of-arrival data to time-of-flight data using a lookup table. + + The output data will have a time-of-flight coordinate. + + This is a wrapper around + :func:`ess.reduce.time_of_flight.detector_time_of_flight_data` + for different input types. + """ + return reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data( + detector_data=DetectorData[RunType](sample_data), + lookup=lookup, + ltotal=ltotal, + pulse_stride_offset=pulse_stride_offset, + ) + + +providers = (detector_time_of_flight_data,) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py new file mode 100644 index 000000000..e309c7ccd --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Domain types for single crystal diffraction on BIFROST.""" + +from dataclasses import dataclass +from typing import NewType + +import sciline +import scipp as sc + +from ess.spectroscopy.types import RunType + + +class QMap(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + +@dataclass(frozen=True, slots=True) +class QProjection: + """Projection vectors in Q.""" + + parallel: sc.Variable + perpendicular: sc.Variable + + +QBinsParallel = NewType('QBinsParallel', sc.Variable) +QBinsPerpendicular = NewType('QBinsPerpendicular', sc.Variable) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py new file mode 100644 index 000000000..bde0c8d90 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +"""BIFROST Bragg peak monitor workflows.""" + +import sciline + +from ess.reduce import time_of_flight as reduce_time_of_flight +from ess.spectroscopy.indirect.time_of_flight import TofWorkflow +from ess.spectroscopy.types import ( + FrameMonitor1, + FrameMonitor2, + FrameMonitor3, + SampleRun, +) + +from ..cutting import group_by_rotation +from ..io import nexus +from ..io.mcstas import convert_simulated_time_to_event_time_offset +from ..workflow import simulation_default_parameters +from . import conversion, q_map, time_of_flight + +_PROVIDERS = ( + *nexus.providers, + *conversion.providers, + *q_map.providers, + *time_of_flight.providers, + convert_simulated_time_to_event_time_offset, + group_by_rotation, +) + + +def BifrostBraggPeakMonitorWorkflow() -> sciline.Pipeline: + workflow = TofWorkflow( + run_types=(SampleRun,), + monitor_types=(FrameMonitor1, FrameMonitor2, FrameMonitor3), + ) + # Use the vanilla implementation instead of the indirect geometry one: + workflow.insert(reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data) + for provider in _PROVIDERS: + workflow.insert(provider) + for key, val in simulation_default_parameters().items(): + workflow[key] = val + return workflow diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 6e29425f1..f0e4586dd 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -79,6 +79,12 @@ class DataAtSample(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... class DataGroupedByRotation(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class DetectorCountsWithQ(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + +ElasticCoordTransformGraph = NewType('ElasticCoordTransformGraph', dict) + + class EnergyData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... From faf90e7f5a219ae47dbc4a3c73e654cb4774ecf2 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 3 Oct 2025 17:13:03 +0200 Subject: [PATCH 191/330] Update reference test data --- packages/essspectroscopy/src/ess/bifrost/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index f4bae3d3d..fa189d860 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -16,7 +16,7 @@ def _make_pooch(): version=_version, registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated.h5": "md5:31b2444042935e99831c3c84a375ccae", + "computed_energy_data_simulated.h5": "blake2b:3c398443cb85c8294d283c7212255bc695c2520f2332c2c99d041a0760b6bcbb9937e19bcd8a498daf306d279c88d2ea911c510c1ce3b3a7f1e6b7e54022a943", # noqa: E501 "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 }, retry_if_failed=3, From 8ad63e1d20e5550b4c9d4b8778b3c6c153aeff76 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 3 Oct 2025 17:13:22 +0200 Subject: [PATCH 192/330] Implement interactive Q-map --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 127 ++++++++++-------- .../ess/bifrost/single_crystal/__init__.py | 3 +- .../src/ess/bifrost/single_crystal/q_map.py | 104 ++++++++++++-- .../src/ess/bifrost/single_crystal/types.py | 7 +- 4 files changed, 166 insertions(+), 75 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index 5a46487e9..b32de9148 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -5,7 +5,10 @@ "id": "0", "metadata": {}, "source": [ - "# BIFROST Bragg peak monitor" + "# BIFROST Bragg peak monitor\n", + "\n", + "This notebook demonstrates how to process data for BIFROST's Bragg peak monitor.\n", + "It uses a dedicated single crystal diffraction workflow to construct a map in Q and an interactive slicer plot." ] }, { @@ -15,14 +18,17 @@ "metadata": {}, "outputs": [], "source": [ - "from ess.bifrost.single_crystal import BifrostBraggPeakMonitorWorkflow\n", - "from ess.spectroscopy.types import *\n", + "import scippnexus as snx\n", + "\n", + "from ess.bifrost.data import (\n", + " simulated_elastic_incoherent_with_phonon,\n", + " tof_lookup_table_simulation,\n", + ")\n", + "from ess.bifrost.single_crystal import BifrostBraggPeakMonitorWorkflow, make_q_map\n", + "from ess.bifrost.single_crystal.types import *\n", "from ess.bifrost.types import McStasDetectorData\n", - "from ess.bifrost.data import simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation\n", - "from ess.reduce.nexus.types import NeXusDetectorName\n", "from ess.reduce.time_of_flight import DetectorLtotal\n", - "import scippnexus as snx\n", - "from ess.bifrost.single_crystal.types import *" + "from ess.spectroscopy.types import *" ] }, { @@ -31,29 +37,59 @@ "id": "2", "metadata": {}, "outputs": [], + "source": [ + "%matplotlib widget" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "Build a workflow for processing the data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], "source": [ "workflow = BifrostBraggPeakMonitorWorkflow()\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", + "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "
\n", + "\n", + "**Attention**\n", + "\n", + "The current tests data does not contain a bragg peak monitor.\n", + "So we instead use a bank ('triplet') of the regular inelastic detector.\n", + "This means that the workflow can run, but the results don't show any bragg peaks.\n", "\n", - "workflow[QBinsParallel] = sc.linspace('Q_parallel', -3, 3, 200, unit='1/Ã…')\n", - "workflow[QBinsPerpendicular] = sc.linspace('Q_perpendicular', -3, 3, 200, unit='1/Ã…')" + "
" ] }, { "cell_type": "code", "execution_count": null, - "id": "3", + "id": "6", "metadata": {}, "outputs": [], "source": [ - "# Load an inelastic detector as we don't have an actual bragg peak monitor in the file.\n", "workflow[NeXusDetectorName] = \"309_channel_9_5_triplet\"\n", "\n", "\n", "def assemble_detector_data_flatten(\n", - " detector: CalibratedBeamline[RunType],\n", - " data: NeXusData[snx.NXdetector, RunType],\n", + " detector: CalibratedBeamline[RunType],\n", + " data: NeXusData[snx.NXdetector, RunType],\n", ") -> McStasDetectorData[RunType]:\n", " from ess.reduce.nexus.workflow import assemble_detector_data as assemble\n", " base = assemble(detector, data)\n", @@ -67,7 +103,7 @@ "\n", "\n", "def detector_ltotal_from_straight_line_approximation(\n", - " detector_beamline: DetectorData[RunType],\n", + " detector_beamline: DetectorData[RunType],\n", ") -> DetectorLtotal[RunType]:\n", " from ess.reduce.time_of_flight import eto_to_tof\n", " return eto_to_tof.detector_ltotal_from_straight_line_approximation(\n", @@ -82,91 +118,72 @@ { "cell_type": "code", "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "workflow.visualize(QMap[SampleRun], graph_attr={\"rankdir\": \"LR\"})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "da = workflow.compute(QMap[SampleRun])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", + "id": "7", "metadata": {}, "outputs": [], "source": [ - "da" + "workflow.visualize(CountsWithQMapCoords[SampleRun], graph_attr={\"rankdir\": \"LR\"})" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "7", + "cell_type": "markdown", + "id": "8", "metadata": {}, - "outputs": [], "source": [ - "da.hist().plot(norm='log')" + "Compute the data projected onto Q:" ] }, { "cell_type": "code", "execution_count": null, - "id": "8", + "id": "9", "metadata": {}, "outputs": [], "source": [ - "da.bins.coords['Q'].min()" + "counts = workflow.compute(CountsWithQMapCoords[SampleRun])" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "9", + "cell_type": "markdown", + "id": "10", "metadata": {}, - "outputs": [], "source": [ - "da.bins.coords['Q'].max()" + "Make an interactive figure.\n", + "Use the slider to select a range in $Q$ to integrate over and display in the 1D figure." ] }, { "cell_type": "code", "execution_count": null, - "id": "10", + "id": "11", "metadata": {}, "outputs": [], "source": [ - "da.bins.concat().bin(Q=sc.linspace('Q', 2.6, 2.7, 100, unit='1/Å')).bins.concat().hist(a3=180).plot()" + "make_q_map(counts,\n", + " q_parallel_bins=sc.linspace('Q_parallel', -3, 3, 200, unit='1/Å'),\n", + " q_perpendicular_bins=sc.linspace('Q_perpendicular', -3, 3, 200, unit='1/Å'),\n", + " sample_rotation_bins=180,\n", + ")" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.11.10" } }, "nbformat": 4, diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py index 7ea460fca..ec4cad7ff 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py @@ -2,6 +2,7 @@ # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) """A single crystal reduction workflow for BIFROST's Bragg peak monitor.""" +from .q_map import make_q_map from .workflow import BifrostBraggPeakMonitorWorkflow -__all__ = ["BifrostBraggPeakMonitorWorkflow"] +__all__ = ["BifrostBraggPeakMonitorWorkflow", "make_q_map"] diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index c11d86328..8e41e2ba0 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -5,25 +5,28 @@ from collections.abc import Callable +import plopp as pp import scipp as sc +from matplotlib.axes import Axes +from matplotlib.patches import Circle +from plopp.widgets import Box from ess.spectroscopy.types import DetectorCountsWithQ, RunType -from .types import QBinsParallel, QBinsPerpendicular, QMap, QProjection +from .types import CountsWithQMapCoords, QProjection -def project_onto_q_plane( +def project_momentum_transfer( counts: DetectorCountsWithQ[RunType], *, q_projection: QProjection, - parallel_bins: QBinsParallel, - perpendicular_bins: QBinsPerpendicular, -) -> QMap[RunType]: +) -> CountsWithQMapCoords[RunType]: + """Project Q onto given axes and also compute the norm of Q.""" transformed = counts.transform_coords( ['Q_parallel', 'Q_perpendicular', 'Q'], graph={ - 'Q_parallel': _make_projection(q_projection.parallel), - 'Q_perpendicular': _make_projection(q_projection.perpendicular), + 'Q_parallel': _make_projection_kernel(q_projection.parallel), + 'Q_perpendicular': _make_projection_kernel(q_projection.perpendicular), 'Q': lambda sample_table_momentum_transfer: sc.norm( sample_table_momentum_transfer ), @@ -36,13 +39,10 @@ def project_onto_q_plane( ) transformed = transformed.bins.concat() - binned = transformed.bin( - Q_perpendicular=perpendicular_bins, Q_parallel=parallel_bins - ) - return QMap[RunType](binned) + return CountsWithQMapCoords[RunType](transformed) -def _make_projection(vector: sc.Variable) -> Callable[..., sc.Variable]: +def _make_projection_kernel(vector: sc.Variable) -> Callable[..., sc.Variable]: def projection(sample_table_momentum_transfer: sc.Variable) -> sc.Variable: return sc.dot(sample_table_momentum_transfer, vector / sc.norm(vector)) @@ -55,4 +55,82 @@ def default_q_projection() -> QProjection: ) -providers = (default_q_projection, project_onto_q_plane) +def make_q_map( + events: sc.DataArray, + q_parallel_bins: int | sc.Variable, + q_perpendicular_bins: int | sc.Variable, + sample_rotation_bins: int | sc.Variable, +) -> Box: + """Build a figure with a 2D Q-map and a 1D slice for a range of Q values.""" + import ipywidgets as ipw + + def make_q_hist(da: sc.DataArray) -> sc.DataArray: + return da.hist( + Q_perpendicular=q_perpendicular_bins, Q_parallel=q_parallel_bins + ).rename(Q_perpendicular=r'$Q_{\perp}$', Q_parallel='$Q_{||}$') + + def make_q_slice(da: sc.DataArray, q_range: tuple[float, float]) -> sc.DataArray: + unit = da.bins.coords['Q'].unit + lo = q_range[0] * unit + hi = q_range[1] * unit + sliced = da.bins['Q', lo:hi] + try: + return sliced.hist(a3=sample_rotation_bins).rename(a3='sample_rotation') + except ValueError as err: + if "empty data range" in err.args[0].lower(): + return _empty_angle_array_like(sliced) + raise + + q_lo = events.bins.coords['Q'].min().value + q_hi = events.bins.coords['Q'].max().value + slider = ipw.FloatRangeSlider( + value=(q_lo, q_hi), min=q_lo, max=q_hi, step=(q_hi - q_lo) / 100 + ) + + slider_node = pp.widget_node(slider) + input_node = pp.Node(events) + q_map_node = pp.Node(make_q_hist, input_node) + q_slice_node = pp.Node(make_q_slice, input_node, slider_node) + q_map_fig = pp.imagefigure(q_map_node, aspect='equal', norm='log') + q_slice_fig = pp.linefigure(q_slice_node) + + lo_circle = _draw_circle(q_map_fig.ax, q_lo) + hi_circle = _draw_circle(q_map_fig.ax, q_hi) + + def update_circle(q_range: tuple[float, float]) -> None: + lo_circle.radius, hi_circle.radius = q_range + q_map_fig.fig.canvas.draw_idle() + + pp.View(pp.Node(update_circle, slider_node)) + + return Box([[q_map_fig], [q_slice_fig], [slider]]) + + +def _draw_circle(ax: Axes, radius: float) -> Circle: + circle = Circle((0, 0), radius, edgecolor='C1', facecolor='none', linewidth=1.5) + ax.add_artist(circle) + return circle + + +def _empty_angle_array_like( + reference: sc.DataArray, *, dim: str = 'sample_rotation' +) -> sc.DataArray: + a3_lo = reference.bins.coords[dim].min() + a3_hi = reference.bins.coords[dim].max() + return sc.DataArray( + sc.array( + dims=[dim], + values=[0, 0], + variances=[0, 0], + unit=reference.unit, + dtype=reference.dtype, + ), + coords={ + dim: sc.array( + dims=[dim], values=[a3_lo.value, a3_hi.value], unit=a3_lo.unit + ) + }, + ) + + +providers = (default_q_projection, project_momentum_transfer) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py index e309c7ccd..46b5a43b6 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py @@ -4,7 +4,6 @@ """Domain types for single crystal diffraction on BIFROST.""" from dataclasses import dataclass -from typing import NewType import sciline import scipp as sc @@ -12,7 +11,7 @@ from ess.spectroscopy.types import RunType -class QMap(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class CountsWithQMapCoords(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... @dataclass(frozen=True, slots=True) @@ -21,7 +20,3 @@ class QProjection: parallel: sc.Variable perpendicular: sc.Variable - - -QBinsParallel = NewType('QBinsParallel', sc.Variable) -QBinsPerpendicular = NewType('QBinsPerpendicular', sc.Variable) From 55c7aef35452a0b9e9c42381555ecc41683bcd29 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 3 Oct 2025 17:14:27 +0200 Subject: [PATCH 193/330] Pre-compute normal vector --- .../essspectroscopy/src/ess/bifrost/single_crystal/q_map.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index 8e41e2ba0..1f82eeeb3 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -43,8 +43,10 @@ def project_momentum_transfer( def _make_projection_kernel(vector: sc.Variable) -> Callable[..., sc.Variable]: + normal = vector / sc.norm(vector) + def projection(sample_table_momentum_transfer: sc.Variable) -> sc.Variable: - return sc.dot(sample_table_momentum_transfer, vector / sc.norm(vector)) + return sc.dot(sample_table_momentum_transfer, normal) return projection From 505ad3a97a6e29320214e19085ad0494b3d208be Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 3 Oct 2025 17:34:02 +0200 Subject: [PATCH 194/330] Add widgets deps to docs --- .../essspectroscopy/requirements/base.txt | 32 ++++----- .../essspectroscopy/requirements/basetest.txt | 8 +-- packages/essspectroscopy/requirements/ci.txt | 14 ++-- packages/essspectroscopy/requirements/dev.txt | 32 ++++----- packages/essspectroscopy/requirements/docs.in | 2 + .../essspectroscopy/requirements/docs.txt | 68 +++++++++++-------- .../essspectroscopy/requirements/mypy.txt | 2 +- .../essspectroscopy/requirements/nightly.txt | 36 +++++----- .../essspectroscopy/requirements/static.txt | 12 ++-- 9 files changed, 111 insertions(+), 95 deletions(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index f405955ed..bc5704f84 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -13,13 +13,13 @@ cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -dnspython==2.7.0 +dnspython==2.8.0 # via email-validator -email-validator==2.2.0 +email-validator==2.3.0 # via scippneutron -essreduce==25.7.1 +essreduce==25.9.0 # via -r base.in -fonttools==4.59.0 +fonttools==4.60.1 # via matplotlib graphviz==0.21 # via -r base.in @@ -29,14 +29,14 @@ h5py==3.14.0 # scippnexus idna==3.10 # via email-validator -kiwisolver==1.4.8 +kiwisolver==1.4.9 # via matplotlib lazy-loader==0.4 # via # plopp # scippneutron # tof -matplotlib==3.10.5 +matplotlib==3.10.6 # via # mpltoolbox # plopp @@ -44,7 +44,7 @@ mpltoolbox==25.5.0 # via scippneutron networkx==3.5 # via cyclebane -numpy==2.3.2 +numpy==2.3.3 # via # contourpy # h5py @@ -57,19 +57,19 @@ packaging==25.0 # via # lazy-loader # matplotlib -pandas==2.3.1 +pandas==2.3.3 # via -r base.in pillow==11.3.0 # via matplotlib -plopp==25.7.1 +plopp==25.9.0 # via # scippneutron # tof -pydantic==2.11.7 +pydantic==2.11.9 # via scippneutron pydantic-core==2.33.2 # via pydantic -pyparsing==3.2.3 +pyparsing==3.2.5 # via matplotlib python-dateutil==2.9.0.post0 # via @@ -79,7 +79,7 @@ python-dateutil==2.9.0.post0 # scippnexus pytz==2025.2 # via pandas -sciline==25.5.2 +sciline==25.8.0 # via # -r base.in # essreduce @@ -99,22 +99,22 @@ scippnexus==25.6.0 # -r base.in # essreduce # scippneutron -scipy==1.16.1 +scipy==1.16.2 # via # scippneutron # scippnexus # tof six==1.17.0 # via python-dateutil -tof==25.5.0 +tof==25.9.0 # via -r base.in -typing-extensions==4.14.1 +typing-extensions==4.15.0 # via # pydantic # pydantic-core # sciline # typing-inspection -typing-inspection==0.4.1 +typing-inspection==0.4.2 # via pydantic tzdata==2025.2 # via pandas diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 411b708c1..7e375f3ed 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -7,7 +7,7 @@ # certifi==2025.8.3 # via requests -charset-normalizer==3.4.2 +charset-normalizer==3.4.3 # via requests idna==3.10 # via requests @@ -17,7 +17,7 @@ packaging==25.0 # via # pooch # pytest -platformdirs==4.3.8 +platformdirs==4.4.0 # via pooch pluggy==1.6.0 # via pytest @@ -25,9 +25,9 @@ pooch==1.8.2 # via -r basetest.in pygments==2.19.2 # via pytest -pytest==8.4.1 +pytest==8.4.2 # via -r basetest.in -requests==2.32.4 +requests==2.32.5 # via pooch urllib3==2.5.0 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index cf385f77e..03be72d55 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,19 +5,19 @@ # # requirements upgrade # -cachetools==6.1.0 +cachetools==6.2.0 # via tox certifi==2025.8.3 # via requests chardet==5.2.0 # via tox -charset-normalizer==3.4.2 +charset-normalizer==3.4.3 # via requests colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.18.0 +filelock==3.19.1 # via # tox # virtualenv @@ -32,7 +32,7 @@ packaging==25.0 # -r ci.in # pyproject-api # tox -platformdirs==4.3.8 +platformdirs==4.4.0 # via # tox # virtualenv @@ -40,13 +40,13 @@ pluggy==1.6.0 # via tox pyproject-api==1.9.1 # via tox -requests==2.32.4 +requests==2.32.5 # via -r ci.in smmap==5.0.2 # via gitdb -tox==4.28.4 +tox==4.30.3 # via -r ci.in urllib3==2.5.0 # via requests -virtualenv==20.33.1 +virtualenv==20.34.0 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 3a743f013..7787cf9f5 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -12,7 +12,7 @@ -r static.txt -r test.txt -r wheels.txt -anyio==4.10.0 +anyio==4.11.0 # via # httpx # jupyter-server @@ -24,13 +24,13 @@ arrow==1.3.0 # via isoduration async-lru==2.0.5 # via jupyterlab -cffi==1.17.1 +cffi==2.0.0 # via argon2-cffi-bindings -click==8.2.1 +click==8.3.0 # via # pip-compile-multi # pip-tools -copier==9.9.0 +copier==9.10.2 # via -r dev.in dunamai==1.25.0 # via copier @@ -48,20 +48,20 @@ isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.12.0 +json5==0.12.1 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.25.0 +jsonschema[format-nongpl]==4.25.1 # via # jupyter-events # jupyterlab-server # nbformat jupyter-events==0.12.0 # via jupyter-server -jupyter-lsp==2.2.6 +jupyter-lsp==2.3.0 # via jupyterlab -jupyter-server==2.16.0 +jupyter-server==2.17.0 # via # jupyter-lsp # jupyterlab @@ -69,29 +69,29 @@ jupyter-server==2.16.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.4.5 +jupyterlab==4.4.9 # via -r dev.in jupyterlab-server==2.27.3 # via jupyterlab -lark==1.2.2 +lark==1.3.0 # via rfc3987-syntax notebook-shim==0.2.4 # via jupyterlab overrides==7.7.0 # via jupyter-server -pip-compile-multi==3.2.1 +pip-compile-multi==3.2.2 # via -r dev.in -pip-tools==7.5.0 +pip-tools==7.5.1 # via pip-compile-multi plumbum==1.9.0 # via copier -prometheus-client==0.22.1 +prometheus-client==0.23.1 # via jupyter-server -pycparser==2.22 +pycparser==2.23 # via cffi python-json-logger==3.3.0 # via jupyter-events -questionary==2.1.0 +questionary==2.1.1 # via copier rfc3339-validator==0.1.4 # via @@ -113,7 +113,7 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.9.0.20250708 +types-python-dateutil==2.9.0.20250822 # via arrow uri-template==1.3.0 # via jsonschema diff --git a/packages/essspectroscopy/requirements/docs.in b/packages/essspectroscopy/requirements/docs.in index f4c44bdb1..1d831a162 100644 --- a/packages/essspectroscopy/requirements/docs.in +++ b/packages/essspectroscopy/requirements/docs.in @@ -1,7 +1,9 @@ -r base.in autodoc-pydantic ipykernel +ipympl ipython!=8.7.0 # Breaks syntax highlighting in Jupyter code cells. +ipywidgets myst-parser nbsphinx pandas diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 33ec101d9..0b927e91a 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -1,4 +1,4 @@ -# SHA1:103aabc5a0c93de8e51263bcbed36d619e1016c3 +# SHA1:cd38650dbade5abcec0a82225fc305a00e19732c # # This file was generated by pip-compile-multi. # To update, run: @@ -10,8 +10,6 @@ accessible-pygments==0.0.5 # via pydata-sphinx-theme alabaster==1.0.0 # via sphinx -appnope==0.1.4 - # via ipykernel asttokens==3.0.0 # via stack-data attrs==25.3.0 @@ -24,7 +22,7 @@ babel==2.17.0 # via # pydata-sphinx-theme # sphinx -beautifulsoup4==4.13.4 +beautifulsoup4==4.14.2 # via # nbconvert # pydata-sphinx-theme @@ -32,11 +30,13 @@ bleach[css]==6.2.0 # via nbconvert certifi==2025.8.3 # via requests -charset-normalizer==3.4.2 +charset-normalizer==3.4.3 # via requests comm==0.2.3 - # via ipykernel -debugpy==1.8.15 + # via + # ipykernel + # ipywidgets +debugpy==1.8.17 # via ipykernel decorator==5.2.1 # via ipython @@ -48,20 +48,28 @@ docutils==0.21.2 # nbsphinx # pydata-sphinx-theme # sphinx -executing==2.2.0 +executing==2.2.1 # via stack-data -fastjsonschema==2.21.1 +fastjsonschema==2.21.2 # via nbformat imagesize==1.4.1 # via sphinx ipykernel==6.30.1 # via -r docs.in -ipython==9.4.0 +ipympl==0.9.7 + # via -r docs.in +ipython==9.6.0 # via # -r docs.in # ipykernel + # ipympl + # ipywidgets ipython-pygments-lexers==1.1.1 # via ipython +ipywidgets==8.1.7 + # via + # -r docs.in + # ipympl jedi==0.19.2 # via ipython jinja2==3.1.6 @@ -70,9 +78,9 @@ jinja2==3.1.6 # nbconvert # nbsphinx # sphinx -jsonschema==4.25.0 +jsonschema==4.25.1 # via nbformat -jsonschema-specifications==2025.4.1 +jsonschema-specifications==2025.9.1 # via jsonschema jupyter-client==8.6.3 # via @@ -87,11 +95,13 @@ jupyter-core==5.8.1 # nbformat jupyterlab-pygments==0.3.0 # via nbconvert +jupyterlab-widgets==3.0.15 + # via ipywidgets markdown-it-py==3.0.0 # via # mdit-py-plugins # myst-parser -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # nbconvert @@ -99,11 +109,11 @@ matplotlib-inline==0.1.7 # via # ipykernel # ipython -mdit-py-plugins==0.4.2 +mdit-py-plugins==0.5.0 # via myst-parser mdurl==0.1.2 # via markdown-it-py -mistune==3.1.3 +mistune==3.1.4 # via nbconvert myst-parser==4.0.1 # via -r docs.in @@ -122,25 +132,25 @@ nest-asyncio==1.6.0 # via ipykernel pandocfilters==1.5.1 # via nbconvert -parso==0.8.4 +parso==0.8.5 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.3.8 +platformdirs==4.4.0 # via # jupyter-core # pooch pooch==1.8.2 # via -r docs.in -prompt-toolkit==3.0.51 +prompt-toolkit==3.0.52 # via ipython -psutil==7.0.0 +psutil==7.1.0 # via ipykernel ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pydantic-settings==2.10.1 +pydantic-settings==2.11.0 # via autodoc-pydantic pydata-sphinx-theme==0.16.1 # via -r docs.in @@ -154,9 +164,9 @@ pygments==2.19.2 # sphinx python-dotenv==1.1.1 # via pydantic-settings -pyyaml==6.0.2 +pyyaml==6.0.3 # via myst-parser -pyzmq==27.0.1 +pyzmq==27.1.0 # via # ipykernel # jupyter-client @@ -164,17 +174,17 @@ referencing==0.36.2 # via # jsonschema # jsonschema-specifications -requests==2.32.4 +requests==2.32.5 # via # pooch # sphinx -rpds-py==0.26.0 +rpds-py==0.27.1 # via # jsonschema # referencing snowballstemmer==3.0.1 # via sphinx -soupsieve==2.7 +soupsieve==2.8 # via beautifulsoup4 sphinx==8.1.3 # via @@ -208,14 +218,16 @@ stack-data==0.6.3 # via ipython tinycss2==1.4.0 # via bleach -tornado==6.5.1 +tornado==6.5.2 # via # ipykernel # jupyter-client traitlets==5.14.3 # via # ipykernel + # ipympl # ipython + # ipywidgets # jupyter-client # jupyter-core # matplotlib-inline @@ -225,9 +237,11 @@ traitlets==5.14.3 # nbsphinx urllib3==2.5.0 # via requests -wcwidth==0.2.13 +wcwidth==0.2.14 # via prompt-toolkit webencodings==0.5.1 # via # bleach # tinycss2 +widgetsnbextension==4.0.14 + # via ipywidgets diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index a2b4de295..088d0c288 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,7 +6,7 @@ # requirements upgrade # -r test.txt -mypy==1.17.1 +mypy==1.18.2 # via -r mypy.in mypy-extensions==1.1.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index f28ec6924..a531c7c10 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -12,7 +12,7 @@ annotated-types==0.7.0 # via pydantic certifi==2025.8.3 # via requests -charset-normalizer==3.4.2 +charset-normalizer==3.4.3 # via requests contourpy==1.3.3 # via matplotlib @@ -20,13 +20,13 @@ cyclebane==24.10.0 # via sciline cycler==0.12.1 # via matplotlib -dnspython==2.7.0 +dnspython==2.8.0 # via email-validator -email-validator==2.2.0 +email-validator==2.3.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -fonttools==4.59.0 +fonttools==4.60.1 # via matplotlib graphviz==0.21 # via -r nightly.in @@ -40,14 +40,14 @@ idna==3.10 # requests iniconfig==2.1.0 # via pytest -kiwisolver==1.4.8 +kiwisolver==1.4.10rc0 # via matplotlib lazy-loader==0.4 # via # plopp # scippneutron # tof -matplotlib==3.10.5 +matplotlib==3.10.6 # via # mpltoolbox # plopp @@ -55,7 +55,7 @@ mpltoolbox==25.5.0 # via scippneutron networkx==3.5 # via cyclebane -numpy==2.3.2 +numpy==2.3.3 # via # contourpy # h5py @@ -70,11 +70,11 @@ packaging==25.0 # matplotlib # pooch # pytest -pandas==2.3.1 +pandas==2.3.3 # via -r nightly.in pillow==11.3.0 # via matplotlib -platformdirs==4.3.8 +platformdirs==4.4.0 # via pooch plopp @ git+https://github.com/scipp/plopp@main # via @@ -85,15 +85,15 @@ pluggy==1.6.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.12.0a1 +pydantic==2.12.0b1 # via scippneutron -pydantic-core==2.37.2 +pydantic-core==2.40.1 # via pydantic pygments==2.19.2 # via pytest -pyparsing==3.2.3 +pyparsing==3.3.0a1 # via matplotlib -pytest==8.4.1 +pytest==8.4.2 # via -r nightly.in python-dateutil==2.9.0.post0 # via @@ -102,7 +102,7 @@ python-dateutil==2.9.0.post0 # scippneutron pytz==2025.2 # via pandas -requests==2.32.4 +requests==2.32.5 # via pooch sciline @ git+https://github.com/scipp/sciline@main # via @@ -124,22 +124,22 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.16.1 +scipy==1.16.2 # via # scippneutron # scippnexus # tof six==1.17.0 # via python-dateutil -tof==25.5.0 +tof==25.9.0 # via -r nightly.in -typing-extensions==4.14.1 +typing-extensions==4.15.0 # via # pydantic # pydantic-core # sciline # typing-inspection -typing-inspection==0.4.1 +typing-inspection==0.4.2 # via pydantic tzdata==2025.2 # via pandas diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 3e288557c..1c80de170 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,17 +9,17 @@ cfgv==3.4.0 # via pre-commit distlib==0.4.0 # via virtualenv -filelock==3.18.0 +filelock==3.19.1 # via virtualenv -identify==2.6.12 +identify==2.6.15 # via pre-commit nodeenv==1.9.1 # via pre-commit -platformdirs==4.3.8 +platformdirs==4.4.0 # via virtualenv -pre-commit==4.2.0 +pre-commit==4.3.0 # via -r static.in -pyyaml==6.0.2 +pyyaml==6.0.3 # via pre-commit -virtualenv==20.33.1 +virtualenv==20.34.0 # via pre-commit From 664eca72d5deb7f5ec33ed52fa77ba5b272bd377 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 6 Oct 2025 13:15:59 +0200 Subject: [PATCH 195/330] Zero out y component in fake data --- .../docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index b32de9148..9355ec2ab 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -99,6 +99,8 @@ " monitor.coords['detector_number'] = sc.index(0)\n", " # Halfway between the bank and the sample:\n", " monitor.coords['position'] = base.coords['position'].mean() / 2\n", + " # Zero out the y-component because the monitor is in the sample plane:\n", + " monitor.coords['position'].fields.y = sc.scalar(0.0, unit=monitor.coords['position'].unit)\n", " return McStasDetectorData[RunType](monitor)\n", "\n", "\n", From f0700c407cd84c9d090297b070b86e54983f3d16 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 6 Oct 2025 16:31:55 +0200 Subject: [PATCH 196/330] Fill ROI --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 6 +- .../src/ess/bifrost/single_crystal/q_map.py | 129 ++++++++++++++++-- 2 files changed, 121 insertions(+), 14 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index 9355ec2ab..e8a8122d3 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -162,9 +162,9 @@ "outputs": [], "source": [ "make_q_map(counts,\n", - " q_parallel_bins=sc.linspace('Q_parallel', -3, 3, 200, unit='1/Å'),\n", - " q_perpendicular_bins=sc.linspace('Q_perpendicular', -3, 3, 200, unit='1/Å'),\n", - " sample_rotation_bins=180,\n", + " q_parallel_bins=sc.linspace('Q_parallel', -3, 3, 100, unit='1/Å'),\n", + " q_perpendicular_bins=sc.linspace('Q_perpendicular', -3, 3, 100, unit='1/Å'),\n", + " sample_rotation_bins=90,\n", ")" ] } diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index 1f82eeeb3..208982f31 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -4,11 +4,13 @@ """Build a Q-map for single crystal diffraction.""" from collections.abc import Callable +from typing import Any +import numpy as np +import numpy.typing as npt import plopp as pp import scipp as sc from matplotlib.axes import Axes -from matplotlib.patches import Circle from plopp.widgets import Box from ess.spectroscopy.types import DetectorCountsWithQ, RunType @@ -62,6 +64,11 @@ def make_q_map( q_parallel_bins: int | sc.Variable, q_perpendicular_bins: int | sc.Variable, sample_rotation_bins: int | sc.Variable, + *, + circle_n_points: int = 100, + roi_fill_alpha: float = 0.2, + roi_fill_color: Any = 'C1', + roi_line_color: Any = 'C1', ) -> Box: """Build a figure with a 2D Q-map and a 1D slice for a range of Q values.""" import ipywidgets as ipw @@ -96,22 +103,122 @@ def make_q_slice(da: sc.DataArray, q_range: tuple[float, float]) -> sc.DataArray q_map_fig = pp.imagefigure(q_map_node, aspect='equal', norm='log') q_slice_fig = pp.linefigure(q_slice_node) - lo_circle = _draw_circle(q_map_fig.ax, q_lo) - hi_circle = _draw_circle(q_map_fig.ax, q_hi) + roi_path = _ROICirclePath(q_lo, q_hi, circle_n_points) + roi_circle = _ROICircle( + roi_path, + q_map_fig.ax, + fill_alpha=roi_fill_alpha, + fill_color=roi_fill_color, + line_color=roi_line_color, + ) - def update_circle(q_range: tuple[float, float]) -> None: - lo_circle.radius, hi_circle.radius = q_range + def update_roi(q_range: tuple[float, float]) -> None: + roi_circle.set(*q_range) q_map_fig.fig.canvas.draw_idle() - pp.View(pp.Node(update_circle, slider_node)) - + pp.View(pp.Node(update_roi, slider_node)) return Box([[q_map_fig], [q_slice_fig], [slider]]) -def _draw_circle(ax: Axes, radius: float) -> Circle: - circle = Circle((0, 0), radius, edgecolor='C1', facecolor='none', linewidth=1.5) - ax.add_artist(circle) - return circle +class _ROICirclePath: + # The path is encoded as an array xy with shape (n_points * 2 + 1, 2). + # Where xy[:, 0] is the x coordinate and xy[:, 1] is the y coordinate. + # xy[:n_points] is the outer circle, xy[n_points:-1] is the inner circle. + # xy[-1] is the same as xy[0]; we close the path to be compatible with MPL. + + def __init__(self, r_inner: float, r_outer: float, n_points: int) -> None: + self._r_inner = r_inner + self._r_outer = r_outer + self._n_points = n_points + + self._angles = np.linspace(0, 2 * np.pi, n_points, endpoint=True) + # 2*n_points for the inner and outer circle, + # +1 to repeat the first point at the end. + self._xy = np.zeros((n_points * 2 + 1, 2), dtype=float) + + self.set_inner(r_inner) + self.set_outer(r_outer) + + @property + def r_inner(self) -> float: + return self._r_inner + + @property + def r_outer(self) -> float: + return self._r_outer + + @property + def closed_xy(self) -> npt.NDArray[float]: + # includes the last point + return self._xy + + @property + def inner(self) -> npt.NDArray[float]: + # does not include the last point + return self._xy[self._n_points : -1] + + @property + def outer(self) -> npt.NDArray[float]: + # does not include the last point + return self._xy[: self._n_points] + + @property + def open_path(self) -> npt.NDArray[float]: + # does not include the last point + return self._xy[:-1] + + def set_inner(self, r: float) -> None: + # reverse=True makes MPL render this circle as a cutout. + self._r_inner = r + x, y = self.inner.T + self._set_circle(x, y, r, reverse=True) + + def set_outer(self, r: float) -> None: + self._r_outer = r + x, y = self.outer.T + self._set_circle(x, y, r, reverse=False) + self._xy[-1] = self._xy[0] + + def _set_circle( + self, x: npt.NDArray[float], y: npt.NDArray[float], r: float, reverse: bool + ) -> None: + if reverse: + angles = self._angles[::-1] + else: + angles = self._angles + + np.cos(angles, out=x) + x *= r + + np.sin(angles, out=y) + y *= r + + +class _ROICircle: + def __init__( + self, + path: _ROICirclePath, + ax: Axes, + *, + fill_alpha: float = 0.2, + fill_color: Any = 'C1', + line_color: Any = 'C1', + ) -> None: + self._path = path + self._fill = ax.fill( + *self._path.open_path.T, fill_color, alpha=fill_alpha, zorder=-1 + )[0] + self._inner = ax.plot(*self._path.inner.T, c=line_color, zorder=2)[0] + self._outer = ax.plot(*self._path.outer.T, c=line_color, zorder=2)[0] + + def set(self, r_inner: float, r_outer: float) -> None: + if r_inner != self._path.r_inner: + self._path.set_inner(r_inner) + self._inner.set_data(*self._path.inner.T) + if r_outer != self._path.r_outer: + self._path.set_outer(r_outer) + self._outer.set_data(*self._path.outer.T) + self._fill.set_xy(self._path.closed_xy) def _empty_angle_array_like( From d9b6dda9ac49b1c02518d04f2db88563e11f2ab7 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 6 Oct 2025 16:32:45 +0200 Subject: [PATCH 197/330] Add notebook to TOC --- packages/essspectroscopy/docs/user-guide/bifrost/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/index.md b/packages/essspectroscopy/docs/user-guide/bifrost/index.md index 1a4449278..c7cca4364 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/index.md +++ b/packages/essspectroscopy/docs/user-guide/bifrost/index.md @@ -25,6 +25,7 @@ hidden: --- bifrost-reduction +bifrost-bragg-peak-monitor ``` ## Advanced Tools From a7c194df2bda7d5daa0e5142d171c6edf759bf35 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 6 Oct 2025 16:34:42 +0200 Subject: [PATCH 198/330] Only import Box in a function To avoid making ipywidgets a hard dependency. --- .../essspectroscopy/src/ess/bifrost/single_crystal/q_map.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index 208982f31..c271ee4f5 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -11,7 +11,6 @@ import plopp as pp import scipp as sc from matplotlib.axes import Axes -from plopp.widgets import Box from ess.spectroscopy.types import DetectorCountsWithQ, RunType @@ -69,9 +68,10 @@ def make_q_map( roi_fill_alpha: float = 0.2, roi_fill_color: Any = 'C1', roi_line_color: Any = 'C1', -) -> Box: +) -> Any: """Build a figure with a 2D Q-map and a 1D slice for a range of Q values.""" import ipywidgets as ipw + from plopp.widgets import Box def make_q_hist(da: sc.DataArray) -> sc.DataArray: return da.hist( From c34af380f77ea4eb1ae12b22af29cef69b6b571c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 6 Oct 2025 16:35:33 +0200 Subject: [PATCH 199/330] Simplify draw call --- .../essspectroscopy/src/ess/bifrost/single_crystal/q_map.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index c271ee4f5..756217772 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -114,7 +114,7 @@ def make_q_slice(da: sc.DataArray, q_range: tuple[float, float]) -> sc.DataArray def update_roi(q_range: tuple[float, float]) -> None: roi_circle.set(*q_range) - q_map_fig.fig.canvas.draw_idle() + q_map_fig.canvas.draw() pp.View(pp.Node(update_roi, slider_node)) return Box([[q_map_fig], [q_slice_fig], [slider]]) From d0773ffb00c72889ba470625005b57fc51b12a1c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 6 Oct 2025 16:36:41 +0200 Subject: [PATCH 200/330] Explain unusual view --- .../essspectroscopy/src/ess/bifrost/single_crystal/q_map.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index 756217772..4e80a53c0 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -116,6 +116,8 @@ def update_roi(q_range: tuple[float, float]) -> None: roi_circle.set(*q_range) q_map_fig.canvas.draw() + # Create aview without any output so that `update_roi` gets called + # when the slider is moved. See https://github.com/scipp/plopp/pull/496 pp.View(pp.Node(update_roi, slider_node)) return Box([[q_map_fig], [q_slice_fig], [slider]]) From ba925a70390c90adfe412d185afb586cb852da8c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 7 Oct 2025 09:38:56 +0200 Subject: [PATCH 201/330] Fix typo Co-authored-by: Neil Vaytet <39047984+nvaytet@users.noreply.github.com> --- .../essspectroscopy/src/ess/bifrost/single_crystal/q_map.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index 4e80a53c0..c7ea56fae 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -116,7 +116,7 @@ def update_roi(q_range: tuple[float, float]) -> None: roi_circle.set(*q_range) q_map_fig.canvas.draw() - # Create aview without any output so that `update_roi` gets called + # Create a view without any output so that `update_roi` gets called # when the slider is moved. See https://github.com/scipp/plopp/pull/496 pp.View(pp.Node(update_roi, slider_node)) return Box([[q_map_fig], [q_slice_fig], [slider]]) From 02b352ff4fac298e0c227728ec04476c1ca57b84 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 7 Oct 2025 09:40:58 +0200 Subject: [PATCH 202/330] Use consistent names --- .../src/ess/bifrost/single_crystal/q_map.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index c7ea56fae..65b986748 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -154,6 +154,11 @@ def closed_xy(self) -> npt.NDArray[float]: # includes the last point return self._xy + @property + def open_xy(self) -> npt.NDArray[float]: + # does not include the last point + return self._xy[:-1] + @property def inner(self) -> npt.NDArray[float]: # does not include the last point @@ -164,11 +169,6 @@ def outer(self) -> npt.NDArray[float]: # does not include the last point return self._xy[: self._n_points] - @property - def open_path(self) -> npt.NDArray[float]: - # does not include the last point - return self._xy[:-1] - def set_inner(self, r: float) -> None: # reverse=True makes MPL render this circle as a cutout. self._r_inner = r @@ -208,7 +208,7 @@ def __init__( ) -> None: self._path = path self._fill = ax.fill( - *self._path.open_path.T, fill_color, alpha=fill_alpha, zorder=-1 + *self._path.open_xy.T, fill_color, alpha=fill_alpha, zorder=-1 )[0] self._inner = ax.plot(*self._path.inner.T, c=line_color, zorder=2)[0] self._outer = ax.plot(*self._path.outer.T, c=line_color, zorder=2)[0] From 30a33b0e334752f1e06f8db1181c40cd961e5ea1 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 8 Oct 2025 09:28:25 +0200 Subject: [PATCH 203/330] Use a constant bin width --- .../docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index e8a8122d3..d2bbeaba8 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -164,7 +164,7 @@ "make_q_map(counts,\n", " q_parallel_bins=sc.linspace('Q_parallel', -3, 3, 100, unit='1/Å'),\n", " q_perpendicular_bins=sc.linspace('Q_perpendicular', -3, 3, 100, unit='1/Å'),\n", - " sample_rotation_bins=90,\n", + " sample_rotation_bins=sc.scalar(1.0, unit='deg'),\n", ")" ] } From 39c4910ddf3720b6faa462fd5725ead8b52059bd Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 8 Oct 2025 16:34:47 +0200 Subject: [PATCH 204/330] Add providers for computing Q histograms --- .../src/ess/bifrost/single_crystal/q_map.py | 63 +++++++++++++++---- .../src/ess/bifrost/single_crystal/types.py | 16 +++++ 2 files changed, 67 insertions(+), 12 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index 65b986748..610b73a6c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -14,7 +14,16 @@ from ess.spectroscopy.types import DetectorCountsWithQ, RunType -from .types import CountsWithQMapCoords, QProjection +from .types import ( + CountsWithQMapCoords, + Q2dHistogram, + QHistogram, + QParallelBins, + QPerpendicularBins, + QProjection, + QRange, + SampleRotationBins, +) def project_momentum_transfer( @@ -58,6 +67,37 @@ def default_q_projection() -> QProjection: ) +def histogram_q_2d( + events: CountsWithQMapCoords[RunType], + q_parallel_bins: QParallelBins, + q_perpendicular_bins: QPerpendicularBins, +) -> Q2dHistogram[RunType]: + """Histogram the data in Q_parallel and Q_perpendicular""" + return Q2dHistogram[RunType]( + events.hist(Q_perpendicular=q_perpendicular_bins, Q_parallel=q_parallel_bins) + ) + + +def integrate_q( + events: CountsWithQMapCoords[RunType], + q_range: QRange, + sample_rotation_bins: SampleRotationBins, +) -> QHistogram[RunType]: + """Integrate the data over |Q| and histogram in the sample rotation.""" + unit = events.bins.coords['Q'].unit + lo = q_range[0].to(unit=unit) + hi = q_range[1].to(unit=unit) + sliced = events.bins['Q', lo:hi] + try: + return QHistogram[RunType](sliced.hist(a3=sample_rotation_bins)) + except ValueError as err: + if "empty data range" in err.args[0].lower(): + # This happens when the user selects an empty range Q range, + # which is mainly a problem in the widget. + return QHistogram[RunType](_empty_angle_array_like(sliced)) + raise + + def make_q_map( events: sc.DataArray, q_parallel_bins: int | sc.Variable, @@ -74,21 +114,15 @@ def make_q_map( from plopp.widgets import Box def make_q_hist(da: sc.DataArray) -> sc.DataArray: - return da.hist( - Q_perpendicular=q_perpendicular_bins, Q_parallel=q_parallel_bins - ).rename(Q_perpendicular=r'$Q_{\perp}$', Q_parallel='$Q_{||}$') + return histogram_q_2d(da, q_parallel_bins, q_perpendicular_bins).rename( + Q_perpendicular=r'$Q_{\perp}$', Q_parallel='$Q_{||}$' + ) def make_q_slice(da: sc.DataArray, q_range: tuple[float, float]) -> sc.DataArray: unit = da.bins.coords['Q'].unit lo = q_range[0] * unit hi = q_range[1] * unit - sliced = da.bins['Q', lo:hi] - try: - return sliced.hist(a3=sample_rotation_bins).rename(a3='sample_rotation') - except ValueError as err: - if "empty data range" in err.args[0].lower(): - return _empty_angle_array_like(sliced) - raise + return integrate_q(da, (lo, hi), sample_rotation_bins) q_lo = events.bins.coords['Q'].min().value q_hi = events.bins.coords['Q'].max().value @@ -244,4 +278,9 @@ def _empty_angle_array_like( ) -providers = (default_q_projection, project_momentum_transfer) +providers = ( + default_q_projection, + integrate_q, + histogram_q_2d, + project_momentum_transfer, +) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py index 46b5a43b6..90f36452c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py @@ -4,6 +4,7 @@ """Domain types for single crystal diffraction on BIFROST.""" from dataclasses import dataclass +from typing import NewType import sciline import scipp as sc @@ -20,3 +21,18 @@ class QProjection: parallel: sc.Variable perpendicular: sc.Variable + + +QParallelBins = NewType("QParallelBins", sc.Variable) +QPerpendicularBins = NewType("QPerpendicularBins", sc.Variable) + + +class Q2dHistogram(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + +class QHistogram(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + +QRange = NewType("QRange", tuple[sc.Variable, sc.Variable]) + +SampleRotationBins = NewType("SampleRotationBins", sc.Variable) From 1b0b1ad6dc3b466e7ed860784c3a8d7628805ab0 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 9 Oct 2025 13:33:54 +0200 Subject: [PATCH 205/330] Clearer names --- .../src/ess/bifrost/single_crystal/q_map.py | 24 ++++++++--------- .../src/ess/bifrost/single_crystal/types.py | 27 ++++++++++++++++--- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index 610b73a6c..af6f9ff2b 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -16,8 +16,8 @@ from .types import ( CountsWithQMapCoords, - Q2dHistogram, - QHistogram, + IntensityQparQperp, + IntensitySampleRotation, QParallelBins, QPerpendicularBins, QProjection, @@ -67,13 +67,13 @@ def default_q_projection() -> QProjection: ) -def histogram_q_2d( +def histogram_qparallel_qperpendicular( events: CountsWithQMapCoords[RunType], q_parallel_bins: QParallelBins, q_perpendicular_bins: QPerpendicularBins, -) -> Q2dHistogram[RunType]: +) -> IntensityQparQperp[RunType]: """Histogram the data in Q_parallel and Q_perpendicular""" - return Q2dHistogram[RunType]( + return IntensityQparQperp[RunType]( events.hist(Q_perpendicular=q_perpendicular_bins, Q_parallel=q_parallel_bins) ) @@ -82,19 +82,19 @@ def integrate_q( events: CountsWithQMapCoords[RunType], q_range: QRange, sample_rotation_bins: SampleRotationBins, -) -> QHistogram[RunType]: +) -> IntensitySampleRotation[RunType]: """Integrate the data over |Q| and histogram in the sample rotation.""" unit = events.bins.coords['Q'].unit lo = q_range[0].to(unit=unit) hi = q_range[1].to(unit=unit) sliced = events.bins['Q', lo:hi] try: - return QHistogram[RunType](sliced.hist(a3=sample_rotation_bins)) + return IntensitySampleRotation[RunType](sliced.hist(a3=sample_rotation_bins)) except ValueError as err: if "empty data range" in err.args[0].lower(): # This happens when the user selects an empty range Q range, # which is mainly a problem in the widget. - return QHistogram[RunType](_empty_angle_array_like(sliced)) + return IntensitySampleRotation[RunType](_empty_angle_array_like(sliced)) raise @@ -114,9 +114,9 @@ def make_q_map( from plopp.widgets import Box def make_q_hist(da: sc.DataArray) -> sc.DataArray: - return histogram_q_2d(da, q_parallel_bins, q_perpendicular_bins).rename( - Q_perpendicular=r'$Q_{\perp}$', Q_parallel='$Q_{||}$' - ) + return histogram_qparallel_qperpendicular( + da, q_parallel_bins, q_perpendicular_bins + ).rename(Q_perpendicular=r'$Q_{\perp}$', Q_parallel='$Q_{||}$') def make_q_slice(da: sc.DataArray, q_range: tuple[float, float]) -> sc.DataArray: unit = da.bins.coords['Q'].unit @@ -281,6 +281,6 @@ def _empty_angle_array_like( providers = ( default_q_projection, integrate_q, - histogram_q_2d, + histogram_qparallel_qperpendicular, project_momentum_transfer, ) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py index 90f36452c..2f155edf2 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py @@ -12,7 +12,15 @@ from ess.spectroscopy.types import RunType -class CountsWithQMapCoords(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class CountsWithQMapCoords(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Counts with various Q coordinates. + + Has (event) coordinates: + + - 'Q_parallel': projection along the beam direction, aka 'Qz' + - 'Q_perpendicular': perpendicular component of Q to the beam, aka 'Qx' + - 'Q': absolute value of Q + """ @dataclass(frozen=True, slots=True) @@ -24,15 +32,28 @@ class QProjection: QParallelBins = NewType("QParallelBins", sc.Variable) +"""Binning in Q_parallel (aka Qz).""" + QPerpendicularBins = NewType("QPerpendicularBins", sc.Variable) +"""Binning in Q_perpendicular (aka Qx).""" + +class IntensityQparQperp(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Histogrammed data in Q_parallel and Q_perpendicular. -class Q2dHistogram(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + Here, Q_parallel is the component of Q along the beam direction and Q_perpendicular + is the non-zero component of Q perpendicular to the beam direction. + For BIFROST, these are Qz and Qx respectively. (Qy is zero because the + detector is in the x-z plane with the sample.) + """ -class QHistogram(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class IntensitySampleRotation(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Data integrated over |Q| and histogrammed in the sample rotation angle.""" QRange = NewType("QRange", tuple[sc.Variable, sc.Variable]) +"""Range of |Q| to integrate over.""" SampleRotationBins = NewType("SampleRotationBins", sc.Variable) +"""Binning in the sample rotation angle.""" From e60474beeca93d4efa06be42c77e11d1247c1dea Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Wed, 22 Oct 2025 15:00:53 +0200 Subject: [PATCH 206/330] tox -e deps --- .../essspectroscopy/requirements/base.txt | 22 ++++++++-------- .../essspectroscopy/requirements/basetest.txt | 10 +++---- packages/essspectroscopy/requirements/ci.txt | 18 ++++++------- packages/essspectroscopy/requirements/dev.txt | 10 +++---- .../essspectroscopy/requirements/docs.txt | 18 ++++++------- .../essspectroscopy/requirements/nightly.txt | 26 +++++++++---------- .../essspectroscopy/requirements/static.txt | 6 ++--- 7 files changed, 54 insertions(+), 56 deletions(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index bc5704f84..a39613eab 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -17,17 +17,17 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==25.9.0 +essreduce==25.10.1 # via -r base.in fonttools==4.60.1 # via matplotlib graphviz==0.21 # via -r base.in -h5py==3.14.0 +h5py==3.15.1 # via # scippneutron # scippnexus -idna==3.10 +idna==3.11 # via email-validator kiwisolver==1.4.9 # via matplotlib @@ -36,15 +36,15 @@ lazy-loader==0.4 # plopp # scippneutron # tof -matplotlib==3.10.6 +matplotlib==3.10.7 # via # mpltoolbox # plopp -mpltoolbox==25.5.0 +mpltoolbox==25.10.0 # via scippneutron networkx==3.5 # via cyclebane -numpy==2.3.3 +numpy==2.3.4 # via # contourpy # h5py @@ -59,15 +59,15 @@ packaging==25.0 # matplotlib pandas==2.3.3 # via -r base.in -pillow==11.3.0 +pillow==12.0.0 # via matplotlib -plopp==25.9.0 +plopp==25.10.0 # via # scippneutron # tof -pydantic==2.11.9 +pydantic==2.12.3 # via scippneutron -pydantic-core==2.33.2 +pydantic-core==2.41.4 # via pydantic pyparsing==3.2.5 # via matplotlib @@ -106,7 +106,7 @@ scipy==1.16.2 # tof six==1.17.0 # via python-dateutil -tof==25.9.0 +tof==25.10.1 # via -r base.in typing-extensions==4.15.0 # via diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 7e375f3ed..375775b1d 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,19 +5,19 @@ # # requirements upgrade # -certifi==2025.8.3 +certifi==2025.10.5 # via requests -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -idna==3.10 +idna==3.11 # via requests -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest packaging==25.0 # via # pooch # pytest -platformdirs==4.4.0 +platformdirs==4.5.0 # via pooch pluggy==1.6.0 # via pytest diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 03be72d55..0e48c7f7a 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,19 +5,19 @@ # # requirements upgrade # -cachetools==6.2.0 +cachetools==6.2.1 # via tox -certifi==2025.8.3 +certifi==2025.10.5 # via requests chardet==5.2.0 # via tox -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.19.1 +filelock==3.20.0 # via # tox # virtualenv @@ -25,28 +25,28 @@ gitdb==4.0.12 # via gitpython gitpython==3.1.45 # via -r ci.in -idna==3.10 +idna==3.11 # via requests packaging==25.0 # via # -r ci.in # pyproject-api # tox -platformdirs==4.4.0 +platformdirs==4.5.0 # via # tox # virtualenv pluggy==1.6.0 # via tox -pyproject-api==1.9.1 +pyproject-api==1.10.0 # via tox requests==2.32.5 # via -r ci.in smmap==5.0.2 # via gitdb -tox==4.30.3 +tox==4.31.0 # via -r ci.in urllib3==2.5.0 # via requests -virtualenv==20.34.0 +virtualenv==20.35.3 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 7787cf9f5..90be6d362 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -20,7 +20,7 @@ argon2-cffi==25.1.0 # via jupyter-server argon2-cffi-bindings==25.1.0 # via argon2-cffi -arrow==1.3.0 +arrow==1.4.0 # via isoduration async-lru==2.0.5 # via jupyterlab @@ -30,7 +30,7 @@ click==8.3.0 # via # pip-compile-multi # pip-tools -copier==9.10.2 +copier==9.10.3 # via -r dev.in dunamai==1.25.0 # via copier @@ -89,7 +89,7 @@ prometheus-client==0.23.1 # via jupyter-server pycparser==2.23 # via cffi -python-json-logger==3.3.0 +python-json-logger==4.0.0 # via jupyter-events questionary==2.1.1 # via copier @@ -113,13 +113,11 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -types-python-dateutil==2.9.0.20250822 - # via arrow uri-template==1.3.0 # via jsonschema webcolors==24.11.1 # via jsonschema -websocket-client==1.8.0 +websocket-client==1.9.0 # via jupyter-server wheel==0.45.1 # via pip-tools diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 0b927e91a..213580e4c 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -12,7 +12,7 @@ alabaster==1.0.0 # via sphinx asttokens==3.0.0 # via stack-data -attrs==25.3.0 +attrs==25.4.0 # via # jsonschema # referencing @@ -28,9 +28,9 @@ beautifulsoup4==4.14.2 # pydata-sphinx-theme bleach[css]==6.2.0 # via nbconvert -certifi==2025.8.3 +certifi==2025.10.5 # via requests -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests comm==0.2.3 # via @@ -54,9 +54,9 @@ fastjsonschema==2.21.2 # via nbformat imagesize==1.4.1 # via sphinx -ipykernel==6.30.1 +ipykernel==7.0.1 # via -r docs.in -ipympl==0.9.7 +ipympl==0.9.8 # via -r docs.in ipython==9.6.0 # via @@ -86,7 +86,7 @@ jupyter-client==8.6.3 # via # ipykernel # nbclient -jupyter-core==5.8.1 +jupyter-core==5.9.1 # via # ipykernel # jupyter-client @@ -136,7 +136,7 @@ parso==0.8.5 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.4.0 +platformdirs==4.5.0 # via # jupyter-core # pooch @@ -144,7 +144,7 @@ pooch==1.8.2 # via -r docs.in prompt-toolkit==3.0.52 # via ipython -psutil==7.1.0 +psutil==7.1.1 # via ipykernel ptyprocess==0.7.0 # via pexpect @@ -170,7 +170,7 @@ pyzmq==27.1.0 # via # ipykernel # jupyter-client -referencing==0.36.2 +referencing==0.37.0 # via # jsonschema # jsonschema-specifications diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index a531c7c10..2ede728d4 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -10,9 +10,9 @@ annotated-types==0.7.0 # via pydantic -certifi==2025.8.3 +certifi==2025.10.5 # via requests -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests contourpy==1.3.3 # via matplotlib @@ -30,15 +30,15 @@ fonttools==4.60.1 # via matplotlib graphviz==0.21 # via -r nightly.in -h5py==3.14.0 +h5py==3.15.1 # via # scippneutron # scippnexus -idna==3.10 +idna==3.11 # via # email-validator # requests -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest kiwisolver==1.4.10rc0 # via matplotlib @@ -47,15 +47,15 @@ lazy-loader==0.4 # plopp # scippneutron # tof -matplotlib==3.10.6 +matplotlib==3.10.7 # via # mpltoolbox # plopp -mpltoolbox==25.5.0 +mpltoolbox==25.10.0 # via scippneutron networkx==3.5 # via cyclebane -numpy==2.3.3 +numpy==2.3.4 # via # contourpy # h5py @@ -72,9 +72,9 @@ packaging==25.0 # pytest pandas==2.3.3 # via -r nightly.in -pillow==11.3.0 +pillow==12.0.0 # via matplotlib -platformdirs==4.4.0 +platformdirs==4.5.0 # via pooch plopp @ git+https://github.com/scipp/plopp@main # via @@ -85,9 +85,9 @@ pluggy==1.6.0 # via pytest pooch==1.8.2 # via -r nightly.in -pydantic==2.12.0b1 +pydantic==2.12.3 # via scippneutron -pydantic-core==2.40.1 +pydantic-core==2.41.4 # via pydantic pygments==2.19.2 # via pytest @@ -131,7 +131,7 @@ scipy==1.16.2 # tof six==1.17.0 # via python-dateutil -tof==25.9.0 +tof==25.10.1 # via -r nightly.in typing-extensions==4.15.0 # via diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 1c80de170..aec8f4c81 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,17 +9,17 @@ cfgv==3.4.0 # via pre-commit distlib==0.4.0 # via virtualenv -filelock==3.19.1 +filelock==3.20.0 # via virtualenv identify==2.6.15 # via pre-commit nodeenv==1.9.1 # via pre-commit -platformdirs==4.4.0 +platformdirs==4.5.0 # via virtualenv pre-commit==4.3.0 # via -r static.in pyyaml==6.0.3 # via pre-commit -virtualenv==20.34.0 +virtualenv==20.35.3 # via pre-commit From 8984be1438a85130f7ec4732863a63de9f54f8bf Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Mon, 13 Oct 2025 10:39:02 +0000 Subject: [PATCH 207/330] Add tests for BifrostQCutWorkflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create TestBifrostQCutWorkflow class with two comprehensive tests - test_cut_along_q_norm_and_energy_transfer: Tests cutting along |Q| and energy transfer - test_cut_along_qx_direction_and_energy_transfer: Tests cutting along Qx direction - Both tests verify: * Correct output dimensions and coordinates * Proper unit conversions * Count preservation (no events lost during cutting operation) - Tests follow existing patterns in workflow_test.py - All tests pass successfully Original prompt: We need to add tests for BifrostQCutWorkflow. TL;DR is that we want to be able to run something like `workflow.compute(CutData[SampleRun])` and verify the result (as far as feasible). @tests/bifrost/workflow_test.py demonstrates how similar workflows are created, thw Q-cut workflow is an extension. Follow-up: Please group the test in a class TestBifrostQCutworflow. Use better test names. Try if you can add an assertion for the sum over the result, to see if no counts were lost. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../tests/bifrost/workflow_test.py | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index afd8417c5..31e4fc26c 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -12,6 +12,7 @@ simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation, ) +from ess.bifrost.live import BifrostQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData from ess.spectroscopy.types import ( DetectorData, EnergyData, @@ -125,3 +126,92 @@ def test_simulation_workflow_produces_the_same_data_as_before( ) sc.testing.assert_allclose(energy_data.bins.data, expected.bins.data) + + +class TestBifrostQCutWorkflow: + @pytest.fixture + def qcut_workflow( + self, simulation_detector_names: list[NeXusDetectorName] + ) -> sciline.Pipeline: + workflow = BifrostQCutWorkflow(simulation_detector_names) + workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() + workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5( + tof_lookup_table_simulation() + ) + return workflow + + def test_cut_along_q_norm_and_energy_transfer( + self, qcut_workflow: sciline.Pipeline + ) -> None: + # Define cut axes for |Q| and energy transfer + axis_1 = CutAxis( + output='|Q|', + fn=lambda sample_table_momentum_transfer: sc.norm( + sample_table_momentum_transfer + ), + bins=sc.linspace(dim='|Q|', start=0.0, stop=3.0, num=50, unit='1/angstrom'), + ) + axis_2 = CutAxis( + output='E', + fn=lambda energy_transfer: energy_transfer, + bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), + ) + + qcut_workflow[CutAxis1] = axis_1 + qcut_workflow[CutAxis2] = axis_2 + + # Compute both cut data and energy data to compare total counts + cut_data = qcut_workflow.compute(CutData[SampleRun]) + energy_data = qcut_workflow.compute(EnergyData[SampleRun]) + + # Verify the structure of the result + assert cut_data.bins is None # Should be histogrammed + assert set(cut_data.dims) == {'|Q|', 'E'} + assert cut_data.sizes['|Q|'] == 49 # num bins - 1 + assert cut_data.sizes['E'] == 49 + assert '|Q|' in cut_data.coords + assert 'E' in cut_data.coords + + # Check that coordinates have expected units + cut_data.coords['|Q|'].to(unit='1/angstrom') + cut_data.coords['E'].to(unit='meV') + + # Verify no counts were lost during the cut + total_counts_before = sc.sum(energy_data.bins.size()).value + total_counts_after = sc.sum(cut_data).value + assert total_counts_before == total_counts_after + + def test_cut_along_qx_direction_and_energy_transfer( + self, qcut_workflow: sciline.Pipeline + ) -> None: + # Test cutting along a specific Q direction (Qx) + axis_1 = CutAxis.from_q_vector( + output='Qx', + vec=sc.vector([1, 0, 0]), + bins=sc.linspace(dim='Qx', start=-2.0, stop=2.0, num=40, unit='1/angstrom'), + ) + axis_2 = CutAxis( + output='E', + fn=lambda energy_transfer: energy_transfer, + bins=sc.linspace(dim='E', start=-5.0, stop=5.0, num=30, unit='meV'), + ) + + qcut_workflow[CutAxis1] = axis_1 + qcut_workflow[CutAxis2] = axis_2 + + # Compute both cut data and energy data to compare total counts + cut_data = qcut_workflow.compute(CutData[SampleRun]) + energy_data = qcut_workflow.compute(EnergyData[SampleRun]) + + # Verify the result structure + assert cut_data.bins is None + assert set(cut_data.dims) == {'Qx', 'E'} + assert cut_data.sizes['Qx'] == 39 + assert cut_data.sizes['E'] == 29 + assert 'Qx' in cut_data.coords + assert 'E' in cut_data.coords + + # Verify no counts were lost during the cut + total_counts_before = sc.sum(energy_data.bins.size()).value + total_counts_after = sc.sum(cut_data).value + assert total_counts_before == total_counts_after From 4c044526f9d3212d423d7d51685e476b62e15558 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Mon, 13 Oct 2025 11:00:35 +0000 Subject: [PATCH 208/330] Preserve arc dimension in BifrostQCutWorkflow cut function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified BifrostQCutWorkflow and the cut method to preserve the arc dimension (renamed from triplet) in the output. The output is now 3-D with dimensions (arc, axis_1, axis_2) instead of 2-D. Changes: - Added ArcEnergy type (NewType alias for sc.Variable) in types.py - Added arc_energy() provider with values [2.7, 3.2, 3.8, 4.4, 5.0] meV - Modified cut() function to: - Rename triplet dimension to arc - Concat only over non-arc dimensions - Add arc coordinate with proper energy values - Updated existing tests to expect 3-D output with arc dimension - Added new test test_cut_preserves_arc_dimension to verify arc preservation All tests passing. Implemented using TDD (red-green cycle). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- Original prompt: We need to modify BifrostQCutWorkflow and in particular the cut method in @src/ess/bifrost/live.py --- the new requirement is to preserve the arc dimension (which should have length 5). I think the input EnergyData already has this dim, so all we might need to do is specify which dims to concat() (instead of all dims). The new output should be 3-D, with an arc dimension. There should be a coord with values [2.7, 3.2, 3.8, 4.4, 5.0] and unit=meV. Add a provider in the workflow instead of hardcoding (unless there is one already). Use TDD red/green. Follow-up: So the old code seems to use triplet instead of arc. We cannot change this right now, but our modified cut function should rename triplet->arc. The arc_number function is weird, not sure why it is needed (tracking down the original author!). For now, let us just create our own ArcEnergy type (NewType alias for sc.Variable) and set & use that. --- .../essspectroscopy/src/ess/bifrost/live.py | 38 ++++++++++++-- .../essspectroscopy/src/ess/bifrost/types.py | 5 ++ .../tests/bifrost/workflow_test.py | 49 +++++++++++++++++-- 3 files changed, 84 insertions(+), 8 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index b8569372f..4bf2fac55 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -16,6 +16,7 @@ RunType, ) +from .types import ArcEnergy from .workflow import BifrostWorkflow @@ -95,14 +96,31 @@ class CutData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """Data that was cut along CutAxis1 and CutAxis2.""" +def arc_energy() -> ArcEnergy: + """Provide the BIFROST arc energies. + + Returns + ------- + : + The final energies for each of the 5 BIFROST analyzer arcs. + """ + return ArcEnergy( + sc.array(dims=['arc'], values=[2.7, 3.2, 3.8, 4.4, 5.0], unit='meV') + ) + + def cut( - data: EnergyData[RunType], *, axis_1: CutAxis1, axis_2: CutAxis2 + data: EnergyData[RunType], + *, + axis_1: CutAxis1, + axis_2: CutAxis2, + arc_energy: ArcEnergy, ) -> CutData[RunType]: """Cut data along two axes. This function projects the input ``data`` expressed in :math:`Q` and :math:`\\Delta E` onto a 2D surface defined by the cut axes. - This integrates over the other dimensions. + This integrates over the other dimensions while preserving the arc dimension. Then, the projected data is histogrammed according to the axis bins. Parameters @@ -114,19 +132,30 @@ def cut( Defines the projection onto and binning in the first axis. axis_2: Defines the projection onto and binning in the second axis. + arc_energy: + The final energies for each analyzer arc. Returns ------- : - ``data`` projected and histogrammed along the cut axes. + ``data`` projected and histogrammed along the cut axes, with arc dimension. """ + # Rename triplet dimension to arc + data = data.rename_dims(triplet='arc') + + # Concat over all dimensions except arc + dims_to_concat = [dim for dim in data.dims if dim != 'arc'] new_coords = {axis_1.output, axis_2.output} - projected = data.bins.concat().transform_coords( + projected = data.bins.concat(dims_to_concat).transform_coords( new_coords, graph={axis_1.output: axis_1.fn, axis_2.output: axis_2.fn}, keep_inputs=False, ) projected = projected.drop_coords(list(set(projected.coords.keys()) - new_coords)) + + # Add arc coordinate + projected = projected.assign_coords(arc=arc_energy) + return CutData[RunType]( projected.hist({axis_2.output: axis_2.bins, axis_1.output: axis_1.bins}) ) @@ -135,5 +164,6 @@ def cut( def BifrostQCutWorkflow(detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: """Workflow for BIFROST to compute cuts in Q-E-space.""" workflow = BifrostWorkflow(detector_names) + workflow.insert(arc_energy) workflow.insert(cut) return workflow diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 958aae67d..13ba1044d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -6,6 +6,8 @@ This module supplements :mod:`ess.spectroscopy.types` with BIFROST-specific types. """ +from typing import NewType + import sciline import scipp as sc @@ -16,3 +18,6 @@ class ArcNumber(sciline.Scope[RunType, sc.Variable], sc.Variable): ... class McStasDetectorData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + +ArcEnergy = NewType('ArcEnergy', sc.Variable) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 31e4fc26c..469a42b97 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -164,15 +164,18 @@ def test_cut_along_q_norm_and_energy_transfer( cut_data = qcut_workflow.compute(CutData[SampleRun]) energy_data = qcut_workflow.compute(EnergyData[SampleRun]) - # Verify the structure of the result + # Verify the structure of the result (now 3-D with arc dimension) assert cut_data.bins is None # Should be histogrammed - assert set(cut_data.dims) == {'|Q|', 'E'} + assert set(cut_data.dims) == {'arc', '|Q|', 'E'} + assert cut_data.sizes['arc'] == 5 assert cut_data.sizes['|Q|'] == 49 # num bins - 1 assert cut_data.sizes['E'] == 49 + assert 'arc' in cut_data.coords assert '|Q|' in cut_data.coords assert 'E' in cut_data.coords # Check that coordinates have expected units + cut_data.coords['arc'].to(unit='meV') cut_data.coords['|Q|'].to(unit='1/angstrom') cut_data.coords['E'].to(unit='meV') @@ -203,11 +206,13 @@ def test_cut_along_qx_direction_and_energy_transfer( cut_data = qcut_workflow.compute(CutData[SampleRun]) energy_data = qcut_workflow.compute(EnergyData[SampleRun]) - # Verify the result structure + # Verify the result structure (now 3-D with arc dimension) assert cut_data.bins is None - assert set(cut_data.dims) == {'Qx', 'E'} + assert set(cut_data.dims) == {'arc', 'Qx', 'E'} + assert cut_data.sizes['arc'] == 5 assert cut_data.sizes['Qx'] == 39 assert cut_data.sizes['E'] == 29 + assert 'arc' in cut_data.coords assert 'Qx' in cut_data.coords assert 'E' in cut_data.coords @@ -215,3 +220,39 @@ def test_cut_along_qx_direction_and_energy_transfer( total_counts_before = sc.sum(energy_data.bins.size()).value total_counts_after = sc.sum(cut_data).value assert total_counts_before == total_counts_after + + def test_cut_preserves_arc_dimension( + self, qcut_workflow: sciline.Pipeline + ) -> None: + # Test that cut preserves the arc dimension (renamed from triplet) + axis_1 = CutAxis( + output='|Q|', + fn=lambda sample_table_momentum_transfer: sc.norm( + sample_table_momentum_transfer + ), + bins=sc.linspace(dim='|Q|', start=0.0, stop=3.0, num=50, unit='1/angstrom'), + ) + axis_2 = CutAxis( + output='E', + fn=lambda energy_transfer: energy_transfer, + bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), + ) + + qcut_workflow[CutAxis1] = axis_1 + qcut_workflow[CutAxis2] = axis_2 + + cut_data = qcut_workflow.compute(CutData[SampleRun]) + + # Verify the result is 3-D with arc dimension preserved + assert cut_data.bins is None + assert set(cut_data.dims) == {'arc', '|Q|', 'E'} + assert cut_data.sizes['arc'] == 5 + assert cut_data.sizes['|Q|'] == 49 + assert cut_data.sizes['E'] == 49 + + # Verify arc coordinate exists with correct values + assert 'arc' in cut_data.coords + expected_arc_energies = sc.array( + dims=['arc'], values=[2.7, 3.2, 3.8, 4.4, 5.0], unit='meV' + ) + sc.testing.assert_allclose(cut_data.coords['arc'], expected_arc_energies) From 67f833e4d6a07356e772bb62bb59f40fee3f7576 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 11:08:01 +0000 Subject: [PATCH 209/330] Apply automatic formatting --- packages/essspectroscopy/tests/bifrost/workflow_test.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 469a42b97..44caaab4a 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -221,9 +221,7 @@ def test_cut_along_qx_direction_and_energy_transfer( total_counts_after = sc.sum(cut_data).value assert total_counts_before == total_counts_after - def test_cut_preserves_arc_dimension( - self, qcut_workflow: sciline.Pipeline - ) -> None: + def test_cut_preserves_arc_dimension(self, qcut_workflow: sciline.Pipeline) -> None: # Test that cut preserves the arc dimension (renamed from triplet) axis_1 = CutAxis( output='|Q|', From 3975cba9bc344e2e6cbd502a9ed965134e7dd5c3 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Thu, 16 Oct 2025 11:07:12 +0000 Subject: [PATCH 210/330] Add comments --- packages/essspectroscopy/src/ess/bifrost/live.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index 4bf2fac55..0ebc034d8 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -141,6 +141,8 @@ def cut( ``data`` projected and histogrammed along the cut axes, with arc dimension. """ # Rename triplet dimension to arc + # TODO This is wrong, triplet is a flattened version of (arc, channel), but in + # unknown order. data = data.rename_dims(triplet='arc') # Concat over all dimensions except arc @@ -153,7 +155,8 @@ def cut( ) projected = projected.drop_coords(list(set(projected.coords.keys()) - new_coords)) - # Add arc coordinate + # Add arc coordinate. Note that is for identifying the arc, it should NOT be used + # as a replacement for a precise final_energy coordinate! projected = projected.assign_coords(arc=arc_energy) return CutData[RunType]( From 4155bd1562bc33d0d186eeed157c6366e31a8b3c Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Thu, 16 Oct 2025 12:45:45 +0000 Subject: [PATCH 211/330] Add folding mechanim --- .../src/ess/bifrost/detector.py | 92 ++++++++++++++++++- .../essspectroscopy/src/ess/bifrost/live.py | 29 +++--- .../tests/bifrost/workflow_test.py | 6 +- 3 files changed, 114 insertions(+), 13 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 1e1f81fda..5c322dd94 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -100,6 +100,12 @@ def merge_triplets( ) -> sc.DataArray: """Merge BIFROST detector triplets into a single data array. + This function attempts to fold the triplets into (arc, channel) dimensions + based on the detector_number coordinate. If the triplets form a regular + rectangular subset of the full 5x9 detector array, they will be folded + into those dimensions. Otherwise, they are concatenated along a 'triplet' + dimension. + Parameters ---------- triplets: @@ -108,8 +114,92 @@ def merge_triplets( Returns ------- : - Input data arrays stacked along the "triplet" dimension. + Input data arrays either folded into (arc, channel) dimensions or + stacked along the "triplet" dimension. """ + if len(triplets) == 0: + raise ValueError("At least one triplet is required") + + # Extract detector_number from first pixel of first tube in each triplet + # to determine arc and channel indices + detector_numbers = [] + for triplet in triplets: + if 'detector_number' not in triplet.coords: + # If no detector_number, fall back to simple concatenation + return sc.concat(triplets, dim="triplet") + # Get the first detector number (position [0, 0] in tube, length dims) + det_num = triplet.coords['detector_number']['tube', 0]['length', 0] + detector_numbers.append(det_num.value) + + # Calculate arc and channel indices based on detector_number layout + # BIFROST has 5 arcs, each with 9 channels, each with 3 tubes of 100 pixels + # detector_number runs 1 to 13500, folded as (arc=5, tube=3, channel=9, pixel=100) + # Layout within an arc: + # - pixels 0-99: channel 0, tube 0 + # - pixels 100-199: channel 1, tube 0 + # - ... + # - pixels 800-899: channel 8, tube 0 + # - pixels 900-999: channel 0, tube 1 + # - etc. + pixels_per_tube = 100 + tubes_per_channel = 3 + channels_per_arc = 9 + pixels_per_arc = pixels_per_tube * tubes_per_channel * channels_per_arc # 2700 + + arc_channel_pairs = [] + for det_num in detector_numbers: + # detector_number is 1-indexed + idx = det_num - 1 + arc = idx // pixels_per_arc + remainder = idx % pixels_per_arc + # Within an arc, pattern repeats every (pixels_per_tube * channels_per_arc) + # for each of the 3 tubes. Channel is determined by position within that. + channel = ( + (remainder % (pixels_per_tube * channels_per_arc)) // pixels_per_tube + ) + arc_channel_pairs.append((arc, channel)) + + # Sort triplets by (arc, channel) + sorted_indices = sorted(range(len(triplets)), key=lambda i: arc_channel_pairs[i]) + sorted_triplets = [triplets[i] for i in sorted_indices] + sorted_pairs = [arc_channel_pairs[i] for i in sorted_indices] + + # Check if the pairs form a regular rectangular grid + arcs = [pair[0] for pair in sorted_pairs] + channels = [pair[1] for pair in sorted_pairs] + + unique_arcs = sorted(set(arcs)) + unique_channels = sorted(set(channels)) + + # Check if we have a complete rectangular subset + expected_count = len(unique_arcs) * len(unique_channels) + if len(sorted_triplets) == expected_count: + # Verify that all (arc, channel) combinations are present + expected_pairs = [ + (arc, channel) for arc in unique_arcs for channel in unique_channels + ] + if sorted_pairs == expected_pairs: + # We have a regular grid, fold it + concatenated = sc.concat(sorted_triplets, dim='triplet') + try: + folded = concatenated.fold( + dim='triplet', + sizes={'arc': len(unique_arcs), 'channel': len(unique_channels)}, + ) + # Remove size-1 dimensions (e.g., if only one channel is present) + folded = folded.squeeze() + return folded + except Exception as e: + # If folding fails for any reason, fall back to triplet dim + import warnings + + warnings.warn( + f"Failed to fold triplets into (arc, channel): {e}", + stacklevel=2, + ) + pass + + # Fall back to simple concatenation if not a regular grid return sc.concat(triplets, dim="triplet") diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index 0ebc034d8..60de9bf84 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -120,8 +120,8 @@ def cut( This function projects the input ``data`` expressed in :math:`Q` and :math:`\\Delta E` onto a 2D surface defined by the cut axes. - This integrates over the other dimensions while preserving the arc dimension. - Then, the projected data is histogrammed according to the axis bins. + This integrates over the other dimensions while preserving the arc dimension + if present. Then, the projected data is histogrammed according to the axis bins. Parameters ---------- @@ -138,15 +138,20 @@ def cut( Returns ------- : - ``data`` projected and histogrammed along the cut axes, with arc dimension. + ``data`` projected and histogrammed along the cut axes. If the input has + an arc dimension, it is preserved in the output. Otherwise, all dimensions + are integrated. """ - # Rename triplet dimension to arc - # TODO This is wrong, triplet is a flattened version of (arc, channel), but in - # unknown order. - data = data.rename_dims(triplet='arc') + # Determine which dimensions to preserve + # Only preserve 'arc' dimension if present; concat everything else + preserve_dim = 'arc' if 'arc' in data.dims else None + + # Concat over all dimensions except the one we want to preserve + if preserve_dim is not None: + dims_to_concat = [dim for dim in data.dims if dim != preserve_dim] + else: + dims_to_concat = list(data.dims) - # Concat over all dimensions except arc - dims_to_concat = [dim for dim in data.dims if dim != 'arc'] new_coords = {axis_1.output, axis_2.output} projected = data.bins.concat(dims_to_concat).transform_coords( new_coords, @@ -155,9 +160,11 @@ def cut( ) projected = projected.drop_coords(list(set(projected.coords.keys()) - new_coords)) - # Add arc coordinate. Note that is for identifying the arc, it should NOT be used + # Add arc coordinate if we're working with arc dimension + # Note that this is for identifying the arc, it should NOT be used # as a replacement for a precise final_energy coordinate! - projected = projected.assign_coords(arc=arc_energy) + if preserve_dim == 'arc': + projected = projected.assign_coords(arc=arc_energy) return CutData[RunType]( projected.hist({axis_2.output: axis_2.bins, axis_1.output: axis_1.bins}) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 44caaab4a..80a86c62a 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -72,7 +72,7 @@ def test_simulation_workflow_can_compute_energy_data( energy_data = workflow.compute(EnergyData[SampleRun]) assert energy_data.sizes == { - 'triplet': 5, + 'arc': 5, 'tube': 3, 'length': 100, 'a3': 180, @@ -115,6 +115,10 @@ def test_simulation_workflow_produces_the_same_data_as_before( assert not energy_data.masks assert not energy_data.bins.masks + # Handle transition from 'triplet' to 'arc' dimension + if 'triplet' in expected.dims and 'arc' in energy_data.dims: + expected = expected.rename_dims(triplet='arc') + assert energy_data.coords.keys() == expected.coords.keys() for name in energy_data.coords.keys(): sc.testing.assert_allclose(energy_data.coords[name], expected.coords[name]) From 0e03e47cdb0a5c2bb1e14b443a135ccf9d19ba5f Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Thu, 16 Oct 2025 15:29:49 +0200 Subject: [PATCH 212/330] Update tests --- .../tests/bifrost/workflow_test.py | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 80a86c62a..33f3381a2 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -30,7 +30,7 @@ def simulation_detector_names() -> list[NeXusDetectorName]: with snx.File(simulated_elastic_incoherent_with_phonon()) as f: names = list(f['entry']['instrument'][snx.NXdetector].keys()) - return names[:5] # These should be enough to test the workflow. + return names[:10] # First 10 detectors form a 5x2 grid (arc=5, channel=2) @pytest.fixture @@ -73,6 +73,7 @@ def test_simulation_workflow_can_compute_energy_data( assert energy_data.sizes == { 'arc': 5, + 'channel': 2, 'tube': 3, 'length': 100, 'a3': 180, @@ -115,9 +116,21 @@ def test_simulation_workflow_produces_the_same_data_as_before( assert not energy_data.masks assert not energy_data.bins.masks - # Handle transition from 'triplet' to 'arc' dimension - if 'triplet' in expected.dims and 'arc' in energy_data.dims: - expected = expected.rename_dims(triplet='arc') + # The reference file was computed with 5 detectors (arc=5, no channel dimension). + # The current test uses 10 detectors (arc=5, channel=2). + # We can only compare a subset of the data by selecting matching detectors. + + # Handle transition from 'triplet' to 'arc'/'channel' dimensions + if 'triplet' in expected.dims: + if 'arc' in energy_data.dims and 'channel' in energy_data.dims: + # Current data has (arc, channel), reference has triplet + # Compare only the first channel to match the reference + # (which was channel 0) + energy_data = energy_data['channel', 0] + # After slicing, rename arc -> triplet for comparison + expected = expected.rename_dims(triplet='arc') + elif 'arc' in energy_data.dims: + expected = expected.rename_dims(triplet='arc') assert energy_data.coords.keys() == expected.coords.keys() for name in energy_data.coords.keys(): From b97711804076c75e85cde150bad9e6d7cc8011d7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 13:31:02 +0000 Subject: [PATCH 213/330] Apply automatic formatting --- packages/essspectroscopy/src/ess/bifrost/detector.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 5c322dd94..095328ded 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -154,9 +154,7 @@ def merge_triplets( remainder = idx % pixels_per_arc # Within an arc, pattern repeats every (pixels_per_tube * channels_per_arc) # for each of the 3 tubes. Channel is determined by position within that. - channel = ( - (remainder % (pixels_per_tube * channels_per_arc)) // pixels_per_tube - ) + channel = (remainder % (pixels_per_tube * channels_per_arc)) // pixels_per_tube arc_channel_pairs.append((arc, channel)) # Sort triplets by (arc, channel) From 4690e00454577d653a1a29555530a1a9938bcf45 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Fri, 17 Oct 2025 07:29:45 +0000 Subject: [PATCH 214/330] Remove redundant check --- packages/essspectroscopy/src/ess/bifrost/detector.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 095328ded..3e3693431 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -124,9 +124,6 @@ def merge_triplets( # to determine arc and channel indices detector_numbers = [] for triplet in triplets: - if 'detector_number' not in triplet.coords: - # If no detector_number, fall back to simple concatenation - return sc.concat(triplets, dim="triplet") # Get the first detector number (position [0, 0] in tube, length dims) det_num = triplet.coords['detector_number']['tube', 0]['length', 0] detector_numbers.append(det_num.value) From f1e81f28ac0b49ee19220926f2f0e6e73dd4fd8d Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Fri, 17 Oct 2025 07:41:11 +0000 Subject: [PATCH 215/330] Simplify merge_triplets by assigning arc/channel coords in get_calibrated_detector_bifrost MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add scalar 'arc' and 'channel' coordinates in get_calibrated_detector_bifrost using sc.index() to avoid unnecessary units - Simplify merge_triplets to read pre-computed arc/channel coordinates instead of recalculating them from detector_number - Remove ~50 lines of redundant arc/channel calculation logic - Update test to allow for new scalar coordinates in comparison Original prompt: Can we simplify `merge_triplets` by assigning a scalar arc and channel coord in get_calibrated_detector_bifrost? Follow-up: Use sc.index instead of sc.scalar to avoid units, and don't specify dtype since the data is small. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../src/ess/bifrost/detector.py | 70 ++++++++----------- .../tests/bifrost/workflow_test.py | 6 +- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 3e3693431..e425fd7a2 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -92,6 +92,25 @@ def get_calibrated_detector_bifrost( bank_sizes=DetectorBankSizes({}), ) da = da.rename(dim_0='tube', dim_1='length') + + # Calculate arc and channel for this triplet based on detector_number layout. + # BIFROST detector_number ordering is (arc, tube, channel, pixel). + # Each triplet contains 3 tubes of 100 pixels for a single arc-channel pair. + det_num = da.coords['detector_number']['tube', 0]['length', 0].value + pixels_per_tube = 100 + tubes_per_channel = 3 + channels_per_arc = 9 + pixels_per_arc = pixels_per_tube * tubes_per_channel * channels_per_arc # 2700 + + # detector_number is 1-indexed + idx = det_num - 1 + arc = idx // pixels_per_arc + remainder = idx % pixels_per_arc + channel = (remainder % (pixels_per_tube * channels_per_arc)) // pixels_per_tube + + da.coords['arc'] = sc.index(arc) + da.coords['channel'] = sc.index(channel) + return CalibratedDetector[RunType](da) @@ -100,16 +119,16 @@ def merge_triplets( ) -> sc.DataArray: """Merge BIFROST detector triplets into a single data array. - This function attempts to fold the triplets into (arc, channel) dimensions - based on the detector_number coordinate. If the triplets form a regular - rectangular subset of the full 5x9 detector array, they will be folded - into those dimensions. Otherwise, they are concatenated along a 'triplet' - dimension. + This function folds the triplets into (arc, channel) dimensions based on + the scalar 'arc' and 'channel' coordinates assigned to each triplet. If the + triplets form a regular rectangular subset of the full 5x9 detector array, + they will be folded into those dimensions. Otherwise, they are concatenated + along a 'triplet' dimension. Parameters ---------- triplets: - Data arrays to merge. + Data arrays to merge. Each must have scalar 'arc' and 'channel' coordinates. Returns ------- @@ -120,39 +139,11 @@ def merge_triplets( if len(triplets) == 0: raise ValueError("At least one triplet is required") - # Extract detector_number from first pixel of first tube in each triplet - # to determine arc and channel indices - detector_numbers = [] - for triplet in triplets: - # Get the first detector number (position [0, 0] in tube, length dims) - det_num = triplet.coords['detector_number']['tube', 0]['length', 0] - detector_numbers.append(det_num.value) - - # Calculate arc and channel indices based on detector_number layout - # BIFROST has 5 arcs, each with 9 channels, each with 3 tubes of 100 pixels - # detector_number runs 1 to 13500, folded as (arc=5, tube=3, channel=9, pixel=100) - # Layout within an arc: - # - pixels 0-99: channel 0, tube 0 - # - pixels 100-199: channel 1, tube 0 - # - ... - # - pixels 800-899: channel 8, tube 0 - # - pixels 900-999: channel 0, tube 1 - # - etc. - pixels_per_tube = 100 - tubes_per_channel = 3 - channels_per_arc = 9 - pixels_per_arc = pixels_per_tube * tubes_per_channel * channels_per_arc # 2700 - - arc_channel_pairs = [] - for det_num in detector_numbers: - # detector_number is 1-indexed - idx = det_num - 1 - arc = idx // pixels_per_arc - remainder = idx % pixels_per_arc - # Within an arc, pattern repeats every (pixels_per_tube * channels_per_arc) - # for each of the 3 tubes. Channel is determined by position within that. - channel = (remainder % (pixels_per_tube * channels_per_arc)) // pixels_per_tube - arc_channel_pairs.append((arc, channel)) + # Extract arc and channel from scalar coordinates + arc_channel_pairs = [ + (triplet.coords['arc'].value, triplet.coords['channel'].value) + for triplet in triplets + ] # Sort triplets by (arc, channel) sorted_indices = sorted(range(len(triplets)), key=lambda i: arc_channel_pairs[i]) @@ -192,7 +183,6 @@ def merge_triplets( f"Failed to fold triplets into (arc, channel): {e}", stacklevel=2, ) - pass # Fall back to simple concatenation if not a regular grid return sc.concat(triplets, dim="triplet") diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 33f3381a2..95ed3c830 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -132,8 +132,10 @@ def test_simulation_workflow_produces_the_same_data_as_before( elif 'arc' in energy_data.dims: expected = expected.rename_dims(triplet='arc') - assert energy_data.coords.keys() == expected.coords.keys() - for name in energy_data.coords.keys(): + # Compare only coordinates that exist in the reference data + # (newer versions may add arc and channel scalar coordinates) + assert set(expected.coords.keys()).issubset(set(energy_data.coords.keys())) + for name in expected.coords.keys(): sc.testing.assert_allclose(energy_data.coords[name], expected.coords[name]) assert energy_data.bins.coords.keys() == expected.bins.coords.keys() From 3b1218d3ac6ce4f5e572c3ea5e8d399f45b81053 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Fri, 17 Oct 2025 07:54:08 +0000 Subject: [PATCH 216/330] Remove redundant try/except --- .../src/ess/bifrost/detector.py | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index e425fd7a2..323defb53 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -167,22 +167,12 @@ def merge_triplets( if sorted_pairs == expected_pairs: # We have a regular grid, fold it concatenated = sc.concat(sorted_triplets, dim='triplet') - try: - folded = concatenated.fold( - dim='triplet', - sizes={'arc': len(unique_arcs), 'channel': len(unique_channels)}, - ) - # Remove size-1 dimensions (e.g., if only one channel is present) - folded = folded.squeeze() - return folded - except Exception as e: - # If folding fails for any reason, fall back to triplet dim - import warnings - - warnings.warn( - f"Failed to fold triplets into (arc, channel): {e}", - stacklevel=2, - ) + folded = concatenated.fold( + dim='triplet', + sizes={'arc': len(unique_arcs), 'channel': len(unique_channels)}, + ) + # Remove size-1 dimensions (e.g., if only one channel is present) + return folded.squeeze() # Fall back to simple concatenation if not a regular grid return sc.concat(triplets, dim="triplet") From 4a129a543ffa0307a821b554c8cf91d42425ad9c Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Fri, 17 Oct 2025 09:41:45 +0000 Subject: [PATCH 217/330] Fix docs build --- .../docs/user-guide/bifrost/bifrost-reduction.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index da682c6e7..a1541c4d9 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -174,7 +174,7 @@ "source": [ "(\n", " data['a4', 0]\n", - " .bins.concat(['triplet', 'tube', 'length'])\n", + " .bins.concat()\n", " .hist(energy_transfer=sc.linspace('energy_transfer', -0.05, 0.05, 200, unit='meV'))\n", ").plot()" ] From 12f853d70f6ecc16d44c34d2f8e6aaace7b3054c Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Wed, 22 Oct 2025 11:57:39 +0000 Subject: [PATCH 218/330] Use set construction directly in merge_triplets Avoid intermediate lists when extracting unique arcs and channels by using set comprehension directly. User request: Can you have a look a the comments in https://github.com/scipp/essspectroscopy/pull/71#pullrequestreview-3365372982 (only the latest review from today). Please address each comment, one per commit. --- packages/essspectroscopy/src/ess/bifrost/detector.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 323defb53..0a0c0daf1 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -151,11 +151,8 @@ def merge_triplets( sorted_pairs = [arc_channel_pairs[i] for i in sorted_indices] # Check if the pairs form a regular rectangular grid - arcs = [pair[0] for pair in sorted_pairs] - channels = [pair[1] for pair in sorted_pairs] - - unique_arcs = sorted(set(arcs)) - unique_channels = sorted(set(channels)) + unique_arcs = sorted({pair[0] for pair in sorted_pairs}) + unique_channels = sorted({pair[1] for pair in sorted_pairs}) # Check if we have a complete rectangular subset expected_count = len(unique_arcs) * len(unique_channels) From 644a3c5a37f6a8670b709f923d0fe518f854cd25 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Wed, 22 Oct 2025 11:58:10 +0000 Subject: [PATCH 219/330] Simplify rectangular grid check in merge_triplets Remove redundant expected_count check and just compare the sorted pairs directly with expected pairs. User request: Can you have a look a the comments in https://github.com/scipp/essspectroscopy/pull/71#pullrequestreview-3365372982 (only the latest review from today). Please address each comment, one per commit. --- .../src/ess/bifrost/detector.py | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 0a0c0daf1..c3c5fb347 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -155,21 +155,18 @@ def merge_triplets( unique_channels = sorted({pair[1] for pair in sorted_pairs}) # Check if we have a complete rectangular subset - expected_count = len(unique_arcs) * len(unique_channels) - if len(sorted_triplets) == expected_count: - # Verify that all (arc, channel) combinations are present - expected_pairs = [ - (arc, channel) for arc in unique_arcs for channel in unique_channels - ] - if sorted_pairs == expected_pairs: - # We have a regular grid, fold it - concatenated = sc.concat(sorted_triplets, dim='triplet') - folded = concatenated.fold( - dim='triplet', - sizes={'arc': len(unique_arcs), 'channel': len(unique_channels)}, - ) - # Remove size-1 dimensions (e.g., if only one channel is present) - return folded.squeeze() + expected_pairs = [ + (arc, channel) for arc in unique_arcs for channel in unique_channels + ] + if sorted_pairs == expected_pairs: + # We have a regular grid, fold it + concatenated = sc.concat(sorted_triplets, dim='triplet') + folded = concatenated.fold( + dim='triplet', + sizes={'arc': len(unique_arcs), 'channel': len(unique_channels)}, + ) + # Remove size-1 dimensions (e.g., if only one channel is present) + return folded.squeeze() # Fall back to simple concatenation if not a regular grid return sc.concat(triplets, dim="triplet") From 31f31a0b9b0d84bfeac35cdfbe9769efe6a32d89 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Wed, 22 Oct 2025 11:58:39 +0000 Subject: [PATCH 220/330] Use sorted_triplets consistently in merge_triplets Construct concatenated before the if statement and return it in both the regular grid and fallback cases to ensure consistent ordering. User request: Can you have a look a the comments in https://github.com/scipp/essspectroscopy/pull/71#pullrequestreview-3365372982 (only the latest review from today). Please address each comment, one per commit. --- packages/essspectroscopy/src/ess/bifrost/detector.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index c3c5fb347..d4a664532 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -158,9 +158,9 @@ def merge_triplets( expected_pairs = [ (arc, channel) for arc in unique_arcs for channel in unique_channels ] + concatenated = sc.concat(sorted_triplets, dim='triplet') if sorted_pairs == expected_pairs: # We have a regular grid, fold it - concatenated = sc.concat(sorted_triplets, dim='triplet') folded = concatenated.fold( dim='triplet', sizes={'arc': len(unique_arcs), 'channel': len(unique_channels)}, @@ -169,7 +169,7 @@ def merge_triplets( return folded.squeeze() # Fall back to simple concatenation if not a regular grid - return sc.concat(triplets, dim="triplet") + return concatenated providers = (arc_number, get_calibrated_detector_bifrost) From 32f2e7466d5780bab8f3a2944a3f1f066b4e248a Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Wed, 22 Oct 2025 11:59:20 +0000 Subject: [PATCH 221/330] Always preserve arc and channel dims in merge_triplets Remove squeeze() to ensure the output always has either (arc, channel) dimensions or (triplet) dimension, never a mix like just (arc) or just (channel). This ensures downstream code only needs to handle two cases. User request: Can you have a look a the comments in https://github.com/scipp/essspectroscopy/pull/71#pullrequestreview-3365372982 (only the latest review from today). Please address each comment, one per commit. --- packages/essspectroscopy/src/ess/bifrost/detector.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index d4a664532..39760284e 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -161,12 +161,10 @@ def merge_triplets( concatenated = sc.concat(sorted_triplets, dim='triplet') if sorted_pairs == expected_pairs: # We have a regular grid, fold it - folded = concatenated.fold( + return concatenated.fold( dim='triplet', sizes={'arc': len(unique_arcs), 'channel': len(unique_channels)}, ) - # Remove size-1 dimensions (e.g., if only one channel is present) - return folded.squeeze() # Fall back to simple concatenation if not a regular grid return concatenated From 7cea2d05d1c69dde933b9f137401e43d8ef8f352 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Wed, 22 Oct 2025 12:04:43 +0000 Subject: [PATCH 222/330] Replace complicated test logic with new reference file Instead of complex logic to handle dimension transitions, create a new reference file that matches the current output format with arc and channel dimensions (5x2 grid). The reference file needs to be uploaded to: https://public.esss.dk/groups/scipp/ess/bifrost/3/computed_energy_data_simulated_5x2.h5 User request: Can you have a look a the comments in https://github.com/scipp/essspectroscopy/pull/71#pullrequestreview-3365372982 (only the latest review from today). Please address each comment, one per commit. --- .../essspectroscopy/src/ess/bifrost/data.py | 11 ++++++++++ .../tests/bifrost/workflow_test.py | 22 ++----------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index fa189d860..4d94db44f 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -17,6 +17,7 @@ def _make_pooch(): registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", "computed_energy_data_simulated.h5": "blake2b:3c398443cb85c8294d283c7212255bc695c2520f2332c2c99d041a0760b6bcbb9937e19bcd8a498daf306d279c88d2ea911c510c1ce3b3a7f1e6b7e54022a943", # noqa: E501 + "computed_energy_data_simulated_5x2.h5": "blake2b:d9d5e785a08e14d9c3416cf04db89a8c6f2fae3c0bae27bf0e73e8e5d492b4ca406e6578a935fa9f72dd9199dc15536409f614791fee6899c4265fe5d31e2706", # noqa: E501 "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 }, retry_if_failed=3, @@ -57,8 +58,18 @@ def computed_energy_data_simulated() -> str: return get_path("computed_energy_data_simulated.h5") +def computed_energy_data_simulated_5x2() -> str: + """Energy and momentum transfer computed from the simulated BIFROST data. + + This reference was computed with 10 detectors forming a 5x2 grid + (arc=5, channel=2). + """ + return get_path("computed_energy_data_simulated_5x2.h5") + + __all__ = [ "computed_energy_data_simulated", + "computed_energy_data_simulated_5x2", "get_path", "simulated_elastic_incoherent_with_phonon", "tof_lookup_table_simulation", diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 95ed3c830..ffce343a3 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -8,7 +8,7 @@ from ess import bifrost from ess.bifrost.data import ( - computed_energy_data_simulated, + computed_energy_data_simulated_5x2, simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation, ) @@ -111,29 +111,11 @@ def test_simulation_workflow_produces_the_same_data_as_before( workflow: sciline.Pipeline, ) -> None: energy_data = workflow.compute(EnergyData[SampleRun]) - expected = sc.io.load_hdf5(computed_energy_data_simulated()) + expected = sc.io.load_hdf5(computed_energy_data_simulated_5x2()) assert not energy_data.masks assert not energy_data.bins.masks - # The reference file was computed with 5 detectors (arc=5, no channel dimension). - # The current test uses 10 detectors (arc=5, channel=2). - # We can only compare a subset of the data by selecting matching detectors. - - # Handle transition from 'triplet' to 'arc'/'channel' dimensions - if 'triplet' in expected.dims: - if 'arc' in energy_data.dims and 'channel' in energy_data.dims: - # Current data has (arc, channel), reference has triplet - # Compare only the first channel to match the reference - # (which was channel 0) - energy_data = energy_data['channel', 0] - # After slicing, rename arc -> triplet for comparison - expected = expected.rename_dims(triplet='arc') - elif 'arc' in energy_data.dims: - expected = expected.rename_dims(triplet='arc') - - # Compare only coordinates that exist in the reference data - # (newer versions may add arc and channel scalar coordinates) assert set(expected.coords.keys()).issubset(set(energy_data.coords.keys())) for name in expected.coords.keys(): sc.testing.assert_allclose(energy_data.coords[name], expected.coords[name]) From cc35f3e97a9a3ce4ca0a3473b89d12a96cc17388 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Wed, 22 Oct 2025 12:06:55 +0000 Subject: [PATCH 223/330] Move live workflow tests to separate file Move TestBifrostQCutWorkflow from workflow_test.py to live_test.py to match the package structure (src/ess/bifrost/live.py). User request: Can you have a look a the comments in https://github.com/scipp/essspectroscopy/pull/71#pullrequestreview-3365372982 (only the latest review from today). Please address each comment, one per commit. --- .../tests/bifrost/live_test.py | 155 ++++++++++++++++++ .../tests/bifrost/workflow_test.py | 129 --------------- 2 files changed, 155 insertions(+), 129 deletions(-) create mode 100644 packages/essspectroscopy/tests/bifrost/live_test.py diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py new file mode 100644 index 000000000..4906d712c --- /dev/null +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -0,0 +1,155 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +import pytest +import sciline +import scipp as sc +import scipp.testing +import scippnexus as snx + +from ess.bifrost.data import ( + simulated_elastic_incoherent_with_phonon, + tof_lookup_table_simulation, +) +from ess.bifrost.live import BifrostQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData +from ess.spectroscopy.types import ( + EnergyData, + Filename, + NeXusDetectorName, + SampleRun, + TimeOfFlightLookupTable, +) + + +@pytest.fixture(scope='module') +def simulation_detector_names() -> list[NeXusDetectorName]: + with snx.File(simulated_elastic_incoherent_with_phonon()) as f: + names = list(f['entry']['instrument'][snx.NXdetector].keys()) + return names[:10] # First 10 detectors form a 5x2 grid (arc=5, channel=2) + + +class TestBifrostQCutWorkflow: + @pytest.fixture + def qcut_workflow( + self, simulation_detector_names: list[NeXusDetectorName] + ) -> sciline.Pipeline: + workflow = BifrostQCutWorkflow(simulation_detector_names) + workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() + workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5( + tof_lookup_table_simulation() + ) + return workflow + + def test_cut_along_q_norm_and_energy_transfer( + self, qcut_workflow: sciline.Pipeline + ) -> None: + # Define cut axes for |Q| and energy transfer + axis_1 = CutAxis( + output='|Q|', + fn=lambda sample_table_momentum_transfer: sc.norm( + sample_table_momentum_transfer + ), + bins=sc.linspace(dim='|Q|', start=0.0, stop=3.0, num=50, unit='1/angstrom'), + ) + axis_2 = CutAxis( + output='E', + fn=lambda energy_transfer: energy_transfer, + bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), + ) + + qcut_workflow[CutAxis1] = axis_1 + qcut_workflow[CutAxis2] = axis_2 + + # Compute both cut data and energy data to compare total counts + cut_data = qcut_workflow.compute(CutData[SampleRun]) + energy_data = qcut_workflow.compute(EnergyData[SampleRun]) + + # Verify the structure of the result (now 3-D with arc dimension) + assert cut_data.bins is None # Should be histogrammed + assert set(cut_data.dims) == {'arc', '|Q|', 'E'} + assert cut_data.sizes['arc'] == 5 + assert cut_data.sizes['|Q|'] == 49 # num bins - 1 + assert cut_data.sizes['E'] == 49 + assert 'arc' in cut_data.coords + assert '|Q|' in cut_data.coords + assert 'E' in cut_data.coords + + # Check that coordinates have expected units + cut_data.coords['arc'].to(unit='meV') + cut_data.coords['|Q|'].to(unit='1/angstrom') + cut_data.coords['E'].to(unit='meV') + + # Verify no counts were lost during the cut + total_counts_before = sc.sum(energy_data.bins.size()).value + total_counts_after = sc.sum(cut_data).value + assert total_counts_before == total_counts_after + + def test_cut_along_qx_direction_and_energy_transfer( + self, qcut_workflow: sciline.Pipeline + ) -> None: + # Test cutting along a specific Q direction (Qx) + axis_1 = CutAxis.from_q_vector( + output='Qx', + vec=sc.vector([1, 0, 0]), + bins=sc.linspace(dim='Qx', start=-2.0, stop=2.0, num=40, unit='1/angstrom'), + ) + axis_2 = CutAxis( + output='E', + fn=lambda energy_transfer: energy_transfer, + bins=sc.linspace(dim='E', start=-5.0, stop=5.0, num=30, unit='meV'), + ) + + qcut_workflow[CutAxis1] = axis_1 + qcut_workflow[CutAxis2] = axis_2 + + # Compute both cut data and energy data to compare total counts + cut_data = qcut_workflow.compute(CutData[SampleRun]) + energy_data = qcut_workflow.compute(EnergyData[SampleRun]) + + # Verify the result structure (now 3-D with arc dimension) + assert cut_data.bins is None + assert set(cut_data.dims) == {'arc', 'Qx', 'E'} + assert cut_data.sizes['arc'] == 5 + assert cut_data.sizes['Qx'] == 39 + assert cut_data.sizes['E'] == 29 + assert 'arc' in cut_data.coords + assert 'Qx' in cut_data.coords + assert 'E' in cut_data.coords + + # Verify no counts were lost during the cut + total_counts_before = sc.sum(energy_data.bins.size()).value + total_counts_after = sc.sum(cut_data).value + assert total_counts_before == total_counts_after + + def test_cut_preserves_arc_dimension(self, qcut_workflow: sciline.Pipeline) -> None: + # Test that cut preserves the arc dimension (renamed from triplet) + axis_1 = CutAxis( + output='|Q|', + fn=lambda sample_table_momentum_transfer: sc.norm( + sample_table_momentum_transfer + ), + bins=sc.linspace(dim='|Q|', start=0.0, stop=3.0, num=50, unit='1/angstrom'), + ) + axis_2 = CutAxis( + output='E', + fn=lambda energy_transfer: energy_transfer, + bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), + ) + + qcut_workflow[CutAxis1] = axis_1 + qcut_workflow[CutAxis2] = axis_2 + + cut_data = qcut_workflow.compute(CutData[SampleRun]) + + # Verify the result is 3-D with arc dimension preserved + assert cut_data.bins is None + assert set(cut_data.dims) == {'arc', '|Q|', 'E'} + assert cut_data.sizes['arc'] == 5 + assert cut_data.sizes['|Q|'] == 49 + assert cut_data.sizes['E'] == 49 + + # Verify arc coordinate exists with correct values + assert 'arc' in cut_data.coords + expected_arc_energies = sc.array( + dims=['arc'], values=[2.7, 3.2, 3.8, 4.4, 5.0], unit='meV' + ) + sc.testing.assert_allclose(cut_data.coords['arc'], expected_arc_energies) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index ffce343a3..d7192cd96 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -12,7 +12,6 @@ simulated_elastic_incoherent_with_phonon, tof_lookup_table_simulation, ) -from ess.bifrost.live import BifrostQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData from ess.spectroscopy.types import ( DetectorData, EnergyData, @@ -127,131 +126,3 @@ def test_simulation_workflow_produces_the_same_data_as_before( ) sc.testing.assert_allclose(energy_data.bins.data, expected.bins.data) - - -class TestBifrostQCutWorkflow: - @pytest.fixture - def qcut_workflow( - self, simulation_detector_names: list[NeXusDetectorName] - ) -> sciline.Pipeline: - workflow = BifrostQCutWorkflow(simulation_detector_names) - workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5( - tof_lookup_table_simulation() - ) - return workflow - - def test_cut_along_q_norm_and_energy_transfer( - self, qcut_workflow: sciline.Pipeline - ) -> None: - # Define cut axes for |Q| and energy transfer - axis_1 = CutAxis( - output='|Q|', - fn=lambda sample_table_momentum_transfer: sc.norm( - sample_table_momentum_transfer - ), - bins=sc.linspace(dim='|Q|', start=0.0, stop=3.0, num=50, unit='1/angstrom'), - ) - axis_2 = CutAxis( - output='E', - fn=lambda energy_transfer: energy_transfer, - bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), - ) - - qcut_workflow[CutAxis1] = axis_1 - qcut_workflow[CutAxis2] = axis_2 - - # Compute both cut data and energy data to compare total counts - cut_data = qcut_workflow.compute(CutData[SampleRun]) - energy_data = qcut_workflow.compute(EnergyData[SampleRun]) - - # Verify the structure of the result (now 3-D with arc dimension) - assert cut_data.bins is None # Should be histogrammed - assert set(cut_data.dims) == {'arc', '|Q|', 'E'} - assert cut_data.sizes['arc'] == 5 - assert cut_data.sizes['|Q|'] == 49 # num bins - 1 - assert cut_data.sizes['E'] == 49 - assert 'arc' in cut_data.coords - assert '|Q|' in cut_data.coords - assert 'E' in cut_data.coords - - # Check that coordinates have expected units - cut_data.coords['arc'].to(unit='meV') - cut_data.coords['|Q|'].to(unit='1/angstrom') - cut_data.coords['E'].to(unit='meV') - - # Verify no counts were lost during the cut - total_counts_before = sc.sum(energy_data.bins.size()).value - total_counts_after = sc.sum(cut_data).value - assert total_counts_before == total_counts_after - - def test_cut_along_qx_direction_and_energy_transfer( - self, qcut_workflow: sciline.Pipeline - ) -> None: - # Test cutting along a specific Q direction (Qx) - axis_1 = CutAxis.from_q_vector( - output='Qx', - vec=sc.vector([1, 0, 0]), - bins=sc.linspace(dim='Qx', start=-2.0, stop=2.0, num=40, unit='1/angstrom'), - ) - axis_2 = CutAxis( - output='E', - fn=lambda energy_transfer: energy_transfer, - bins=sc.linspace(dim='E', start=-5.0, stop=5.0, num=30, unit='meV'), - ) - - qcut_workflow[CutAxis1] = axis_1 - qcut_workflow[CutAxis2] = axis_2 - - # Compute both cut data and energy data to compare total counts - cut_data = qcut_workflow.compute(CutData[SampleRun]) - energy_data = qcut_workflow.compute(EnergyData[SampleRun]) - - # Verify the result structure (now 3-D with arc dimension) - assert cut_data.bins is None - assert set(cut_data.dims) == {'arc', 'Qx', 'E'} - assert cut_data.sizes['arc'] == 5 - assert cut_data.sizes['Qx'] == 39 - assert cut_data.sizes['E'] == 29 - assert 'arc' in cut_data.coords - assert 'Qx' in cut_data.coords - assert 'E' in cut_data.coords - - # Verify no counts were lost during the cut - total_counts_before = sc.sum(energy_data.bins.size()).value - total_counts_after = sc.sum(cut_data).value - assert total_counts_before == total_counts_after - - def test_cut_preserves_arc_dimension(self, qcut_workflow: sciline.Pipeline) -> None: - # Test that cut preserves the arc dimension (renamed from triplet) - axis_1 = CutAxis( - output='|Q|', - fn=lambda sample_table_momentum_transfer: sc.norm( - sample_table_momentum_transfer - ), - bins=sc.linspace(dim='|Q|', start=0.0, stop=3.0, num=50, unit='1/angstrom'), - ) - axis_2 = CutAxis( - output='E', - fn=lambda energy_transfer: energy_transfer, - bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), - ) - - qcut_workflow[CutAxis1] = axis_1 - qcut_workflow[CutAxis2] = axis_2 - - cut_data = qcut_workflow.compute(CutData[SampleRun]) - - # Verify the result is 3-D with arc dimension preserved - assert cut_data.bins is None - assert set(cut_data.dims) == {'arc', '|Q|', 'E'} - assert cut_data.sizes['arc'] == 5 - assert cut_data.sizes['|Q|'] == 49 - assert cut_data.sizes['E'] == 49 - - # Verify arc coordinate exists with correct values - assert 'arc' in cut_data.coords - expected_arc_energies = sc.array( - dims=['arc'], values=[2.7, 3.2, 3.8, 4.4, 5.0], unit='meV' - ) - sc.testing.assert_allclose(cut_data.coords['arc'], expected_arc_energies) From af0fd83b3a5c87bdf490d2873897abfae1a47be2 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Wed, 22 Oct 2025 12:10:04 +0000 Subject: [PATCH 224/330] Separate provider tests from workflow tests Create cutting_test.py for provider tests that verify the cut function behavior (e.g., count preservation). Keep only workflow output verification in live_test.py. User request: Can you have a look a the comments in https://github.com/scipp/essspectroscopy/pull/71#pullrequestreview-3365372982 (only the latest review from today). Please address each comment, one per commit. --- .../tests/bifrost/cutting_test.py | 95 +++++++++++++++++++ .../tests/bifrost/live_test.py | 15 --- 2 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 packages/essspectroscopy/tests/bifrost/cutting_test.py diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py new file mode 100644 index 000000000..0b22d6497 --- /dev/null +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +import pytest +import scipp as sc +import scipp.testing +import scippnexus as snx + +from ess import bifrost +from ess.bifrost.data import ( + simulated_elastic_incoherent_with_phonon, + tof_lookup_table_simulation, +) +from ess.bifrost.live import CutAxis, CutAxis1, CutAxis2, arc_energy, cut +from ess.spectroscopy.types import ( + EnergyData, + Filename, + NeXusDetectorName, + SampleRun, + TimeOfFlightLookupTable, +) + + +@pytest.fixture(scope='module') +def simulation_detector_names() -> list[NeXusDetectorName]: + with snx.File(simulated_elastic_incoherent_with_phonon()) as f: + names = list(f['entry']['instrument'][snx.NXdetector].keys()) + return names[:10] # First 10 detectors form a 5x2 grid (arc=5, channel=2) + + +@pytest.fixture +def energy_data( + simulation_detector_names: list[NeXusDetectorName], +) -> EnergyData[SampleRun]: + workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) + workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() + workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation()) + return workflow.compute(EnergyData[SampleRun]) + + +def test_cut_along_q_norm_and_energy_transfer_preserves_counts( + energy_data: EnergyData[SampleRun], +) -> None: + # Define cut axes for |Q| and energy transfer + axis_1 = CutAxis( + output='|Q|', + fn=lambda sample_table_momentum_transfer: sc.norm( + sample_table_momentum_transfer + ), + bins=sc.linspace(dim='|Q|', start=0.0, stop=3.0, num=50, unit='1/angstrom'), + ) + axis_2 = CutAxis( + output='E', + fn=lambda energy_transfer: energy_transfer, + bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), + ) + + cut_data = cut( + energy_data, + axis_1=CutAxis1(axis_1), + axis_2=CutAxis2(axis_2), + arc_energy=arc_energy(), + ) + + # Verify no counts were lost during the cut + total_counts_before = sc.sum(energy_data.bins.size()).value + total_counts_after = sc.sum(cut_data).value + assert total_counts_before == total_counts_after + + +def test_cut_along_qx_direction_preserves_counts( + energy_data: EnergyData[SampleRun], +) -> None: + # Test cutting along a specific Q direction (Qx) + axis_1 = CutAxis.from_q_vector( + output='Qx', + vec=sc.vector([1, 0, 0]), + bins=sc.linspace(dim='Qx', start=-2.0, stop=2.0, num=40, unit='1/angstrom'), + ) + axis_2 = CutAxis( + output='E', + fn=lambda energy_transfer: energy_transfer, + bins=sc.linspace(dim='E', start=-5.0, stop=5.0, num=30, unit='meV'), + ) + + cut_data = cut( + energy_data, + axis_1=CutAxis1(axis_1), + axis_2=CutAxis2(axis_2), + arc_energy=arc_energy(), + ) + + # Verify no counts were lost during the cut + total_counts_before = sc.sum(energy_data.bins.size()).value + total_counts_after = sc.sum(cut_data).value + assert total_counts_before == total_counts_after diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py index 4906d712c..ff9e19c9e 100644 --- a/packages/essspectroscopy/tests/bifrost/live_test.py +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -12,7 +12,6 @@ ) from ess.bifrost.live import BifrostQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData from ess.spectroscopy.types import ( - EnergyData, Filename, NeXusDetectorName, SampleRun, @@ -59,9 +58,7 @@ def test_cut_along_q_norm_and_energy_transfer( qcut_workflow[CutAxis1] = axis_1 qcut_workflow[CutAxis2] = axis_2 - # Compute both cut data and energy data to compare total counts cut_data = qcut_workflow.compute(CutData[SampleRun]) - energy_data = qcut_workflow.compute(EnergyData[SampleRun]) # Verify the structure of the result (now 3-D with arc dimension) assert cut_data.bins is None # Should be histogrammed @@ -78,11 +75,6 @@ def test_cut_along_q_norm_and_energy_transfer( cut_data.coords['|Q|'].to(unit='1/angstrom') cut_data.coords['E'].to(unit='meV') - # Verify no counts were lost during the cut - total_counts_before = sc.sum(energy_data.bins.size()).value - total_counts_after = sc.sum(cut_data).value - assert total_counts_before == total_counts_after - def test_cut_along_qx_direction_and_energy_transfer( self, qcut_workflow: sciline.Pipeline ) -> None: @@ -101,9 +93,7 @@ def test_cut_along_qx_direction_and_energy_transfer( qcut_workflow[CutAxis1] = axis_1 qcut_workflow[CutAxis2] = axis_2 - # Compute both cut data and energy data to compare total counts cut_data = qcut_workflow.compute(CutData[SampleRun]) - energy_data = qcut_workflow.compute(EnergyData[SampleRun]) # Verify the result structure (now 3-D with arc dimension) assert cut_data.bins is None @@ -115,11 +105,6 @@ def test_cut_along_qx_direction_and_energy_transfer( assert 'Qx' in cut_data.coords assert 'E' in cut_data.coords - # Verify no counts were lost during the cut - total_counts_before = sc.sum(energy_data.bins.size()).value - total_counts_after = sc.sum(cut_data).value - assert total_counts_before == total_counts_after - def test_cut_preserves_arc_dimension(self, qcut_workflow: sciline.Pipeline) -> None: # Test that cut preserves the arc dimension (renamed from triplet) axis_1 = CutAxis( From c733dde2ffdf642b83f18de0b6686ee3e3c10725 Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Wed, 22 Oct 2025 12:11:06 +0000 Subject: [PATCH 225/330] Remove redundant test_cut_preserves_arc_dimension Merge arc coordinate value checks into the first test to avoid redundancy. The arc dimension presence and values are already verified in test_cut_along_q_norm_and_energy_transfer. User request: Can you have a look a the comments in https://github.com/scipp/essspectroscopy/pull/71#pullrequestreview-3365372982 (only the latest review from today). Please address each comment, one per commit. --- .../tests/bifrost/live_test.py | 42 ++++--------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py index ff9e19c9e..9adf81c7b 100644 --- a/packages/essspectroscopy/tests/bifrost/live_test.py +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -70,11 +70,17 @@ def test_cut_along_q_norm_and_energy_transfer( assert '|Q|' in cut_data.coords assert 'E' in cut_data.coords - # Check that coordinates have expected units + # Check that coordinates have expected units and values cut_data.coords['arc'].to(unit='meV') cut_data.coords['|Q|'].to(unit='1/angstrom') cut_data.coords['E'].to(unit='meV') + # Verify arc coordinate values + expected_arc_energies = sc.array( + dims=['arc'], values=[2.7, 3.2, 3.8, 4.4, 5.0], unit='meV' + ) + sc.testing.assert_allclose(cut_data.coords['arc'], expected_arc_energies) + def test_cut_along_qx_direction_and_energy_transfer( self, qcut_workflow: sciline.Pipeline ) -> None: @@ -104,37 +110,3 @@ def test_cut_along_qx_direction_and_energy_transfer( assert 'arc' in cut_data.coords assert 'Qx' in cut_data.coords assert 'E' in cut_data.coords - - def test_cut_preserves_arc_dimension(self, qcut_workflow: sciline.Pipeline) -> None: - # Test that cut preserves the arc dimension (renamed from triplet) - axis_1 = CutAxis( - output='|Q|', - fn=lambda sample_table_momentum_transfer: sc.norm( - sample_table_momentum_transfer - ), - bins=sc.linspace(dim='|Q|', start=0.0, stop=3.0, num=50, unit='1/angstrom'), - ) - axis_2 = CutAxis( - output='E', - fn=lambda energy_transfer: energy_transfer, - bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), - ) - - qcut_workflow[CutAxis1] = axis_1 - qcut_workflow[CutAxis2] = axis_2 - - cut_data = qcut_workflow.compute(CutData[SampleRun]) - - # Verify the result is 3-D with arc dimension preserved - assert cut_data.bins is None - assert set(cut_data.dims) == {'arc', '|Q|', 'E'} - assert cut_data.sizes['arc'] == 5 - assert cut_data.sizes['|Q|'] == 49 - assert cut_data.sizes['E'] == 49 - - # Verify arc coordinate exists with correct values - assert 'arc' in cut_data.coords - expected_arc_energies = sc.array( - dims=['arc'], values=[2.7, 3.2, 3.8, 4.4, 5.0], unit='meV' - ) - sc.testing.assert_allclose(cut_data.coords['arc'], expected_arc_energies) From 3522e88bdeb2b784bfcf6987564b2c128498e958 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 17 Oct 2025 14:48:10 +0200 Subject: [PATCH 226/330] Use public nexus functions --- .../src/ess/bifrost/io/nexus.py | 72 ++++++++++--------- .../src/ess/spectroscopy/types.py | 3 + 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 1d34661d7..41b32975a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -3,17 +3,17 @@ """NeXus input/output for BIFROST.""" -from collections.abc import Iterable - import scipp as sc import scippnexus as snx +from ess.reduce.nexus import load_all_components, open_component_group +from ess.reduce.nexus.types import NeXusAllLocationSpec, NeXusLocationSpec from ess.spectroscopy.types import ( Analyzer, + Analyzers, InstrumentAngle, NeXusClass, NeXusComponentLocationSpec, - NeXusDetectorName, NeXusFileSpec, RunType, SampleAngle, @@ -41,43 +41,51 @@ def load_instrument_angle( def _load_experiment_parameter( file_spec: NeXusFileSpec[RunType], param_name: str ) -> sc.DataArray: - # TODO need mechanism in ESSreduce to load specific components of non-unique - # class by name - from ess.reduce.nexus._nexus_loader import _unique_child_group, open_nexus_file - - with open_nexus_file(file_spec.value) as file: - parameters = _unique_child_group( - _unique_child_group(file, snx.NXentry, name=None), - snx.NXparameters, - name=None, + with open_component_group( + NeXusLocationSpec(filename=file_spec.value), + nx_class=snx.NXparameters, + parent_class=snx.NXentry, + ) as group: + return group[param_name][()]['value'] + + +def load_analyzers(file_spec: NeXusFileSpec[RunType]) -> Analyzers[RunType]: + """Load all analyzers in a NeXus file.""" + return Analyzers[RunType]( + load_all_components( + NeXusAllLocationSpec(filename=file_spec.value), + nx_class=snx.NXcrystal, ) - return parameters[param_name][()]['value'] + ) -def _analyzer_name_for_detector_name( - detector_name: NeXusDetectorName, all_names: Iterable[str] -) -> str: +def _get_analyzer_for_detector_name( + detector_name: str, analyzers: Analyzers[RunType] +) -> Analyzers[RunType]: detector_index = int(detector_name.split('_', 1)[0]) analyzer_index = str(detector_index - 2) - for name in all_names: + for name, analyzer in analyzers.items(): if name.startswith(analyzer_index): - return name + return analyzer raise RuntimeError(f"No analyzer found for detector {detector_name}") -def load_analyzer_for_detector( +def analyzer_for_detector( + analyzers: Analyzers[RunType], detector_location: NeXusComponentLocationSpec[snx.NXdetector, RunType], ) -> Analyzer[RunType]: - """Find and load the right analyzer for a detector triplet. + """Extract the analyzer for a given detector. Note ---- - Depends heavily on the names of components being preceded by an in-instrument index, + Depends heavily on the names of components being preceded by an instrument index, and the analyzer and detector components being separated in index by 2. - If either condition changes this function will need to be modified. + If either condition changes, this function will need to be modified. Parameters ---------- + analyzers: + Data group of loaded analyzers. detector_location: The location of an NXdetector in the NeXus file. The analyzer is identified based on this location. @@ -85,18 +93,15 @@ def load_analyzer_for_detector( Returns ------- : - The loaded analyzer for the given detector triplet. + The analyzer for the given detector triplet. Only a subset of fields is returned. """ - from ess.reduce.nexus._nexus_loader import _open_component_parent - - with _open_component_parent(detector_location, nx_class=snx.NXcrystal) as parent: - analyzer_name = _analyzer_name_for_detector_name( - detector_location.component_name, parent.keys() - ) - analyzer = snx.compute_positions( - parent[analyzer_name][()], store_transform='transform' - ) + if detector_location.component_name is None: + raise ValueError("Detector component name is None") + analyzer = snx.compute_positions( + _get_analyzer_for_detector_name(detector_location.component_name, analyzers), + store_transform='transform', + ) return Analyzer[RunType]( sc.DataGroup( dspacing=analyzer['d_spacing'], @@ -107,7 +112,8 @@ def load_analyzer_for_detector( providers = ( - load_analyzer_for_detector, + analyzer_for_detector, + load_analyzers, load_instrument_angle, load_sample_angle, moderator_class_for_source, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index f0e4586dd..82fe7c6ad 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -68,6 +68,9 @@ class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): ... +class Analyzers(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): ... + + class BeamlineWithSpectrometerCoords( sciline.Scope[RunType, sc.DataArray], sc.DataArray ): ... From a36f24a110f6a91c8eb39c288b0b3c39ce91e347 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 31 Oct 2025 15:34:42 +0100 Subject: [PATCH 227/330] Require essreduce>=25.10.2 --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- packages/essspectroscopy/requirements/base.txt | 6 +++--- packages/essspectroscopy/requirements/ci.txt | 4 ++-- packages/essspectroscopy/requirements/dev.txt | 10 +++++----- packages/essspectroscopy/requirements/docs.txt | 12 ++++++------ packages/essspectroscopy/requirements/nightly.txt | 2 +- packages/essspectroscopy/requirements/static.txt | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index c469f430d..6afdc71a5 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,7 +30,7 @@ requires-python = ">=3.11" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=25.07.0", + "essreduce>=25.10.2", "graphviz>=0.20", "pandas>=2.1.2", "sciline>=25.4.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 722eecd71..f947f3933 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=25.07.0 +essreduce>=25.10.2 graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index a39613eab..ff51008af 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:2f0e00355fbb2de9650c92550ecaf43171f44146 +# SHA1:dd2fa1df38fd2cfcf224afdeefe82b3e9a1d15e8 # # This file was generated by pip-compile-multi. # To update, run: @@ -17,7 +17,7 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==25.10.1 +essreduce==25.10.2 # via -r base.in fonttools==4.60.1 # via matplotlib @@ -99,7 +99,7 @@ scippnexus==25.6.0 # -r base.in # essreduce # scippneutron -scipy==1.16.2 +scipy==1.16.3 # via # scippneutron # scippnexus diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 0e48c7f7a..5bc02f409 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -44,9 +44,9 @@ requests==2.32.5 # via -r ci.in smmap==5.0.2 # via gitdb -tox==4.31.0 +tox==4.32.0 # via -r ci.in urllib3==2.5.0 # via requests -virtualenv==20.35.3 +virtualenv==20.35.4 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 90be6d362..17d52b683 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -69,11 +69,11 @@ jupyter-server==2.17.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.4.9 +jupyterlab==4.4.10 # via -r dev.in -jupyterlab-server==2.27.3 +jupyterlab-server==2.28.0 # via jupyterlab -lark==1.3.0 +lark==1.3.1 # via rfc3987-syntax notebook-shim==0.2.4 # via jupyterlab @@ -83,7 +83,7 @@ pip-compile-multi==3.2.2 # via -r dev.in pip-tools==7.5.1 # via pip-compile-multi -plumbum==1.9.0 +plumbum==1.10.0 # via copier prometheus-client==0.23.1 # via jupyter-server @@ -115,7 +115,7 @@ toposort==1.10 # via pip-compile-multi uri-template==1.3.0 # via jsonschema -webcolors==24.11.1 +webcolors==25.10.0 # via jsonschema websocket-client==1.9.0 # via jupyter-server diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 213580e4c..5bc7b83b0 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -26,7 +26,7 @@ beautifulsoup4==4.14.2 # via # nbconvert # pydata-sphinx-theme -bleach[css]==6.2.0 +bleach[css]==6.3.0 # via nbconvert certifi==2025.10.5 # via requests @@ -54,7 +54,7 @@ fastjsonschema==2.21.2 # via nbformat imagesize==1.4.1 # via sphinx -ipykernel==7.0.1 +ipykernel==7.1.0 # via -r docs.in ipympl==0.9.8 # via -r docs.in @@ -105,7 +105,7 @@ markupsafe==3.0.3 # via # jinja2 # nbconvert -matplotlib-inline==0.1.7 +matplotlib-inline==0.2.1 # via # ipykernel # ipython @@ -144,7 +144,7 @@ pooch==1.8.2 # via -r docs.in prompt-toolkit==3.0.52 # via ipython -psutil==7.1.1 +psutil==7.1.2 # via ipykernel ptyprocess==0.7.0 # via pexpect @@ -162,7 +162,7 @@ pygments==2.19.2 # nbconvert # pydata-sphinx-theme # sphinx -python-dotenv==1.1.1 +python-dotenv==1.2.1 # via pydantic-settings pyyaml==6.0.3 # via myst-parser @@ -178,7 +178,7 @@ requests==2.32.5 # via # pooch # sphinx -rpds-py==0.27.1 +rpds-py==0.28.0 # via # jsonschema # referencing diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 2ede728d4..f87ab0ece 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -124,7 +124,7 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.16.2 +scipy==1.16.3 # via # scippneutron # scippnexus diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index aec8f4c81..991a89212 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -21,5 +21,5 @@ pre-commit==4.3.0 # via -r static.in pyyaml==6.0.3 # via pre-commit -virtualenv==20.35.3 +virtualenv==20.35.4 # via pre-commit From 18701ea779c2ead64a440ba35a1a0ce94038440a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 29 Oct 2025 09:53:47 +0100 Subject: [PATCH 228/330] Use standard naming scheme --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 19 +++-- .../bifrost-make-tof-lookup-table.ipynb | 18 +++-- .../bifrost/bifrost-reduction.ipynb | 4 +- .../src/ess/bifrost/cutting.py | 4 +- .../essspectroscopy/src/ess/bifrost/data.py | 6 +- .../src/ess/bifrost/detector.py | 70 ++++++++++++------- .../src/ess/bifrost/io/mcstas.py | 18 ++--- .../essspectroscopy/src/ess/bifrost/live.py | 4 +- .../ess/bifrost/single_crystal/conversion.py | 22 +++--- .../src/ess/bifrost/single_crystal/q_map.py | 4 +- .../bifrost/single_crystal/time_of_flight.py | 8 +-- .../essspectroscopy/src/ess/bifrost/types.py | 2 +- .../src/ess/bifrost/workflow.py | 11 ++- .../ess/spectroscopy/indirect/conversion.py | 21 +++--- .../src/ess/spectroscopy/indirect/io.py | 4 +- .../src/ess/spectroscopy/indirect/ki.py | 24 ++++++- .../spectroscopy/indirect/time_of_flight.py | 18 ++--- .../src/ess/spectroscopy/types.py | 34 +++++---- .../tests/bifrost/cutting_test.py | 10 +-- .../tests/bifrost/workflow_test.py | 16 ++--- .../tools/docs/bifrost-thumbnails.ipynb | 2 +- 21 files changed, 191 insertions(+), 128 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index d2bbeaba8..69a29fb19 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -26,7 +26,7 @@ ")\n", "from ess.bifrost.single_crystal import BifrostBraggPeakMonitorWorkflow, make_q_map\n", "from ess.bifrost.single_crystal.types import *\n", - "from ess.bifrost.types import McStasDetectorData\n", + "from ess.bifrost.types import McStasRawDetector\n", "from ess.reduce.time_of_flight import DetectorLtotal\n", "from ess.spectroscopy.types import *" ] @@ -88,9 +88,9 @@ "\n", "\n", "def assemble_detector_data_flatten(\n", - " detector: CalibratedBeamline[RunType],\n", + " detector: EmptyDetector[RunType],\n", " data: NeXusData[snx.NXdetector, RunType],\n", - ") -> McStasDetectorData[RunType]:\n", + ") -> McStasRawDetector[RunType]:\n", " from ess.reduce.nexus.workflow import assemble_detector_data as assemble\n", " base = assemble(detector, data)\n", "\n", @@ -101,15 +101,22 @@ " monitor.coords['position'] = base.coords['position'].mean() / 2\n", " # Zero out the y-component because the monitor is in the sample plane:\n", " monitor.coords['position'].fields.y = sc.scalar(0.0, unit=monitor.coords['position'].unit)\n", - " return McStasDetectorData[RunType](monitor)\n", + " return McStasRawDetector[RunType](monitor)\n", "\n", "\n", "def detector_ltotal_from_straight_line_approximation(\n", - " detector_beamline: DetectorData[RunType],\n", + " detector_beamline: RawDetector[RunType],\n", + " source_position: Position[snx.NXsource, RunType],\n", + " sample_position: Position[snx.NXsample, RunType],\n", + " gravity: GravityVector,\n", ") -> DetectorLtotal[RunType]:\n", " from ess.reduce.time_of_flight import eto_to_tof\n", " return eto_to_tof.detector_ltotal_from_straight_line_approximation(\n", - " detector_beamline # type: ignore[arg-type]\n", + " detector_beamline, # type: ignore[arg-type]\n", + "\n", + " source_position=source_position,\n", + " sample_position=sample_position,\n", + " gravity=gravity,\n", " )\n", "\n", "\n", diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb index 4596430c8..3163ba177 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb @@ -69,10 +69,12 @@ "bifrost_workflow = BifrostSimulationWorkflow(detector_names)\n", "bifrost_workflow[Filename[SampleRun]] = input_filename\n", "\n", - "M = nexus.types.CalibratedMonitor[SampleRun, FrameMonitor3]\n", + "M = nexus.types.EmptyMonitor[SampleRun, FrameMonitor3]\n", "C = RawChoppers[SampleRun]\n", - "choppers, monitor = bifrost_workflow.compute((C, M)).values()\n", - "beamline = sciline.compute_mapped(bifrost_workflow, BeamlineWithSpectrometerCoords[SampleRun])[0]" + "SOURCE = Position[snx.NXsource, SampleRun]\n", + "SAMPLE = Position[snx.NXsample, SampleRun]\n", + "choppers, monitor, sample_position, source_position = bifrost_workflow.compute((C, M, SAMPLE, SOURCE)).values()\n", + "detector = sciline.compute_mapped(bifrost_workflow, EmptyDetector[SampleRun])[0]" ] }, { @@ -92,9 +94,15 @@ "metadata": {}, "outputs": [], "source": [ + "graph = {\n", + " **beamline_graph.beamline(scatter=True),\n", + " 'sample_position': lambda: sample_position,\n", + " 'source_position': lambda: source_position,\n", + "}\n", + "\n", "l_monitor = sc.norm(monitor.coords['source_position'] - monitor.coords['position'])\n", "l_min = l_monitor\n", - "l_max = beamline.transform_coords('Ltotal', graph=beamline_graph.beamline(scatter=True)).coords['Ltotal'].max()" + "l_max = detector.transform_coords('Ltotal', graph=graph).coords['Ltotal'].max()" ] }, { @@ -152,7 +160,7 @@ "workflow = TofLookupTableWorkflow()\n", "workflow[DiskChoppers] = disk_choppers\n", "workflow[LtotalRange] = (l_min, l_max)\n", - "workflow[SourcePosition] = beamline.coords['source_position']\n", + "workflow[SourcePosition] = source_position\n", "\n", "# Increase this number for more reliable results:\n", "workflow[NumberOfSimulatedNeutrons] = 600_000" diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index a1541c4d9..51352e20f 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -113,7 +113,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow.visualize(EnergyData[SampleRun], graph_attr={\"rankdir\": \"LR\"})" + "workflow.visualize(EnergyQDetector[SampleRun], graph_attr={\"rankdir\": \"LR\"})" ] }, { @@ -134,7 +134,7 @@ "outputs": [], "source": [ "scheduler = sciline.scheduler.NaiveScheduler()\n", - "data = workflow.compute(EnergyData[SampleRun], scheduler=scheduler)" + "data = workflow.compute(EnergyQDetector[SampleRun], scheduler=scheduler)" ] }, { diff --git a/packages/essspectroscopy/src/ess/bifrost/cutting.py b/packages/essspectroscopy/src/ess/bifrost/cutting.py index d924d4452..6388e055b 100644 --- a/packages/essspectroscopy/src/ess/bifrost/cutting.py +++ b/packages/essspectroscopy/src/ess/bifrost/cutting.py @@ -9,15 +9,15 @@ from ess.spectroscopy.types import ( DataGroupedByRotation, - DetectorData, InstrumentAngle, + RawDetector, RunType, SampleAngle, ) def group_by_rotation( - data: DetectorData[RunType], + data: RawDetector[RunType], sample_angle: SampleAngle[RunType], instrument_angle: InstrumentAngle[RunType], ) -> DataGroupedByRotation[RunType]: diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 4d94db44f..fc68ed7a4 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -3,7 +3,7 @@ """Data for tests and documentation with BIFROST.""" -_version = "3" +_version = "4" def _make_pooch(): @@ -16,8 +16,8 @@ def _make_pooch(): version=_version, registry={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated.h5": "blake2b:3c398443cb85c8294d283c7212255bc695c2520f2332c2c99d041a0760b6bcbb9937e19bcd8a498daf306d279c88d2ea911c510c1ce3b3a7f1e6b7e54022a943", # noqa: E501 - "computed_energy_data_simulated_5x2.h5": "blake2b:d9d5e785a08e14d9c3416cf04db89a8c6f2fae3c0bae27bf0e73e8e5d492b4ca406e6578a935fa9f72dd9199dc15536409f614791fee6899c4265fe5d31e2706", # noqa: E501 + "computed_energy_data_simulated.h5": "blake2b:690d837ce684a0aeea021b2624c5f7371e299f1bbc803725b40bf3eca35816e3348a79e5fdf04dc89e29c4bdd4f6ea2b052b49058eecfdf535b9733eefa8a854", # noqa: E501 + "computed_energy_data_simulated_5x2.h5": "blake2b:0353f7e675a276451637fd175eef4f3d231a68a8983faf1240796fef44c9f3e78a264baf705e24d71f001afc83d07bbf1bff17e5bd83a15db89386a43dd5d5d7", # noqa: E501 "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 }, retry_if_failed=3, diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 39760284e..24acd57f3 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -6,20 +6,22 @@ import scipp as sc import scippnexus as snx +from ess.spectroscopy.indirect.conversion import add_spectrometer_coords from ess.spectroscopy.types import ( - BeamlineWithSpectrometerCoords, - CalibratedDetector, DetectorPositionOffset, + EmptyDetector, NeXusComponent, NeXusTransformation, + PrimarySpecCoordTransformGraph, RunType, + SecondarySpecCoordTransformGraph, ) from .types import ArcNumber def arc_number( - beamline: BeamlineWithSpectrometerCoords[RunType], + beamline: EmptyDetector[RunType], ) -> ArcNumber[RunType]: """Calculate BIFROST arc index number from pixel final energy @@ -49,16 +51,41 @@ def arc_number( return ArcNumber[RunType](sc.round((final_energy - minimum) / step).to(dtype='int')) +def arc_and_channel_from_detector_number( + detector_number: sc.Variable, +) -> tuple[sc.Variable, sc.Variable]: + """Calculate arc number and channel from detector number. + + Calculate arc and channel for this triplet based on detector_number layout. + BIFROST detector_number ordering is (arc, tube, channel, pixel). + Each triplet contains 3 tubes of 100 pixels for a single arc-channel pair. + """ + + det_num = detector_number['tube', 0]['length', 0].value + pixels_per_tube = 100 + tubes_per_channel = 3 + channels_per_arc = 9 + pixels_per_arc = pixels_per_tube * tubes_per_channel * channels_per_arc # 2700 + + # detector_number is 1-indexed + idx = det_num - 1 + arc = idx // pixels_per_arc + remainder = idx % pixels_per_arc + channel = (remainder % (pixels_per_tube * channels_per_arc)) // pixels_per_tube + + return sc.index(arc), sc.index(channel) + + def get_calibrated_detector_bifrost( detector: NeXusComponent[snx.NXdetector, RunType], *, transform: NeXusTransformation[snx.NXdetector, RunType], offset: DetectorPositionOffset[RunType], -) -> CalibratedDetector[RunType]: + primary_graph: PrimarySpecCoordTransformGraph[RunType], + secondary_graph: SecondarySpecCoordTransformGraph[RunType], +) -> EmptyDetector[RunType]: """Extract the data array corresponding to a detector's signal field. - The returned data array includes coords and masks pertaining directly to the - signal values array, but not additional information about the detector. The data array is reshaped to the logical detector shape. This function is specific to BIFROST and differs from the generic @@ -74,11 +101,18 @@ def get_calibrated_detector_bifrost( Transformation that determines the detector position. offset: Offset to add to the detector position. + primary_graph: + Coordinate transformation graph for the primary spectrometer. + secondary_graph: + Coordinate transformation graph for the secondary spectrometer. + Must be a closure over analyzer parameters. + And those parameters must have a compatible shape with ``data``. Returns ------- : - Detector data. + Detector geometry and spectrometer coordinates. + This includes "final_energy", "secondary_flight_time", and "L1". """ from ess.reduce.nexus.types import DetectorBankSizes @@ -93,25 +127,13 @@ def get_calibrated_detector_bifrost( ) da = da.rename(dim_0='tube', dim_1='length') - # Calculate arc and channel for this triplet based on detector_number layout. - # BIFROST detector_number ordering is (arc, tube, channel, pixel). - # Each triplet contains 3 tubes of 100 pixels for a single arc-channel pair. - det_num = da.coords['detector_number']['tube', 0]['length', 0].value - pixels_per_tube = 100 - tubes_per_channel = 3 - channels_per_arc = 9 - pixels_per_arc = pixels_per_tube * tubes_per_channel * channels_per_arc # 2700 - - # detector_number is 1-indexed - idx = det_num - 1 - arc = idx // pixels_per_arc - remainder = idx % pixels_per_arc - channel = (remainder % (pixels_per_tube * channels_per_arc)) // pixels_per_tube + arc, channel = arc_and_channel_from_detector_number(da.coords['detector_number']) + da.coords['arc'] = arc + da.coords['channel'] = channel - da.coords['arc'] = sc.index(arc) - da.coords['channel'] = sc.index(channel) + da = add_spectrometer_coords(da, primary_graph, secondary_graph) - return CalibratedDetector[RunType](da) + return EmptyDetector[RunType](da) def merge_triplets( diff --git a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py index 945e8078e..778b79580 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py @@ -7,30 +7,30 @@ import scippnexus as snx from ess.spectroscopy.types import ( - BeamlineWithSpectrometerCoords, - DetectorData, + EmptyDetector, NeXusData, PulsePeriod, + RawDetector, RunType, ) -from ..types import McStasDetectorData +from ..types import McStasRawDetector def assemble_detector_data( - detector: BeamlineWithSpectrometerCoords[RunType], + detector: EmptyDetector[RunType], event_data: NeXusData[snx.NXdetector, RunType], -) -> McStasDetectorData[RunType]: +) -> McStasRawDetector[RunType]: """Custom assemble function that returns McStasDetectorData.""" from ess.reduce.nexus.workflow import assemble_detector_data as reduce_assemble - return McStasDetectorData[RunType](reduce_assemble(detector, event_data)) + return McStasRawDetector[RunType](reduce_assemble(detector, event_data)) def convert_simulated_time_to_event_time_offset( - mcstas_data: McStasDetectorData[RunType], + mcstas_data: McStasRawDetector[RunType], pulse_period: PulsePeriod, -) -> DetectorData[RunType]: +) -> RawDetector[RunType]: """Helper to make McStas simulated event data look more like real data McStas has the ability to track the time-of-flight from source to detector for @@ -67,7 +67,7 @@ def wrap_event_time_offset(event_time_offset: sc.Variable) -> sc.Variable: keep_intermediate=False, keep_inputs=False, ) - return DetectorData[RunType]( + return RawDetector[RunType]( res.transform_coords(event_time_offset='frame_time', keep_inputs=False) ) diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index 60de9bf84..a28695374 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -11,7 +11,7 @@ import scipp as sc from ess.spectroscopy.types import ( - EnergyData, + EnergyQDetector, NeXusDetectorName, RunType, ) @@ -110,7 +110,7 @@ def arc_energy() -> ArcEnergy: def cut( - data: EnergyData[RunType], + data: EnergyQDetector[RunType], *, axis_1: CutAxis1, axis_2: CutAxis2, diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py index df1c59a72..5fc42fa02 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py @@ -3,6 +3,7 @@ """Coordinate conversions for single crystal diffraction with BIFROST.""" +import scippnexus as snx from scippneutron.conversion.graph import beamline as beamline_graphs from scippneutron.conversion.graph import tof as tof_graphs @@ -10,24 +11,29 @@ rotate_to_sample_table_momentum_transfer, ) from ess.spectroscopy.types import ( - DetectorCountsWithQ, - DetectorTofData, ElasticCoordTransformGraph, GravityVector, + Position, + QDetector, RunType, + TofDetector, ) def single_crystal_coordinate_transformation_graph( + source_position: Position[snx.NXsource, RunType], + sample_position: Position[snx.NXsample, RunType], gravity: GravityVector, -) -> ElasticCoordTransformGraph: +) -> ElasticCoordTransformGraph[RunType]: """Return the coordinate transformation graph for single crystal diffraction.""" base = tof_graphs.elastic_Q_vec(start='tof') base['lab_momentum_transfer'] = base['Q_vec'] - return ElasticCoordTransformGraph( + return ElasticCoordTransformGraph[RunType]( { **beamline_graphs.beamline(scatter=True), **base, + 'sample_position': lambda: sample_position, + 'source_position': lambda: source_position, 'gravity': lambda: gravity, 'sample_table_momentum_transfer': rotate_to_sample_table_momentum_transfer, } @@ -35,10 +41,10 @@ def single_crystal_coordinate_transformation_graph( def convert_tof_to_q( - with_tof: DetectorTofData[RunType], + with_tof: TofDetector[RunType], *, - graph: ElasticCoordTransformGraph, -) -> DetectorCountsWithQ[RunType]: + graph: ElasticCoordTransformGraph[RunType], +) -> QDetector[RunType]: """Convert ToF to Q.""" transformed = with_tof.transform_coords( ['a3', 'sample_table_momentum_transfer'], @@ -48,7 +54,7 @@ def convert_tof_to_q( keep_aliases=False, rename_dims=False, # because otherwise, it would rename a3 -> Q ) - return DetectorCountsWithQ[RunType](transformed) + return QDetector[RunType](transformed) providers = (single_crystal_coordinate_transformation_graph, convert_tof_to_q) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index af6f9ff2b..a1cb863ce 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -12,7 +12,7 @@ import scipp as sc from matplotlib.axes import Axes -from ess.spectroscopy.types import DetectorCountsWithQ, RunType +from ess.spectroscopy.types import QDetector, RunType from .types import ( CountsWithQMapCoords, @@ -27,7 +27,7 @@ def project_momentum_transfer( - counts: DetectorCountsWithQ[RunType], + counts: QDetector[RunType], *, q_projection: QProjection, ) -> CountsWithQMapCoords[RunType]: diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py index ad7c87f97..3dd4beef4 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py @@ -7,11 +7,11 @@ from ess.reduce.time_of_flight.types import DetectorLtotal from ess.spectroscopy.types import ( DataGroupedByRotation, - DetectorData, - DetectorTofData, PulseStrideOffset, + RawDetector, RunType, TimeOfFlightLookupTable, + TofDetector, ) @@ -20,7 +20,7 @@ def detector_time_of_flight_data( lookup: TimeOfFlightLookupTable, ltotal: DetectorLtotal[RunType], pulse_stride_offset: PulseStrideOffset, -) -> DetectorTofData[RunType]: +) -> TofDetector[RunType]: """ Convert the time-of-arrival data to time-of-flight data using a lookup table. @@ -31,7 +31,7 @@ def detector_time_of_flight_data( for different input types. """ return reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data( - detector_data=DetectorData[RunType](sample_data), + detector_data=RawDetector[RunType](sample_data), lookup=lookup, ltotal=ltotal, pulse_stride_offset=pulse_stride_offset, diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 13ba1044d..46a0018c5 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -17,7 +17,7 @@ class ArcNumber(sciline.Scope[RunType, sc.Variable], sc.Variable): ... -class McStasDetectorData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class McStasRawDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... ArcEnergy = NewType('ArcEnergy', sc.Variable) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 44a6b7888..6174bdad3 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -15,8 +15,6 @@ from ess.spectroscopy.indirect.normalization import providers as normalisation_providers from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( - BeamlineWithSpectrometerCoords, - DetectorData, FrameMonitor0, FrameMonitor1, FrameMonitor2, @@ -25,6 +23,7 @@ NeXusDetectorName, NeXusMonitorName, PulsePeriod, + RawDetector, SampleRun, ) @@ -80,8 +79,8 @@ def BifrostSimulationWorkflow( for key, val in simulation_default_parameters().items(): workflow[key] = val - workflow[DetectorData[SampleRun]] = ( - workflow[DetectorData[SampleRun]] + workflow[RawDetector[SampleRun]] = ( + workflow[RawDetector[SampleRun]] .map(_make_detector_name_mapping(detector_names)) .reduce(func=merge_triplets) ) @@ -104,8 +103,8 @@ def BifrostWorkflow( for key, val in simulation_default_parameters().items(): workflow[key] = val - workflow[BeamlineWithSpectrometerCoords[SampleRun]] = ( - workflow[BeamlineWithSpectrometerCoords[SampleRun]] + workflow[RawDetector[SampleRun]] = ( + workflow[RawDetector[SampleRun]] .map(_make_detector_name_mapping(detector_names)) .reduce(func=merge_triplets) ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 99c43371d..760254935 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -11,18 +11,16 @@ ) from ..types import ( - BeamlineWithSpectrometerCoords, - CalibratedBeamline, - DetectorTofData, - EnergyData, + EnergyQDetector, GravityVector, InelasticCoordTransformGraph, MonitorCoordTransformGraph, - MonitorTofData, MonitorType, PrimarySpecCoordTransformGraph, RunType, SecondarySpecCoordTransformGraph, + TofDetector, + TofMonitor, WavelengthMonitor, ) @@ -160,8 +158,8 @@ def inelastic_coordinate_transformation_graph_at_sample( def add_inelastic_coordinates( - data: DetectorTofData[RunType], graph: InelasticCoordTransformGraph -) -> EnergyData[RunType]: + data: TofDetector[RunType], graph: InelasticCoordTransformGraph +) -> EnergyQDetector[RunType]: transformed = data.transform_coords( [ # TODO pick minimal list of coords @@ -180,14 +178,14 @@ def add_inelastic_coordinates( keep_intermediate=False, rename_dims=False, ) - return EnergyData[RunType](transformed) + return EnergyQDetector[RunType](transformed) def add_spectrometer_coords( - data: CalibratedBeamline[RunType], + data: sc.DataArray, primary_graph: PrimarySpecCoordTransformGraph[RunType], secondary_graph: SecondarySpecCoordTransformGraph[RunType], -) -> BeamlineWithSpectrometerCoords[RunType]: +) -> sc.DataArray: """Compute and add coordinates for the spectrometer. Parameters @@ -236,7 +234,7 @@ def monitor_coordinate_transformation_graph() -> MonitorCoordTransformGraph: def add_monitor_wavelength_coords( - monitor: MonitorTofData[RunType, MonitorType], graph: MonitorCoordTransformGraph + monitor: TofMonitor[RunType, MonitorType], graph: MonitorCoordTransformGraph ) -> WavelengthMonitor[RunType, MonitorType]: return WavelengthMonitor[RunType, MonitorType]( monitor.transform_coords( @@ -248,7 +246,6 @@ def add_monitor_wavelength_coords( providers = ( add_inelastic_coordinates, add_monitor_wavelength_coords, - add_spectrometer_coords, inelastic_coordinate_transformation_graph_at_sample, monitor_coordinate_transformation_graph, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py index 426f5a521..84a2d8e65 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/io.py @@ -10,10 +10,10 @@ import scippnexus from scipp import DataArray -from ..types import EnergyData, NXspeFileName, NXspeFileNames, SampleRun +from ..types import EnergyQDetector, NXspeFileName, NXspeFileNames, SampleRun -def to_nxspe(events: EnergyData[SampleRun], base: NXspeFileName) -> NXspeFileNames: +def to_nxspe(events: EnergyQDetector[SampleRun], base: NXspeFileName) -> NXspeFileNames: """Take events, which have been binned in incident wavelength and have monitor counts per bin, and output one NXspe file per setting diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 8f6faef48..0b8c2901c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -5,17 +5,32 @@ from __future__ import annotations +import scippnexus as snx + from ess.spectroscopy.types import ( + GravityVector, + Position, PrimarySpecCoordTransformGraph, RunType, ) -def primary_spectrometer_coordinate_transformation_graph() -> ( - PrimarySpecCoordTransformGraph[RunType] -): +def primary_spectrometer_coordinate_transformation_graph( + source_position: Position[snx.NXsource, RunType], + sample_position: Position[snx.NXsample, RunType], + gravity: GravityVector, +) -> PrimarySpecCoordTransformGraph[RunType]: """Return a coordinate transformation graph for the primary spectrometer. + Parameters + ---------- + source_position: + Position of the neutron source. + sample_position: + Position of the sample. + gravity: + Gravity vector. + Returns ------- : @@ -35,6 +50,9 @@ def primary_spectrometer_coordinate_transformation_graph() -> ( { "incident_beam": straight_incident_beam, "L1": L1, + "sample_position": lambda: sample_position, + "source_position": lambda: source_position, + "gravity": lambda: gravity, } ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index f67dc24d9..c674b6ebf 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -12,16 +12,16 @@ from ..types import ( DataAtSample, - DetectorData, - DetectorTofData, MonitorCoordTransformGraph, - MonitorData, MonitorLtotal, - MonitorTofData, MonitorType, PulseStrideOffset, + RawDetector, + RawMonitor, RunType, TimeOfFlightLookupTable, + TofDetector, + TofMonitor, ) @@ -43,7 +43,7 @@ def detector_time_of_flight_data( sample_data: DataAtSample[RunType], lookup: TimeOfFlightLookupTable, pulse_stride_offset: PulseStrideOffset, -) -> DetectorTofData[RunType]: +) -> TofDetector[RunType]: """ Convert the time-of-arrival data to time-of-flight data using a lookup table. @@ -54,7 +54,7 @@ def detector_time_of_flight_data( for indirect geometry spectrometers. """ result = reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data( - detector_data=DetectorData[RunType](sample_data), + detector_data=RawDetector[RunType](sample_data), lookup=lookup, ltotal=DetectorLtotal(sample_data.coords['L1']), pulse_stride_offset=pulse_stride_offset, @@ -66,11 +66,11 @@ def detector_time_of_flight_data( def monitor_time_of_flight_data( - monitor_data: MonitorData[RunType, MonitorType], + monitor_data: RawMonitor[RunType, MonitorType], lookup: TimeOfFlightLookupTable, ltotal: MonitorLtotal[RunType, MonitorType], pulse_stride_offset: PulseStrideOffset, -) -> MonitorTofData[RunType, MonitorType]: +) -> TofMonitor[RunType, MonitorType]: """ Convert the time-of-arrival data to time-of-flight data using a lookup table. @@ -90,7 +90,7 @@ def monitor_time_of_flight_data( def compute_monitor_ltotal( - monitor_data: MonitorData[RunType, MonitorType], + monitor_data: RawMonitor[RunType, MonitorType], coord_transform_graph: MonitorCoordTransformGraph, ) -> MonitorLtotal[RunType, MonitorType]: """Compute the path length from the source to the monitor.""" diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 82fe7c6ad..85e225454 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -13,13 +13,12 @@ # NeXus types -CalibratedBeamline = reduce_t.CalibratedBeamline -CalibratedDetector = reduce_t.CalibratedDetector -DetectorData = reduce_t.DetectorData +EmptyDetector = reduce_t.EmptyDetector +RawDetector = reduce_t.RawDetector DetectorPositionOffset = reduce_t.DetectorPositionOffset GravityVector = reduce_t.GravityVector Filename = reduce_t.Filename -MonitorData = reduce_t.MonitorData +RawMonitor = reduce_t.RawMonitor NeXusClass = reduce_t.NeXusClass NeXusComponentLocationSpec = reduce_t.NeXusComponentLocationSpec NeXusComponent = reduce_t.NeXusComponent @@ -53,8 +52,8 @@ # Time-of-flight types -DetectorTofData = time_of_flight.DetectorTofData -MonitorTofData = time_of_flight.MonitorTofData +TofDetector = time_of_flight.TofDetector +TofMonitor = time_of_flight.TofMonitor MonitorLtotal = time_of_flight.MonitorLtotal PulseStride = time_of_flight.PulseStride PulseStrideOffset = time_of_flight.PulseStrideOffset @@ -65,15 +64,15 @@ # Custom types -class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): ... +class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): + """A single wavelength analyzer loaded from an NXcrystal. - -class Analyzers(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): ... + Can be obtained from ``Analyzers``. + """ -class BeamlineWithSpectrometerCoords( - sciline.Scope[RunType, sc.DataArray], sc.DataArray -): ... +class Analyzers(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): + """All wavelength analyzers loaded from a NXcrystals.""" class DataAtSample(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... @@ -88,7 +87,10 @@ class DetectorCountsWithQ(sciline.Scope[RunType, sc.DataArray], sc.DataArray): . ElasticCoordTransformGraph = NewType('ElasticCoordTransformGraph', dict) -class EnergyData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class QDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + +class EnergyQDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... InelasticCoordTransformGraph = NewType('InelasticCoordTransformGraph', dict) @@ -121,6 +123,12 @@ class PrimarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... +class ElasticCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... + + +SQWBinSizes = NewType('SQWBinSizes', dict[str, int]) + + class WavelengthMonitor( sciline.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray ): ... diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py index 0b22d6497..d0ff18f43 100644 --- a/packages/essspectroscopy/tests/bifrost/cutting_test.py +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -12,7 +12,7 @@ ) from ess.bifrost.live import CutAxis, CutAxis1, CutAxis2, arc_energy, cut from ess.spectroscopy.types import ( - EnergyData, + EnergyQDetector, Filename, NeXusDetectorName, SampleRun, @@ -30,15 +30,15 @@ def simulation_detector_names() -> list[NeXusDetectorName]: @pytest.fixture def energy_data( simulation_detector_names: list[NeXusDetectorName], -) -> EnergyData[SampleRun]: +) -> EnergyQDetector[SampleRun]: workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation()) - return workflow.compute(EnergyData[SampleRun]) + return workflow.compute(EnergyQDetector[SampleRun]) def test_cut_along_q_norm_and_energy_transfer_preserves_counts( - energy_data: EnergyData[SampleRun], + energy_data: EnergyQDetector[SampleRun], ) -> None: # Define cut axes for |Q| and energy transfer axis_1 = CutAxis( @@ -68,7 +68,7 @@ def test_cut_along_q_norm_and_energy_transfer_preserves_counts( def test_cut_along_qx_direction_preserves_counts( - energy_data: EnergyData[SampleRun], + energy_data: EnergyQDetector[SampleRun], ) -> None: # Test cutting along a specific Q direction (Qx) axis_1 = CutAxis.from_q_vector( diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index d7192cd96..b743c1b58 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -13,12 +13,12 @@ tof_lookup_table_simulation, ) from ess.spectroscopy.types import ( - DetectorData, - EnergyData, + EnergyQDetector, Filename, FrameMonitor3, - MonitorData, NeXusDetectorName, + RawDetector, + RawMonitor, SampleRun, TimeOfFlightLookupTable, WavelengthMonitor, @@ -45,19 +45,17 @@ def test_simulation_workflow_can_load_detector() -> None: [NeXusDetectorName("125_channel_1_1_triplet")] ) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - results = sciline.compute_mapped(workflow, DetectorData[SampleRun]) + results = sciline.compute_mapped(workflow, RawDetector[SampleRun]) result = results.iloc[0] assert result.bins is not None assert set(result.dims) == {'tube', 'length'} assert result.sizes['tube'] == 3 assert 'position' in result.coords - assert 'sample_position' in result.coords - assert 'source_position' in result.coords def test_simulation_workflow_can_load_monitor(workflow: sciline.Pipeline) -> None: - result = workflow.compute(MonitorData[SampleRun, FrameMonitor3]) + result = workflow.compute(RawMonitor[SampleRun, FrameMonitor3]) assert result.bins is None assert 'position' in result.coords @@ -68,7 +66,7 @@ def test_simulation_workflow_can_load_monitor(workflow: sciline.Pipeline) -> Non def test_simulation_workflow_can_compute_energy_data( workflow: sciline.Pipeline, ) -> None: - energy_data = workflow.compute(EnergyData[SampleRun]) + energy_data = workflow.compute(EnergyQDetector[SampleRun]) assert energy_data.sizes == { 'arc': 5, @@ -109,7 +107,7 @@ def test_simulation_workflow_can_compute_wavelength_monitor( def test_simulation_workflow_produces_the_same_data_as_before( workflow: sciline.Pipeline, ) -> None: - energy_data = workflow.compute(EnergyData[SampleRun]) + energy_data = workflow.compute(EnergyQDetector[SampleRun]) expected = sc.io.load_hdf5(computed_energy_data_simulated_5x2()) assert not energy_data.masks diff --git a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb index 8cd720c7c..7c78ff48c 100644 --- a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb +++ b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb @@ -66,7 +66,7 @@ "outputs": [], "source": [ "scheduler = sciline.scheduler.NaiveScheduler()\n", - "data = workflow.compute(EnergyData[SampleRun], scheduler=scheduler)" + "data = workflow.compute(EnergyQDetector[SampleRun], scheduler=scheduler)" ] }, { From c3ed25a58ef477ddcbd6d19c0f9f4c7039a7f6d6 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 3 Nov 2025 11:28:29 +0100 Subject: [PATCH 229/330] Fix workflow mapping --- packages/essspectroscopy/src/ess/bifrost/workflow.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 6174bdad3..09dba3bad 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -15,6 +15,7 @@ from ess.spectroscopy.indirect.normalization import providers as normalisation_providers from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( + EmptyDetector, FrameMonitor0, FrameMonitor1, FrameMonitor2, @@ -103,8 +104,8 @@ def BifrostWorkflow( for key, val in simulation_default_parameters().items(): workflow[key] = val - workflow[RawDetector[SampleRun]] = ( - workflow[RawDetector[SampleRun]] + workflow[EmptyDetector[SampleRun]] = ( + workflow[EmptyDetector[SampleRun]] .map(_make_detector_name_mapping(detector_names)) .reduce(func=merge_triplets) ) From c8e92cd32b79f1f2caa8caf212e467f181311f25 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 3 Nov 2025 11:48:28 +0100 Subject: [PATCH 230/330] Require essreduce>=25.11.0 --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- packages/essspectroscopy/requirements/base.txt | 7 +++---- packages/essspectroscopy/requirements/docs.txt | 8 ++++---- packages/essspectroscopy/requirements/nightly.txt | 1 - 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 6afdc71a5..5645ac67b 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,7 +30,7 @@ requires-python = ">=3.11" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=25.10.2", + "essreduce>=25.11.0", "graphviz>=0.20", "pandas>=2.1.2", "sciline>=25.4.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index f947f3933..1ad3e953e 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=25.10.2 +essreduce>=25.11.0 graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index ff51008af..b11008dfa 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:dd2fa1df38fd2cfcf224afdeefe82b3e9a1d15e8 +# SHA1:50a6edfe91172d974287276363ead5efd7db446b # # This file was generated by pip-compile-multi. # To update, run: @@ -17,7 +17,7 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==25.10.2 +essreduce==25.11.0 # via -r base.in fonttools==4.60.1 # via matplotlib @@ -79,7 +79,7 @@ python-dateutil==2.9.0.post0 # scippnexus pytz==2025.2 # via pandas -sciline==25.8.0 +sciline==25.11.1 # via # -r base.in # essreduce @@ -112,7 +112,6 @@ typing-extensions==4.15.0 # via # pydantic # pydantic-core - # sciline # typing-inspection typing-inspection==0.4.2 # via pydantic diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 5bc7b83b0..10fed86e9 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -66,7 +66,7 @@ ipython==9.6.0 # ipywidgets ipython-pygments-lexers==1.1.1 # via ipython -ipywidgets==8.1.7 +ipywidgets==8.1.8 # via # -r docs.in # ipympl @@ -95,7 +95,7 @@ jupyter-core==5.9.1 # nbformat jupyterlab-pygments==0.3.0 # via nbconvert -jupyterlab-widgets==3.0.15 +jupyterlab-widgets==3.0.16 # via ipywidgets markdown-it-py==3.0.0 # via @@ -144,7 +144,7 @@ pooch==1.8.2 # via -r docs.in prompt-toolkit==3.0.52 # via ipython -psutil==7.1.2 +psutil==7.1.3 # via ipykernel ptyprocess==0.7.0 # via pexpect @@ -243,5 +243,5 @@ webencodings==0.5.1 # via # bleach # tinycss2 -widgetsnbextension==4.0.14 +widgetsnbextension==4.0.15 # via ipywidgets diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index f87ab0ece..bbfea8f88 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -137,7 +137,6 @@ typing-extensions==4.15.0 # via # pydantic # pydantic-core - # sciline # typing-inspection typing-inspection==0.4.2 # via pydantic From f520bbbe9c458fd5e4847b10bd2514d3b251654d Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 3 Nov 2025 11:56:08 +0100 Subject: [PATCH 231/330] Use generic DiskChoppers --- .../user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb index 3163ba177..1af980601 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb @@ -22,7 +22,7 @@ "import scipp as sc\n", "from scippneutron.conversion.graph import beamline as beamline_graph\n", "import scippnexus as snx\n", - "from ess.reduce.nexus.types import RawChoppers, DiskChoppers\n", + "from ess.reduce.nexus.types import AnyRun, RawChoppers, DiskChoppers\n", "from ess.reduce.time_of_flight.lut import (\n", " LtotalRange,\n", " NumberOfSimulatedNeutrons,\n", @@ -158,7 +158,7 @@ "outputs": [], "source": [ "workflow = TofLookupTableWorkflow()\n", - "workflow[DiskChoppers] = disk_choppers\n", + "workflow[DiskChoppers[AnyRun]] = disk_choppers\n", "workflow[LtotalRange] = (l_min, l_max)\n", "workflow[SourcePosition] = source_position\n", "\n", From 59a479385121e6d64ae0b88c99e53ca312903b88 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 3 Nov 2025 12:59:35 +0100 Subject: [PATCH 232/330] Remove duplicate definition --- packages/essspectroscopy/src/ess/spectroscopy/types.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 85e225454..3733dc168 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -84,18 +84,12 @@ class DataGroupedByRotation(sciline.Scope[RunType, sc.DataArray], sc.DataArray): class DetectorCountsWithQ(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -ElasticCoordTransformGraph = NewType('ElasticCoordTransformGraph', dict) - - class QDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... class EnergyQDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -InelasticCoordTransformGraph = NewType('InelasticCoordTransformGraph', dict) - - class SampleAngle(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """Rotation angle of the sample, possibly as a function of time. @@ -123,6 +117,9 @@ class PrimarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... +InelasticCoordTransformGraph = NewType('InelasticCoordTransformGraph', dict) + + class ElasticCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... From 0b7619cdf848279007fd831b911db86496c6a358 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 4 Nov 2025 09:58:38 +0100 Subject: [PATCH 233/330] Add docstrings --- packages/essspectroscopy/src/ess/spectroscopy/types.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 3733dc168..f1ff63e6f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -84,10 +84,12 @@ class DataGroupedByRotation(sciline.Scope[RunType, sc.DataArray], sc.DataArray): class DetectorCountsWithQ(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -class QDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class QDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Detector counts with a momentum transfer coordinate.""" -class EnergyQDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... +class EnergyQDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Detector counts with a momentum transfer and energy transfer coordinates.""" class SampleAngle(sciline.Scope[RunType, sc.DataArray], sc.DataArray): From 33352121fddf7f903b5d3f203b57db5f2b594333 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 4 Nov 2025 15:39:44 +0100 Subject: [PATCH 234/330] Remove unused type --- packages/essspectroscopy/src/ess/spectroscopy/types.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index f1ff63e6f..b3dc40522 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -81,9 +81,6 @@ class DataAtSample(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... class DataGroupedByRotation(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... -class DetectorCountsWithQ(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... - - class QDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """Detector counts with a momentum transfer coordinate.""" From c9046179aad520fd4bfd8965d9d8e557474358db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 14:45:49 +0000 Subject: [PATCH 235/330] Bump scipp from 25.8.0 to 25.11.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 25.8.0 to 25.11.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/25.08.0...25.11.0) --- updated-dependencies: - dependency-name: scipp dependency-version: 25.11.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index b11008dfa..2ac3a9328 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -83,7 +83,7 @@ sciline==25.11.1 # via # -r base.in # essreduce -scipp==25.8.0 +scipp==25.11.0 # via # -r base.in # essreduce From e294ff5621639a1518c0479d1f9320e514d47cc4 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 6 Nov 2025 10:19:36 +0100 Subject: [PATCH 236/330] Use file registry from ESSreduce --- .../essspectroscopy/src/ess/bifrost/data.py | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index fc68ed7a4..499cb2c36 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -3,46 +3,38 @@ """Data for tests and documentation with BIFROST.""" -_version = "4" +from pathlib import Path +from ess.reduce.data import make_registry -def _make_pooch(): - import pooch +_registry = make_registry( + 'ess/bifrost', + files={ + "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", + "computed_energy_data_simulated.h5": "blake2b:690d837ce684a0aeea021b2624c5f7371e299f1bbc803725b40bf3eca35816e3348a79e5fdf04dc89e29c4bdd4f6ea2b052b49058eecfdf535b9733eefa8a854", # noqa: E501 + "computed_energy_data_simulated_5x2.h5": "blake2b:0353f7e675a276451637fd175eef4f3d231a68a8983faf1240796fef44c9f3e78a264baf705e24d71f001afc83d07bbf1bff17e5bd83a15db89386a43dd5d5d7", # noqa: E501 + "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 + }, + version="4", +) - return pooch.create( - path=pooch.os_cache("ess/bifrost"), - env="ESS_DATA_DIR", - base_url="https://public.esss.dk/groups/scipp/ess/bifrost/{version}/", - version=_version, - registry={ - "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated.h5": "blake2b:690d837ce684a0aeea021b2624c5f7371e299f1bbc803725b40bf3eca35816e3348a79e5fdf04dc89e29c4bdd4f6ea2b052b49058eecfdf535b9733eefa8a854", # noqa: E501 - "computed_energy_data_simulated_5x2.h5": "blake2b:0353f7e675a276451637fd175eef4f3d231a68a8983faf1240796fef44c9f3e78a264baf705e24d71f001afc83d07bbf1bff17e5bd83a15db89386a43dd5d5d7", # noqa: E501 - "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 - }, - retry_if_failed=3, - ) - -_pooch = _make_pooch() - - -def get_path(name: str) -> str: +def get_path(name: str) -> Path: """ Return the path to a data file bundled with ess.bifrost. This function only works with example data and cannot handle paths to custom files. """ - return _pooch.fetch(name) + return _registry.get_path(name) -def simulated_elastic_incoherent_with_phonon() -> str: +def simulated_elastic_incoherent_with_phonon() -> Path: """Simulated data for elastic incoherent scattering including a phonon.""" return get_path("BIFROST_20240914T053723.h5") -def tof_lookup_table_simulation() -> str: +def tof_lookup_table_simulation() -> Path: """Time-of-flight lookup table for the simulated BIFROST data. This table was computed with `tof `_ @@ -53,12 +45,12 @@ def tof_lookup_table_simulation() -> str: return get_path("BIFROST-simulation-tof-lookup-table.h5") -def computed_energy_data_simulated() -> str: +def computed_energy_data_simulated() -> Path: """Energy and momentum transfer computed from the simulated BIFROST data.""" return get_path("computed_energy_data_simulated.h5") -def computed_energy_data_simulated_5x2() -> str: +def computed_energy_data_simulated_5x2() -> Path: """Energy and momentum transfer computed from the simulated BIFROST data. This reference was computed with 10 detectors forming a 5x2 grid From dc34eae32d3d755fc0d0f6aeeead75a82cfba298 Mon Sep 17 00:00:00 2001 From: Neil Vaytet Date: Mon, 1 Dec 2025 08:44:59 +0100 Subject: [PATCH 237/330] set the filename of the tof lut instead of loading it manually --- .../docs/user-guide/bifrost/bifrost-reduction.ipynb | 2 +- packages/essspectroscopy/tests/bifrost/cutting_test.py | 4 ++-- packages/essspectroscopy/tests/bifrost/live_test.py | 6 ++---- packages/essspectroscopy/tests/bifrost/workflow_test.py | 4 ++-- .../essspectroscopy/tools/docs/bifrost-thumbnails.ipynb | 2 +- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index 51352e20f..d75ed1294 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -90,7 +90,7 @@ "# Set the input file name:\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", "# Set the lookup table for frame unwrapping:\n", - "workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation())\n", + "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", "# We need to read many objects from the file,\n", "# keeping it open improves performance: (optional)\n", "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)" diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py index d0ff18f43..672a978e3 100644 --- a/packages/essspectroscopy/tests/bifrost/cutting_test.py +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -16,7 +16,7 @@ Filename, NeXusDetectorName, SampleRun, - TimeOfFlightLookupTable, + TimeOfFlightLookupTableFilename, ) @@ -33,7 +33,7 @@ def energy_data( ) -> EnergyQDetector[SampleRun]: workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation()) + workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() return workflow.compute(EnergyQDetector[SampleRun]) diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py index 9adf81c7b..d302af7e7 100644 --- a/packages/essspectroscopy/tests/bifrost/live_test.py +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -15,7 +15,7 @@ Filename, NeXusDetectorName, SampleRun, - TimeOfFlightLookupTable, + TimeOfFlightLookupTableFilename, ) @@ -33,9 +33,7 @@ def qcut_workflow( ) -> sciline.Pipeline: workflow = BifrostQCutWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5( - tof_lookup_table_simulation() - ) + workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() return workflow def test_cut_along_q_norm_and_energy_transfer( diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index b743c1b58..09450b864 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -20,7 +20,7 @@ RawDetector, RawMonitor, SampleRun, - TimeOfFlightLookupTable, + TimeOfFlightLookupTableFilename, WavelengthMonitor, ) @@ -36,7 +36,7 @@ def simulation_detector_names() -> list[NeXusDetectorName]: def workflow(simulation_detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation()) + workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() return workflow diff --git a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb index 7c78ff48c..d62fca414 100644 --- a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb +++ b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb @@ -54,7 +54,7 @@ "source": [ "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation())\n", + "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)" ] }, From 4fe2e3a599ac86ff998e642a62f2c903ebfabb83 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 23 Sep 2025 15:50:32 +0200 Subject: [PATCH 238/330] Keep final energy in output --- .../essspectroscopy/src/ess/spectroscopy/indirect/conversion.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 760254935..315f9be87 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -164,6 +164,7 @@ def add_inelastic_coordinates( [ # TODO pick minimal list of coords 'energy_transfer', + 'final_energy', 'incident_wavelength', 'incident_energy', 'lab_momentum_transfer', From 12c5a4abffaa7b5bd2bc24b55e91dd163ff4bf69 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 23 Sep 2025 15:51:06 +0200 Subject: [PATCH 239/330] Dev notebook for SQW --- packages/essspectroscopy/bifrost-sqw.ipynb | 449 +++++++++++++++++++++ 1 file changed, 449 insertions(+) create mode 100644 packages/essspectroscopy/bifrost-sqw.ipynb diff --git a/packages/essspectroscopy/bifrost-sqw.ipynb b/packages/essspectroscopy/bifrost-sqw.ipynb new file mode 100644 index 000000000..544279f47 --- /dev/null +++ b/packages/essspectroscopy/bifrost-sqw.ipynb @@ -0,0 +1,449 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Writing SQW for BIFROST" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import scipp as sc\n", + "import sciline\n", + "from scippneutron.io import sqw\n", + "from pathlib import Path\n", + "import scippnexus as snx\n", + "import numpy as np\n", + "import dataclasses\n", + "\n", + "from ess import bifrost\n", + "from ess.bifrost.data import (\n", + " simulated_elastic_incoherent_with_phonon,\n", + " tof_lookup_table_simulation\n", + ")\n", + "from ess.spectroscopy.types import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "n_det = 3\n", + "n_angle = 5\n", + "\n", + "bin_sizes = {'u1': 6, 'u2': 7, 'u3': 8, 'u4': 9}\n", + "\n", + "out_file = Path(\"bifrost-simulated.sqw\")\n", + "\n", + "# Q projections\n", + "u = sc.vector([1, 0, 0], unit=\"1/angstrom\")\n", + "v = sc.vector([0, 1, 0], unit=\"1/angstrom\")\n", + "w = sc.cross(u, v) # must be orthogonal to u and v for now" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "with snx.File(simulated_elastic_incoherent_with_phonon()) as f:\n", + " detector_names = list(f['entry/instrument'][snx.NXdetector])\n", + "detector_names = detector_names[:n_det]\n", + "\n", + "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", + "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", + "workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation())\n", + "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", + "scheduler = sciline.scheduler.NaiveScheduler()\n", + "\n", + "data = workflow.compute(EnergyData[SampleRun], scheduler=scheduler)\n", + "\n", + "data = data['a3', :n_angle].flatten(['triplet', 'tube', 'length'], 'detector')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "settings = sc.DataArray(\n", + " sc.arange('s', data.sizes['a3']*data.sizes['a4'], unit=None).fold('s', sizes={'a3': data.sizes['a3'], 'a4': data.sizes['a4']}),\n", + " coords={\n", + " 'a3': data.coords['a3'],\n", + " 'a4': data.coords['a4'],\n", + " }\n", + ").flatten(to='setting')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "def project_onto(direction, vec):\n", + " return sc.dot(direction / sc.norm(direction), vec)\n", + "\n", + "aux = (data\n", + " .flatten(['a3', 'a4'], 'setting')\n", + " # Split into two calls because of https://github.com/scipp/scipp/issues/3766\n", + " .transform_coords(\n", + " u1=lambda sample_table_momentum_transfer: project_onto(u, sample_table_momentum_transfer),\n", + " u2=lambda sample_table_momentum_transfer: project_onto(v, sample_table_momentum_transfer),\n", + " u3=lambda sample_table_momentum_transfer: project_onto(w, sample_table_momentum_transfer),\n", + " keep_inputs=False,\n", + " ).transform_coords(u4=\"energy_transfer\", keep_inputs=False)\n", + " .bins.drop_coords(['incident_energy', 'incident_wavelength', 'lab_momentum_transfer'])\n", + " .drop_coords(['a3', 'a4', 'secondary_flight_time'])\n", + " )\n", + "binned = (aux\n", + " .bins.assign_coords({\n", + " 'setting': sc.bins_like(aux, settings.data),\n", + " 'detector_number': sc.bins_like(aux, aux.coords.pop('detector_number')),\n", + " })\n", + " .bins.concat()\n", + " .bin(bin_sizes)\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "def coord_range(da: sc.DataArray, coord: str) -> sc.Variable:\n", + " assert sc.islinspace(da.coords[coord])\n", + " return sc.array(dims=[coord], values=[da.coords[coord][0].value, da.coords[coord][-1].value],\n", + " unit=da.coords[coord].unit)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "sample = sqw.SqwIXSample(\n", + " name=\"Vibranium\",\n", + " lattice_spacing=sc.vector([2.86, 2.86, 2.86], unit=\"angstrom\"),\n", + " lattice_angle=sc.vector([90.0, 90.0, 90.0], unit=\"deg\"),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "dnd_metadata = sqw.SqwDndMetadata(\n", + " axes=sqw.SqwLineAxes(\n", + " title=\"My Axes\",\n", + " label=[\"u1\", \"u2\", \"u3\", \"u4\"],\n", + " img_scales=[\n", + " sc.scalar(1.0, unit=\"1/angstrom\"),\n", + " sc.scalar(1.0, unit=\"1/angstrom\"),\n", + " sc.scalar(1.0, unit=\"1/angstrom\"),\n", + " sc.scalar(1.0, unit=\"meV\"),\n", + " ],\n", + " img_range=[\n", + " coord_range(binned, name)\n", + " for name in [\"u1\", \"u2\", \"u3\", \"u4\"]\n", + " ],\n", + " n_bins_all_dims=sc.array(dims=[\"axis\"], values=[binned.sizes[f'u{i}'] for i in range(1, 5)], unit=None),\n", + " single_bin_defines_iax=sc.array(dims=[\"axis\"], values=[True] * 4),\n", + " dax=sc.arange(\"axis\", 4, unit=None),\n", + " offset=[\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"meV\"),\n", + " ],\n", + " changes_aspect_ratio=True,\n", + " ),\n", + " proj=sqw.SqwLineProj(\n", + " title=\"My Projection\",\n", + " lattice_spacing=sample.lattice_spacing,\n", + " lattice_angle=sample.lattice_angle,\n", + " offset=[\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"meV\"),\n", + " ],\n", + " label=[\"u1\", \"u2\", \"u3\", \"u4\"],\n", + " u=u,\n", + " v=v,\n", + " w=None,\n", + " non_orthogonal=False,\n", + " type=\"aaa\",\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "dnd_metadata.axes.img_range" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "instrument = sqw.SqwIXNullInstrument(\n", + " name=\"BIFROST\",\n", + " source=sqw.SqwIXSource(\n", + " name=\"ESS\",\n", + " target_name=\"Tungsten wheel\",\n", + " frequency=sc.scalar(14, unit=\"Hz\"),\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "en = binned.coords['u4'].broadcast(sizes={'detector': data.sizes['detector'], 'u4': len(binned.coords['u4'])}).rename(u4='energy_transfer')\n", + "experiment_template = sqw.SqwIXExperiment(\n", + " run_id=0,\n", + " efix=data.coords['final_energy'],\n", + " emode=sqw.EnergyMode.indirect,\n", + " en=en,\n", + " psi=sc.scalar(0.0, unit=\"rad\"),\n", + " u=u,\n", + " v=v,\n", + " omega=sc.scalar(0.0, unit=\"rad\"),\n", + " dpsi=sc.scalar(0.0, unit=\"rad\"),\n", + " gl=sc.scalar(0.0, unit=\"rad\"),\n", + " gs=sc.scalar(0.0, unit=\"rad\"),\n", + ")\n", + "assert np.unique(data.coords['a4'].values).size == 1\n", + "experiments = [\n", + " dataclasses.replace(experiment_template, run_id=i, psi=a3)\n", + " for i, a3 in enumerate(data.coords['a3'])\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "binned" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO add 0 observations\n", + "# we lose some bins in the above binning processes, e.g., here, idet is only a subset of all detector numbers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "observations = binned.copy().drop_coords(['sample_position', 'source_position'])\n", + "observations = observations.bins.assign_coords(\n", + " {\n", + " 'idet': observations.bins.coords.pop('detector_number').to(dtype='float32'),\n", + " 'irun': observations.bins.coords.pop('setting').to(dtype='float32'),\n", + " }\n", + ")\n", + "observations = observations.assign_coords(\n", + " {\n", + " f'u{i}': sc.midpoints(observations.coords.pop(f'u{i}')).to(dtype='float32', copy=False)\n", + " for i in range(1, 5)\n", + " }\n", + ")\n", + "observations.coords['ien'] = sc.arange('u4', observations.sizes['u4'], dtype='float32', unit=None)\n", + "observations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "buffer = None\n", + "\n", + "def get_buffer(n: int):\n", + " global buffer\n", + " if buffer is None or buffer.shape[0] < n:\n", + " buffer = np.empty((n, 9), dtype=np.float32)\n", + " return buffer\n", + " return buffer[:n]\n", + "\n", + "buffers = []\n", + "for obs_bin in observations.flatten(to='u'):\n", + " h = obs_bin.group('idet', 'irun').hist()\n", + " n = h.sizes['idet'] * h.sizes['irun']\n", + " h = h.flatten(to='obs')\n", + " buf = get_buffer(n)\n", + " buf[:, 0] = h.coords['u1'].values\n", + " buf[:, 1] = h.coords['u2'].values\n", + " buf[:, 2] = h.coords['u3'].values\n", + " buf[:, 3] = h.coords['u4'].values\n", + " buf[:, 4] = h.coords['irun'].values\n", + " buf[:, 5] = h.coords['idet'].values\n", + " buf[:, 6] = h.coords['ien'].values\n", + " buf[:, 7] = h.values\n", + " buf[:, 8] = sc.stddevs(h).values\n", + " buffers.append(buf.copy())\n", + "\n", + "pix_buffer = np.concat(buffers, axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "bin_sizes = sc.array(dims=['u'], values=[buf.shape[0] for buf in buffers], unit=None)\n", + "bin_sizes = bin_sizes.fold(dim='u', sizes=observations.sizes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon\").add_default_instrument(instrument).add_default_sample(sample)\n", + "builder = builder.add_dnd_data(dnd_metadata, data=observations.hist().data, counts=bin_sizes)\n", + "builder = builder.add_pixel_data(pix_buffer, experiments=experiments)\n", + "builder.create()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "with sqw.Sqw.open(out_file) as f:\n", + " print(f.data_block_names())\n", + " d = f.read_data_block('data', \"nd_data\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "d[0].shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "binned.hist().data['u1', 3]['u2', 6]['u3', 1]['u4', 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO The dim order is reversed.\n", + "# Seems wrong, I thought we handled transposition properly now?!\n", + "d[0][0][1][6][3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "d[0][3][6][1][0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "np.nonzero(d[0] == 127.0)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2ea9c1a052e04b4d1da783543c62be201655c009 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 23 Sep 2025 17:29:01 +0200 Subject: [PATCH 240/330] Compare to horace --- packages/essspectroscopy/bifrost-sqw.ipynb | 26 ++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/bifrost-sqw.ipynb b/packages/essspectroscopy/bifrost-sqw.ipynb index 544279f47..ab431278f 100644 --- a/packages/essspectroscopy/bifrost-sqw.ipynb +++ b/packages/essspectroscopy/bifrost-sqw.ipynb @@ -251,7 +251,7 @@ "assert np.unique(data.coords['a4'].values).size == 1\n", "experiments = [\n", " dataclasses.replace(experiment_template, run_id=i, psi=a3)\n", - " for i, a3 in enumerate(data.coords['a3'])\n", + " for i, a3 in enumerate(data.coords['a3'], 1)\n", "]" ] }, @@ -286,8 +286,8 @@ "observations = binned.copy().drop_coords(['sample_position', 'source_position'])\n", "observations = observations.bins.assign_coords(\n", " {\n", - " 'idet': observations.bins.coords.pop('detector_number').to(dtype='float32'),\n", - " 'irun': observations.bins.coords.pop('setting').to(dtype='float32'),\n", + " 'idet': observations.bins.coords.pop('detector_number').to(dtype='float32') + sc.index(1),\n", + " 'irun': observations.bins.coords.pop('setting').to(dtype='float32') + sc.index(1), # +1 because of 1-based indexing\n", " }\n", ")\n", "observations = observations.assign_coords(\n", @@ -296,7 +296,7 @@ " for i in range(1, 5)\n", " }\n", ")\n", - "observations.coords['ien'] = sc.arange('u4', observations.sizes['u4'], dtype='float32', unit=None)\n", + "observations.coords['ien'] = sc.arange('u4', 1, 1+observations.sizes['u4'], dtype='float32', unit=None)\n", "observations" ] }, @@ -423,6 +423,24 @@ "source": [ "np.nonzero(d[0] == 127.0)" ] + }, + { + "cell_type": "markdown", + "id": "24", + "metadata": {}, + "source": [ + "### Compare to horace output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "binned.hist().sum('u2').sum('u4').transpose(['u3','u1']).plot(norm='log')" + ] } ], "metadata": { From 70e213de19ae0628bda2ff2823ec9937e5721ca2 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 24 Sep 2025 07:23:20 +0200 Subject: [PATCH 241/330] Use fortran layout for q bins --- packages/essspectroscopy/bifrost-sqw.ipynb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/essspectroscopy/bifrost-sqw.ipynb b/packages/essspectroscopy/bifrost-sqw.ipynb index ab431278f..13496f2f5 100644 --- a/packages/essspectroscopy/bifrost-sqw.ipynb +++ b/packages/essspectroscopy/bifrost-sqw.ipynb @@ -317,6 +317,8 @@ " return buffer[:n]\n", "\n", "buffers = []\n", + "# transpose to match fortran layout. But horace plots look the same, does this actually matter?\n", + "flat = observations.transpose(['u4','u3','u2','u1']).flatten(to='u')\n", "for obs_bin in observations.flatten(to='u'):\n", " h = obs_bin.group('idet', 'irun').hist()\n", " n = h.sizes['idet'] * h.sizes['irun']\n", From 76943144b82ca6f908d1e711cc69c72ddb3b8078 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 24 Sep 2025 14:53:13 +0200 Subject: [PATCH 242/330] Attempt to build table from index --- packages/essspectroscopy/bifrost-sqw.ipynb | 246 +++++++++++++++++---- 1 file changed, 199 insertions(+), 47 deletions(-) diff --git a/packages/essspectroscopy/bifrost-sqw.ipynb b/packages/essspectroscopy/bifrost-sqw.ipynb index 13496f2f5..10a08eb02 100644 --- a/packages/essspectroscopy/bifrost-sqw.ipynb +++ b/packages/essspectroscopy/bifrost-sqw.ipynb @@ -8,10 +8,34 @@ "# Writing SQW for BIFROST" ] }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "**Idea for determining position in pixel block:**\n", + "\n", + "- Compute an upper bound size for each (Q,E,irun,idet,ien) bin.\n", + "- For each event, compute an index based on that upper bound.\n", + "- `group` or `groupby` in that index. This only retains indices where we have data and orders the data by the index. If the index is computed right, that is the order in a pixel block.\n", + "- `sum` the bins.\n", + "- Write the result into the pixel block.\n", + "\n", + "The extra index event coord should not be too large, we should be able to fit that into memory.\n", + "\n", + "If we can make `groupby` lazy in its groups, we can stream the data to file.\n", + "\n", + "Or we process the events in arbitrary chunks.\n", + "For each chunk, compute the index, group, sum.\n", + "Write to file by: if index out of bounds, grow file and fill with 0s. Then add the new value onto the existing one. That way, we accumulate events directly in the file.\n", + "Might be quite slow because of somewhat random access to file and many read+writes and because it needs tight loop (-> not Python?)\n", + "**Maybe not** this would require knowing all index values that can contribute up front top do the grouping." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "1", + "id": "2", "metadata": {}, "outputs": [], "source": [ @@ -34,7 +58,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2", + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -54,7 +78,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3", + "id": "4", "metadata": {}, "outputs": [], "source": [ @@ -76,12 +100,13 @@ { "cell_type": "code", "execution_count": null, - "id": "4", + "id": "5", "metadata": {}, "outputs": [], "source": [ "settings = sc.DataArray(\n", - " sc.arange('s', data.sizes['a3']*data.sizes['a4'], unit=None).fold('s', sizes={'a3': data.sizes['a3'], 'a4': data.sizes['a4']}),\n", + " sc.arange('s', data.sizes['a3'] * data.sizes['a4'], unit=None).fold('s', sizes={'a3': data.sizes['a3'],\n", + " 'a4': data.sizes['a4']}),\n", " coords={\n", " 'a3': data.coords['a3'],\n", " 'a4': data.coords['a4'],\n", @@ -92,30 +117,31 @@ { "cell_type": "code", "execution_count": null, - "id": "5", + "id": "6", "metadata": {}, "outputs": [], "source": [ "def project_onto(direction, vec):\n", " return sc.dot(direction / sc.norm(direction), vec)\n", "\n", + "\n", "aux = (data\n", - " .flatten(['a3', 'a4'], 'setting')\n", - " # Split into two calls because of https://github.com/scipp/scipp/issues/3766\n", - " .transform_coords(\n", - " u1=lambda sample_table_momentum_transfer: project_onto(u, sample_table_momentum_transfer),\n", - " u2=lambda sample_table_momentum_transfer: project_onto(v, sample_table_momentum_transfer),\n", - " u3=lambda sample_table_momentum_transfer: project_onto(w, sample_table_momentum_transfer),\n", - " keep_inputs=False,\n", - " ).transform_coords(u4=\"energy_transfer\", keep_inputs=False)\n", - " .bins.drop_coords(['incident_energy', 'incident_wavelength', 'lab_momentum_transfer'])\n", - " .drop_coords(['a3', 'a4', 'secondary_flight_time'])\n", - " )\n", + " .flatten(['a3', 'a4'], 'setting')\n", + " # Split into two calls because of https://github.com/scipp/scipp/issues/3766\n", + " .transform_coords(\n", + " u1=lambda sample_table_momentum_transfer: project_onto(u, sample_table_momentum_transfer),\n", + " u2=lambda sample_table_momentum_transfer: project_onto(v, sample_table_momentum_transfer),\n", + " u3=lambda sample_table_momentum_transfer: project_onto(w, sample_table_momentum_transfer),\n", + " keep_inputs=False,\n", + ").transform_coords(u4=\"energy_transfer\", keep_inputs=False)\n", + " .bins.drop_coords(['incident_energy', 'incident_wavelength', 'lab_momentum_transfer'])\n", + " .drop_coords(['a3', 'a4', 'secondary_flight_time'])\n", + " )\n", "binned = (aux\n", " .bins.assign_coords({\n", - " 'setting': sc.bins_like(aux, settings.data),\n", - " 'detector_number': sc.bins_like(aux, aux.coords.pop('detector_number')),\n", - " })\n", + " 'setting': sc.bins_like(aux, settings.data),\n", + " 'detector_number': sc.bins_like(aux, aux.coords.pop('detector_number')),\n", + "})\n", " .bins.concat()\n", " .bin(bin_sizes)\n", " )" @@ -124,7 +150,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6", + "id": "7", "metadata": {}, "outputs": [], "source": [ @@ -137,7 +163,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7", + "id": "8", "metadata": {}, "outputs": [], "source": [ @@ -151,7 +177,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8", + "id": "9", "metadata": {}, "outputs": [], "source": [ @@ -203,7 +229,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9", + "id": "10", "metadata": {}, "outputs": [], "source": [ @@ -213,7 +239,7 @@ { "cell_type": "code", "execution_count": null, - "id": "10", + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -230,11 +256,12 @@ { "cell_type": "code", "execution_count": null, - "id": "11", + "id": "12", "metadata": {}, "outputs": [], "source": [ - "en = binned.coords['u4'].broadcast(sizes={'detector': data.sizes['detector'], 'u4': len(binned.coords['u4'])}).rename(u4='energy_transfer')\n", + "en = binned.coords['u4'].broadcast(sizes={'detector': data.sizes['detector'], 'u4': len(binned.coords['u4'])}).rename(\n", + " u4='energy_transfer')\n", "experiment_template = sqw.SqwIXExperiment(\n", " run_id=0,\n", " efix=data.coords['final_energy'],\n", @@ -258,7 +285,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12", + "id": "13", "metadata": {}, "outputs": [], "source": [ @@ -268,7 +295,7 @@ { "cell_type": "code", "execution_count": null, - "id": "13", + "id": "14", "metadata": {}, "outputs": [], "source": [ @@ -279,7 +306,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14", + "id": "15", "metadata": {}, "outputs": [], "source": [ @@ -287,7 +314,8 @@ "observations = observations.bins.assign_coords(\n", " {\n", " 'idet': observations.bins.coords.pop('detector_number').to(dtype='float32') + sc.index(1),\n", - " 'irun': observations.bins.coords.pop('setting').to(dtype='float32') + sc.index(1), # +1 because of 1-based indexing\n", + " 'irun': observations.bins.coords.pop('setting').to(dtype='float32') + sc.index(1),\n", + " # +1 because of 1-based indexing\n", " }\n", ")\n", "observations = observations.assign_coords(\n", @@ -296,19 +324,20 @@ " for i in range(1, 5)\n", " }\n", ")\n", - "observations.coords['ien'] = sc.arange('u4', 1, 1+observations.sizes['u4'], dtype='float32', unit=None)\n", + "observations.coords['ien'] = sc.arange('u4', 1, 1 + observations.sizes['u4'], dtype='float32', unit=None)\n", "observations" ] }, { "cell_type": "code", "execution_count": null, - "id": "15", + "id": "16", "metadata": {}, "outputs": [], "source": [ "buffer = None\n", "\n", + "\n", "def get_buffer(n: int):\n", " global buffer\n", " if buffer is None or buffer.shape[0] < n:\n", @@ -316,9 +345,10 @@ " return buffer\n", " return buffer[:n]\n", "\n", + "\n", "buffers = []\n", "# transpose to match fortran layout. But horace plots look the same, does this actually matter?\n", - "flat = observations.transpose(['u4','u3','u2','u1']).flatten(to='u')\n", + "flat = observations.transpose(['u4', 'u3', 'u2', 'u1']).flatten(to='u')\n", "for obs_bin in observations.flatten(to='u'):\n", " h = obs_bin.group('idet', 'irun').hist()\n", " n = h.sizes['idet'] * h.sizes['irun']\n", @@ -341,7 +371,7 @@ { "cell_type": "code", "execution_count": null, - "id": "16", + "id": "17", "metadata": {}, "outputs": [], "source": [ @@ -352,11 +382,12 @@ { "cell_type": "code", "execution_count": null, - "id": "17", + "id": "18", "metadata": {}, "outputs": [], "source": [ - "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon\").add_default_instrument(instrument).add_default_sample(sample)\n", + "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon\").add_default_instrument(\n", + " instrument).add_default_sample(sample)\n", "builder = builder.add_dnd_data(dnd_metadata, data=observations.hist().data, counts=bin_sizes)\n", "builder = builder.add_pixel_data(pix_buffer, experiments=experiments)\n", "builder.create()" @@ -365,7 +396,7 @@ { "cell_type": "code", "execution_count": null, - "id": "18", + "id": "19", "metadata": {}, "outputs": [], "source": [ @@ -377,7 +408,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19", + "id": "20", "metadata": {}, "outputs": [], "source": [ @@ -387,7 +418,7 @@ { "cell_type": "code", "execution_count": null, - "id": "20", + "id": "21", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +428,7 @@ { "cell_type": "code", "execution_count": null, - "id": "21", + "id": "22", "metadata": {}, "outputs": [], "source": [ @@ -409,7 +440,7 @@ { "cell_type": "code", "execution_count": null, - "id": "22", + "id": "23", "metadata": {}, "outputs": [], "source": [ @@ -419,29 +450,150 @@ { "cell_type": "code", "execution_count": null, - "id": "23", + "id": "24", "metadata": {}, "outputs": [], "source": [ "np.nonzero(d[0] == 127.0)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "binned.hist().sum('u2').sum('u4').transpose(['u3', 'u1']).plot()" + ] + }, { "cell_type": "markdown", - "id": "24", + "id": "26", "metadata": {}, "source": [ - "### Compare to horace output" + "### Build pix data using group" ] }, { "cell_type": "code", "execution_count": null, - "id": "25", + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "# Revert all indices to 0-based for faster index arithmetic\n", + "binned_indices = observations.copy().bins.assign_coords(\n", + " **{f'u{i}': sc.bins_like(observations, sc.arange(f'u{i}', observations.sizes[f'u{i}'], unit=None, dtype='float32'))\n", + " for i in range(1, 5)},\n", + " ien=sc.bins_like(observations, observations.coords['ien'] - sc.index(1)),\n", + " irun=observations.bins.coords['irun'] - sc.index(1),\n", + " idet=observations.bins.coords['idet'] - sc.index(1),\n", + ")\n", + "binned_indices" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "n_u1 = sc.index(binned_indices.sizes['u1'])\n", + "n_u2 = sc.index(binned_indices.sizes['u2'])\n", + "n_u3 = sc.index(binned_indices.sizes['u3'])\n", + "n_u4 = sc.index(binned_indices.sizes['u4'])\n", + "n_idet = binned_indices.bins.coords['idet'].max() + sc.index(1)\n", + "n_irun = binned_indices.bins.coords['irun'].max() + sc.index(1)\n", + "n_ien = binned_indices.bins.coords['ien'].max() + sc.index(1)\n", + "\n", + "i_u1 = binned_indices.bins.coords['u1']\n", + "i_u2 = binned_indices.bins.coords['u2']\n", + "i_u3 = binned_indices.bins.coords['u3']\n", + "i_u4 = binned_indices.bins.coords['u4']\n", + "idet = binned_indices.bins.coords['idet']\n", + "irun = binned_indices.bins.coords['irun']\n", + "ien = binned_indices.bins.coords['ien']\n", + "\n", + "out_index = i_u4.to(dtype='int64')\n", + "for i, n in ((i_u3, n_u3), (i_u2, n_u2), (i_u1, n_u1), (idet, n_idet), (irun, n_irun), (ien, n_ien)):\n", + " out_index *= n.to(dtype='int64')\n", + " out_index += i.to(dtype='int64')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO the data is shorter than when using the custom loop! (A bunch of u4 might be missing)\n", + "\n", + "for_grouping = observations.bins.assign_coords(pix_index=out_index)\n", + "for_grouping = for_grouping.bins.assign_coords({f'u{i}': sc.bins_like(for_grouping, for_grouping.coords.pop(f'u{i}')) for i in range(1, 5)})\n", + "for_grouping.bins.coords['ien'] = sc.bins_like(for_grouping, for_grouping.coords.pop('ien'))\n", + "\n", + "grouped = for_grouping.bins.concat().group('pix_index').drop_coords('pix_index')\n", + "hist = grouped.bins.sum()\n", + "# indices in `observations` are 1-based\n", + "hist = hist.assign_coords({name: grouped.bins.coords.pop(name).bins.min() for name in list(grouped.bins.coords.keys())})\n", + "hist = hist.assign_coords({})\n", + "hist" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30", + "metadata": {}, + "outputs": [], + "source": [ + "hist.group('u3', 'u1').bins.sum().plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "buffer = np.c_[*(hist.coords[name].values for name in ('u1', 'u2', 'u3', 'u4', 'irun', 'idet', 'ien')), hist.values, sc.stddevs(hist).values]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32", + "metadata": {}, + "outputs": [], + "source": [ + "dnd = hist.group('u4', 'u3', 'u2', 'u1')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon (index method\").add_default_instrument(instrument).add_default_sample(sample)\n", + "builder = builder.add_dnd_data(dnd_metadata, data=dnd.bins.sum().data, counts=dnd.bins.size())\n", + "builder = builder.add_pixel_data(buffer, experiments=experiments)\n", + "builder.create()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34", "metadata": {}, "outputs": [], "source": [ - "binned.hist().sum('u2').sum('u4').transpose(['u3','u1']).plot(norm='log')" + "dnd.bins.sum().data" ] } ], From b9279666ffda19a981504f121f2ed196eb0042c1 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 9 Oct 2025 16:30:33 +0200 Subject: [PATCH 243/330] Preserve final_wavevector --- .../essspectroscopy/src/ess/spectroscopy/indirect/conversion.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 315f9be87..078f274ea 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -165,6 +165,7 @@ def add_inelastic_coordinates( # TODO pick minimal list of coords 'energy_transfer', 'final_energy', + 'final_wavevector', 'incident_wavelength', 'incident_energy', 'lab_momentum_transfer', From a22d34e313b46c81cd0fab0101b24d96a09e0db4 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 9 Oct 2025 16:30:49 +0200 Subject: [PATCH 244/330] Add new SQW dev notebook --- .../bifrost-sqw-small-table.ipynb | 479 ++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 packages/essspectroscopy/bifrost-sqw-small-table.ipynb diff --git a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb new file mode 100644 index 000000000..d38eb30ef --- /dev/null +++ b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Writing SQW for BIFROST" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import scipp as sc\n", + "import sciline\n", + "from scippneutron.io import sqw\n", + "from pathlib import Path\n", + "import scippnexus as snx\n", + "import numpy as np\n", + "import scipp.constants\n", + "import dataclasses\n", + "\n", + "from ess import bifrost\n", + "from ess.bifrost.data import (\n", + " simulated_elastic_incoherent_with_phonon,\n", + " tof_lookup_table_simulation\n", + ")\n", + "from ess.spectroscopy.types import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "n_det = 3\n", + "n_angle = 5\n", + "\n", + "bin_sizes = {'u1': 6, 'u2': 7, 'u3': 8, 'u4': 9}\n", + "\n", + "out_file = Path(\"bifrost-simulated.sqw\")\n", + "\n", + "# Q projections\n", + "u = sc.vector([1, 0, 0], unit=\"1/angstrom\")\n", + "v = sc.vector([0, 1, 0], unit=\"1/angstrom\")\n", + "w = sc.cross(u, v) # must be orthogonal to u and v for now" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "with snx.File(simulated_elastic_incoherent_with_phonon()) as f:\n", + " detector_names = list(f['entry/instrument'][snx.NXdetector])\n", + "detector_names = detector_names[:n_det]\n", + "\n", + "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", + "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", + "workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation())\n", + "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", + "scheduler = sciline.scheduler.NaiveScheduler()\n", + "\n", + "data = workflow.compute(EnergyData[SampleRun], scheduler=scheduler)\n", + "\n", + "data = data['a3', :n_angle].flatten(['triplet', 'tube', 'length'], 'detector')\n", + "\n", + "# Flatten angles and define a setting index where a3 is the fastest running index.\n", + "n_a3 = data.sizes['a3']\n", + "data.coords['i_a3'] = sc.arange('a3', n_a3, unit=None)\n", + "data.coords['i_a4'] = sc.arange('a4', data.sizes['a4'], unit=None)\n", + "data = data.flatten(['a3', 'a4'], 'setting')\n", + "data.coords['setting'] = data.coords.pop('i_a3') + data.coords.pop('i_a4') * sc.index(n_a3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "index_binned = data.hist(energy_transfer=sc.linspace('energy_transfer', -0.05, 0.05, bin_sizes['u4'] + 1, unit='meV'))\n", + "index_binned.coords['energy_transfer'] = sc.midpoints(index_binned.coords['energy_transfer'])\n", + "index_binned.coords['ien'] = sc.arange('energy_transfer', bin_sizes['u4'], unit=None, dtype='float32')\n", + "index_binned" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "a3 = index_binned.coords['a3']\n", + "# idet = hist.coords['detector_number']\n", + "en = index_binned.coords['energy_transfer']\n", + "ef = index_binned.coords['final_energy']\n", + "kf = index_binned.coords['final_wavevector']\n", + "\n", + "# should get this form the data\n", + "bi = sc.vector([0, 0, 1])\n", + "Ra3 = sc.spatial.rotations_from_rotvecs(-a3 * sc.vector([0, 1, 0]))\n", + "\n", + "ki = 2 * np.pi / sc.constants.h * sc.sqrt(2 * sc.constants.m_n * (en + ef)) * bi\n", + "Q = Ra3 * (ki.to(unit=kf.unit) - kf)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "Q" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "da = index_binned.copy()\n", + "da.coords['Qx'] = Q.fields.x\n", + "da.coords['Qy'] = Q.fields.y\n", + "da.coords['Qz'] = Q.fields.z\n", + "da = da.flatten(to='pix')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "u_binned = da.bin(\n", + " {'energy_transfer': bin_sizes['u4'], 'Qz': bin_sizes[\"u3\"], 'Qy': bin_sizes['u2'], 'Qx': bin_sizes['u1']})\n", + "u_binned" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "dnd = u_binned.data.rename_dims(energy_transfer='u4', Qz='u3', Qy='u2', Qx='u1')\n", + "dnd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "def coord_range(da: sc.DataArray, coord: str) -> sc.Variable:\n", + " assert sc.islinspace(da.coords[coord])\n", + " return sc.array(dims=[coord], values=[da.coords[coord][0].value, da.coords[coord][-1].value],\n", + " unit=da.coords[coord].unit)\n", + "\n", + "\n", + "img_range = [\n", + " coord_range(u_binned, name)\n", + " for name in [\"Qx\", \"Qy\", \"Qz\", \"energy_transfer\"]\n", + "]\n", + "\n", + "n_bins_all_dims = sc.array(dims=[\"axis\"], values=[\n", + " u_binned.sizes['Qx'], u_binned.sizes['Qy'], u_binned.sizes['Qz'], u_binned.sizes['energy_transfer'],\n", + "], unit=None)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "# now in the correct order (?)\n", + "in_pixel_order = u_binned.bins.concat().value\n", + "in_pixel_order" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "# check that Q computation makes sense\n", + "# needs input like index_binned but binned, not histogrammed\n", + "\n", + "# for i, pix in enumerate(da[:1000]):\n", + "# e_q = pix.bins.coords['sample_table_momentum_transfer'].copy().bins.concat().value\n", + "# out = []\n", + "# for dim in 'xyz':\n", + "# q = getattr(e_q.fields, dim)\n", + "# lo = q.min().value\n", + "# hi = q.max().value\n", + "# n = len(q)\n", + "# Q = pix.coords[f'Q{dim}'].value\n", + "# if n > 0:\n", + "# out.append(f' {dim}: {Q: .4f} | [{lo: .4f}, {hi: .4f}]')\n", + "# if out:\n", + "# print(i)\n", + "# print('\\n'.join(out))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "pix = sc.DataArray(\n", + " in_pixel_order.data,\n", + " coords={\n", + " 'u1': in_pixel_order.coords['Qx'].to(unit='1/Å', dtype='float32', copy=False),\n", + " 'u2': in_pixel_order.coords['Qy'].to(unit='1/Å', dtype='float32', copy=False),\n", + " 'u3': in_pixel_order.coords['Qz'].to(unit='1/Å', dtype='float32', copy=False),\n", + " 'u4': in_pixel_order.coords['energy_transfer'].to(unit='meV', dtype='float32', copy=False),\n", + " 'idet': in_pixel_order.coords['detector_number'].to(dtype='float32', copy=False),\n", + " 'irun': in_pixel_order.coords['setting'].to(dtype='float32', copy=False),\n", + " 'ien': in_pixel_order.coords['ien'].to(dtype='float32', copy=False),\n", + " }\n", + ")\n", + "pix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "sample = sqw.SqwIXSample(\n", + " name=\"Vibranium\",\n", + " lattice_spacing=sc.vector([2.86, 2.86, 2.86], unit=\"angstrom\"),\n", + " lattice_angle=sc.vector([90.0, 90.0, 90.0], unit=\"deg\"),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "dnd_metadata = sqw.SqwDndMetadata(\n", + " axes=sqw.SqwLineAxes(\n", + " title=\"My Axes\",\n", + " label=[\"u1\", \"u2\", \"u3\", \"u4\"],\n", + " img_scales=[\n", + " sc.scalar(1.0, unit=\"1/angstrom\"),\n", + " sc.scalar(1.0, unit=\"1/angstrom\"),\n", + " sc.scalar(1.0, unit=\"1/angstrom\"),\n", + " sc.scalar(1.0, unit=\"meV\"),\n", + " ],\n", + " img_range=img_range,\n", + " n_bins_all_dims=n_bins_all_dims,\n", + " single_bin_defines_iax=sc.array(dims=[\"axis\"], values=[True] * 4),\n", + " dax=sc.arange(\"axis\", 4, unit=None),\n", + " offset=[\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"meV\"),\n", + " ],\n", + " changes_aspect_ratio=True,\n", + " ),\n", + " proj=sqw.SqwLineProj(\n", + " title=\"My Projection\",\n", + " lattice_spacing=sample.lattice_spacing,\n", + " lattice_angle=sample.lattice_angle,\n", + " offset=[\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"1/angstrom\"),\n", + " sc.scalar(0.0, unit=\"meV\"),\n", + " ],\n", + " label=[\"u1\", \"u2\", \"u3\", \"u4\"],\n", + " u=u,\n", + " v=v,\n", + " w=None,\n", + " non_orthogonal=False,\n", + " type=\"aaa\",\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "instrument = sqw.SqwIXNullInstrument(\n", + " name=\"BIFROST\",\n", + " source=sqw.SqwIXSource(\n", + " name=\"ESS\",\n", + " target_name=\"Tungsten wheel\",\n", + " frequency=sc.scalar(14, unit=\"Hz\"),\n", + " ),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "multi_en = en.broadcast(sizes={'detector': data.sizes['detector'], 'energy_transfer': len(en)})\n", + "experiment_template = sqw.SqwIXExperiment(\n", + " run_id=0,\n", + " efix=data.coords['final_energy'],\n", + " emode=sqw.EnergyMode.indirect,\n", + " en=multi_en,\n", + " psi=sc.scalar(0.0, unit=\"rad\"),\n", + " u=u,\n", + " v=v,\n", + " omega=sc.scalar(0.0, unit=\"rad\"),\n", + " dpsi=sc.scalar(0.0, unit=\"rad\"),\n", + " gl=sc.scalar(0.0, unit=\"rad\"),\n", + " gs=sc.scalar(0.0, unit=\"rad\"),\n", + ")\n", + "assert np.unique(data.coords['a4'].values).size == 1\n", + "experiments = [\n", + " dataclasses.replace(experiment_template, run_id=i, psi=a3)\n", + " for i, a3 in enumerate(data.coords['a3'], 1)\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "pix_buffer = np.c_[\n", + " *(pix.coords[name].values for name in ('u1', 'u2', 'u3', 'u4', 'irun', 'idet', 'ien')),\n", + " pix.values,\n", + " sc.stddevs(pix).values\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon (index method\").add_default_instrument(instrument)\n", + "builder = builder.add_default_sample(sample)\n", + "builder = builder.add_dnd_data(dnd_metadata, data=dnd.bins.sum(), counts=dnd.bins.size())\n", + "builder = builder.add_pixel_data(pix_buffer, experiments=experiments)\n", + "builder.create()" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "Tested so far:\n", + "\n", + "- can load\n", + "- shape matches\n", + "- ranges of all u_i match" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "## Test load" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "with sqw.Sqw.open(out_file) as sqw:\n", + " m = sqw.read_data_block(\"data\", \"metadata\")\n", + " d = sqw.read_data_block(\"data\", \"nd_data\")\n", + " l_pix = sqw.read_data_block(\"pix\", \"data_wrap\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "d[0].shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "pix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "pix.coords['u4'].min()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d28dcada63382be7f25627e48a5e7f6a0a754b9e Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 10 Oct 2025 09:34:11 +0200 Subject: [PATCH 245/330] Fix 1-based indexing --- .../bifrost-sqw-small-table.ipynb | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb index d38eb30ef..f0b1dd40f 100644 --- a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb +++ b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb @@ -252,6 +252,9 @@ " 'ien': in_pixel_order.coords['ien'].to(dtype='float32', copy=False),\n", " }\n", ")\n", + "# Convert to 1-based indexing:\n", + "for key in ('idet', 'irun', 'ien'):\n", + " pix.coords[key] += sc.scalar(1.0, dtype='float32', unit=None)\n", "pix" ] }, @@ -356,10 +359,10 @@ " gl=sc.scalar(0.0, unit=\"rad\"),\n", " gs=sc.scalar(0.0, unit=\"rad\"),\n", ")\n", - "assert np.unique(data.coords['a4'].values).size == 1\n", + "assert np.unique(index_binned.coords['a4'].values).size == 1\n", "experiments = [\n", " dataclasses.replace(experiment_template, run_id=i, psi=a3)\n", - " for i, a3 in enumerate(data.coords['a3'], 1)\n", + " for i, a3 in enumerate(index_binned.coords['a3'], 1)\n", "]" ] }, @@ -453,6 +456,26 @@ "source": [ "pix.coords['u4'].min()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "u_binned.sum('Qy').sum('energy_transfer').plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "u_binned['energy_transfer', sc.scalar(0.0, unit='meV'):sc.scalar(0.01, unit='meV')].sum('Qy').sum('energy_transfer').plot()" + ] } ], "metadata": { From c37e24800a6d702650b7c476d7fafba922037d1b Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 10 Oct 2025 14:35:57 +0200 Subject: [PATCH 246/330] Transpose file correctly --- .../bifrost-sqw-small-table.ipynb | 134 ++++++++++++++---- 1 file changed, 109 insertions(+), 25 deletions(-) diff --git a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb index f0b1dd40f..3b305561b 100644 --- a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb +++ b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb @@ -143,9 +143,9 @@ "outputs": [], "source": [ "da = index_binned.copy()\n", - "da.coords['Qx'] = Q.fields.x\n", - "da.coords['Qy'] = Q.fields.y\n", - "da.coords['Qz'] = Q.fields.z\n", + "da.coords['Qx'] = sc.dot(u/sc.norm(u), Q)\n", + "da.coords['Qy'] = sc.dot(v/sc.norm(v), Q)\n", + "da.coords['Qz'] = sc.dot(w/sc.norm(w), Q)\n", "da = da.flatten(to='pix')" ] }, @@ -181,7 +181,10 @@ "source": [ "def coord_range(da: sc.DataArray, coord: str) -> sc.Variable:\n", " assert sc.islinspace(da.coords[coord])\n", - " return sc.array(dims=[coord], values=[da.coords[coord][0].value, da.coords[coord][-1].value],\n", + " c= da.coords[coord]\n", + " lo = c[0].value\n", + " hi = c[-1].value\n", + " return sc.array(dims=[coord], values=[lo, hi],\n", " unit=da.coords[coord].unit)\n", "\n", "\n", @@ -338,10 +341,25 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "
\n", + " Outstanding work: Figure out how to write `en`.\n", + " We write it as a 2d array here. But horace loads it as a '1d' array (n_energy_transfer*n_detector, 1).\n", + " How do we need to write it?\n", + "\n", + "Also, the test file contains more than 2x the number of bins of the d4d object in en. (d4d: 50, en: 106)\n", + "What are all these bins?\n", + "
" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "18", + "id": "19", "metadata": {}, "outputs": [], "source": [ @@ -369,7 +387,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19", + "id": "20", "metadata": {}, "outputs": [], "source": [ @@ -383,29 +401,19 @@ { "cell_type": "code", "execution_count": null, - "id": "20", + "id": "21", "metadata": {}, "outputs": [], "source": [ "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon (index method\").add_default_instrument(instrument)\n", "builder = builder.add_default_sample(sample)\n", - "builder = builder.add_dnd_data(dnd_metadata, data=dnd.bins.sum(), counts=dnd.bins.size())\n", + "# Note the transpose!\n", + "dndt = dnd.transpose(['u1', 'u2','u3','u4'])\n", + "builder = builder.add_dnd_data(dnd_metadata, data=dndt.bins.sum() , counts=dndt.bins.size())\n", "builder = builder.add_pixel_data(pix_buffer, experiments=experiments)\n", "builder.create()" ] }, - { - "cell_type": "markdown", - "id": "21", - "metadata": {}, - "source": [ - "Tested so far:\n", - "\n", - "- can load\n", - "- shape matches\n", - "- ranges of all u_i match" - ] - }, { "cell_type": "markdown", "id": "22", @@ -421,10 +429,11 @@ "metadata": {}, "outputs": [], "source": [ - "with sqw.Sqw.open(out_file) as sqw:\n", - " m = sqw.read_data_block(\"data\", \"metadata\")\n", - " d = sqw.read_data_block(\"data\", \"nd_data\")\n", - " l_pix = sqw.read_data_block(\"pix\", \"data_wrap\")" + "with sqw.Sqw.open(out_file) as f:\n", + " m = f.read_data_block(\"data\", \"metadata\")\n", + " d = f.read_data_block(\"data\", \"nd_data\")\n", + " e = f.read_data_block(\"experiment_info\", 'expdata')\n", + " l_pix = f.read_data_block(\"pix\", \"data_wrap\")" ] }, { @@ -464,7 +473,11 @@ "metadata": {}, "outputs": [], "source": [ - "u_binned.sum('Qy').sum('energy_transfer').plot()" + "h = u_binned.sum('Qy').sum('energy_transfer')\n", + "# h /= u_binned.coords['Qy'][1]-u_binned.coords['Qy'][0]\n", + "h /= u_binned.coords['energy_transfer'][1]-u_binned.coords['energy_transfer'][0]\n", + "h /= sc.values(h.sum())\n", + "h.plot()" ] }, { @@ -473,9 +486,80 @@ "id": "28", "metadata": {}, "outputs": [], + "source": [ + "h = u_binned.mean('Qy').mean('energy_transfer')\n", + "# h /= u_binned.coords['Qy'][1]-u_binned.coords['Qy'][0]\n", + "# h /= u_binned.coords['energy_transfer'][1]-u_binned.coords['energy_transfer'][0]\n", + "# h /= sc.values(h.sum())\n", + "h.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "h = u_binned.mean('Qy').mean('Qx')\n", + "# h /= u_binned.coords['Qy'][1]-u_binned.coords['Qy'][0]\n", + "# h /= u_binned.coords['energy_transfer'][1]-u_binned.coords['energy_transfer'][0]\n", + "# h /= sc.values(h.sum())\n", + "h.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30", + "metadata": {}, + "outputs": [], "source": [ "u_binned['energy_transfer', sc.scalar(0.0, unit='meV'):sc.scalar(0.01, unit='meV')].sum('Qy').sum('energy_transfer').plot()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "u_binned['Qy', 0]['energy_transfer', 0].bins.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32", + "metadata": {}, + "outputs": [], + "source": [ + "print(dnd['u2', 0]['u4', 0].bins.sum().values.T)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "k = u_binned.mean('Qy')\n", + "# print(k.data.values[0])\n", + "# print(k.data.values[1])\n", + "k" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34", + "metadata": {}, + "outputs": [], + "source": [ + "k['energy_transfer', 1].values" + ] } ], "metadata": { From 902d1cc55723a4ae54f2e2bd77909f2cfc9bdde8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 10 Oct 2025 15:24:42 +0200 Subject: [PATCH 247/330] New notes --- .../bifrost-sqw-small-table.ipynb | 93 ++++++++++++------- 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb index 3b305561b..c171bb9c5 100644 --- a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb +++ b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb @@ -38,6 +38,18 @@ "id": "2", "metadata": {}, "outputs": [], + "source": [ + "# TODO\n", + "# try only one det and pretend that all dets have the same Ef and energy transfer range -> pass 1D array to sqw\n", + "# (use det 0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], "source": [ "n_det = 3\n", "n_angle = 5\n", @@ -55,7 +67,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3", + "id": "4", "metadata": {}, "outputs": [], "source": [ @@ -84,7 +96,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4", + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -94,7 +106,21 @@ { "cell_type": "code", "execution_count": null, - "id": "5", + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO\n", + "# not all detectors see the same energy transfer range\n", + "# => bin in incident energy / wavelength / etc. Then compute transfer (2d coord here)\n", + "# use transfer as en in IXexperiment\n", + "# then continue as normal, compute Q and bin and flatten" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", "metadata": {}, "outputs": [], "source": [ @@ -107,7 +133,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6", + "id": "8", "metadata": {}, "outputs": [], "source": [ @@ -128,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7", + "id": "9", "metadata": {}, "outputs": [], "source": [ @@ -138,7 +164,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8", + "id": "10", "metadata": {}, "outputs": [], "source": [ @@ -152,7 +178,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9", + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -164,10 +190,11 @@ { "cell_type": "code", "execution_count": null, - "id": "10", + "id": "12", "metadata": {}, "outputs": [], "source": [ + "# TODO check order\n", "dnd = u_binned.data.rename_dims(energy_transfer='u4', Qz='u3', Qy='u2', Qx='u1')\n", "dnd" ] @@ -175,7 +202,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11", + "id": "13", "metadata": {}, "outputs": [], "source": [ @@ -201,7 +228,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12", + "id": "14", "metadata": {}, "outputs": [], "source": [ @@ -213,7 +240,7 @@ { "cell_type": "code", "execution_count": null, - "id": "13", + "id": "15", "metadata": {}, "outputs": [], "source": [ @@ -239,7 +266,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14", + "id": "16", "metadata": {}, "outputs": [], "source": [ @@ -264,7 +291,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15", + "id": "17", "metadata": {}, "outputs": [], "source": [ @@ -278,7 +305,7 @@ { "cell_type": "code", "execution_count": null, - "id": "16", + "id": "18", "metadata": {}, "outputs": [], "source": [ @@ -327,7 +354,7 @@ { "cell_type": "code", "execution_count": null, - "id": "17", + "id": "19", "metadata": {}, "outputs": [], "source": [ @@ -343,7 +370,7 @@ }, { "cell_type": "markdown", - "id": "18", + "id": "20", "metadata": {}, "source": [ "
\n", @@ -351,15 +378,13 @@ " We write it as a 2d array here. But horace loads it as a '1d' array (n_energy_transfer*n_detector, 1).\n", " How do we need to write it?\n", "\n", - "Also, the test file contains more than 2x the number of bins of the d4d object in en. (d4d: 50, en: 106)\n", - "What are all these bins?\n", "
" ] }, { "cell_type": "code", "execution_count": null, - "id": "19", + "id": "21", "metadata": {}, "outputs": [], "source": [ @@ -387,7 +412,7 @@ { "cell_type": "code", "execution_count": null, - "id": "20", + "id": "22", "metadata": {}, "outputs": [], "source": [ @@ -401,7 +426,7 @@ { "cell_type": "code", "execution_count": null, - "id": "21", + "id": "23", "metadata": {}, "outputs": [], "source": [ @@ -416,7 +441,7 @@ }, { "cell_type": "markdown", - "id": "22", + "id": "24", "metadata": {}, "source": [ "## Test load" @@ -425,7 +450,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23", + "id": "25", "metadata": {}, "outputs": [], "source": [ @@ -439,7 +464,7 @@ { "cell_type": "code", "execution_count": null, - "id": "24", + "id": "26", "metadata": {}, "outputs": [], "source": [ @@ -449,7 +474,7 @@ { "cell_type": "code", "execution_count": null, - "id": "25", + "id": "27", "metadata": {}, "outputs": [], "source": [ @@ -459,7 +484,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26", + "id": "28", "metadata": {}, "outputs": [], "source": [ @@ -469,7 +494,7 @@ { "cell_type": "code", "execution_count": null, - "id": "27", + "id": "29", "metadata": {}, "outputs": [], "source": [ @@ -483,7 +508,7 @@ { "cell_type": "code", "execution_count": null, - "id": "28", + "id": "30", "metadata": {}, "outputs": [], "source": [ @@ -497,7 +522,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29", + "id": "31", "metadata": {}, "outputs": [], "source": [ @@ -511,7 +536,7 @@ { "cell_type": "code", "execution_count": null, - "id": "30", + "id": "32", "metadata": {}, "outputs": [], "source": [ @@ -521,7 +546,7 @@ { "cell_type": "code", "execution_count": null, - "id": "31", + "id": "33", "metadata": {}, "outputs": [], "source": [ @@ -531,7 +556,7 @@ { "cell_type": "code", "execution_count": null, - "id": "32", + "id": "34", "metadata": {}, "outputs": [], "source": [ @@ -541,7 +566,7 @@ { "cell_type": "code", "execution_count": null, - "id": "33", + "id": "35", "metadata": {}, "outputs": [], "source": [ @@ -554,7 +579,7 @@ { "cell_type": "code", "execution_count": null, - "id": "34", + "id": "36", "metadata": {}, "outputs": [], "source": [ From abc17ca263e2df04efe03dc73177d6929c2259b9 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 13 Oct 2025 13:23:20 +0200 Subject: [PATCH 248/330] Hist in incident energy --- .../bifrost-sqw-small-table.ipynb | 198 ++++++++++++------ .../ess/spectroscopy/indirect/conversion.py | 29 ++- .../src/ess/spectroscopy/types.py | 4 + 3 files changed, 164 insertions(+), 67 deletions(-) diff --git a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb index c171bb9c5..d9acdc12d 100644 --- a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb +++ b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb @@ -23,6 +23,7 @@ "import numpy as np\n", "import scipp.constants\n", "import dataclasses\n", + "import plopp as pp\n", "\n", "from ess import bifrost\n", "from ess.bifrost.data import (\n", @@ -38,6 +39,16 @@ "id": "2", "metadata": {}, "outputs": [], + "source": [ + "%matplotlib widget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], "source": [ "# TODO\n", "# try only one det and pretend that all dets have the same Ef and energy transfer range -> pass 1D array to sqw\n", @@ -47,7 +58,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3", + "id": "4", "metadata": {}, "outputs": [], "source": [ @@ -55,6 +66,7 @@ "n_angle = 5\n", "\n", "bin_sizes = {'u1': 6, 'u2': 7, 'u3': 8, 'u4': 9}\n", + "energy_bins = 13\n", "\n", "out_file = Path(\"bifrost-simulated.sqw\")\n", "\n", @@ -67,7 +79,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4", + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -81,7 +93,7 @@ "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", "scheduler = sciline.scheduler.NaiveScheduler()\n", "\n", - "data = workflow.compute(EnergyData[SampleRun], scheduler=scheduler)\n", + "data = workflow.compute(IncidentEnergyDetector[SampleRun], scheduler=scheduler)\n", "\n", "data = data['a3', :n_angle].flatten(['triplet', 'tube', 'length'], 'detector')\n", "\n", @@ -93,16 +105,6 @@ "data.coords['setting'] = data.coords.pop('i_a3') + data.coords.pop('i_a4') * sc.index(n_a3)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "data" - ] - }, { "cell_type": "code", "execution_count": null, @@ -110,11 +112,7 @@ "metadata": {}, "outputs": [], "source": [ - "# TODO\n", - "# not all detectors see the same energy transfer range\n", - "# => bin in incident energy / wavelength / etc. Then compute transfer (2d coord here)\n", - "# use transfer as en in IXexperiment\n", - "# then continue as normal, compute Q and bin and flatten" + "data" ] }, { @@ -124,9 +122,10 @@ "metadata": {}, "outputs": [], "source": [ - "index_binned = data.hist(energy_transfer=sc.linspace('energy_transfer', -0.05, 0.05, bin_sizes['u4'] + 1, unit='meV'))\n", - "index_binned.coords['energy_transfer'] = sc.midpoints(index_binned.coords['energy_transfer'])\n", - "index_binned.coords['ien'] = sc.arange('energy_transfer', bin_sizes['u4'], unit=None, dtype='float32')\n", + "index_binned = data.hist(incident_energy=energy_bins)\n", + "# index_binned = data.hist(incident_energy=sc.linspace('incident_energy', -0.05, 0.05, energy_bins + 1, unit='meV'))\n", + "index_binned.coords['incident_energy'] = sc.midpoints(index_binned.coords['incident_energy'])\n", + "index_binned.coords['ien'] = sc.arange('incident_energy', energy_bins, unit=None, dtype='float32')\n", "index_binned" ] }, @@ -139,16 +138,18 @@ "source": [ "a3 = index_binned.coords['a3']\n", "# idet = hist.coords['detector_number']\n", - "en = index_binned.coords['energy_transfer']\n", + "ei = index_binned.coords['incident_energy']\n", "ef = index_binned.coords['final_energy']\n", "kf = index_binned.coords['final_wavevector']\n", "\n", - "# should get this form the data\n", + "# TODO should get this from the data\n", "bi = sc.vector([0, 0, 1])\n", "Ra3 = sc.spatial.rotations_from_rotvecs(-a3 * sc.vector([0, 1, 0]))\n", "\n", - "ki = 2 * np.pi / sc.constants.h * sc.sqrt(2 * sc.constants.m_n * (en + ef)) * bi\n", - "Q = Ra3 * (ki.to(unit=kf.unit) - kf)" + "ki = 2 * np.pi / sc.constants.h * sc.sqrt(2 * sc.constants.m_n * ei) * bi\n", + "Q = Ra3 * (ki.to(unit=kf.unit) - kf)\n", + "\n", + "delta_e = ei - ef" ] }, { @@ -168,11 +169,7 @@ "metadata": {}, "outputs": [], "source": [ - "da = index_binned.copy()\n", - "da.coords['Qx'] = sc.dot(u/sc.norm(u), Q)\n", - "da.coords['Qy'] = sc.dot(v/sc.norm(v), Q)\n", - "da.coords['Qz'] = sc.dot(w/sc.norm(w), Q)\n", - "da = da.flatten(to='pix')" + "delta_e" ] }, { @@ -182,7 +179,29 @@ "metadata": {}, "outputs": [], "source": [ - "u_binned = da.bin(\n", + "observations = index_binned.copy()\n", + "observations.coords['Qx'] = sc.dot(u / sc.norm(u), Q)\n", + "observations.coords['Qy'] = sc.dot(v / sc.norm(v), Q)\n", + "observations.coords['Qz'] = sc.dot(w / sc.norm(w), Q)\n", + "observations.coords['energy_transfer'] = delta_e\n", + "\n", + "# Remove large coords that we no longer need.\n", + "# This should happen earlier!\n", + "observations = observations.drop_coords(['final_wavevector', 'incident_energy', 'secondary_flight_time'])\n", + "\n", + "observations = observations.flatten(to='pix')\n", + "\n", + "observations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "u_binned = observations.bin(\n", " {'energy_transfer': bin_sizes['u4'], 'Qz': bin_sizes[\"u3\"], 'Qy': bin_sizes['u2'], 'Qx': bin_sizes['u1']})\n", "u_binned" ] @@ -190,7 +209,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12", + "id": "13", "metadata": {}, "outputs": [], "source": [ @@ -202,7 +221,7 @@ { "cell_type": "code", "execution_count": null, - "id": "13", + "id": "14", "metadata": {}, "outputs": [], "source": [ @@ -228,7 +247,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14", + "id": "15", "metadata": {}, "outputs": [], "source": [ @@ -240,7 +259,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15", + "id": "16", "metadata": {}, "outputs": [], "source": [ @@ -266,10 +285,11 @@ { "cell_type": "code", "execution_count": null, - "id": "16", + "id": "17", "metadata": {}, "outputs": [], "source": [ + "# TODO convert to float32 much earlier\n", "pix = sc.DataArray(\n", " in_pixel_order.data,\n", " coords={\n", @@ -291,7 +311,7 @@ { "cell_type": "code", "execution_count": null, - "id": "17", + "id": "18", "metadata": {}, "outputs": [], "source": [ @@ -305,7 +325,7 @@ { "cell_type": "code", "execution_count": null, - "id": "18", + "id": "19", "metadata": {}, "outputs": [], "source": [ @@ -319,7 +339,7 @@ " sc.scalar(1.0, unit=\"1/angstrom\"),\n", " sc.scalar(1.0, unit=\"meV\"),\n", " ],\n", - " img_range=img_range,\n", + " img_range=img_range, # or is this the range of dnd? (here we use pix)\n", " n_bins_all_dims=n_bins_all_dims,\n", " single_bin_defines_iax=sc.array(dims=[\"axis\"], values=[True] * 4),\n", " dax=sc.arange(\"axis\", 4, unit=None),\n", @@ -354,7 +374,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19", + "id": "20", "metadata": {}, "outputs": [], "source": [ @@ -370,7 +390,7 @@ }, { "cell_type": "markdown", - "id": "20", + "id": "21", "metadata": {}, "source": [ "
\n", @@ -384,16 +404,27 @@ { "cell_type": "code", "execution_count": null, - "id": "21", + "id": "22", "metadata": {}, "outputs": [], "source": [ - "multi_en = en.broadcast(sizes={'detector': data.sizes['detector'], 'energy_transfer': len(en)})\n", + "delta_e" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "en = delta_e.rename_dims(incident_energy='energy_transfer').transpose(['detector', 'energy_transfer'])\n", + "\n", "experiment_template = sqw.SqwIXExperiment(\n", " run_id=0,\n", " efix=data.coords['final_energy'],\n", " emode=sqw.EnergyMode.indirect,\n", - " en=multi_en,\n", + " en=en,\n", " psi=sc.scalar(0.0, unit=\"rad\"),\n", " u=u,\n", " v=v,\n", @@ -412,7 +443,7 @@ { "cell_type": "code", "execution_count": null, - "id": "22", + "id": "24", "metadata": {}, "outputs": [], "source": [ @@ -426,7 +457,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23", + "id": "25", "metadata": {}, "outputs": [], "source": [ @@ -441,7 +472,7 @@ }, { "cell_type": "markdown", - "id": "24", + "id": "26", "metadata": {}, "source": [ "## Test load" @@ -450,7 +481,7 @@ { "cell_type": "code", "execution_count": null, - "id": "25", + "id": "27", "metadata": {}, "outputs": [], "source": [ @@ -464,7 +495,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26", + "id": "28", "metadata": {}, "outputs": [], "source": [ @@ -474,7 +505,7 @@ { "cell_type": "code", "execution_count": null, - "id": "27", + "id": "29", "metadata": {}, "outputs": [], "source": [ @@ -484,7 +515,7 @@ { "cell_type": "code", "execution_count": null, - "id": "28", + "id": "30", "metadata": {}, "outputs": [], "source": [ @@ -494,7 +525,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29", + "id": "31", "metadata": {}, "outputs": [], "source": [ @@ -508,11 +539,21 @@ { "cell_type": "code", "execution_count": null, - "id": "30", + "id": "32", "metadata": {}, "outputs": [], "source": [ - "h = u_binned.mean('Qy').mean('energy_transfer')\n", + "pp.slicer(u_binned.bins.mean(), keep=['Qx', 'Qz'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "h = u_binned.nanmean('Qy').nanmean('energy_transfer')\n", "# h /= u_binned.coords['Qy'][1]-u_binned.coords['Qy'][0]\n", "# h /= u_binned.coords['energy_transfer'][1]-u_binned.coords['energy_transfer'][0]\n", "# h /= sc.values(h.sum())\n", @@ -522,11 +563,11 @@ { "cell_type": "code", "execution_count": null, - "id": "31", + "id": "34", "metadata": {}, "outputs": [], "source": [ - "h = u_binned.mean('Qy').mean('Qx')\n", + "h = u_binned.nanmean('Qy').nanmean('Qx')\n", "# h /= u_binned.coords['Qy'][1]-u_binned.coords['Qy'][0]\n", "# h /= u_binned.coords['energy_transfer'][1]-u_binned.coords['energy_transfer'][0]\n", "# h /= sc.values(h.sum())\n", @@ -536,7 +577,42 @@ { "cell_type": "code", "execution_count": null, - "id": "32", + "id": "35", + "metadata": {}, + "outputs": [], + "source": [ + "h.values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36", + "metadata": {}, + "outputs": [], + "source": [ + "s = \"\"\" 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0\n", + " 0 1.2943 3.1028 3.5018 3.2000 0 0 0\n", + " 0 0 0.0523 0.0433 0.0288 0 0 0\n", + " 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0.0015 0.0054 0.0024 0\n", + " 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0\"\"\"\n", + "\n", + "a = h.values\n", + "e = np.array([float(x.strip()) for x in s.split(\" \") if x]).reshape((-1, 8))\n", + "\n", + "np.isnan(a) | (np.isclose(a, e))\n", + "\n", + "(a - e) / e" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", "metadata": {}, "outputs": [], "source": [ @@ -546,7 +622,7 @@ { "cell_type": "code", "execution_count": null, - "id": "33", + "id": "38", "metadata": {}, "outputs": [], "source": [ @@ -556,7 +632,7 @@ { "cell_type": "code", "execution_count": null, - "id": "34", + "id": "39", "metadata": {}, "outputs": [], "source": [ @@ -566,7 +642,7 @@ { "cell_type": "code", "execution_count": null, - "id": "35", + "id": "40", "metadata": {}, "outputs": [], "source": [ @@ -579,7 +655,7 @@ { "cell_type": "code", "execution_count": null, - "id": "36", + "id": "41", "metadata": {}, "outputs": [], "source": [ diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 078f274ea..cbbd7097e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -13,6 +13,7 @@ from ..types import ( EnergyQDetector, GravityVector, + IncidentEnergyDetector, InelasticCoordTransformGraph, MonitorCoordTransformGraph, MonitorType, @@ -162,13 +163,7 @@ def add_inelastic_coordinates( ) -> EnergyQDetector[RunType]: transformed = data.transform_coords( [ - # TODO pick minimal list of coords 'energy_transfer', - 'final_energy', - 'final_wavevector', - 'incident_wavelength', - 'incident_energy', - 'lab_momentum_transfer', 'sample_table_momentum_transfer', # These are inputs, but we want to preserve them 'a3', @@ -183,6 +178,27 @@ def add_inelastic_coordinates( return EnergyQDetector[RunType](transformed) +def add_incident_energy( + data: DetectorTofData[RunType], graph: InelasticCoordTransformGraph +) -> IncidentEnergyDetector[RunType]: + transformed = data.transform_coords( + [ + 'incident_energy', + # These are inputs, but we need them for binning: + 'a3', + 'a4', + 'final_energy', + 'final_wavevector', + ], + graph=graph, + keep_aliases=False, + keep_inputs=False, + keep_intermediate=False, + rename_dims=False, + ) + return IncidentEnergyDetector[RunType](transformed) + + def add_spectrometer_coords( data: sc.DataArray, primary_graph: PrimarySpecCoordTransformGraph[RunType], @@ -247,6 +263,7 @@ def add_monitor_wavelength_coords( providers = ( add_inelastic_coordinates, + add_incident_energy, add_monitor_wavelength_coords, inelastic_coordinate_transformation_graph_at_sample, monitor_coordinate_transformation_graph, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index b3dc40522..7a3b4eac6 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -89,6 +89,10 @@ class EnergyQDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """Detector counts with a momentum transfer and energy transfer coordinates.""" +class IncidentEnergyDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Detector counts with an incident energy coordinate.""" + + class SampleAngle(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """Rotation angle of the sample, possibly as a function of time. From d86f248fcaf30a2c1ee62bf8a745319dde97aa7b Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 13 Oct 2025 15:09:26 +0200 Subject: [PATCH 249/330] Try using a single bank --- .../bifrost-sqw-small-table.ipynb | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb index d9acdc12d..56d06db33 100644 --- a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb +++ b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb @@ -62,7 +62,7 @@ "metadata": {}, "outputs": [], "source": [ - "n_det = 3\n", + "n_det = 1\n", "n_angle = 5\n", "\n", "bin_sizes = {'u1': 6, 'u2': 7, 'u3': 8, 'u4': 9}\n", @@ -121,6 +121,18 @@ "id": "7", "metadata": {}, "outputs": [], + "source": [ + "# TODO pretend that that is only a single final energu\n", + "data.coords['final_energy'] = data.coords['final_energy'].mean()\n", + "data.coords['final_wavevector'] = data.coords['final_wavevector'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], "source": [ "index_binned = data.hist(incident_energy=energy_bins)\n", "# index_binned = data.hist(incident_energy=sc.linspace('incident_energy', -0.05, 0.05, energy_bins + 1, unit='meV'))\n", @@ -132,7 +144,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8", + "id": "9", "metadata": {}, "outputs": [], "source": [ @@ -155,7 +167,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9", + "id": "10", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +177,7 @@ { "cell_type": "code", "execution_count": null, - "id": "10", + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -175,7 +187,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11", + "id": "12", "metadata": {}, "outputs": [], "source": [ @@ -197,7 +209,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12", + "id": "13", "metadata": {}, "outputs": [], "source": [ @@ -209,7 +221,7 @@ { "cell_type": "code", "execution_count": null, - "id": "13", + "id": "14", "metadata": {}, "outputs": [], "source": [ @@ -221,7 +233,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14", + "id": "15", "metadata": {}, "outputs": [], "source": [ @@ -247,7 +259,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15", + "id": "16", "metadata": {}, "outputs": [], "source": [ @@ -259,7 +271,7 @@ { "cell_type": "code", "execution_count": null, - "id": "16", + "id": "17", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +297,7 @@ { "cell_type": "code", "execution_count": null, - "id": "17", + "id": "18", "metadata": {}, "outputs": [], "source": [ @@ -311,7 +323,7 @@ { "cell_type": "code", "execution_count": null, - "id": "18", + "id": "19", "metadata": {}, "outputs": [], "source": [ @@ -325,7 +337,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19", + "id": "20", "metadata": {}, "outputs": [], "source": [ @@ -374,7 +386,7 @@ { "cell_type": "code", "execution_count": null, - "id": "20", + "id": "21", "metadata": {}, "outputs": [], "source": [ @@ -390,7 +402,7 @@ }, { "cell_type": "markdown", - "id": "21", + "id": "22", "metadata": {}, "source": [ "
\n", @@ -401,16 +413,6 @@ "
" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "22", - "metadata": {}, - "outputs": [], - "source": [ - "delta_e" - ] - }, { "cell_type": "code", "execution_count": null, @@ -418,7 +420,9 @@ "metadata": {}, "outputs": [], "source": [ - "en = delta_e.rename_dims(incident_energy='energy_transfer').transpose(['detector', 'energy_transfer'])\n", + "# TODO\n", + "# en = delta_e.rename_dims(incident_energy='energy_transfer').transpose(['detector', 'energy_transfer'])\n", + "en = delta_e.rename_dims(incident_energy='energy_transfer')\n", "\n", "experiment_template = sqw.SqwIXExperiment(\n", " run_id=0,\n", From 461a14aea87a512afb35c866dce62e3ecec8fead Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 16 Oct 2025 16:10:35 +0200 Subject: [PATCH 250/330] Add function for Ei -> Q --- .../ess/spectroscopy/indirect/conversion.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index cbbd7097e..15db875e7 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -3,7 +3,9 @@ """Coordinate conversions for indirect spectroscopy.""" +import numpy as np import scipp as sc +import scipp.constants from scippneutron.conversion.tof import ( energy_from_wavelength, wavelength_from_tof, @@ -101,6 +103,55 @@ def lab_momentum_transfer_from_wavevectors( ) +def lab_momentum_transfer_from_incident_energy( + incident_energy: sc.Variable, + incident_beam: sc.Variable, + final_wavevector: sc.Variable, +) -> sc.Variable: + r"""Compute the momentum transfer in the lab frame. + + Here, the momentum transfer is defined as + + .. math:: + + \vec{Q} = \vec{k_i} - \vec{k_f} + + with + + .. math:: + + \vec{k_i} = \frac{2\pi}{h} \hat{b}_i \sqrt(2 M_n E_i} + + Parameters + ---------- + incident_energy: + The neutron energy :math:`E_i` before scattering. + incident_beam: + The vector of the incident beam in the lab frame :math:`\vec{b}_i`. + final_wavevector: + The neutron wavevector :math:`\vec{k_f}` after scattering. + + Returns + ------- + : + The momentum transfer :math:`\vec{Q}` in the lab frame. + """ + # Typical shapes: + # - incident_beam: () + # - incident_energy: (incident_energy,) (small) + # - final_wavevector: (detector,) (large-ish but 1D) + # - result: (detector, incident_energy) + incident_wavevector = ( + (2 * np.pi / sc.constants.h) + * (incident_beam / sc.norm(incident_beam)) + * sc.sqrt(2 * sc.constants.m_n * incident_energy) + ) + # Order of operations such that the final result has dim order described above. + return -final_wavevector + incident_wavevector.to( + unit=final_wavevector.unit, copy=False + ) + + def rotate_to_sample_table_momentum_transfer( *, a3: sc.Variable, From 363e43556a44926c71f89f8f1c8a3ba328b45bd3 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 16 Oct 2025 16:41:06 +0200 Subject: [PATCH 251/330] Start implementing SQW writer --- .../essspectroscopy/src/ess/bifrost/io/sqw.py | 357 ++++++++++++++++++ .../src/ess/spectroscopy/types.py | 8 + 2 files changed, 365 insertions(+) create mode 100644 packages/essspectroscopy/src/ess/bifrost/io/sqw.py diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py new file mode 100644 index 000000000..52be82512 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -0,0 +1,357 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""SQW output for BIFROST.""" + +import dataclasses + +import numpy as np +import numpy.typing as npt +import scipp as sc +from scippneutron.io import sqw +from scippneutron.metadata import ESS_SOURCE, Beamline, Measurement + +from ess.spectroscopy.types import ( + EnergyBins, + IncidentEnergyDetector, + OutFilename, + PulsePeriod, + SampleRun, + SQWBinSizes, +) + +# Projection axes +# For now, we always project onto the cartesian axes for simplicity. +_AXIS_U = sc.vector([1, 0, 0], unit="1/angstrom") +_AXIS_V = sc.vector([0, 1, 0], unit="1/angstrom") +_AXIS_W = sc.vector([0, 0, 1], unit="1/angstrom") + + +def save_sqw( + path: OutFilename, + events: IncidentEnergyDetector[SampleRun], + *, + bin_sizes: SQWBinSizes, + energy_bins: EnergyBins, # TODO distinct from above! + beamline: Beamline, + measurement: Measurement, + pulse_period: PulsePeriod, + sample: sqw.SqwIXSample, +) -> None: + """Save events recorded at BIFROST to an SQW file. + + ``events`` has shape (*logical, a3, a4), is binned with Ei event coord. + """ + # TODO validate inputs: single a4 + + flat_events = _flatten_events(events) + del events # 'move' events into _flatten_events + _filter_and_convert_coords_in_place(flat_events) + + sample_angle = flat_events.coords['a3'] + + observations = _histogram_detector_setting_ei(flat_events, energy_bins=energy_bins) + del flat_events # 'move' flat_events into _histogram_detector_setting_ei + final_energy = observations.coords['final_energy'] + observations = _with_inelastic_coords(observations) + energy_transfer = observations.coords['energy_transfer'].rename_dims( + incident_energy='energy_transfer' + ) + observations = observations.flatten(to="observation") + + dnd, counts, binned_observations = _bin_image(observations, bin_sizes) + del observations # 'move' observations into _bin_image + pix = _make_pixel_data(binned_observations) + del binned_observations # 'move' binned_observations into _make_pixel_data + pix_buffer = _make_pixel_buffer(pix) + del pix # 'move' pix into _make_pixel_buffer + + experiments = _make_experiments( + energy_transfer=energy_transfer, + final_energy=final_energy, + sample_angle=sample_angle, + ) + builder = ( + sqw.Sqw.build(path, title=measurement.title) + .add_default_instrument(_make_instrument(beamline, pulse_period)) + .add_default_sample(sample) + .add_dnd_data(_make_dnd_metadata(dnd, sample), data=dnd.data, counts=counts) + .add_pixel_data(pix_buffer, experiments=experiments) + ) + builder.create() + + +def _flatten_events(events: IncidentEnergyDetector[SampleRun]) -> sc.DataArray: + """Flatten events from (*logical, a3, a4) to (detector, setting). + + Also assigns the 'irun' coordinate as that requires the initial shape. + """ + logical_dims = [dim for dim in events.dims if dim not in ("a3", "a4")] + aux = events.flatten(logical_dims, 'detector') + + n_a3 = aux.sizes['a3'] + aux.coords['i_a3'] = sc.arange('a3', n_a3, dtype='float32', unit=None) + aux.coords['i_a4'] = sc.arange('a4', aux.sizes['a4'], dtype='float32', unit=None) + flat = aux.flatten(['a3', 'a4'], 'setting') + return flat.assign_coords( + irun=flat.coords.pop('i_a3') + + flat.coords.pop('i_a4') * sc.index(n_a3) + + sc.index(1, dtype='float32') # 1-based indexing + ) + + +def _filter_and_convert_coords_in_place(flat_events: sc.DataArray) -> None: + """Filter out all coords we no longer need and convert to float32. + + This function mainly serves to reduce memory usage. + The conversion to float32 is ultimately required when building the 'pixel data', + we do it here to reduce size early. This should not have a significant impact + on precision as we do not reduce these coordinates. + The event weights remain in float64 or int64 for now because + they do need to be summed. + """ + flat_events.coords['final_energy'] = flat_events.coords['final_energy'].to( + dtype='float32', copy=False + ) + flat_events.bins.coords['incident_energy'] = flat_events.bins.coords[ + 'incident_energy' + ].to(dtype='float32', copy=False) + + flat_events.coords['idet'] = flat_events.coords.pop('detector_number').to( + dtype='float32', copy=False + ) + # to 1-based indexing: + flat_events.coords['idet'] += sc.scalar(1.0, dtype='float32', unit=None) + + keep = { + 'a3', + 'final_energy', + 'final_wavevector', + 'gravity', + 'idet', + 'incident_beam', + 'irun', + } + for dim in set(flat_events.coords) - keep: + del flat_events.coords[dim] + + +def _histogram_detector_setting_ei( + flat_events: sc.DataArray, *, energy_bins: EnergyBins +) -> sc.DataArray: + """Histogram the events in (detector, setting, incident_energy). + + This also converts the weights to float32 as no further reductions + will be performed for the 'pixel data'. + We accept a loss of precision for the 'image data' here which will be + converted back to float64 later. + """ + hist = flat_events.hist(incident_energy=energy_bins) + hist.coords['incident_energy'] = sc.midpoints(hist.coords['incident_energy']).to( + dtype='float32', copy=False + ) + hist.coords['ien'] = sc.arange( + 'incident_energy', + 1, # 1-based indexing + hist.sizes['incident_energy'] + 1, + dtype='float32', + unit=None, + ) + + hist.data = hist.data.to(dtype='float32', copy=False) + + return hist + + +def _with_inelastic_coords(observations: sc.DataArray) -> sc.DataArray: + """Compute and assign Qx, Qy, Qz, and energy_transfer. + + This also drops all coordinates that are no longer needed. + """ + from ess.spectroscopy.indirect.conversion import ( + energy_transfer, + lab_momentum_transfer_from_incident_energy, + rotate_to_sample_table_momentum_transfer, + ) + + graph = { + 'lab_momentum_transfer': lab_momentum_transfer_from_incident_energy, + 'sample_table_momentum_transfer': rotate_to_sample_table_momentum_transfer, + 'energy_transfer': energy_transfer, + } + aux = observations.transform_coords( + ['sample_table_momentum_transfer', 'energy_transfer'], + graph=graph, + keep_inputs=False, + keep_intermediate=False, + quiet=True, + ) + q = aux.coords.pop('sample_table_momentum_transfer') + + return aux.assign_coords( + energy_transfer=aux.coords.pop('energy_transfer').to( + dtype='float32', copy=False + ), + **{ + f'Q{dim}': sc.dot(axis / sc.norm(axis), q).to(dtype='float32') + for dim, axis in zip('xyz', (_AXIS_U, _AXIS_V, _AXIS_W), strict=True) + }, + ) + + +def _bin_image( + observations: sc.DataArray, bin_sizes: SQWBinSizes +) -> tuple[sc.DataArray, sc.Variable, sc.DataArray]: + # Dim order to match pixel data (note the transpose for dnd) + # TODO correct? Might not be!! + binned = observations.bin( + {dim: bin_sizes[dim] for dim in ('energy_transfer', 'Qz', 'Qy', 'Qx')} + ).rename(energy_transfer='u4', Qz='u3', Qy='u2', Qx='u1') + + image = binned.transpose(['u1', 'u2', 'u3', 'u4']) + dnd = image.bins.sum().to(dtype='float64', copy=False) + counts = image.bins.size() + + return dnd, counts, binned + + +def _make_pixel_data(binned_observations: sc.DataArray) -> sc.DataArray: + pix = binned_observations.data.bins.concat().value + del binned_observations + + # Convert to expected units: + return sc.DataArray( + pix.data, + coords={ + 'u1': pix.coords['u1'].to(unit='1/Ã…', copy=False), + 'u2': pix.coords['u2'].to(unit='1/Ã…', copy=False), + 'u3': pix.coords['u3'].to(unit='1/Ã…', copy=False), + 'u4': pix.coords['u4'].to(unit='meV', copy=False), + 'idet': pix.coords['idet'], + 'irun': pix.coords['irun'], + 'ien': pix.coords['ien'], + }, + ) + + +def _make_pixel_buffer(pix: sc.DataArray) -> npt.NDArray[np.float32]: + return np.c_[ + *( + pix.coords[name].values + for name in ('u1', 'u2', 'u3', 'u4', 'irun', 'idet', 'ien') + ), + pix.values, + sc.stddevs(pix).values, + ] + + +def _make_instrument( + beamline: Beamline, pulse_period: PulsePeriod +) -> sqw.SqwIXNullInstrument: + return sqw.SqwIXNullInstrument( + name=beamline.name, + source=sqw.SqwIXSource( + name="ESS", + target_name=ESS_SOURCE.name, + frequency=1 / pulse_period, + ), + ) + + +def _make_dnd_metadata( + dnd: sc.DataArray, sample: sqw.SqwIXSample +) -> sqw.SqwDndMetadata: + """Create the DND metadata for an SQW file. + + Parameters + ---------- + dnd: + DND 'image data'. + Must be histogrammed along the Qx, Qy, Qz, and energy_transfer axes + with linspace coordinates. + sample: + Sample metadata. + """ + img_range = [ + sc.array( + dims=[name], + values=[ + dnd.coords[name].min(), + dnd.coords[name].max(), + ], + unit=dnd.coords[name].unit, + ) + for name in ("u1", "u2", "u3", "u4") + ] + + n_bins_all_dims = sc.array( + dims=["axis"], + values=[dnd.sizes[name] for name in ("u1", "u2", "u3", "u4")], + unit=None, + ) + + return sqw.SqwDndMetadata( + axes=sqw.SqwLineAxes( + title="Instrument Axes", + label=["Qx", "Qy", "Qz", "Delta E"], + img_scales=[ + sc.scalar(1.0, unit="1/angstrom"), + sc.scalar(1.0, unit="1/angstrom"), + sc.scalar(1.0, unit="1/angstrom"), + sc.scalar(1.0, unit="meV"), + ], + img_range=img_range, + n_bins_all_dims=n_bins_all_dims, + single_bin_defines_iax=sc.array(dims=["axis"], values=[True] * 4), + dax=sc.arange("axis", 4, unit=None), + offset=[ + sc.scalar(0.0, unit="1/angstrom"), + sc.scalar(0.0, unit="1/angstrom"), + sc.scalar(0.0, unit="1/angstrom"), + sc.scalar(0.0, unit="meV"), + ], + changes_aspect_ratio=True, + ), + proj=sqw.SqwLineProj( + title="Null Projection", + lattice_spacing=sample.lattice_spacing, + lattice_angle=sample.lattice_angle, + offset=[ + sc.scalar(0.0, unit="1/angstrom"), + sc.scalar(0.0, unit="1/angstrom"), + sc.scalar(0.0, unit="1/angstrom"), + sc.scalar(0.0, unit="meV"), + ], + label=["Qx", "Qy", "Qz", "Delta E"], + u=_AXIS_U, + v=_AXIS_V, + w=_AXIS_W, + non_orthogonal=False, + type="aaa", + ), + ) + + +def _make_experiments( + *, + energy_transfer: sc.Variable, + final_energy: sc.Variable, + sample_angle: sc.Variable, +) -> list[sqw.SqwIXExperiment]: + experiment_template = sqw.SqwIXExperiment( + run_id=0, + efix=final_energy, + emode=sqw.EnergyMode.indirect, + en=energy_transfer, + psi=sc.scalar(0.0, unit="rad"), + u=_AXIS_U, + v=_AXIS_V, + omega=sc.scalar(0.0, unit="rad"), + dpsi=sc.scalar(0.0, unit="rad"), + gl=sc.scalar(0.0, unit="rad"), + gs=sc.scalar(0.0, unit="rad"), + ) + return [ + dataclasses.replace(experiment_template, run_id=i, psi=a3) + for i, a3 in enumerate(sample_angle, 1) + ] diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 7a3b4eac6..77cdbe298 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -85,6 +85,12 @@ class QDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """Detector counts with a momentum transfer coordinate.""" +EnergyBins = NewType('EnergyBins', sc.Variable) + + +class EnergyData(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... + + class EnergyQDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """Detector counts with a momentum transfer and energy transfer coordinates.""" @@ -113,6 +119,8 @@ class InstrumentAngle(sciline.Scope[RunType, sc.DataArray], sc.DataArray): NXspeFileName = NewType('NXspeFileName', str) NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) +OutFilename = NewType("OutFilename", str) + class PrimarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... From a049fa2838a138016ca6d0a01b168cad07271544 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 24 Oct 2025 10:06:19 +0200 Subject: [PATCH 252/330] Fix img_range concat --- packages/essspectroscopy/src/ess/bifrost/io/sqw.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 52be82512..7cba51c18 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -273,14 +273,7 @@ def _make_dnd_metadata( Sample metadata. """ img_range = [ - sc.array( - dims=[name], - values=[ - dnd.coords[name].min(), - dnd.coords[name].max(), - ], - unit=dnd.coords[name].unit, - ) + sc.concat([dnd.coords[name].min(), dnd.coords[name].max()], dim=name) for name in ("u1", "u2", "u3", "u4") ] From 307734c2f08e4df251d2faf49bf4696e1073ddb3 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 27 Oct 2025 11:59:49 +0100 Subject: [PATCH 253/330] Add tests for basic SQW metadata --- .../src/ess/bifrost/io/__init__.py | 4 +- .../tests/bifrost/io/sqw_test.py | 149 ++++++++++++++++++ 2 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 packages/essspectroscopy/tests/bifrost/io/sqw_test.py diff --git a/packages/essspectroscopy/src/ess/bifrost/io/__init__.py b/packages/essspectroscopy/src/ess/bifrost/io/__init__.py index 8d4d05b4c..20300bcf7 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/__init__.py @@ -3,6 +3,6 @@ """Input/output for BIFROST.""" -from . import nexus +from . import nexus, sqw -__all__ = ['nexus'] +__all__ = ['nexus', 'sqw'] diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py new file mode 100644 index 000000000..6b8a4139c --- /dev/null +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -0,0 +1,149 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +# Writing an SQW file is fairly slow. +# So the tests in this module use module-scoped fixtures to write a single file +# that is shared between all tests. +# Function-scoped fixtures allow accessing that file for reading. + +from collections.abc import Generator +from pathlib import Path + +import numpy as np +import pytest +import sciline +import scipp as sc +import scipp.testing +import scippnexus as snx +from scippneutron.io import sqw + +from ess import bifrost +from ess.bifrost.data import ( + simulated_elastic_incoherent_with_phonon, + tof_lookup_table_simulation, +) +from ess.spectroscopy.types import ( + EnergyBins, + Filename, + NeXusDetectorName, + OutFilename, + PreopenNeXusFile, + SampleRun, + SQWBinSizes, + TimeOfFlightLookupTable, +) + +N_DETECTORS = 3 +N_ANGLES = 180 + +BIN_SIZES = {'Qx': 6, 'Qy': 7, 'Qz': 8, 'energy_transfer': 9} +ENERGY_BIN_SIZE = 13 + +# Q projections +U = sc.vector([1, 0, 0], unit="1/angstrom") +V = sc.vector([0, 1, 0], unit="1/angstrom") +W = sc.vector([0, 0, 1], unit="1/angstrom") + + +@pytest.fixture(scope='module') +def detector_names() -> list[NeXusDetectorName]: + with snx.File(simulated_elastic_incoherent_with_phonon()) as f: + detector_names = list(f['entry/instrument'][snx.NXdetector]) + return detector_names[:N_DETECTORS] + + +@pytest.fixture(scope='module') +def sample() -> sqw.SqwIXSample: + return sqw.SqwIXSample( + name="Vibranium", + lattice_spacing=sc.vector([2.86, 2.86, 2.86], unit="angstrom"), + lattice_angle=sc.vector([90.0, 90.0, 90.0], unit="deg"), + ) + + +@pytest.fixture(scope='module') +def common_workflow( + detector_names: list[NeXusDetectorName], sample: sqw.SqwIXSample +) -> sciline.Pipeline: + wf = bifrost.BifrostSimulationWorkflow(detector_names) + + wf[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() + wf[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation()) + wf[PreopenNeXusFile] = PreopenNeXusFile(True) + wf[sqw.SqwIXSample] = sample + wf[EnergyBins] = ENERGY_BIN_SIZE + wf[SQWBinSizes] = BIN_SIZES + + return wf + + +@pytest.fixture(scope='module') +def write_file( + common_workflow: sciline.Pipeline, tmp_path_factory: pytest.TempPathFactory +) -> Path: + path = tmp_path_factory.mktemp("bifrost-sqw").joinpath("bifrost-simulated.sqw") + workflow = common_workflow.copy() + workflow[OutFilename] = path + workflow.bind_and_call(bifrost.io.sqw.save_sqw) + return path + + +@pytest.fixture +def output_file(write_file: Path) -> Generator[sqw.Sqw, None, None]: + with sqw.Sqw.open(write_file) as file: + yield file + + +def test_save_sqw_writes_instrument_metadata(output_file: sqw.Sqw) -> None: + instruments = output_file.read_data_block("experiment_info", "instruments") + + assert len(instruments) == N_ANGLES + # All instruments are the same: + for instrument in instruments[1:]: + sc.testing.assert_identical(instrument, instruments[0]) + + instrument = instruments[0] + assert instrument.name == "BIFROST" + sc.testing.assert_identical(instrument.source.frequency, sc.scalar(14.0, unit="Hz")) + + +def test_save_sqw_writes_sample_metadata( + output_file: sqw.Sqw, sample: sqw.SqwIXSample +) -> None: + samples = output_file.read_data_block("experiment_info", "samples") + + assert len(samples) == N_ANGLES + # All samples are the same: + for s in samples: + sc.testing.assert_identical(s, sample) + + +def test_save_sqw_writes_experiment_metadata(output_file: sqw.Sqw) -> None: + experiments = output_file.read_data_block("experiment_info", "expdata") + + assert len(experiments) == N_ANGLES + # N unique run ids + assert len({experiment.run_id for experiment in experiments}) == N_ANGLES + for experiment in experiments: + assert experiment.emode == sqw.EnergyMode.indirect + assert experiment.u == U + assert experiment.v == V + + +def test_save_sqw_writes_dnd_metadata( + output_file: sqw.Sqw, sample: sqw.SqwIXSample +) -> None: + metadata = output_file.read_data_block("data", "metadata") + + np.testing.assert_array_equal( + metadata.axes.n_bins_all_dims.values, list(BIN_SIZES.values()) + ) + + sc.testing.assert_identical(metadata.proj.u, U) + sc.testing.assert_identical(metadata.proj.v, V) + sc.testing.assert_identical(metadata.proj.w, W) + assert metadata.proj.type == "aaa" + assert not metadata.proj.non_orthogonal + + sc.testing.assert_identical(metadata.proj.lattice_spacing, sample.lattice_spacing) + sc.testing.assert_identical(metadata.proj.lattice_angle, sample.lattice_angle) From 9b191dc6fbdf7b9c5481952861c7b4407b33f84e Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 27 Oct 2025 13:16:23 +0100 Subject: [PATCH 254/330] Directly access vec fields --- .../essspectroscopy/src/ess/bifrost/io/sqw.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 7cba51c18..89ff1c365 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -193,12 +193,26 @@ def _with_inelastic_coords(observations: sc.DataArray) -> sc.DataArray: dtype='float32', copy=False ), **{ - f'Q{dim}': sc.dot(axis / sc.norm(axis), q).to(dtype='float32') + f'Q{dim}': _project_onto(q, axis).to(dtype='float32') for dim, axis in zip('xyz', (_AXIS_U, _AXIS_V, _AXIS_W), strict=True) }, ) +def _project_onto(vec: sc.Variable, axis: sc.Variable) -> sc.Variable: + axis = axis / sc.norm(axis) + # Optimization to avoid huge dot-products: + match list(axis.values): + case [1, 0, 0]: + return vec.fields.x + case [0, 1, 0]: + return vec.fields.y + case [0, 0, 1]: + return vec.fields.z + case _: + return sc.dot(axis, vec) + + def _bin_image( observations: sc.DataArray, bin_sizes: SQWBinSizes ) -> tuple[sc.DataArray, sc.Variable, sc.DataArray]: From a00086a52efd7e58b5865d077e93504151255b6c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 6 Nov 2025 09:45:55 +0100 Subject: [PATCH 255/330] Fix broken rebase --- .../essspectroscopy/src/ess/bifrost/io/sqw.py | 17 ++++++++++++----- .../src/ess/spectroscopy/indirect/conversion.py | 2 +- .../src/ess/spectroscopy/types.py | 11 ++++++----- .../tests/bifrost/workflow_test.py | 4 +--- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 89ff1c365..1d79a905b 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -9,11 +9,14 @@ import numpy.typing as npt import scipp as sc from scippneutron.io import sqw -from scippneutron.metadata import ESS_SOURCE, Beamline, Measurement +from scippneutron.metadata import ESS_SOURCE from ess.spectroscopy.types import ( + Beamline, EnergyBins, + GravityVector, IncidentEnergyDetector, + Measurement, OutFilename, PulsePeriod, SampleRun, @@ -33,9 +36,10 @@ def save_sqw( *, bin_sizes: SQWBinSizes, energy_bins: EnergyBins, # TODO distinct from above! - beamline: Beamline, - measurement: Measurement, + beamline: Beamline[SampleRun], + measurement: Measurement[SampleRun], pulse_period: PulsePeriod, + gravity: GravityVector, sample: sqw.SqwIXSample, ) -> None: """Save events recorded at BIFROST to an SQW file. @@ -53,7 +57,7 @@ def save_sqw( observations = _histogram_detector_setting_ei(flat_events, energy_bins=energy_bins) del flat_events # 'move' flat_events into _histogram_detector_setting_ei final_energy = observations.coords['final_energy'] - observations = _with_inelastic_coords(observations) + observations = _with_inelastic_coords(observations, gravity) energy_transfer = observations.coords['energy_transfer'].rename_dims( incident_energy='energy_transfer' ) @@ -163,7 +167,9 @@ def _histogram_detector_setting_ei( return hist -def _with_inelastic_coords(observations: sc.DataArray) -> sc.DataArray: +def _with_inelastic_coords( + observations: sc.DataArray, gravity: GravityVector +) -> sc.DataArray: """Compute and assign Qx, Qy, Qz, and energy_transfer. This also drops all coordinates that are no longer needed. @@ -178,6 +184,7 @@ def _with_inelastic_coords(observations: sc.DataArray) -> sc.DataArray: 'lab_momentum_transfer': lab_momentum_transfer_from_incident_energy, 'sample_table_momentum_transfer': rotate_to_sample_table_momentum_transfer, 'energy_transfer': energy_transfer, + 'gravity': lambda: gravity, } aux = observations.transform_coords( ['sample_table_momentum_transfer', 'energy_transfer'], diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 15db875e7..4b01291f4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -230,7 +230,7 @@ def add_inelastic_coordinates( def add_incident_energy( - data: DetectorTofData[RunType], graph: InelasticCoordTransformGraph + data: TofDetector[RunType], graph: InelasticCoordTransformGraph ) -> IncidentEnergyDetector[RunType]: transformed = data.transform_coords( [ diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 77cdbe298..0fa1bd6ce 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -13,12 +13,12 @@ # NeXus types -EmptyDetector = reduce_t.EmptyDetector -RawDetector = reduce_t.RawDetector +Beamline = reduce_t.Beamline DetectorPositionOffset = reduce_t.DetectorPositionOffset -GravityVector = reduce_t.GravityVector +EmptyDetector = reduce_t.EmptyDetector Filename = reduce_t.Filename -RawMonitor = reduce_t.RawMonitor +GravityVector = reduce_t.GravityVector +Measurement = reduce_t.Measurement NeXusClass = reduce_t.NeXusClass NeXusComponentLocationSpec = reduce_t.NeXusComponentLocationSpec NeXusComponent = reduce_t.NeXusComponent @@ -29,7 +29,8 @@ NeXusTransformation = reduce_t.NeXusTransformation Position = reduce_t.Position PreopenNeXusFile = reduce_t.PreopenNeXusFile - +RawDetector = reduce_t.RawDetector +RawMonitor = reduce_t.RawMonitor SampleRun = reduce_t.SampleRun VanadiumRun = reduce_t.VanadiumRun diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 09450b864..a76b76eae 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -79,9 +79,7 @@ def test_simulation_workflow_can_compute_energy_data( expected_coords = {'a3', 'a4', 'detector_number'} assert expected_coords.issubset(energy_data.coords) expected_event_coords = { - 'incident_wavelength', 'energy_transfer', - 'lab_momentum_transfer', 'sample_table_momentum_transfer', } assert expected_event_coords.issubset(energy_data.bins.coords) @@ -90,7 +88,6 @@ def test_simulation_workflow_can_compute_energy_data( energy_data.coords['a3'].to(unit='rad') energy_data.coords['a4'].to(unit='rad') energy_data.bins.coords['energy_transfer'].to(unit='meV') - energy_data.bins.coords['lab_momentum_transfer'].to(unit='1/Ã…') energy_data.bins.coords['sample_table_momentum_transfer'].to(unit='1/Ã…') @@ -104,6 +101,7 @@ def test_simulation_workflow_can_compute_wavelength_monitor( assert monitor.bins is None +# TODO update reference data once we settled and which coords get computed def test_simulation_workflow_produces_the_same_data_as_before( workflow: sciline.Pipeline, ) -> None: From 0441d0bd7ceb207b0528fd9a705c56e536616350 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 6 Nov 2025 14:12:45 +0100 Subject: [PATCH 256/330] Expand tests --- .../tests/bifrost/io/sqw_test.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index 6b8a4139c..76df9d8a7 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -44,6 +44,8 @@ V = sc.vector([0, 1, 0], unit="1/angstrom") W = sc.vector([0, 0, 1], unit="1/angstrom") +N_PIXELS_PER_DETECTOR = 300 # Fixed, not a parameter! + @pytest.fixture(scope='module') def detector_names() -> list[NeXusDetectorName]: @@ -147,3 +149,21 @@ def test_save_sqw_writes_dnd_metadata( sc.testing.assert_identical(metadata.proj.lattice_spacing, sample.lattice_spacing) sc.testing.assert_identical(metadata.proj.lattice_angle, sample.lattice_angle) + + +def test_save_sqw_writes_dnd_data(output_file: sqw.Sqw) -> None: + dnd = output_file.read_data_block("data", "nd_data") + values, errors, counts = dnd + # Fortran order + assert values.shape == tuple(BIN_SIZES.values())[::-1] + assert errors.shape == tuple(BIN_SIZES.values())[::-1] + assert counts.shape == tuple(BIN_SIZES.values())[::-1] + + +def test_save_sqw_writes_pixel_data(output_file: sqw.Sqw) -> None: + pix = output_file.read_data_block("pix", "data_wrap") + assert pix.shape == ( + N_DETECTORS * N_PIXELS_PER_DETECTOR * N_ANGLES * ENERGY_BIN_SIZE, + 9, + ) + # TODO many more checks From 0681f183abcb778840450d8828f21b870984ff6f Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 21 Nov 2025 11:22:50 +0100 Subject: [PATCH 257/330] More SQW pixel tests --- .../tests/bifrost/io/sqw_test.py | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index 76df9d8a7..7db44e243 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -6,10 +6,12 @@ # that is shared between all tests. # Function-scoped fixtures allow accessing that file for reading. +import itertools from collections.abc import Generator from pathlib import Path import numpy as np +import numpy.typing as npt import pytest import sciline import scipp as sc @@ -161,9 +163,62 @@ def test_save_sqw_writes_dnd_data(output_file: sqw.Sqw) -> None: def test_save_sqw_writes_pixel_data(output_file: sqw.Sqw) -> None: + metadata = output_file.read_data_block("data", "metadata") + dnd = output_file.read_data_block("data", "nd_data") pix = output_file.read_data_block("pix", "data_wrap") + assert pix.shape == ( N_DETECTORS * N_PIXELS_PER_DETECTOR * N_ANGLES * ENERGY_BIN_SIZE, 9, ) - # TODO many more checks + + n_pix = dnd[2].astype(int) + check_pixels_in_bin_ranges(pix, metadata, n_pix) + check_pixel_indices_in_ranges(pix) + + +def check_pixels_in_bin_ranges( + pix: npt.NDArray[np.float32], metadata: sqw.SqwDndMetadata, n_pix: npt.NDArray[int] +) -> None: + """Check that all pixels are within the bin edges defined in the dnd metadata.""" + img_range = metadata.axes.img_range + n_bins = metadata.axes.n_bins_all_dims.values + u_edges = [ + sc.linspace(f'u{i}', img_range[i][0], img_range[i][1], n_bins[i] + 1) + for i in range(len(n_bins)) + ] + + bin_offsets = np.r_[0, np.cumsum(n_pix.flat)] + for bin_index, (l, k, j, i) in enumerate( # noqa: E741 + itertools.product(*(range(nb) for nb in n_bins[::-1])) + ): + pix_slice = slice(bin_offsets[bin_index], bin_offsets[bin_index + 1]) + if pix_slice.stop <= pix_slice.start: + continue # empty bin => no pixels to check + for col, index in enumerate((i, j, k, l)): + p = pix[pix_slice, col] + p_min = p.min() # actual range + p_max = p.max() + e_min = u_edges[col][index].value # expected range + e_max = u_edges[col][index + 1].value + assert p_min >= e_min - 1e-6 # small offset to account for f32 rounding + assert p_max < e_max + 1e6 + + +def check_pixel_indices_in_ranges(pix: npt.NDArray[np.float32]) -> None: + """Check that all indices in the pixel data are in the correct ranges.""" + + irun = pix[:, 4] + idet = pix[:, 5] + ien = pix[:, 6] + + # 1-based indices! + assert irun.min() == 1 + assert irun.max() == N_ANGLES + assert ien.min() == 1 + assert ien.max() == ENERGY_BIN_SIZE + + # We cannot check the values of idet directly because they are a non-contiguous + # subset of all detector numbers. So just check that we have the correct number of + # distinct detectors: + assert np.unique(idet).size == N_DETECTORS * N_PIXELS_PER_DETECTOR From bd8a6b4858c4dd93c99d2468e108d3c888e206fa Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 21 Nov 2025 11:23:22 +0100 Subject: [PATCH 258/330] Remote SQW dev notebooks --- .../bifrost-sqw-small-table.ipynb | 691 ------------------ packages/essspectroscopy/bifrost-sqw.ipynb | 621 ---------------- 2 files changed, 1312 deletions(-) delete mode 100644 packages/essspectroscopy/bifrost-sqw-small-table.ipynb delete mode 100644 packages/essspectroscopy/bifrost-sqw.ipynb diff --git a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb b/packages/essspectroscopy/bifrost-sqw-small-table.ipynb deleted file mode 100644 index 56d06db33..000000000 --- a/packages/essspectroscopy/bifrost-sqw-small-table.ipynb +++ /dev/null @@ -1,691 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0", - "metadata": {}, - "source": [ - "# Writing SQW for BIFROST" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": {}, - "outputs": [], - "source": [ - "import scipp as sc\n", - "import sciline\n", - "from scippneutron.io import sqw\n", - "from pathlib import Path\n", - "import scippnexus as snx\n", - "import numpy as np\n", - "import scipp.constants\n", - "import dataclasses\n", - "import plopp as pp\n", - "\n", - "from ess import bifrost\n", - "from ess.bifrost.data import (\n", - " simulated_elastic_incoherent_with_phonon,\n", - " tof_lookup_table_simulation\n", - ")\n", - "from ess.spectroscopy.types import *" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib widget" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO\n", - "# try only one det and pretend that all dets have the same Ef and energy transfer range -> pass 1D array to sqw\n", - "# (use det 0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "n_det = 1\n", - "n_angle = 5\n", - "\n", - "bin_sizes = {'u1': 6, 'u2': 7, 'u3': 8, 'u4': 9}\n", - "energy_bins = 13\n", - "\n", - "out_file = Path(\"bifrost-simulated.sqw\")\n", - "\n", - "# Q projections\n", - "u = sc.vector([1, 0, 0], unit=\"1/angstrom\")\n", - "v = sc.vector([0, 1, 0], unit=\"1/angstrom\")\n", - "w = sc.cross(u, v) # must be orthogonal to u and v for now" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "with snx.File(simulated_elastic_incoherent_with_phonon()) as f:\n", - " detector_names = list(f['entry/instrument'][snx.NXdetector])\n", - "detector_names = detector_names[:n_det]\n", - "\n", - "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", - "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation())\n", - "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", - "scheduler = sciline.scheduler.NaiveScheduler()\n", - "\n", - "data = workflow.compute(IncidentEnergyDetector[SampleRun], scheduler=scheduler)\n", - "\n", - "data = data['a3', :n_angle].flatten(['triplet', 'tube', 'length'], 'detector')\n", - "\n", - "# Flatten angles and define a setting index where a3 is the fastest running index.\n", - "n_a3 = data.sizes['a3']\n", - "data.coords['i_a3'] = sc.arange('a3', n_a3, unit=None)\n", - "data.coords['i_a4'] = sc.arange('a4', data.sizes['a4'], unit=None)\n", - "data = data.flatten(['a3', 'a4'], 'setting')\n", - "data.coords['setting'] = data.coords.pop('i_a3') + data.coords.pop('i_a4') * sc.index(n_a3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO pretend that that is only a single final energu\n", - "data.coords['final_energy'] = data.coords['final_energy'].mean()\n", - "data.coords['final_wavevector'] = data.coords['final_wavevector'].mean()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [ - "index_binned = data.hist(incident_energy=energy_bins)\n", - "# index_binned = data.hist(incident_energy=sc.linspace('incident_energy', -0.05, 0.05, energy_bins + 1, unit='meV'))\n", - "index_binned.coords['incident_energy'] = sc.midpoints(index_binned.coords['incident_energy'])\n", - "index_binned.coords['ien'] = sc.arange('incident_energy', energy_bins, unit=None, dtype='float32')\n", - "index_binned" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9", - "metadata": {}, - "outputs": [], - "source": [ - "a3 = index_binned.coords['a3']\n", - "# idet = hist.coords['detector_number']\n", - "ei = index_binned.coords['incident_energy']\n", - "ef = index_binned.coords['final_energy']\n", - "kf = index_binned.coords['final_wavevector']\n", - "\n", - "# TODO should get this from the data\n", - "bi = sc.vector([0, 0, 1])\n", - "Ra3 = sc.spatial.rotations_from_rotvecs(-a3 * sc.vector([0, 1, 0]))\n", - "\n", - "ki = 2 * np.pi / sc.constants.h * sc.sqrt(2 * sc.constants.m_n * ei) * bi\n", - "Q = Ra3 * (ki.to(unit=kf.unit) - kf)\n", - "\n", - "delta_e = ei - ef" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10", - "metadata": {}, - "outputs": [], - "source": [ - "Q" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "11", - "metadata": {}, - "outputs": [], - "source": [ - "delta_e" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12", - "metadata": {}, - "outputs": [], - "source": [ - "observations = index_binned.copy()\n", - "observations.coords['Qx'] = sc.dot(u / sc.norm(u), Q)\n", - "observations.coords['Qy'] = sc.dot(v / sc.norm(v), Q)\n", - "observations.coords['Qz'] = sc.dot(w / sc.norm(w), Q)\n", - "observations.coords['energy_transfer'] = delta_e\n", - "\n", - "# Remove large coords that we no longer need.\n", - "# This should happen earlier!\n", - "observations = observations.drop_coords(['final_wavevector', 'incident_energy', 'secondary_flight_time'])\n", - "\n", - "observations = observations.flatten(to='pix')\n", - "\n", - "observations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "13", - "metadata": {}, - "outputs": [], - "source": [ - "u_binned = observations.bin(\n", - " {'energy_transfer': bin_sizes['u4'], 'Qz': bin_sizes[\"u3\"], 'Qy': bin_sizes['u2'], 'Qx': bin_sizes['u1']})\n", - "u_binned" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "14", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO check order\n", - "dnd = u_binned.data.rename_dims(energy_transfer='u4', Qz='u3', Qy='u2', Qx='u1')\n", - "dnd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "15", - "metadata": {}, - "outputs": [], - "source": [ - "def coord_range(da: sc.DataArray, coord: str) -> sc.Variable:\n", - " assert sc.islinspace(da.coords[coord])\n", - " c= da.coords[coord]\n", - " lo = c[0].value\n", - " hi = c[-1].value\n", - " return sc.array(dims=[coord], values=[lo, hi],\n", - " unit=da.coords[coord].unit)\n", - "\n", - "\n", - "img_range = [\n", - " coord_range(u_binned, name)\n", - " for name in [\"Qx\", \"Qy\", \"Qz\", \"energy_transfer\"]\n", - "]\n", - "\n", - "n_bins_all_dims = sc.array(dims=[\"axis\"], values=[\n", - " u_binned.sizes['Qx'], u_binned.sizes['Qy'], u_binned.sizes['Qz'], u_binned.sizes['energy_transfer'],\n", - "], unit=None)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "16", - "metadata": {}, - "outputs": [], - "source": [ - "# now in the correct order (?)\n", - "in_pixel_order = u_binned.bins.concat().value\n", - "in_pixel_order" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "17", - "metadata": {}, - "outputs": [], - "source": [ - "# check that Q computation makes sense\n", - "# needs input like index_binned but binned, not histogrammed\n", - "\n", - "# for i, pix in enumerate(da[:1000]):\n", - "# e_q = pix.bins.coords['sample_table_momentum_transfer'].copy().bins.concat().value\n", - "# out = []\n", - "# for dim in 'xyz':\n", - "# q = getattr(e_q.fields, dim)\n", - "# lo = q.min().value\n", - "# hi = q.max().value\n", - "# n = len(q)\n", - "# Q = pix.coords[f'Q{dim}'].value\n", - "# if n > 0:\n", - "# out.append(f' {dim}: {Q: .4f} | [{lo: .4f}, {hi: .4f}]')\n", - "# if out:\n", - "# print(i)\n", - "# print('\\n'.join(out))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "18", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO convert to float32 much earlier\n", - "pix = sc.DataArray(\n", - " in_pixel_order.data,\n", - " coords={\n", - " 'u1': in_pixel_order.coords['Qx'].to(unit='1/Ã…', dtype='float32', copy=False),\n", - " 'u2': in_pixel_order.coords['Qy'].to(unit='1/Ã…', dtype='float32', copy=False),\n", - " 'u3': in_pixel_order.coords['Qz'].to(unit='1/Ã…', dtype='float32', copy=False),\n", - " 'u4': in_pixel_order.coords['energy_transfer'].to(unit='meV', dtype='float32', copy=False),\n", - " 'idet': in_pixel_order.coords['detector_number'].to(dtype='float32', copy=False),\n", - " 'irun': in_pixel_order.coords['setting'].to(dtype='float32', copy=False),\n", - " 'ien': in_pixel_order.coords['ien'].to(dtype='float32', copy=False),\n", - " }\n", - ")\n", - "# Convert to 1-based indexing:\n", - "for key in ('idet', 'irun', 'ien'):\n", - " pix.coords[key] += sc.scalar(1.0, dtype='float32', unit=None)\n", - "pix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "19", - "metadata": {}, - "outputs": [], - "source": [ - "sample = sqw.SqwIXSample(\n", - " name=\"Vibranium\",\n", - " lattice_spacing=sc.vector([2.86, 2.86, 2.86], unit=\"angstrom\"),\n", - " lattice_angle=sc.vector([90.0, 90.0, 90.0], unit=\"deg\"),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "20", - "metadata": {}, - "outputs": [], - "source": [ - "dnd_metadata = sqw.SqwDndMetadata(\n", - " axes=sqw.SqwLineAxes(\n", - " title=\"My Axes\",\n", - " label=[\"u1\", \"u2\", \"u3\", \"u4\"],\n", - " img_scales=[\n", - " sc.scalar(1.0, unit=\"1/angstrom\"),\n", - " sc.scalar(1.0, unit=\"1/angstrom\"),\n", - " sc.scalar(1.0, unit=\"1/angstrom\"),\n", - " sc.scalar(1.0, unit=\"meV\"),\n", - " ],\n", - " img_range=img_range, # or is this the range of dnd? (here we use pix)\n", - " n_bins_all_dims=n_bins_all_dims,\n", - " single_bin_defines_iax=sc.array(dims=[\"axis\"], values=[True] * 4),\n", - " dax=sc.arange(\"axis\", 4, unit=None),\n", - " offset=[\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"meV\"),\n", - " ],\n", - " changes_aspect_ratio=True,\n", - " ),\n", - " proj=sqw.SqwLineProj(\n", - " title=\"My Projection\",\n", - " lattice_spacing=sample.lattice_spacing,\n", - " lattice_angle=sample.lattice_angle,\n", - " offset=[\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"meV\"),\n", - " ],\n", - " label=[\"u1\", \"u2\", \"u3\", \"u4\"],\n", - " u=u,\n", - " v=v,\n", - " w=None,\n", - " non_orthogonal=False,\n", - " type=\"aaa\",\n", - " ),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21", - "metadata": {}, - "outputs": [], - "source": [ - "instrument = sqw.SqwIXNullInstrument(\n", - " name=\"BIFROST\",\n", - " source=sqw.SqwIXSource(\n", - " name=\"ESS\",\n", - " target_name=\"Tungsten wheel\",\n", - " frequency=sc.scalar(14, unit=\"Hz\"),\n", - " ),\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "22", - "metadata": {}, - "source": [ - "
\n", - " Outstanding work: Figure out how to write `en`.\n", - " We write it as a 2d array here. But horace loads it as a '1d' array (n_energy_transfer*n_detector, 1).\n", - " How do we need to write it?\n", - "\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO\n", - "# en = delta_e.rename_dims(incident_energy='energy_transfer').transpose(['detector', 'energy_transfer'])\n", - "en = delta_e.rename_dims(incident_energy='energy_transfer')\n", - "\n", - "experiment_template = sqw.SqwIXExperiment(\n", - " run_id=0,\n", - " efix=data.coords['final_energy'],\n", - " emode=sqw.EnergyMode.indirect,\n", - " en=en,\n", - " psi=sc.scalar(0.0, unit=\"rad\"),\n", - " u=u,\n", - " v=v,\n", - " omega=sc.scalar(0.0, unit=\"rad\"),\n", - " dpsi=sc.scalar(0.0, unit=\"rad\"),\n", - " gl=sc.scalar(0.0, unit=\"rad\"),\n", - " gs=sc.scalar(0.0, unit=\"rad\"),\n", - ")\n", - "assert np.unique(index_binned.coords['a4'].values).size == 1\n", - "experiments = [\n", - " dataclasses.replace(experiment_template, run_id=i, psi=a3)\n", - " for i, a3 in enumerate(index_binned.coords['a3'], 1)\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "24", - "metadata": {}, - "outputs": [], - "source": [ - "pix_buffer = np.c_[\n", - " *(pix.coords[name].values for name in ('u1', 'u2', 'u3', 'u4', 'irun', 'idet', 'ien')),\n", - " pix.values,\n", - " sc.stddevs(pix).values\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "25", - "metadata": {}, - "outputs": [], - "source": [ - "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon (index method\").add_default_instrument(instrument)\n", - "builder = builder.add_default_sample(sample)\n", - "# Note the transpose!\n", - "dndt = dnd.transpose(['u1', 'u2','u3','u4'])\n", - "builder = builder.add_dnd_data(dnd_metadata, data=dndt.bins.sum() , counts=dndt.bins.size())\n", - "builder = builder.add_pixel_data(pix_buffer, experiments=experiments)\n", - "builder.create()" - ] - }, - { - "cell_type": "markdown", - "id": "26", - "metadata": {}, - "source": [ - "## Test load" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "27", - "metadata": {}, - "outputs": [], - "source": [ - "with sqw.Sqw.open(out_file) as f:\n", - " m = f.read_data_block(\"data\", \"metadata\")\n", - " d = f.read_data_block(\"data\", \"nd_data\")\n", - " e = f.read_data_block(\"experiment_info\", 'expdata')\n", - " l_pix = f.read_data_block(\"pix\", \"data_wrap\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28", - "metadata": {}, - "outputs": [], - "source": [ - "d[0].shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "29", - "metadata": {}, - "outputs": [], - "source": [ - "pix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "30", - "metadata": {}, - "outputs": [], - "source": [ - "pix.coords['u4'].min()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "31", - "metadata": {}, - "outputs": [], - "source": [ - "h = u_binned.sum('Qy').sum('energy_transfer')\n", - "# h /= u_binned.coords['Qy'][1]-u_binned.coords['Qy'][0]\n", - "h /= u_binned.coords['energy_transfer'][1]-u_binned.coords['energy_transfer'][0]\n", - "h /= sc.values(h.sum())\n", - "h.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "32", - "metadata": {}, - "outputs": [], - "source": [ - "pp.slicer(u_binned.bins.mean(), keep=['Qx', 'Qz'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "33", - "metadata": {}, - "outputs": [], - "source": [ - "h = u_binned.nanmean('Qy').nanmean('energy_transfer')\n", - "# h /= u_binned.coords['Qy'][1]-u_binned.coords['Qy'][0]\n", - "# h /= u_binned.coords['energy_transfer'][1]-u_binned.coords['energy_transfer'][0]\n", - "# h /= sc.values(h.sum())\n", - "h.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "34", - "metadata": {}, - "outputs": [], - "source": [ - "h = u_binned.nanmean('Qy').nanmean('Qx')\n", - "# h /= u_binned.coords['Qy'][1]-u_binned.coords['Qy'][0]\n", - "# h /= u_binned.coords['energy_transfer'][1]-u_binned.coords['energy_transfer'][0]\n", - "# h /= sc.values(h.sum())\n", - "h.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "35", - "metadata": {}, - "outputs": [], - "source": [ - "h.values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "36", - "metadata": {}, - "outputs": [], - "source": [ - "s = \"\"\" 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0\n", - " 0 1.2943 3.1028 3.5018 3.2000 0 0 0\n", - " 0 0 0.0523 0.0433 0.0288 0 0 0\n", - " 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0.0015 0.0054 0.0024 0\n", - " 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0\"\"\"\n", - "\n", - "a = h.values\n", - "e = np.array([float(x.strip()) for x in s.split(\" \") if x]).reshape((-1, 8))\n", - "\n", - "np.isnan(a) | (np.isclose(a, e))\n", - "\n", - "(a - e) / e" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "37", - "metadata": {}, - "outputs": [], - "source": [ - "u_binned['energy_transfer', sc.scalar(0.0, unit='meV'):sc.scalar(0.01, unit='meV')].sum('Qy').sum('energy_transfer').plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38", - "metadata": {}, - "outputs": [], - "source": [ - "u_binned['Qy', 0]['energy_transfer', 0].bins.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "39", - "metadata": {}, - "outputs": [], - "source": [ - "print(dnd['u2', 0]['u4', 0].bins.sum().values.T)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "40", - "metadata": {}, - "outputs": [], - "source": [ - "k = u_binned.mean('Qy')\n", - "# print(k.data.values[0])\n", - "# print(k.data.values[1])\n", - "k" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "41", - "metadata": {}, - "outputs": [], - "source": [ - "k['energy_transfer', 1].values" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/packages/essspectroscopy/bifrost-sqw.ipynb b/packages/essspectroscopy/bifrost-sqw.ipynb deleted file mode 100644 index 10a08eb02..000000000 --- a/packages/essspectroscopy/bifrost-sqw.ipynb +++ /dev/null @@ -1,621 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0", - "metadata": {}, - "source": [ - "# Writing SQW for BIFROST" - ] - }, - { - "cell_type": "markdown", - "id": "1", - "metadata": {}, - "source": [ - "**Idea for determining position in pixel block:**\n", - "\n", - "- Compute an upper bound size for each (Q,E,irun,idet,ien) bin.\n", - "- For each event, compute an index based on that upper bound.\n", - "- `group` or `groupby` in that index. This only retains indices where we have data and orders the data by the index. If the index is computed right, that is the order in a pixel block.\n", - "- `sum` the bins.\n", - "- Write the result into the pixel block.\n", - "\n", - "The extra index event coord should not be too large, we should be able to fit that into memory.\n", - "\n", - "If we can make `groupby` lazy in its groups, we can stream the data to file.\n", - "\n", - "Or we process the events in arbitrary chunks.\n", - "For each chunk, compute the index, group, sum.\n", - "Write to file by: if index out of bounds, grow file and fill with 0s. Then add the new value onto the existing one. That way, we accumulate events directly in the file.\n", - "Might be quite slow because of somewhat random access to file and many read+writes and because it needs tight loop (-> not Python?)\n", - "**Maybe not** this would require knowing all index values that can contribute up front top do the grouping." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "import scipp as sc\n", - "import sciline\n", - "from scippneutron.io import sqw\n", - "from pathlib import Path\n", - "import scippnexus as snx\n", - "import numpy as np\n", - "import dataclasses\n", - "\n", - "from ess import bifrost\n", - "from ess.bifrost.data import (\n", - " simulated_elastic_incoherent_with_phonon,\n", - " tof_lookup_table_simulation\n", - ")\n", - "from ess.spectroscopy.types import *" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "n_det = 3\n", - "n_angle = 5\n", - "\n", - "bin_sizes = {'u1': 6, 'u2': 7, 'u3': 8, 'u4': 9}\n", - "\n", - "out_file = Path(\"bifrost-simulated.sqw\")\n", - "\n", - "# Q projections\n", - "u = sc.vector([1, 0, 0], unit=\"1/angstrom\")\n", - "v = sc.vector([0, 1, 0], unit=\"1/angstrom\")\n", - "w = sc.cross(u, v) # must be orthogonal to u and v for now" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "with snx.File(simulated_elastic_incoherent_with_phonon()) as f:\n", - " detector_names = list(f['entry/instrument'][snx.NXdetector])\n", - "detector_names = detector_names[:n_det]\n", - "\n", - "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", - "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation())\n", - "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", - "scheduler = sciline.scheduler.NaiveScheduler()\n", - "\n", - "data = workflow.compute(EnergyData[SampleRun], scheduler=scheduler)\n", - "\n", - "data = data['a3', :n_angle].flatten(['triplet', 'tube', 'length'], 'detector')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "settings = sc.DataArray(\n", - " sc.arange('s', data.sizes['a3'] * data.sizes['a4'], unit=None).fold('s', sizes={'a3': data.sizes['a3'],\n", - " 'a4': data.sizes['a4']}),\n", - " coords={\n", - " 'a3': data.coords['a3'],\n", - " 'a4': data.coords['a4'],\n", - " }\n", - ").flatten(to='setting')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "def project_onto(direction, vec):\n", - " return sc.dot(direction / sc.norm(direction), vec)\n", - "\n", - "\n", - "aux = (data\n", - " .flatten(['a3', 'a4'], 'setting')\n", - " # Split into two calls because of https://github.com/scipp/scipp/issues/3766\n", - " .transform_coords(\n", - " u1=lambda sample_table_momentum_transfer: project_onto(u, sample_table_momentum_transfer),\n", - " u2=lambda sample_table_momentum_transfer: project_onto(v, sample_table_momentum_transfer),\n", - " u3=lambda sample_table_momentum_transfer: project_onto(w, sample_table_momentum_transfer),\n", - " keep_inputs=False,\n", - ").transform_coords(u4=\"energy_transfer\", keep_inputs=False)\n", - " .bins.drop_coords(['incident_energy', 'incident_wavelength', 'lab_momentum_transfer'])\n", - " .drop_coords(['a3', 'a4', 'secondary_flight_time'])\n", - " )\n", - "binned = (aux\n", - " .bins.assign_coords({\n", - " 'setting': sc.bins_like(aux, settings.data),\n", - " 'detector_number': sc.bins_like(aux, aux.coords.pop('detector_number')),\n", - "})\n", - " .bins.concat()\n", - " .bin(bin_sizes)\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [ - "def coord_range(da: sc.DataArray, coord: str) -> sc.Variable:\n", - " assert sc.islinspace(da.coords[coord])\n", - " return sc.array(dims=[coord], values=[da.coords[coord][0].value, da.coords[coord][-1].value],\n", - " unit=da.coords[coord].unit)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [ - "sample = sqw.SqwIXSample(\n", - " name=\"Vibranium\",\n", - " lattice_spacing=sc.vector([2.86, 2.86, 2.86], unit=\"angstrom\"),\n", - " lattice_angle=sc.vector([90.0, 90.0, 90.0], unit=\"deg\"),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9", - "metadata": {}, - "outputs": [], - "source": [ - "dnd_metadata = sqw.SqwDndMetadata(\n", - " axes=sqw.SqwLineAxes(\n", - " title=\"My Axes\",\n", - " label=[\"u1\", \"u2\", \"u3\", \"u4\"],\n", - " img_scales=[\n", - " sc.scalar(1.0, unit=\"1/angstrom\"),\n", - " sc.scalar(1.0, unit=\"1/angstrom\"),\n", - " sc.scalar(1.0, unit=\"1/angstrom\"),\n", - " sc.scalar(1.0, unit=\"meV\"),\n", - " ],\n", - " img_range=[\n", - " coord_range(binned, name)\n", - " for name in [\"u1\", \"u2\", \"u3\", \"u4\"]\n", - " ],\n", - " n_bins_all_dims=sc.array(dims=[\"axis\"], values=[binned.sizes[f'u{i}'] for i in range(1, 5)], unit=None),\n", - " single_bin_defines_iax=sc.array(dims=[\"axis\"], values=[True] * 4),\n", - " dax=sc.arange(\"axis\", 4, unit=None),\n", - " offset=[\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"meV\"),\n", - " ],\n", - " changes_aspect_ratio=True,\n", - " ),\n", - " proj=sqw.SqwLineProj(\n", - " title=\"My Projection\",\n", - " lattice_spacing=sample.lattice_spacing,\n", - " lattice_angle=sample.lattice_angle,\n", - " offset=[\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"1/angstrom\"),\n", - " sc.scalar(0.0, unit=\"meV\"),\n", - " ],\n", - " label=[\"u1\", \"u2\", \"u3\", \"u4\"],\n", - " u=u,\n", - " v=v,\n", - " w=None,\n", - " non_orthogonal=False,\n", - " type=\"aaa\",\n", - " ),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10", - "metadata": {}, - "outputs": [], - "source": [ - "dnd_metadata.axes.img_range" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "11", - "metadata": {}, - "outputs": [], - "source": [ - "instrument = sqw.SqwIXNullInstrument(\n", - " name=\"BIFROST\",\n", - " source=sqw.SqwIXSource(\n", - " name=\"ESS\",\n", - " target_name=\"Tungsten wheel\",\n", - " frequency=sc.scalar(14, unit=\"Hz\"),\n", - " ),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12", - "metadata": {}, - "outputs": [], - "source": [ - "en = binned.coords['u4'].broadcast(sizes={'detector': data.sizes['detector'], 'u4': len(binned.coords['u4'])}).rename(\n", - " u4='energy_transfer')\n", - "experiment_template = sqw.SqwIXExperiment(\n", - " run_id=0,\n", - " efix=data.coords['final_energy'],\n", - " emode=sqw.EnergyMode.indirect,\n", - " en=en,\n", - " psi=sc.scalar(0.0, unit=\"rad\"),\n", - " u=u,\n", - " v=v,\n", - " omega=sc.scalar(0.0, unit=\"rad\"),\n", - " dpsi=sc.scalar(0.0, unit=\"rad\"),\n", - " gl=sc.scalar(0.0, unit=\"rad\"),\n", - " gs=sc.scalar(0.0, unit=\"rad\"),\n", - ")\n", - "assert np.unique(data.coords['a4'].values).size == 1\n", - "experiments = [\n", - " dataclasses.replace(experiment_template, run_id=i, psi=a3)\n", - " for i, a3 in enumerate(data.coords['a3'], 1)\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "13", - "metadata": {}, - "outputs": [], - "source": [ - "binned" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "14", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO add 0 observations\n", - "# we lose some bins in the above binning processes, e.g., here, idet is only a subset of all detector numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "15", - "metadata": {}, - "outputs": [], - "source": [ - "observations = binned.copy().drop_coords(['sample_position', 'source_position'])\n", - "observations = observations.bins.assign_coords(\n", - " {\n", - " 'idet': observations.bins.coords.pop('detector_number').to(dtype='float32') + sc.index(1),\n", - " 'irun': observations.bins.coords.pop('setting').to(dtype='float32') + sc.index(1),\n", - " # +1 because of 1-based indexing\n", - " }\n", - ")\n", - "observations = observations.assign_coords(\n", - " {\n", - " f'u{i}': sc.midpoints(observations.coords.pop(f'u{i}')).to(dtype='float32', copy=False)\n", - " for i in range(1, 5)\n", - " }\n", - ")\n", - "observations.coords['ien'] = sc.arange('u4', 1, 1 + observations.sizes['u4'], dtype='float32', unit=None)\n", - "observations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "16", - "metadata": {}, - "outputs": [], - "source": [ - "buffer = None\n", - "\n", - "\n", - "def get_buffer(n: int):\n", - " global buffer\n", - " if buffer is None or buffer.shape[0] < n:\n", - " buffer = np.empty((n, 9), dtype=np.float32)\n", - " return buffer\n", - " return buffer[:n]\n", - "\n", - "\n", - "buffers = []\n", - "# transpose to match fortran layout. But horace plots look the same, does this actually matter?\n", - "flat = observations.transpose(['u4', 'u3', 'u2', 'u1']).flatten(to='u')\n", - "for obs_bin in observations.flatten(to='u'):\n", - " h = obs_bin.group('idet', 'irun').hist()\n", - " n = h.sizes['idet'] * h.sizes['irun']\n", - " h = h.flatten(to='obs')\n", - " buf = get_buffer(n)\n", - " buf[:, 0] = h.coords['u1'].values\n", - " buf[:, 1] = h.coords['u2'].values\n", - " buf[:, 2] = h.coords['u3'].values\n", - " buf[:, 3] = h.coords['u4'].values\n", - " buf[:, 4] = h.coords['irun'].values\n", - " buf[:, 5] = h.coords['idet'].values\n", - " buf[:, 6] = h.coords['ien'].values\n", - " buf[:, 7] = h.values\n", - " buf[:, 8] = sc.stddevs(h).values\n", - " buffers.append(buf.copy())\n", - "\n", - "pix_buffer = np.concat(buffers, axis=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "17", - "metadata": {}, - "outputs": [], - "source": [ - "bin_sizes = sc.array(dims=['u'], values=[buf.shape[0] for buf in buffers], unit=None)\n", - "bin_sizes = bin_sizes.fold(dim='u', sizes=observations.sizes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "18", - "metadata": {}, - "outputs": [], - "source": [ - "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon\").add_default_instrument(\n", - " instrument).add_default_sample(sample)\n", - "builder = builder.add_dnd_data(dnd_metadata, data=observations.hist().data, counts=bin_sizes)\n", - "builder = builder.add_pixel_data(pix_buffer, experiments=experiments)\n", - "builder.create()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "19", - "metadata": {}, - "outputs": [], - "source": [ - "with sqw.Sqw.open(out_file) as f:\n", - " print(f.data_block_names())\n", - " d = f.read_data_block('data', \"nd_data\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "20", - "metadata": {}, - "outputs": [], - "source": [ - "d[0].shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21", - "metadata": {}, - "outputs": [], - "source": [ - "binned.hist().data['u1', 3]['u2', 6]['u3', 1]['u4', 0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO The dim order is reversed.\n", - "# Seems wrong, I thought we handled transposition properly now?!\n", - "d[0][0][1][6][3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23", - "metadata": {}, - "outputs": [], - "source": [ - "d[0][3][6][1][0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "24", - "metadata": {}, - "outputs": [], - "source": [ - "np.nonzero(d[0] == 127.0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "25", - "metadata": {}, - "outputs": [], - "source": [ - "binned.hist().sum('u2').sum('u4').transpose(['u3', 'u1']).plot()" - ] - }, - { - "cell_type": "markdown", - "id": "26", - "metadata": {}, - "source": [ - "### Build pix data using group" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "27", - "metadata": {}, - "outputs": [], - "source": [ - "# Revert all indices to 0-based for faster index arithmetic\n", - "binned_indices = observations.copy().bins.assign_coords(\n", - " **{f'u{i}': sc.bins_like(observations, sc.arange(f'u{i}', observations.sizes[f'u{i}'], unit=None, dtype='float32'))\n", - " for i in range(1, 5)},\n", - " ien=sc.bins_like(observations, observations.coords['ien'] - sc.index(1)),\n", - " irun=observations.bins.coords['irun'] - sc.index(1),\n", - " idet=observations.bins.coords['idet'] - sc.index(1),\n", - ")\n", - "binned_indices" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28", - "metadata": {}, - "outputs": [], - "source": [ - "n_u1 = sc.index(binned_indices.sizes['u1'])\n", - "n_u2 = sc.index(binned_indices.sizes['u2'])\n", - "n_u3 = sc.index(binned_indices.sizes['u3'])\n", - "n_u4 = sc.index(binned_indices.sizes['u4'])\n", - "n_idet = binned_indices.bins.coords['idet'].max() + sc.index(1)\n", - "n_irun = binned_indices.bins.coords['irun'].max() + sc.index(1)\n", - "n_ien = binned_indices.bins.coords['ien'].max() + sc.index(1)\n", - "\n", - "i_u1 = binned_indices.bins.coords['u1']\n", - "i_u2 = binned_indices.bins.coords['u2']\n", - "i_u3 = binned_indices.bins.coords['u3']\n", - "i_u4 = binned_indices.bins.coords['u4']\n", - "idet = binned_indices.bins.coords['idet']\n", - "irun = binned_indices.bins.coords['irun']\n", - "ien = binned_indices.bins.coords['ien']\n", - "\n", - "out_index = i_u4.to(dtype='int64')\n", - "for i, n in ((i_u3, n_u3), (i_u2, n_u2), (i_u1, n_u1), (idet, n_idet), (irun, n_irun), (ien, n_ien)):\n", - " out_index *= n.to(dtype='int64')\n", - " out_index += i.to(dtype='int64')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "29", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO the data is shorter than when using the custom loop! (A bunch of u4 might be missing)\n", - "\n", - "for_grouping = observations.bins.assign_coords(pix_index=out_index)\n", - "for_grouping = for_grouping.bins.assign_coords({f'u{i}': sc.bins_like(for_grouping, for_grouping.coords.pop(f'u{i}')) for i in range(1, 5)})\n", - "for_grouping.bins.coords['ien'] = sc.bins_like(for_grouping, for_grouping.coords.pop('ien'))\n", - "\n", - "grouped = for_grouping.bins.concat().group('pix_index').drop_coords('pix_index')\n", - "hist = grouped.bins.sum()\n", - "# indices in `observations` are 1-based\n", - "hist = hist.assign_coords({name: grouped.bins.coords.pop(name).bins.min() for name in list(grouped.bins.coords.keys())})\n", - "hist = hist.assign_coords({})\n", - "hist" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "30", - "metadata": {}, - "outputs": [], - "source": [ - "hist.group('u3', 'u1').bins.sum().plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "31", - "metadata": {}, - "outputs": [], - "source": [ - "buffer = np.c_[*(hist.coords[name].values for name in ('u1', 'u2', 'u3', 'u4', 'irun', 'idet', 'ien')), hist.values, sc.stddevs(hist).values]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "32", - "metadata": {}, - "outputs": [], - "source": [ - "dnd = hist.group('u4', 'u3', 'u2', 'u1')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "33", - "metadata": {}, - "outputs": [], - "source": [ - "builder = sqw.Sqw.build(out_file, title=\"Simulated data with phonon (index method\").add_default_instrument(instrument).add_default_sample(sample)\n", - "builder = builder.add_dnd_data(dnd_metadata, data=dnd.bins.sum().data, counts=dnd.bins.size())\n", - "builder = builder.add_pixel_data(buffer, experiments=experiments)\n", - "builder.create()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "34", - "metadata": {}, - "outputs": [], - "source": [ - "dnd.bins.sum().data" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 5c4da591d802d459f3fef27eed48f99c65fa132e Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 21 Nov 2025 11:46:58 +0100 Subject: [PATCH 259/330] More documentation for SQW --- packages/essspectroscopy/docs/conf.py | 4 +- .../essspectroscopy/src/ess/bifrost/io/sqw.py | 63 +++++++++++++++++-- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index 6c7f998a6..bf3e9a4ce 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -69,9 +69,11 @@ } intersphinx_mapping = { - 'python': ('https://docs.python.org/3', None), + 'essreduce': ('https://scipp.github.io/essreduce/', None), 'numpy': ('https://numpy.org/doc/stable/', None), + 'python': ('https://docs.python.org/3', None), 'scipp': ('https://scipp.github.io/', None), + 'scippneutron': ('https://scipp.github.io/scippneutron/', None), } # autodocs includes everything, even irrelevant API internals. autosummary diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 1d79a905b..3a2543dbb 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -35,18 +35,72 @@ def save_sqw( events: IncidentEnergyDetector[SampleRun], *, bin_sizes: SQWBinSizes, - energy_bins: EnergyBins, # TODO distinct from above! + energy_bins: EnergyBins, beamline: Beamline[SampleRun], measurement: Measurement[SampleRun], + sample: sqw.SqwIXSample, pulse_period: PulsePeriod, gravity: GravityVector, - sample: sqw.SqwIXSample, ) -> None: """Save events recorded at BIFROST to an SQW file. - ``events`` has shape (*logical, a3, a4), is binned with Ei event coord. + The files written by this function can be read by + `Horace `_ for further processing. + For details on the file format, see the documentation for Horace as well as + the `SQW `_ + developer guide in ScippNeutron. + + The input to this function should not yet contain inelastic coordinates like + 'energy_transfer' or 'sample_table_momentum_transfer'. + Instead, ``save_sqw`` histograms the events according to detector number, + experiment setting, and incident energy and computes inelastic + coordinates on that histogram. + This is done for consistency with Horace. + + Note + ---- + This function requires large amounts of memory to construct intermediate + arrays and fill those with null observations. + + Parameters + ---------- + path: + Path of the file to write. + events: + Binned data array with shape ``(*logical, "a3", "a4")`` where ``logical`` + is any number of logical detector dimensions (e.g., arc, tube). + Must have an ``"incident_energy"`` bin coordinate. + bin_sizes: + Sizes of the output 'image' bins. + The data will be ordered based on these bins, but it is possible + to change the binning later in Horace. + E.g., ``{'Qx': 50, 'Qy': 50, 'Qz': 50, 'energy_transfer': 50}``. + energy_bins: + Bin edges or number of bins for (incident) energy. + The events are histogrammed according to these bins, so this determines the + final energy resolution that is available in Horace. + Should typically be larger than ``bin_sizes['energy_transfer']``. + beamline: + Beamline metadata. + measurement: + Measurement metadata. + sample: + Sample metadata in SQW format. + pulse_period: + Pulse period of the neutron source. + gravity: + Vector indicating the direction of gravity. + Used to define the lab coordinate system. + See also + :func:`ess.spectroscopy.indirect.conversion.rotate_to_sample_table_momentum_transfer`. + + See also + -------- + scippneutron.io.sqw: + For low-level SQW I/O and the underlying implementation of ``save_sqw``. """ - # TODO validate inputs: single a4 + if np.unique(events.coords['a4'].values).size != 1: + raise NotImplementedError("a4 must be constant for all events") flat_events = _flatten_events(events) del events # 'move' events into _flatten_events @@ -224,7 +278,6 @@ def _bin_image( observations: sc.DataArray, bin_sizes: SQWBinSizes ) -> tuple[sc.DataArray, sc.Variable, sc.DataArray]: # Dim order to match pixel data (note the transpose for dnd) - # TODO correct? Might not be!! binned = observations.bin( {dim: bin_sizes[dim] for dim in ('energy_transfer', 'Qz', 'Qy', 'Qx')} ).rename(energy_transfer='u4', Qz='u3', Qy='u2', Qx='u1') From ed9bbfd4759065711187c283d7c9f8a9bc0db98a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Nov 2025 15:57:29 +0100 Subject: [PATCH 260/330] Let ScippNeutron convert to 1-based index --- packages/essspectroscopy/src/ess/bifrost/io/sqw.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 3a2543dbb..7975e7536 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -406,7 +406,7 @@ def _make_experiments( sample_angle: sc.Variable, ) -> list[sqw.SqwIXExperiment]: experiment_template = sqw.SqwIXExperiment( - run_id=0, + run_id=0, # converted to 1-based by ScippNeutron efix=final_energy, emode=sqw.EnergyMode.indirect, en=energy_transfer, @@ -420,5 +420,5 @@ def _make_experiments( ) return [ dataclasses.replace(experiment_template, run_id=i, psi=a3) - for i, a3 in enumerate(sample_angle, 1) + for i, a3 in enumerate(sample_angle) ] From b6e27260f404ee25e3a103c9839091111e211595 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Nov 2025 16:03:35 +0100 Subject: [PATCH 261/330] Use variances in pixels --- packages/essspectroscopy/src/ess/bifrost/io/sqw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 7975e7536..eb8bcf7c9 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -315,7 +315,7 @@ def _make_pixel_buffer(pix: sc.DataArray) -> npt.NDArray[np.float32]: for name in ('u1', 'u2', 'u3', 'u4', 'irun', 'idet', 'ien') ), pix.values, - sc.stddevs(pix).values, + sc.variances(pix).values, ] From 7295d0f6f7424c087f89c43e720072359842c612 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 24 Nov 2025 16:05:29 +0100 Subject: [PATCH 262/330] Fix: compute DND as mean --- packages/essspectroscopy/src/ess/bifrost/io/sqw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index eb8bcf7c9..1612db9c8 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -283,7 +283,7 @@ def _bin_image( ).rename(energy_transfer='u4', Qz='u3', Qy='u2', Qx='u1') image = binned.transpose(['u1', 'u2', 'u3', 'u4']) - dnd = image.bins.sum().to(dtype='float64', copy=False) + dnd = image.bins.mean().to(dtype='float64', copy=False) counts = image.bins.size() return dnd, counts, binned From a28e4de78654f3319843c25c234bc506043bb360 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 26 Nov 2025 13:29:13 +0100 Subject: [PATCH 263/330] Require scippneutron>=25.11.0 For updated SQW writer. --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- .../essspectroscopy/requirements/base.txt | 39 ++++++++++++------- .../essspectroscopy/requirements/basetest.txt | 4 +- packages/essspectroscopy/requirements/ci.txt | 4 +- packages/essspectroscopy/requirements/dev.txt | 8 ++-- .../essspectroscopy/requirements/docs.txt | 24 ++---------- .../essspectroscopy/requirements/nightly.txt | 21 +++++----- .../essspectroscopy/requirements/static.txt | 4 +- 9 files changed, 53 insertions(+), 55 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 5645ac67b..3bfade2ca 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -35,7 +35,7 @@ dependencies = [ "pandas>=2.1.2", "sciline>=25.4.1", "scipp>=25.3.0", - "scippneutron>=25.3.0", + "scippneutron>=25.11.0", "scippnexus>=24.9.0", "tof>=25.01.2", ] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 1ad3e953e..277ab8aa3 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -7,6 +7,6 @@ graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 scipp>=25.3.0 -scippneutron>=25.3.0 +scippneutron>=25.11.0 scippnexus>=24.9.0 tof>=25.01.2 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 2ac3a9328..e1d0bac0c 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:50a6edfe91172d974287276363ead5efd7db446b +# SHA1:27343e81397278f4c403234a38495039094b1147 # # This file was generated by pip-compile-multi. # To update, run: @@ -7,6 +7,10 @@ # annotated-types==0.7.0 # via pydantic +certifi==2025.11.12 + # via requests +charset-normalizer==3.4.4 + # via requests contourpy==1.3.3 # via matplotlib cyclebane==24.10.0 @@ -17,7 +21,7 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==25.11.0 +essreduce==25.11.4 # via -r base.in fonttools==4.60.1 # via matplotlib @@ -28,7 +32,9 @@ h5py==3.15.1 # scippneutron # scippnexus idna==3.11 - # via email-validator + # via + # email-validator + # requests kiwisolver==1.4.9 # via matplotlib lazy-loader==0.4 @@ -42,9 +48,9 @@ matplotlib==3.10.7 # plopp mpltoolbox==25.10.0 # via scippneutron -networkx==3.5 +networkx==3.6 # via cyclebane -numpy==2.3.4 +numpy==2.3.5 # via # contourpy # h5py @@ -57,17 +63,22 @@ packaging==25.0 # via # lazy-loader # matplotlib + # pooch pandas==2.3.3 # via -r base.in pillow==12.0.0 # via matplotlib -plopp==25.10.0 +platformdirs==4.5.0 + # via pooch +plopp==25.11.0 # via # scippneutron # tof -pydantic==2.12.3 +pooch==1.8.2 + # via tof +pydantic==2.12.4 # via scippneutron -pydantic-core==2.41.4 +pydantic-core==2.41.5 # via pydantic pyparsing==3.2.5 # via matplotlib @@ -76,9 +87,10 @@ python-dateutil==2.9.0.post0 # matplotlib # pandas # scippneutron - # scippnexus pytz==2025.2 # via pandas +requests==2.32.5 + # via pooch sciline==25.11.1 # via # -r base.in @@ -90,11 +102,11 @@ scipp==25.11.0 # scippneutron # scippnexus # tof -scippneutron==25.7.0 +scippneutron==25.11.0 # via # -r base.in # essreduce -scippnexus==25.6.0 +scippnexus==25.11.0 # via # -r base.in # essreduce @@ -103,10 +115,9 @@ scipy==1.16.3 # via # scippneutron # scippnexus - # tof six==1.17.0 # via python-dateutil -tof==25.10.1 +tof==25.12.0 # via -r base.in typing-extensions==4.15.0 # via @@ -117,3 +128,5 @@ typing-inspection==0.4.2 # via pydantic tzdata==2025.2 # via pandas +urllib3==2.5.0 + # via requests diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 375775b1d..92f0b2a49 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,7 +5,7 @@ # # requirements upgrade # -certifi==2025.10.5 +certifi==2025.11.12 # via requests charset-normalizer==3.4.4 # via requests @@ -25,7 +25,7 @@ pooch==1.8.2 # via -r basetest.in pygments==2.19.2 # via pytest -pytest==8.4.2 +pytest==9.0.1 # via -r basetest.in requests==2.32.5 # via pooch diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 5bc02f409..4b49511f9 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,9 +5,9 @@ # # requirements upgrade # -cachetools==6.2.1 +cachetools==6.2.2 # via tox -certifi==2025.10.5 +certifi==2025.11.12 # via requests chardet==5.2.0 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 17d52b683..e90ca2add 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -26,11 +26,11 @@ async-lru==2.0.5 # via jupyterlab cffi==2.0.0 # via argon2-cffi-bindings -click==8.3.0 +click==8.3.1 # via # pip-compile-multi # pip-tools -copier==9.10.3 +copier==9.11.0 # via -r dev.in dunamai==1.25.0 # via copier @@ -69,7 +69,7 @@ jupyter-server==2.17.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.4.10 +jupyterlab==4.5.0 # via -r dev.in jupyterlab-server==2.28.0 # via jupyterlab @@ -81,7 +81,7 @@ overrides==7.7.0 # via jupyter-server pip-compile-multi==3.2.2 # via -r dev.in -pip-tools==7.5.1 +pip-tools==7.5.2 # via pip-compile-multi plumbum==1.10.0 # via copier diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 10fed86e9..00623227a 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -10,7 +10,7 @@ accessible-pygments==0.0.5 # via pydata-sphinx-theme alabaster==1.0.0 # via sphinx -asttokens==3.0.0 +asttokens==3.0.1 # via stack-data attrs==25.4.0 # via @@ -28,10 +28,6 @@ beautifulsoup4==4.14.2 # pydata-sphinx-theme bleach[css]==6.3.0 # via nbconvert -certifi==2025.10.5 - # via requests -charset-normalizer==3.4.4 - # via requests comm==0.2.3 # via # ipykernel @@ -58,7 +54,7 @@ ipykernel==7.1.0 # via -r docs.in ipympl==0.9.8 # via -r docs.in -ipython==9.6.0 +ipython==9.7.0 # via # -r docs.in # ipykernel @@ -136,12 +132,6 @@ parso==0.8.5 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.5.0 - # via - # jupyter-core - # pooch -pooch==1.8.2 - # via -r docs.in prompt-toolkit==3.0.52 # via ipython psutil==7.1.3 @@ -150,7 +140,7 @@ ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pydantic-settings==2.11.0 +pydantic-settings==2.12.0 # via autodoc-pydantic pydata-sphinx-theme==0.16.1 # via -r docs.in @@ -174,11 +164,7 @@ referencing==0.37.0 # via # jsonschema # jsonschema-specifications -requests==2.32.5 - # via - # pooch - # sphinx -rpds-py==0.28.0 +rpds-py==0.29.0 # via # jsonschema # referencing @@ -235,8 +221,6 @@ traitlets==5.14.3 # nbconvert # nbformat # nbsphinx -urllib3==2.5.0 - # via requests wcwidth==0.2.14 # via prompt-toolkit webencodings==0.5.1 diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index bbfea8f88..166e27c37 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -10,7 +10,7 @@ annotated-types==0.7.0 # via pydantic -certifi==2025.10.5 +certifi==2025.11.12 # via requests charset-normalizer==3.4.4 # via requests @@ -53,9 +53,9 @@ matplotlib==3.10.7 # plopp mpltoolbox==25.10.0 # via scippneutron -networkx==3.5 +networkx==3.6 # via cyclebane -numpy==2.3.4 +numpy==2.3.5 # via # contourpy # h5py @@ -84,16 +84,18 @@ plopp @ git+https://github.com/scipp/plopp@main pluggy==1.6.0 # via pytest pooch==1.8.2 - # via -r nightly.in -pydantic==2.12.3 + # via + # -r nightly.in + # tof +pydantic==2.12.4 # via scippneutron -pydantic-core==2.41.4 +pydantic-core==2.41.5 # via pydantic pygments==2.19.2 # via pytest -pyparsing==3.3.0a1 +pyparsing==3.3.0b1 # via matplotlib -pytest==8.4.2 +pytest==9.0.1 # via -r nightly.in python-dateutil==2.9.0.post0 # via @@ -128,10 +130,9 @@ scipy==1.16.3 # via # scippneutron # scippnexus - # tof six==1.17.0 # via python-dateutil -tof==25.10.1 +tof==25.12.0 # via -r nightly.in typing-extensions==4.15.0 # via diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 991a89212..4cc95f112 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -5,7 +5,7 @@ # # requirements upgrade # -cfgv==3.4.0 +cfgv==3.5.0 # via pre-commit distlib==0.4.0 # via virtualenv @@ -17,7 +17,7 @@ nodeenv==1.9.1 # via pre-commit platformdirs==4.5.0 # via virtualenv -pre-commit==4.3.0 +pre-commit==4.5.0 # via -r static.in pyyaml==6.0.3 # via pre-commit From f1d5980c519bdcbd1e64dada617a010742ae3100 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 26 Nov 2025 13:31:52 +0100 Subject: [PATCH 264/330] Fix typos --- .../essspectroscopy/src/ess/spectroscopy/indirect/conversion.py | 2 +- packages/essspectroscopy/tests/bifrost/io/sqw_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 4b01291f4..9f038695f 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -120,7 +120,7 @@ def lab_momentum_transfer_from_incident_energy( .. math:: - \vec{k_i} = \frac{2\pi}{h} \hat{b}_i \sqrt(2 M_n E_i} + \vec{k_i} = \frac{2\pi}{h} \hat{b}_i \sqrt{2 M_n E_i} Parameters ---------- diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index 7db44e243..c03386733 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -202,7 +202,7 @@ def check_pixels_in_bin_ranges( e_min = u_edges[col][index].value # expected range e_max = u_edges[col][index + 1].value assert p_min >= e_min - 1e-6 # small offset to account for f32 rounding - assert p_max < e_max + 1e6 + assert p_max < e_max + 1e-6 def check_pixel_indices_in_ranges(pix: npt.NDArray[np.float32]) -> None: From c14590ee6126b54df577ccaf3ee93fd3bbab4a14 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 26 Nov 2025 13:44:23 +0100 Subject: [PATCH 265/330] Update reference data --- packages/essspectroscopy/src/ess/bifrost/data.py | 6 +++--- packages/essspectroscopy/tests/bifrost/workflow_test.py | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 499cb2c36..80c0dcc1f 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -11,11 +11,11 @@ 'ess/bifrost', files={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated.h5": "blake2b:690d837ce684a0aeea021b2624c5f7371e299f1bbc803725b40bf3eca35816e3348a79e5fdf04dc89e29c4bdd4f6ea2b052b49058eecfdf535b9733eefa8a854", # noqa: E501 - "computed_energy_data_simulated_5x2.h5": "blake2b:0353f7e675a276451637fd175eef4f3d231a68a8983faf1240796fef44c9f3e78a264baf705e24d71f001afc83d07bbf1bff17e5bd83a15db89386a43dd5d5d7", # noqa: E501 + "computed_energy_data_simulated.h5": "blake2b:1ff82ef8b23fd9d20fb12efc5c541bb5a67ab7ea21a1b8d8c84d8e05fbf9fc66c3cd640bc80e508c9c24a1f6a21ac4c7c6ebb9494f7fc007e7af51453eb3c88a", # noqa: E501 + "computed_energy_data_simulated_5x2.h5": "blake2b:6ebaeee3d75bd61cc9ef15a593d2984bf1c0eb36423aee12310555ef80674edfaa0f910b721bd2161f4af011a4412e927b6b9a7dda8b08dd26f2d36f9452afe3", # noqa: E501 "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 }, - version="4", + version="5", ) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index a76b76eae..0077cd9ee 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -101,7 +101,6 @@ def test_simulation_workflow_can_compute_wavelength_monitor( assert monitor.bins is None -# TODO update reference data once we settled and which coords get computed def test_simulation_workflow_produces_the_same_data_as_before( workflow: sciline.Pipeline, ) -> None: From b73280dac9dc2523c7c704b14c80d1b773746acd Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 1 Dec 2025 10:55:33 +0100 Subject: [PATCH 266/330] Apply suggestions --- packages/essspectroscopy/src/ess/bifrost/io/sqw.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 1612db9c8..e02e4fd30 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -69,7 +69,7 @@ def save_sqw( events: Binned data array with shape ``(*logical, "a3", "a4")`` where ``logical`` is any number of logical detector dimensions (e.g., arc, tube). - Must have an ``"incident_energy"`` bin coordinate. + Must have an ``"incident_energy"`` event coordinate. bin_sizes: Sizes of the output 'image' bins. The data will be ordered based on these bins, but it is possible @@ -159,7 +159,7 @@ def _flatten_events(events: IncidentEnergyDetector[SampleRun]) -> sc.DataArray: def _filter_and_convert_coords_in_place(flat_events: sc.DataArray) -> None: - """Filter out all coords we no longer need and convert to float32. + """Filter out all coords we no longer need and convert remaining coords to float32. This function mainly serves to reduce memory usage. The conversion to float32 is ultimately required when building the 'pixel data', @@ -283,6 +283,10 @@ def _bin_image( ).rename(energy_transfer='u4', Qz='u3', Qy='u2', Qx='u1') image = binned.transpose(['u1', 'u2', 'u3', 'u4']) + # The dense DND array contains the averages of the observations in `image`. + # Note that `image` contains 'observations', not 'events', so the expectation value + # is the arithmetic mean, not the sum. + # See also https://scipp.github.io/scippneutron/developer/file-formats/sqw.html#dnd-data-blocks dnd = image.bins.mean().to(dtype='float64', copy=False) counts = image.bins.size() From 3e962e3b6e59783b0f00f10db667e4c5fb2dac78 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 1 Dec 2025 11:12:01 +0100 Subject: [PATCH 267/330] Use lookup table filename param --- packages/essspectroscopy/tests/bifrost/io/sqw_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index c03386733..71f75768d 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -32,7 +32,7 @@ PreopenNeXusFile, SampleRun, SQWBinSizes, - TimeOfFlightLookupTable, + TimeOfFlightLookupTableFilename, ) N_DETECTORS = 3 @@ -72,7 +72,7 @@ def common_workflow( wf = bifrost.BifrostSimulationWorkflow(detector_names) wf[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - wf[TimeOfFlightLookupTable] = sc.io.load_hdf5(tof_lookup_table_simulation()) + wf[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() wf[PreopenNeXusFile] = PreopenNeXusFile(True) wf[sqw.SqwIXSample] = sample wf[EnergyBins] = ENERGY_BIN_SIZE From 215ae5c73475e2df7efb7684b3f137a6b274e0a8 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 1 Dec 2025 11:12:36 +0100 Subject: [PATCH 268/330] Suggestion: precompute expected shape --- packages/essspectroscopy/tests/bifrost/io/sqw_test.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index 71f75768d..7cc49938e 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -157,9 +157,10 @@ def test_save_sqw_writes_dnd_data(output_file: sqw.Sqw) -> None: dnd = output_file.read_data_block("data", "nd_data") values, errors, counts = dnd # Fortran order - assert values.shape == tuple(BIN_SIZES.values())[::-1] - assert errors.shape == tuple(BIN_SIZES.values())[::-1] - assert counts.shape == tuple(BIN_SIZES.values())[::-1] + expected_shape = tuple(BIN_SIZES.values())[::-1] + assert values.shape == expected_shape + assert errors.shape == expected_shape + assert counts.shape == expected_shape def test_save_sqw_writes_pixel_data(output_file: sqw.Sqw) -> None: From ef8c15e02cc838c33136849c4b5e12f47a253db1 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 1 Dec 2025 14:05:03 +0100 Subject: [PATCH 269/330] Add comment --- packages/essspectroscopy/src/ess/bifrost/io/sqw.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index e02e4fd30..31b8ef81a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -100,6 +100,8 @@ def save_sqw( For low-level SQW I/O and the underlying implementation of ``save_sqw``. """ if np.unique(events.coords['a4'].values).size != 1: + # We need to support this eventually, but we don't + # have data for a moving detector vessel yet. raise NotImplementedError("a4 must be constant for all events") flat_events = _flatten_events(events) From 713ff016db44b8627296aa0285dc69c531e9279a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 2 Dec 2025 10:06:11 +0100 Subject: [PATCH 270/330] Require scippneutron>=25.11.2 For bugfix to support large files. --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- packages/essspectroscopy/requirements/base.txt | 10 +++++----- packages/essspectroscopy/requirements/dev.txt | 4 +--- packages/essspectroscopy/requirements/docs.txt | 12 +++++++----- packages/essspectroscopy/requirements/mypy.txt | 4 +++- packages/essspectroscopy/requirements/nightly.txt | 4 ++-- 7 files changed, 20 insertions(+), 18 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 3bfade2ca..2136affa1 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -35,7 +35,7 @@ dependencies = [ "pandas>=2.1.2", "sciline>=25.4.1", "scipp>=25.3.0", - "scippneutron>=25.11.0", + "scippneutron>=25.11.2", "scippnexus>=24.9.0", "tof>=25.01.2", ] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 277ab8aa3..bf8fe9ae6 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -7,6 +7,6 @@ graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 scipp>=25.3.0 -scippneutron>=25.11.0 +scippneutron>=25.11.2 scippnexus>=24.9.0 tof>=25.01.2 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index e1d0bac0c..160d8ad45 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:27343e81397278f4c403234a38495039094b1147 +# SHA1:e92206a79ad15e448a68621a3e91eb81ab5255c2 # # This file was generated by pip-compile-multi. # To update, run: @@ -21,9 +21,9 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==25.11.4 +essreduce==25.11.6 # via -r base.in -fonttools==4.60.1 +fonttools==4.61.0 # via matplotlib graphviz==0.21 # via -r base.in @@ -76,7 +76,7 @@ plopp==25.11.0 # tof pooch==1.8.2 # via tof -pydantic==2.12.4 +pydantic==2.12.5 # via scippneutron pydantic-core==2.41.5 # via pydantic @@ -102,7 +102,7 @@ scipp==25.11.0 # scippneutron # scippnexus # tof -scippneutron==25.11.0 +scippneutron==25.11.2 # via # -r base.in # essreduce diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index e90ca2add..a48697dd3 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -12,7 +12,7 @@ -r static.txt -r test.txt -r wheels.txt -anyio==4.11.0 +anyio==4.12.0 # via # httpx # jupyter-server @@ -105,8 +105,6 @@ rfc3987-syntax==1.1.0 # via jsonschema send2trash==1.8.3 # via jupyter-server -sniffio==1.3.1 - # via anyio terminado==0.18.1 # via # jupyter-server diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 00623227a..38da97c0b 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -22,7 +22,7 @@ babel==2.17.0 # via # pydata-sphinx-theme # sphinx -beautifulsoup4==4.14.2 +beautifulsoup4==4.14.3 # via # nbconvert # pydata-sphinx-theme @@ -122,7 +122,7 @@ nbformat==5.10.4 # nbclient # nbconvert # nbsphinx -nbsphinx==0.9.7 +nbsphinx==0.9.8 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel @@ -164,7 +164,9 @@ referencing==0.37.0 # via # jsonschema # jsonschema-specifications -rpds-py==0.29.0 +roman-numerals-py==3.1.0 + # via sphinx +rpds-py==0.30.0 # via # jsonschema # referencing @@ -172,7 +174,7 @@ snowballstemmer==3.0.1 # via sphinx soupsieve==2.8 # via beautifulsoup4 -sphinx==8.1.3 +sphinx==8.2.3 # via # -r docs.in # autodoc-pydantic @@ -182,7 +184,7 @@ sphinx==8.1.3 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==3.0.1 +sphinx-autodoc-typehints==3.5.2 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 088d0c288..b8f2d76fd 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,7 +6,9 @@ # requirements upgrade # -r test.txt -mypy==1.18.2 +librt==0.6.3 + # via mypy +mypy==1.19.0 # via -r mypy.in mypy-extensions==1.1.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 166e27c37..f3bd6432d 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -26,7 +26,7 @@ email-validator==2.3.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -fonttools==4.60.1 +fonttools==4.61.0 # via matplotlib graphviz==0.21 # via -r nightly.in @@ -87,7 +87,7 @@ pooch==1.8.2 # via # -r nightly.in # tof -pydantic==2.12.4 +pydantic==2.12.5 # via scippneutron pydantic-core==2.41.5 # via pydantic From 87ef52ecd4b4abafaf03ed222149304a90920361 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 2 Dec 2025 14:49:49 +0100 Subject: [PATCH 271/330] Use u-labels instead of Q --- .../essspectroscopy/src/ess/bifrost/io/sqw.py | 15 +++++++++++---- .../essspectroscopy/tests/bifrost/io/sqw_test.py | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 31b8ef81a..124250363 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -57,6 +57,13 @@ def save_sqw( coordinates on that histogram. This is done for consistency with Horace. + The data is encoded as a 4-dimensional array, and Horace calls the dimensions + ``u1 ... u4``. The first three correspond to the three dimensions of $\\vec{Q}$ + and the ``u4`` corresponds to energy transfer. Horace supports customizable + projections onto the cardinal axes $Q_x, Q_y, Q_z$, but the implementation here + has hard-coded ``(Qx, Qy, Qz) = (u1, u2, u3)``, however, you need to express the + binning in terms of the `u`'s. + Note ---- This function requires large amounts of memory to construct intermediate @@ -74,7 +81,7 @@ def save_sqw( Sizes of the output 'image' bins. The data will be ordered based on these bins, but it is possible to change the binning later in Horace. - E.g., ``{'Qx': 50, 'Qy': 50, 'Qz': 50, 'energy_transfer': 50}``. + E.g., ``{'u1': 50, 'u2': 50, 'u3': 50, 'u4': 50}``. energy_bins: Bin edges or number of bins for (incident) energy. The events are histogrammed according to these bins, so this determines the @@ -280,8 +287,9 @@ def _bin_image( observations: sc.DataArray, bin_sizes: SQWBinSizes ) -> tuple[sc.DataArray, sc.Variable, sc.DataArray]: # Dim order to match pixel data (note the transpose for dnd) + dim_order = {'energy_transfer': 'u4', 'Qz': 'u3', 'Qy': 'u2', 'Qx': 'u1'} binned = observations.bin( - {dim: bin_sizes[dim] for dim in ('energy_transfer', 'Qz', 'Qy', 'Qx')} + {coord: bin_sizes[dim] for coord, dim in dim_order.items()} ).rename(energy_transfer='u4', Qz='u3', Qy='u2', Qx='u1') image = binned.transpose(['u1', 'u2', 'u3', 'u4']) @@ -347,8 +355,7 @@ def _make_dnd_metadata( ---------- dnd: DND 'image data'. - Must be histogrammed along the Qx, Qy, Qz, and energy_transfer axes - with linspace coordinates. + Must be histogrammed along the u-axes with linspace coordinates. sample: Sample metadata. """ diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index 7cc49938e..b502b50a1 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -38,7 +38,7 @@ N_DETECTORS = 3 N_ANGLES = 180 -BIN_SIZES = {'Qx': 6, 'Qy': 7, 'Qz': 8, 'energy_transfer': 9} +BIN_SIZES = {'u1': 6, 'u2': 7, 'u3': 8, 'u4': 9} ENERGY_BIN_SIZE = 13 # Q projections From 3325812c5a53fd959b10a9b525b8905770d90a19 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 2 Dec 2025 16:16:20 +0100 Subject: [PATCH 272/330] Use proper non-sim providers --- .../src/ess/bifrost/workflow.py | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 09dba3bad..2587e29eb 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -34,6 +34,16 @@ from .io import mcstas, nexus +def default_parameters() -> dict[type, Any]: + """Default parameters for BifrostWorkflow.""" + return { + NeXusMonitorName[FrameMonitor1]: '090_frame_1', + NeXusMonitorName[FrameMonitor2]: '097_frame_2', + NeXusMonitorName[FrameMonitor3]: '110_frame_3', + PulsePeriod: 1.0 / sc.scalar(14.0, unit="Hz"), + } + + def simulation_default_parameters() -> dict[type, Any]: """Default parameters for BifrostSimulationWorkflow.""" return { @@ -44,6 +54,16 @@ def simulation_default_parameters() -> dict[type, Any]: } +_PROVIDERS = ( + *nexus.providers, + *conversion_providers, + *detector_providers, + *cutting_providers, + *ki_providers, + *kf_providers, + *normalisation_providers, +) + _SIMULATION_PROVIDERS = ( *nexus.providers, *conversion_providers, @@ -97,11 +117,9 @@ def BifrostWorkflow( run_types=(SampleRun,), monitor_types=(FrameMonitor0, FrameMonitor1, FrameMonitor2, FrameMonitor3), ) - # TODO change to use non-simulation providers - for provider in _SIMULATION_PROVIDERS: + for provider in _PROVIDERS: workflow.insert(provider) - # TODO change to use non-simulation parameters - for key, val in simulation_default_parameters().items(): + for key, val in default_parameters().items(): workflow[key] = val workflow[EmptyDetector[SampleRun]] = ( From 86425aa03c8637c4ae52b36324224e3b4f90b884 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 3 Dec 2025 11:16:03 +0100 Subject: [PATCH 273/330] Use proper non-sim providers (bragg peak) --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 4 ++-- .../ess/bifrost/single_crystal/__init__.py | 11 +++++++-- .../ess/bifrost/single_crystal/workflow.py | 24 ++++++++++++++++++- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index 69a29fb19..de9a94d0b 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -24,7 +24,7 @@ " simulated_elastic_incoherent_with_phonon,\n", " tof_lookup_table_simulation,\n", ")\n", - "from ess.bifrost.single_crystal import BifrostBraggPeakMonitorWorkflow, make_q_map\n", + "from ess.bifrost.single_crystal import BifrostSimulationBraggPeakMonitorWorkflow, make_q_map\n", "from ess.bifrost.single_crystal.types import *\n", "from ess.bifrost.types import McStasRawDetector\n", "from ess.reduce.time_of_flight import DetectorLtotal\n", @@ -56,7 +56,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow = BifrostBraggPeakMonitorWorkflow()\n", + "workflow = BifrostSimulationBraggPeakMonitorWorkflow()\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()" ] diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py index ec4cad7ff..b97208511 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/__init__.py @@ -3,6 +3,13 @@ """A single crystal reduction workflow for BIFROST's Bragg peak monitor.""" from .q_map import make_q_map -from .workflow import BifrostBraggPeakMonitorWorkflow +from .workflow import ( + BifrostBraggPeakMonitorWorkflow, + BifrostSimulationBraggPeakMonitorWorkflow, +) -__all__ = ["BifrostBraggPeakMonitorWorkflow", "make_q_map"] +__all__ = [ + "BifrostBraggPeakMonitorWorkflow", + "BifrostSimulationBraggPeakMonitorWorkflow", + "make_q_map", +] diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py index bde0c8d90..413697699 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py @@ -16,10 +16,18 @@ from ..cutting import group_by_rotation from ..io import nexus from ..io.mcstas import convert_simulated_time_to_event_time_offset -from ..workflow import simulation_default_parameters +from ..workflow import default_parameters, simulation_default_parameters from . import conversion, q_map, time_of_flight _PROVIDERS = ( + *nexus.providers, + *conversion.providers, + *q_map.providers, + *time_of_flight.providers, + group_by_rotation, +) + +_SIMULATION_PROVIDERS = ( *nexus.providers, *conversion.providers, *q_map.providers, @@ -38,6 +46,20 @@ def BifrostBraggPeakMonitorWorkflow() -> sciline.Pipeline: workflow.insert(reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data) for provider in _PROVIDERS: workflow.insert(provider) + for key, val in default_parameters().items(): + workflow[key] = val + return workflow + + +def BifrostSimulationBraggPeakMonitorWorkflow() -> sciline.Pipeline: + workflow = TofWorkflow( + run_types=(SampleRun,), + monitor_types=(FrameMonitor1, FrameMonitor2, FrameMonitor3), + ) + # Use the vanilla implementation instead of the indirect geometry one: + workflow.insert(reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data) + for provider in _SIMULATION_PROVIDERS: + workflow.insert(provider) for key, val in simulation_default_parameters().items(): workflow[key] = val return workflow From b29b003f43229d459f70bbb664c3e210dea8453f Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 8 Dec 2025 07:34:17 +0100 Subject: [PATCH 274/330] Explicitly request source_position --- .../src/ess/spectroscopy/indirect/conversion.py | 9 +++++++-- packages/essspectroscopy/src/ess/spectroscopy/types.py | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 9f038695f..900e1dcfb 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -6,6 +6,7 @@ import numpy as np import scipp as sc import scipp.constants +import scippnexus as snx from scippneutron.conversion.tof import ( energy_from_wavelength, wavelength_from_tof, @@ -19,6 +20,7 @@ InelasticCoordTransformGraph, MonitorCoordTransformGraph, MonitorType, + Position, PrimarySpecCoordTransformGraph, RunType, SecondarySpecCoordTransformGraph, @@ -291,13 +293,16 @@ def add_spectrometer_coords( ) -def monitor_coordinate_transformation_graph() -> MonitorCoordTransformGraph: +def monitor_coordinate_transformation_graph( + source_position: Position[snx.NXsource, RunType], +) -> MonitorCoordTransformGraph[RunType]: from scippneutron.conversion.graph import beamline, tof - return MonitorCoordTransformGraph( + return MonitorCoordTransformGraph[RunType]( { **beamline.beamline(scatter=False), **tof.elastic_wavelength(start='tof'), + "source_position": lambda: source_position, } ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 0fa1bd6ce..82000877c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -114,9 +114,6 @@ class InstrumentAngle(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """ -MonitorCoordTransformGraph = NewType('MonitorCoordTransformGraph', dict) - - NXspeFileName = NewType('NXspeFileName', str) NXspeFileNames = NewType('NXspeFileNames', list[NXspeFileName]) @@ -135,6 +132,9 @@ class SecondarySpecCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... class ElasticCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... +class MonitorCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... + + SQWBinSizes = NewType('SQWBinSizes', dict[str, int]) From 458487efb42c5de1e8019e245869fa5f5e5be8cc Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 3 Dec 2025 16:33:11 +0100 Subject: [PATCH 275/330] Normalize by monitor and proton charge --- .../docs/api-reference/index.md | 2 + .../bifrost/bifrost-reduction.ipynb | 19 ++-- .../essspectroscopy/src/ess/bifrost/io/sqw.py | 8 +- .../src/ess/bifrost/normalization.py | 90 +++++++++++++++++++ .../src/ess/bifrost/workflow.py | 7 +- .../ess/spectroscopy/indirect/conversion.py | 16 ++-- .../spectroscopy/indirect/normalization.py | 6 -- .../src/ess/spectroscopy/types.py | 14 +++ .../tests/bifrost/cutting_test.py | 14 +-- .../tests/bifrost/io/sqw_test.py | 2 + .../tests/bifrost/live_test.py | 4 + .../tests/bifrost/workflow_test.py | 6 +- 12 files changed, 158 insertions(+), 30 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/bifrost/normalization.py delete mode 100644 packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py diff --git a/packages/essspectroscopy/docs/api-reference/index.md b/packages/essspectroscopy/docs/api-reference/index.md index 0dbbaaa9b..89bd3abcc 100644 --- a/packages/essspectroscopy/docs/api-reference/index.md +++ b/packages/essspectroscopy/docs/api-reference/index.md @@ -11,6 +11,7 @@ :toctree: ../generated/functions :recursive: + BifrostWorkflow BifrostSimulationWorkflow ``` @@ -43,6 +44,7 @@ detector io live + normalization types workflow ``` diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index d75ed1294..d93a6b58a 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -93,7 +93,9 @@ "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", "# We need to read many objects from the file,\n", "# keeping it open improves performance: (optional)\n", - "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)" + "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", + "# We drop uncertainties where they would otherwise lead to correlations:\n", + "workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop" ] }, { @@ -113,7 +115,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow.visualize(EnergyQDetector[SampleRun], graph_attr={\"rankdir\": \"LR\"})" + "workflow.visualize(EnergyQDetector[SampleRun], compact=True, graph_attr={\"rankdir\": \"LR\"})" ] }, { @@ -185,10 +187,13 @@ "metadata": {}, "source": [ "We can also plot the counts as a function of the momentum transfer in the sample table frame $Q$.\n", - "For this, we first need to create a 2D slice of $Q$.\n", - "For simplicity, we use the x and z axes (see https://scipp.github.io/scippneutron/user-guide/coordinate-transformations.html for definitions).\n", - "But we could use any other normalised, orthogonal vectors in the dot products.\n", - "The plot is a bit coarse because we only used 2 triplets." + "For this, we first need to create a 2D slice in $Q$ and $\\Delta E$.\n", + "For simplicity, we use the x and z axes or $Q$ (see https://scipp.github.io/scippneutron/user-guide/coordinate-transformations.html for definitions).\n", + "But we could use any other normalized, orthogonal vectors in the dot products.\n", + "\n", + "We can make a second plot using one of the projections and the energy transfer.\n", + "\n", + "The plots are a bit coarse because we only used two triplets." ] }, { @@ -203,7 +208,7 @@ "z = sc.vector([0, 0, 1])\n", "d.bins.coords['Qx'] = sc.dot(x, d.bins.coords['sample_table_momentum_transfer'])\n", "d.bins.coords['Qz'] = sc.dot(z, d.bins.coords['sample_table_momentum_transfer'])\n", - "d.hist(Qz=200, Qx=200).plot(norm='log')" + "d.hist(Qz=100, Qx=100).plot(norm='log') / d.hist(energy_transfer=100, Qz=100).plot(norm='log')" ] } ], diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 124250363..28444abda 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -15,8 +15,8 @@ Beamline, EnergyBins, GravityVector, - IncidentEnergyDetector, Measurement, + NormalizedIncidentEnergyDetector, OutFilename, PulsePeriod, SampleRun, @@ -32,7 +32,7 @@ def save_sqw( path: OutFilename, - events: IncidentEnergyDetector[SampleRun], + events: NormalizedIncidentEnergyDetector[SampleRun], *, bin_sizes: SQWBinSizes, energy_bins: EnergyBins, @@ -148,7 +148,9 @@ def save_sqw( builder.create() -def _flatten_events(events: IncidentEnergyDetector[SampleRun]) -> sc.DataArray: +def _flatten_events( + events: NormalizedIncidentEnergyDetector[SampleRun], +) -> sc.DataArray: """Flatten events from (*logical, a3, a4) to (detector, setting). Also assigns the 'irun' coordinate as that requires the initial shape. diff --git a/packages/essspectroscopy/src/ess/bifrost/normalization.py b/packages/essspectroscopy/src/ess/bifrost/normalization.py new file mode 100644 index 000000000..223a788f0 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/normalization.py @@ -0,0 +1,90 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + +"""Normalization routines.""" + +import scipp as sc + +from ess.reduce.uncertainty import broadcast_uncertainties +from ess.spectroscopy.types import ( + FrameMonitor3, + IncidentEnergyDetector, + NormalizedIncidentEnergyDetector, + ProtonCharge, + RunType, + UncertaintyBroadcastMode, + WavelengthMonitor, +) + + +def normalize_by_monitor_and_proton_charge( + detector: IncidentEnergyDetector[RunType], + monitor: WavelengthMonitor[RunType, FrameMonitor3], + proton_charge: ProtonCharge[RunType], + uncertainty_broadcast_mode: UncertaintyBroadcastMode, +) -> NormalizedIncidentEnergyDetector[RunType]: + """Normalize detector data by a monitor and proton charge. + + This function divides the detector event weights by the distribution of the monitor + in incident wavelength and by the proton charge. The former accounts for the + wavelength-dependent transmission of the beam through the primary spectrometer. + The latter accounts for the measurement time and source strength. + + The detector is normalized according to + + .. math:: + + d_e^\\text{Norm} = d_e \\frac{\\Delta x_i}{m_i \\sum_j m_j} \\frac1{C} + + where :math:`d_e` is a detector event, :math:`m_i` is the monitor bin containing + the incident wavelength of that detector event, and :math:`\\Delta x_i` is the bin + width of that bin. Finally, :math:`C` is the proton charge. + The monitor term is chosen to have unit integral and represent a probability + density of incident neutrons. + + Parameters + ---------- + detector: + Detector events to normalize. + monitor: + Monitor histogram. + proton_charge: + Accumulated proton charge. + Scalar or per setting (a3 / a4). + uncertainty_broadcast_mode: + Choose how uncertainties of the monitor and proton charge + are broadcast to the sample data. + + Returns + ------- + : + The detector events normalized by the monitor and proton charge. + """ + # We should make this function public or move the normalization to ESSreduce. + from ess.reduce.normalization import _mask_detector_for_norm + + if 'time' in monitor.dims: + # Use a combined monitor distribution for all instrument settings. + monitor = monitor.sum('time') + + detector = _mask_detector_for_norm(detector=detector, monitor=monitor) + + norm = _monitor_distribution(detector=detector, monitor=monitor) + # Combine monitor and proton charge so we only operate on events once. + norm *= proton_charge + norm = broadcast_uncertainties( + norm, prototype=detector, mode=uncertainty_broadcast_mode + ) + return NormalizedIncidentEnergyDetector[RunType](detector.bins / sc.lookup(norm)) + + +def _monitor_distribution( + detector: sc.DataArray, + monitor: sc.DataArray, +) -> sc.DataArray: + coord = monitor.coords[monitor.dim] + delta_w = sc.DataArray(coord[1:] - coord[:-1], masks=monitor.masks) + return monitor / delta_w / sc.values(monitor).sum() + + +providers = (normalize_by_monitor_and_proton_charge,) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 2587e29eb..ff158bbd4 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -12,7 +12,6 @@ from ess.spectroscopy.indirect.conversion import providers as conversion_providers from ess.spectroscopy.indirect.kf import providers as kf_providers from ess.spectroscopy.indirect.ki import providers as ki_providers -from ess.spectroscopy.indirect.normalization import providers as normalisation_providers from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( EmptyDetector, @@ -23,15 +22,18 @@ NeXusData, NeXusDetectorName, NeXusMonitorName, + ProtonCharge, PulsePeriod, RawDetector, SampleRun, + UncertaintyBroadcastMode, ) from .cutting import providers as cutting_providers from .detector import merge_triplets from .detector import providers as detector_providers from .io import mcstas, nexus +from .normalization import providers as normalisation_providers def default_parameters() -> dict[type, Any]: @@ -41,6 +43,7 @@ def default_parameters() -> dict[type, Any]: NeXusMonitorName[FrameMonitor2]: '097_frame_2', NeXusMonitorName[FrameMonitor3]: '110_frame_3', PulsePeriod: 1.0 / sc.scalar(14.0, unit="Hz"), + UncertaintyBroadcastMode: UncertaintyBroadcastMode.fail, } @@ -51,6 +54,8 @@ def simulation_default_parameters() -> dict[type, Any]: NeXusMonitorName[FrameMonitor2]: '097_frame_2', NeXusMonitorName[FrameMonitor3]: '110_frame_3', PulsePeriod: 1.0 / sc.scalar(14.0, unit="Hz"), + ProtonCharge[SampleRun]: sc.DataArray(sc.scalar(1.0, unit='pC')), + UncertaintyBroadcastMode: UncertaintyBroadcastMode.fail, } diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 900e1dcfb..ac9fa23e8 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -20,6 +20,7 @@ InelasticCoordTransformGraph, MonitorCoordTransformGraph, MonitorType, + NormalizedIncidentEnergyDetector, Position, PrimarySpecCoordTransformGraph, RunType, @@ -212,7 +213,7 @@ def inelastic_coordinate_transformation_graph_at_sample( def add_inelastic_coordinates( - data: TofDetector[RunType], graph: InelasticCoordTransformGraph + data: NormalizedIncidentEnergyDetector[RunType], graph: InelasticCoordTransformGraph ) -> EnergyQDetector[RunType]: transformed = data.transform_coords( [ @@ -237,6 +238,7 @@ def add_incident_energy( transformed = data.transform_coords( [ 'incident_energy', + 'incident_wavelength', # TODO # These are inputs, but we need them for binning: 'a3', 'a4', @@ -302,17 +304,21 @@ def monitor_coordinate_transformation_graph( { **beamline.beamline(scatter=False), **tof.elastic_wavelength(start='tof'), - "source_position": lambda: source_position, + 'incident_wavelength': 'wavelength', + 'source_position': lambda: source_position, } ) -def add_monitor_wavelength_coords( +def add_monitor_wavelength_coord( monitor: TofMonitor[RunType, MonitorType], graph: MonitorCoordTransformGraph ) -> WavelengthMonitor[RunType, MonitorType]: return WavelengthMonitor[RunType, MonitorType]( monitor.transform_coords( - 'wavelength', graph=graph, keep_intermediate=False, keep_aliases=False + 'incident_wavelength', + graph=graph, + keep_intermediate=False, + keep_aliases=False, ) ) @@ -320,7 +326,7 @@ def add_monitor_wavelength_coords( providers = ( add_inelastic_coordinates, add_incident_energy, - add_monitor_wavelength_coords, + add_monitor_wavelength_coord, inelastic_coordinate_transformation_graph_at_sample, monitor_coordinate_transformation_graph, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py deleted file mode 100644 index c908b0997..000000000 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/normalization.py +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) - -"""Normalization routines.""" - -providers = () diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 82000877c..4329e1a22 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -10,6 +10,7 @@ from ess.reduce import time_of_flight from ess.reduce.nexus import types as reduce_t +from ess.reduce.uncertainty import UncertaintyBroadcastMode as _UncertaintyBroadcastMode # NeXus types @@ -100,6 +101,12 @@ class IncidentEnergyDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray) """Detector counts with an incident energy coordinate.""" +class NormalizedIncidentEnergyDetector( + sciline.Scope[RunType, sc.DataArray], sc.DataArray +): + """Normalized detector counts with an incident energy coordinate.""" + + class SampleAngle(sciline.Scope[RunType, sc.DataArray], sc.DataArray): """Rotation angle of the sample, possibly as a function of time. @@ -141,3 +148,10 @@ class MonitorCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... class WavelengthMonitor( sciline.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray ): ... + + +UncertaintyBroadcastMode = _UncertaintyBroadcastMode + + +class ProtonCharge(sciline.Scope[RunType, sc.DataArray], sc.DataArray): + """Accumulated proton charge for a measurement.""" diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py index 672a978e3..71e8020e6 100644 --- a/packages/essspectroscopy/tests/bifrost/cutting_test.py +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -17,6 +17,7 @@ NeXusDetectorName, SampleRun, TimeOfFlightLookupTableFilename, + UncertaintyBroadcastMode, ) @@ -34,6 +35,7 @@ def energy_data( workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() + workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop return workflow.compute(EnergyQDetector[SampleRun]) @@ -62,9 +64,9 @@ def test_cut_along_q_norm_and_energy_transfer_preserves_counts( ) # Verify no counts were lost during the cut - total_counts_before = sc.sum(energy_data.bins.size()).value - total_counts_after = sc.sum(cut_data).value - assert total_counts_before == total_counts_after + total_counts_before = sc.sum(energy_data.sum()) + total_counts_after = sc.sum(cut_data) + sc.testing.assert_allclose(total_counts_before, total_counts_after) def test_cut_along_qx_direction_preserves_counts( @@ -90,6 +92,6 @@ def test_cut_along_qx_direction_preserves_counts( ) # Verify no counts were lost during the cut - total_counts_before = sc.sum(energy_data.bins.size()).value - total_counts_after = sc.sum(cut_data).value - assert total_counts_before == total_counts_after + total_counts_before = sc.sum(energy_data.sum()) + total_counts_after = sc.sum(cut_data) + sc.testing.assert_allclose(total_counts_before, total_counts_after) diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index b502b50a1..34e6d2753 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -33,6 +33,7 @@ SampleRun, SQWBinSizes, TimeOfFlightLookupTableFilename, + UncertaintyBroadcastMode, ) N_DETECTORS = 3 @@ -74,6 +75,7 @@ def common_workflow( wf[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() wf[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() wf[PreopenNeXusFile] = PreopenNeXusFile(True) + wf[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop wf[sqw.SqwIXSample] = sample wf[EnergyBins] = ENERGY_BIN_SIZE wf[SQWBinSizes] = BIN_SIZES diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py index d302af7e7..3a066116d 100644 --- a/packages/essspectroscopy/tests/bifrost/live_test.py +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -14,8 +14,10 @@ from ess.spectroscopy.types import ( Filename, NeXusDetectorName, + ProtonCharge, SampleRun, TimeOfFlightLookupTableFilename, + UncertaintyBroadcastMode, ) @@ -34,6 +36,8 @@ def qcut_workflow( workflow = BifrostQCutWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() + workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop + workflow[ProtonCharge[SampleRun]] = sc.DataArray(sc.scalar(1.0, unit='pC')) return workflow def test_cut_along_q_norm_and_energy_transfer( diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 0077cd9ee..bc395eb13 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -21,6 +21,7 @@ RawMonitor, SampleRun, TimeOfFlightLookupTableFilename, + UncertaintyBroadcastMode, WavelengthMonitor, ) @@ -37,6 +38,7 @@ def workflow(simulation_detector_names: list[NeXusDetectorName]) -> sciline.Pipe workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() + workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop return workflow @@ -95,8 +97,8 @@ def test_simulation_workflow_can_compute_wavelength_monitor( workflow: sciline.Pipeline, ) -> None: monitor = workflow.compute(WavelengthMonitor[SampleRun, FrameMonitor3]) - assert set(monitor.dims) == {'time', 'wavelength'} - expected_coords = {'position', 'wavelength', 'time'} + assert set(monitor.dims) == {'time', 'incident_wavelength'} + expected_coords = {'position', 'incident_wavelength', 'time'} assert expected_coords.issubset(monitor.coords) assert monitor.bins is None From 17297ed5e6f6cf2992cf2da4588451b6d45f1545 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 5 Dec 2025 09:04:16 +0100 Subject: [PATCH 276/330] Use explicit dim arg This is needed when the proton charge is not a scalar because `norm` will have multiple dimensions. --- packages/essspectroscopy/src/ess/bifrost/normalization.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/normalization.py b/packages/essspectroscopy/src/ess/bifrost/normalization.py index 223a788f0..ecd686c2a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/normalization.py +++ b/packages/essspectroscopy/src/ess/bifrost/normalization.py @@ -75,7 +75,9 @@ def normalize_by_monitor_and_proton_charge( norm = broadcast_uncertainties( norm, prototype=detector, mode=uncertainty_broadcast_mode ) - return NormalizedIncidentEnergyDetector[RunType](detector.bins / sc.lookup(norm)) + return NormalizedIncidentEnergyDetector[RunType]( + detector.bins / sc.lookup(norm, dim=monitor.dim) + ) def _monitor_distribution( From 774312f00fdccd778a66ee6bf982cb76e6fa2277 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 5 Dec 2025 09:04:27 +0100 Subject: [PATCH 277/330] Remove unused arg --- packages/essspectroscopy/src/ess/bifrost/normalization.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/normalization.py b/packages/essspectroscopy/src/ess/bifrost/normalization.py index ecd686c2a..074bf3b54 100644 --- a/packages/essspectroscopy/src/ess/bifrost/normalization.py +++ b/packages/essspectroscopy/src/ess/bifrost/normalization.py @@ -69,7 +69,7 @@ def normalize_by_monitor_and_proton_charge( detector = _mask_detector_for_norm(detector=detector, monitor=monitor) - norm = _monitor_distribution(detector=detector, monitor=monitor) + norm = _monitor_distribution(monitor=monitor) # Combine monitor and proton charge so we only operate on events once. norm *= proton_charge norm = broadcast_uncertainties( @@ -81,7 +81,6 @@ def normalize_by_monitor_and_proton_charge( def _monitor_distribution( - detector: sc.DataArray, monitor: sc.DataArray, ) -> sc.DataArray: coord = monitor.coords[monitor.dim] From 39a0c7f87e6b22ed48d7529c8d3810d4e9cc2ca5 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 8 Dec 2025 15:46:00 +0100 Subject: [PATCH 278/330] Update reference result --- packages/essspectroscopy/src/ess/bifrost/data.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 80c0dcc1f..7abfbe115 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -11,11 +11,10 @@ 'ess/bifrost', files={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated.h5": "blake2b:1ff82ef8b23fd9d20fb12efc5c541bb5a67ab7ea21a1b8d8c84d8e05fbf9fc66c3cd640bc80e508c9c24a1f6a21ac4c7c6ebb9494f7fc007e7af51453eb3c88a", # noqa: E501 - "computed_energy_data_simulated_5x2.h5": "blake2b:6ebaeee3d75bd61cc9ef15a593d2984bf1c0eb36423aee12310555ef80674edfaa0f910b721bd2161f4af011a4412e927b6b9a7dda8b08dd26f2d36f9452afe3", # noqa: E501 + "computed_energy_data_simulated_5x2.h5": "blake2b:d21290ab012268391785a83ee59d5aa24a9a230fb341f8defb1f2672bc374616423bc76908078af1ff686a0adb7fd408d70c3e9bd8aae23c1fdd8dcfffca2f23", # noqa: E501 "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 }, - version="5", + version="6", ) @@ -45,11 +44,6 @@ def tof_lookup_table_simulation() -> Path: return get_path("BIFROST-simulation-tof-lookup-table.h5") -def computed_energy_data_simulated() -> Path: - """Energy and momentum transfer computed from the simulated BIFROST data.""" - return get_path("computed_energy_data_simulated.h5") - - def computed_energy_data_simulated_5x2() -> Path: """Energy and momentum transfer computed from the simulated BIFROST data. @@ -60,7 +54,6 @@ def computed_energy_data_simulated_5x2() -> Path: __all__ = [ - "computed_energy_data_simulated", "computed_energy_data_simulated_5x2", "get_path", "simulated_elastic_incoherent_with_phonon", From 3e83ce025ce46a15d2ce27c576f74123f3364cf6 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 8 Dec 2025 15:46:34 +0100 Subject: [PATCH 279/330] Remove TODO comment --- .../essspectroscopy/src/ess/spectroscopy/indirect/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index ac9fa23e8..490c9c628 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -238,7 +238,7 @@ def add_incident_energy( transformed = data.transform_coords( [ 'incident_energy', - 'incident_wavelength', # TODO + 'incident_wavelength', # These are inputs, but we need them for binning: 'a3', 'a4', From d74b10a3fdb82e5ca21426663fa466d0374fcf14 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 16 Dec 2025 09:34:39 +0100 Subject: [PATCH 280/330] Do not expect source_position in monitor --- packages/essspectroscopy/tests/bifrost/workflow_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index bc395eb13..5f6a5af0e 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -61,8 +61,6 @@ def test_simulation_workflow_can_load_monitor(workflow: sciline.Pipeline) -> Non assert result.bins is None assert 'position' in result.coords - assert 'sample_position' not in result.coords - assert 'source_position' in result.coords def test_simulation_workflow_can_compute_energy_data( From f8968700e735992a4a360d592ea89207316ed79c Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Thu, 18 Dec 2025 11:00:03 +0100 Subject: [PATCH 281/330] deps: update to essreduce with monitor normalization --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- .../essspectroscopy/requirements/base.txt | 18 +++++++------- .../essspectroscopy/requirements/basetest.txt | 6 ++--- packages/essspectroscopy/requirements/ci.txt | 8 +++---- packages/essspectroscopy/requirements/dev.txt | 2 +- .../essspectroscopy/requirements/docs.txt | 12 ++++++---- .../essspectroscopy/requirements/mypy.txt | 4 ++-- .../essspectroscopy/requirements/nightly.txt | 24 +++++++++---------- .../essspectroscopy/requirements/static.txt | 6 ++--- 10 files changed, 42 insertions(+), 42 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 2136affa1..2485a3b95 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,7 +30,7 @@ requires-python = ">=3.11" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=25.11.0", + "essreduce>=25.11.3", "graphviz>=0.20", "pandas>=2.1.2", "sciline>=25.4.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index bf8fe9ae6..08b4c517d 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=25.11.0 +essreduce>=25.11.3 graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 160d8ad45..4012440d1 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:e92206a79ad15e448a68621a3e91eb81ab5255c2 +# SHA1:e0e70015d041082a1142f9dee041b256941ac8bb # # This file was generated by pip-compile-multi. # To update, run: @@ -21,9 +21,9 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==25.11.6 +essreduce==25.12.1 # via -r base.in -fonttools==4.61.0 +fonttools==4.61.1 # via matplotlib graphviz==0.21 # via -r base.in @@ -42,13 +42,13 @@ lazy-loader==0.4 # plopp # scippneutron # tof -matplotlib==3.10.7 +matplotlib==3.10.8 # via # mpltoolbox # plopp mpltoolbox==25.10.0 # via scippneutron -networkx==3.6 +networkx==3.6.1 # via cyclebane numpy==2.3.5 # via @@ -68,7 +68,7 @@ pandas==2.3.3 # via -r base.in pillow==12.0.0 # via matplotlib -platformdirs==4.5.0 +platformdirs==4.5.1 # via pooch plopp==25.11.0 # via @@ -117,7 +117,7 @@ scipy==1.16.3 # scippnexus six==1.17.0 # via python-dateutil -tof==25.12.0 +tof==25.12.1 # via -r base.in typing-extensions==4.15.0 # via @@ -126,7 +126,7 @@ typing-extensions==4.15.0 # typing-inspection typing-inspection==0.4.2 # via pydantic -tzdata==2025.2 +tzdata==2025.3 # via pandas -urllib3==2.5.0 +urllib3==2.6.2 # via requests diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 92f0b2a49..52f848df2 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -17,7 +17,7 @@ packaging==25.0 # via # pooch # pytest -platformdirs==4.5.0 +platformdirs==4.5.1 # via pooch pluggy==1.6.0 # via pytest @@ -25,9 +25,9 @@ pooch==1.8.2 # via -r basetest.in pygments==2.19.2 # via pytest -pytest==9.0.1 +pytest==9.0.2 # via -r basetest.in requests==2.32.5 # via pooch -urllib3==2.5.0 +urllib3==2.6.2 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 4b49511f9..685f1892f 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,7 +5,7 @@ # # requirements upgrade # -cachetools==6.2.2 +cachetools==6.2.4 # via tox certifi==2025.11.12 # via requests @@ -17,7 +17,7 @@ colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.20.0 +filelock==3.20.1 # via # tox # virtualenv @@ -32,7 +32,7 @@ packaging==25.0 # -r ci.in # pyproject-api # tox -platformdirs==4.5.0 +platformdirs==4.5.1 # via # tox # virtualenv @@ -46,7 +46,7 @@ smmap==5.0.2 # via gitdb tox==4.32.0 # via -r ci.in -urllib3==2.5.0 +urllib3==2.6.2 # via requests virtualenv==20.35.4 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index a48697dd3..e20e9798f 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -69,7 +69,7 @@ jupyter-server==2.17.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.5.0 +jupyterlab==4.5.1 # via -r dev.in jupyterlab-server==2.28.0 # via jupyterlab diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 38da97c0b..731fc07c0 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -32,7 +32,7 @@ comm==0.2.3 # via # ipykernel # ipywidgets -debugpy==1.8.17 +debugpy==1.8.19 # via ipykernel decorator==5.2.1 # via ipython @@ -54,7 +54,7 @@ ipykernel==7.1.0 # via -r docs.in ipympl==0.9.8 # via -r docs.in -ipython==9.7.0 +ipython==9.8.0 # via # -r docs.in # ipykernel @@ -78,7 +78,7 @@ jsonschema==4.25.1 # via nbformat jsonschema-specifications==2025.9.1 # via jsonschema -jupyter-client==8.6.3 +jupyter-client==8.7.0 # via # ipykernel # nbclient @@ -164,7 +164,9 @@ referencing==0.37.0 # via # jsonschema # jsonschema-specifications -roman-numerals-py==3.1.0 +roman-numerals==4.1.0 + # via roman-numerals-py +roman-numerals-py==4.1.0 # via sphinx rpds-py==0.30.0 # via @@ -206,7 +208,7 @@ stack-data==0.6.3 # via ipython tinycss2==1.4.0 # via bleach -tornado==6.5.2 +tornado==6.5.4 # via # ipykernel # jupyter-client diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index b8f2d76fd..71c3036dd 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,9 +6,9 @@ # requirements upgrade # -r test.txt -librt==0.6.3 +librt==0.7.4 # via mypy -mypy==1.19.0 +mypy==1.19.1 # via -r mypy.in mypy-extensions==1.1.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index f3bd6432d..056535bb0 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -26,7 +26,7 @@ email-validator==2.3.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -fonttools==4.61.0 +fonttools==4.61.1 # via matplotlib graphviz==0.21 # via -r nightly.in @@ -47,15 +47,15 @@ lazy-loader==0.4 # plopp # scippneutron # tof -matplotlib==3.10.7 +matplotlib==3.10.8 # via # mpltoolbox # plopp mpltoolbox==25.10.0 # via scippneutron -networkx==3.6 +networkx==3.6.1 # via cyclebane -numpy==2.3.5 +numpy==2.4.0rc1 # via # contourpy # h5py @@ -70,11 +70,11 @@ packaging==25.0 # matplotlib # pooch # pytest -pandas==2.3.3 +pandas==3.0.0rc0 # via -r nightly.in pillow==12.0.0 # via matplotlib -platformdirs==4.5.0 +platformdirs==4.5.1 # via pooch plopp @ git+https://github.com/scipp/plopp@main # via @@ -95,15 +95,13 @@ pygments==2.19.2 # via pytest pyparsing==3.3.0b1 # via matplotlib -pytest==9.0.1 +pytest==9.0.2 # via -r nightly.in python-dateutil==2.9.0.post0 # via # matplotlib # pandas # scippneutron -pytz==2025.2 - # via pandas requests==2.32.5 # via pooch sciline @ git+https://github.com/scipp/sciline@main @@ -126,13 +124,13 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.16.3 +scipy==1.17.0rc1 # via # scippneutron # scippnexus six==1.17.0 # via python-dateutil -tof==25.12.0 +tof==25.12.1 # via -r nightly.in typing-extensions==4.15.0 # via @@ -141,7 +139,7 @@ typing-extensions==4.15.0 # typing-inspection typing-inspection==0.4.2 # via pydantic -tzdata==2025.2 +tzdata==2025.3 # via pandas -urllib3==2.5.0 +urllib3==2.6.2 # via requests diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 4cc95f112..c71d195da 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,15 +9,15 @@ cfgv==3.5.0 # via pre-commit distlib==0.4.0 # via virtualenv -filelock==3.20.0 +filelock==3.20.1 # via virtualenv identify==2.6.15 # via pre-commit nodeenv==1.9.1 # via pre-commit -platformdirs==4.5.0 +platformdirs==4.5.1 # via virtualenv -pre-commit==4.5.0 +pre-commit==4.5.1 # via -r static.in pyyaml==6.0.3 # via pre-commit From 773349b3bffdf7bc22b7f5c04f7f6a40ddf1cdf1 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Fri, 19 Dec 2025 10:56:56 +0100 Subject: [PATCH 282/330] fix: use same source position for monitor and detector --- .../user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb index 1af980601..430814d19 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb @@ -100,7 +100,7 @@ " 'source_position': lambda: source_position,\n", "}\n", "\n", - "l_monitor = sc.norm(monitor.coords['source_position'] - monitor.coords['position'])\n", + "l_monitor = sc.norm(source_position - monitor.coords['position'])\n", "l_min = l_monitor\n", "l_max = detector.transform_coords('Ltotal', graph=graph).coords['Ltotal'].max()" ] @@ -240,7 +240,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.14" } }, "nbformat": 4, From 944776bdef2eef263c2cdd254dad594bd77319f6 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Fri, 19 Dec 2025 11:07:21 +0100 Subject: [PATCH 283/330] deps: bump tof pin --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- packages/essspectroscopy/requirements/base.txt | 4 ++-- packages/essspectroscopy/requirements/docs.txt | 2 +- packages/essspectroscopy/requirements/nightly.in | 2 +- packages/essspectroscopy/requirements/nightly.txt | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 2485a3b95..a9fd57c68 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -37,7 +37,7 @@ dependencies = [ "scipp>=25.3.0", "scippneutron>=25.11.2", "scippnexus>=24.9.0", - "tof>=25.01.2", + "tof>=25.11.0", ] dynamic = ["version"] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 08b4c517d..34313be98 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -9,4 +9,4 @@ sciline>=25.4.1 scipp>=25.3.0 scippneutron>=25.11.2 scippnexus>=24.9.0 -tof>=25.01.2 +tof>=25.11.0 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 4012440d1..8dfea6e9b 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:e0e70015d041082a1142f9dee041b256941ac8bb +# SHA1:a63ce0b5579825930c99f7b52801c19375eb6ba5 # # This file was generated by pip-compile-multi. # To update, run: @@ -95,7 +95,7 @@ sciline==25.11.1 # via # -r base.in # essreduce -scipp==25.11.0 +scipp==25.12.0 # via # -r base.in # essreduce diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 731fc07c0..74bd0543c 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -174,7 +174,7 @@ rpds-py==0.30.0 # referencing snowballstemmer==3.0.1 # via sphinx -soupsieve==2.8 +soupsieve==2.8.1 # via beautifulsoup4 sphinx==8.2.3 # via diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in index 9a24172c6..119483576 100644 --- a/packages/essspectroscopy/requirements/nightly.in +++ b/packages/essspectroscopy/requirements/nightly.in @@ -3,7 +3,7 @@ # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! graphviz>=0.20 pandas>=2.1.2 -tof>=25.01.2 +tof>=25.11.0 pooch>=1.5 pytest>=7.0 scipp diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 056535bb0..1be5cb94d 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -1,4 +1,4 @@ -# SHA1:7d08a7086e92d4d2bc1b09d8d1155aeff9738feb +# SHA1:9b1692fb41c64dc77e48768f164de76a70e84da6 # # This file was generated by pip-compile-multi. # To update, run: From 75a01de48da55bc10beabdf4b1af18ff668b3a7c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 21 Jan 2026 10:07:35 +0100 Subject: [PATCH 284/330] Update dependencies --- .../essspectroscopy/requirements/base.txt | 18 ++++++------ .../essspectroscopy/requirements/basetest.txt | 4 +-- packages/essspectroscopy/requirements/ci.txt | 12 ++++---- packages/essspectroscopy/requirements/dev.txt | 18 ++++++------ .../essspectroscopy/requirements/docs.txt | 28 +++++++++---------- .../essspectroscopy/requirements/mypy.txt | 4 +-- .../essspectroscopy/requirements/nightly.txt | 21 +++++++------- .../essspectroscopy/requirements/static.txt | 8 +++--- .../essspectroscopy/requirements/wheels.txt | 2 +- 9 files changed, 56 insertions(+), 59 deletions(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 8dfea6e9b..4485d0987 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -7,7 +7,7 @@ # annotated-types==0.7.0 # via pydantic -certifi==2025.11.12 +certifi==2026.1.4 # via requests charset-normalizer==3.4.4 # via requests @@ -21,7 +21,7 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==25.12.1 +essreduce==26.1.1 # via -r base.in fonttools==4.61.1 # via matplotlib @@ -50,7 +50,7 @@ mpltoolbox==25.10.0 # via scippneutron networkx==3.6.1 # via cyclebane -numpy==2.3.5 +numpy==2.4.1 # via # contourpy # h5py @@ -66,7 +66,7 @@ packaging==25.0 # pooch pandas==2.3.3 # via -r base.in -pillow==12.0.0 +pillow==12.1.0 # via matplotlib platformdirs==4.5.1 # via pooch @@ -80,7 +80,7 @@ pydantic==2.12.5 # via scippneutron pydantic-core==2.41.5 # via pydantic -pyparsing==3.2.5 +pyparsing==3.3.2 # via matplotlib python-dateutil==2.9.0.post0 # via @@ -106,18 +106,18 @@ scippneutron==25.11.2 # via # -r base.in # essreduce -scippnexus==25.11.0 +scippnexus==26.1.0 # via # -r base.in # essreduce # scippneutron -scipy==1.16.3 +scipy==1.17.0 # via # scippneutron # scippnexus six==1.17.0 # via python-dateutil -tof==25.12.1 +tof==26.1.0 # via -r base.in typing-extensions==4.15.0 # via @@ -128,5 +128,5 @@ typing-inspection==0.4.2 # via pydantic tzdata==2025.3 # via pandas -urllib3==2.6.2 +urllib3==2.6.3 # via requests diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 52f848df2..9e4acb75e 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,7 +5,7 @@ # # requirements upgrade # -certifi==2025.11.12 +certifi==2026.1.4 # via requests charset-normalizer==3.4.4 # via requests @@ -29,5 +29,5 @@ pytest==9.0.2 # via -r basetest.in requests==2.32.5 # via pooch -urllib3==2.6.2 +urllib3==2.6.3 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 685f1892f..75ea55d34 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -7,7 +7,7 @@ # cachetools==6.2.4 # via tox -certifi==2025.11.12 +certifi==2026.1.4 # via requests chardet==5.2.0 # via tox @@ -17,13 +17,13 @@ colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.20.1 +filelock==3.20.3 # via # tox # virtualenv gitdb==4.0.12 # via gitpython -gitpython==3.1.45 +gitpython==3.1.46 # via -r ci.in idna==3.11 # via requests @@ -44,9 +44,9 @@ requests==2.32.5 # via -r ci.in smmap==5.0.2 # via gitdb -tox==4.32.0 +tox==4.34.1 # via -r ci.in -urllib3==2.6.2 +urllib3==2.6.3 # via requests -virtualenv==20.35.4 +virtualenv==20.36.1 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index e20e9798f..6694c3742 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -12,7 +12,7 @@ -r static.txt -r test.txt -r wheels.txt -anyio==4.12.0 +anyio==4.12.1 # via # httpx # jupyter-server @@ -22,7 +22,7 @@ argon2-cffi-bindings==25.1.0 # via argon2-cffi arrow==1.4.0 # via isoduration -async-lru==2.0.5 +async-lru==2.1.0 # via jupyterlab cffi==2.0.0 # via argon2-cffi-bindings @@ -30,7 +30,7 @@ click==8.3.1 # via # pip-compile-multi # pip-tools -copier==9.11.0 +copier==9.11.2 # via -r dev.in dunamai==1.25.0 # via copier @@ -48,11 +48,11 @@ isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.12.1 +json5==0.13.0 # via jupyterlab-server jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.25.1 +jsonschema[format-nongpl]==4.26.0 # via # jupyter-events # jupyterlab-server @@ -67,9 +67,9 @@ jupyter-server==2.17.0 # jupyterlab # jupyterlab-server # notebook-shim -jupyter-server-terminals==0.5.3 +jupyter-server-terminals==0.5.4 # via jupyter-server -jupyterlab==4.5.1 +jupyterlab==4.5.2 # via -r dev.in jupyterlab-server==2.28.0 # via jupyterlab @@ -85,7 +85,7 @@ pip-tools==7.5.2 # via pip-compile-multi plumbum==1.10.0 # via copier -prometheus-client==0.23.1 +prometheus-client==0.24.1 # via jupyter-server pycparser==2.23 # via cffi @@ -103,7 +103,7 @@ rfc3986-validator==0.1.1 # jupyter-events rfc3987-syntax==1.1.0 # via jsonschema -send2trash==1.8.3 +send2trash==2.1.0 # via jupyter-server terminado==0.18.1 # via diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 74bd0543c..ab8ea5fba 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -38,7 +38,7 @@ decorator==5.2.1 # via ipython defusedxml==0.7.1 # via nbconvert -docutils==0.21.2 +docutils==0.22.4 # via # myst-parser # nbsphinx @@ -54,7 +54,7 @@ ipykernel==7.1.0 # via -r docs.in ipympl==0.9.8 # via -r docs.in -ipython==9.8.0 +ipython==9.9.0 # via # -r docs.in # ipykernel @@ -74,11 +74,11 @@ jinja2==3.1.6 # nbconvert # nbsphinx # sphinx -jsonschema==4.25.1 +jsonschema==4.26.0 # via nbformat jsonschema-specifications==2025.9.1 # via jsonschema -jupyter-client==8.7.0 +jupyter-client==8.8.0 # via # ipykernel # nbclient @@ -93,7 +93,7 @@ jupyterlab-pygments==0.3.0 # via nbconvert jupyterlab-widgets==3.0.16 # via ipywidgets -markdown-it-py==3.0.0 +markdown-it-py==4.0.0 # via # mdit-py-plugins # myst-parser @@ -109,11 +109,11 @@ mdit-py-plugins==0.5.0 # via myst-parser mdurl==0.1.2 # via markdown-it-py -mistune==3.1.4 +mistune==3.2.0 # via nbconvert -myst-parser==4.0.1 +myst-parser==5.0.0 # via -r docs.in -nbclient==0.10.2 +nbclient==0.10.4 # via nbconvert nbconvert==7.16.6 # via nbsphinx @@ -134,7 +134,7 @@ pexpect==4.9.0 # via ipython prompt-toolkit==3.0.52 # via ipython -psutil==7.1.3 +psutil==7.2.1 # via ipykernel ptyprocess==0.7.0 # via pexpect @@ -165,8 +165,6 @@ referencing==0.37.0 # jsonschema # jsonschema-specifications roman-numerals==4.1.0 - # via roman-numerals-py -roman-numerals-py==4.1.0 # via sphinx rpds-py==0.30.0 # via @@ -174,9 +172,9 @@ rpds-py==0.30.0 # referencing snowballstemmer==3.0.1 # via sphinx -soupsieve==2.8.1 +soupsieve==2.8.3 # via beautifulsoup4 -sphinx==8.2.3 +sphinx==9.0.4 # via # -r docs.in # autodoc-pydantic @@ -186,11 +184,11 @@ sphinx==8.2.3 # sphinx-autodoc-typehints # sphinx-copybutton # sphinx-design -sphinx-autodoc-typehints==3.5.2 +sphinx-autodoc-typehints==3.6.1 # via -r docs.in sphinx-copybutton==0.5.2 # via -r docs.in -sphinx-design==0.6.1 +sphinx-design==0.7.0 # via -r docs.in sphinxcontrib-applehelp==2.0.0 # via sphinx diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 71c3036dd..2ee61c57e 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,11 +6,11 @@ # requirements upgrade # -r test.txt -librt==0.7.4 +librt==0.7.8 # via mypy mypy==1.19.1 # via -r mypy.in mypy-extensions==1.1.0 # via mypy -pathspec==0.12.1 +pathspec==1.0.3 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 1be5cb94d..f5326e4e5 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -10,7 +10,7 @@ annotated-types==0.7.0 # via pydantic -certifi==2025.11.12 +certifi==2026.1.4 # via requests charset-normalizer==3.4.4 # via requests @@ -55,24 +55,25 @@ mpltoolbox==25.10.0 # via scippneutron networkx==3.6.1 # via cyclebane -numpy==2.4.0rc1 +numpy==2.3.5 # via # contourpy + # essreduce # h5py # matplotlib # pandas # scipp # scippneutron # scipy -packaging==25.0 +packaging==26.0rc3 # via # lazy-loader # matplotlib # pooch # pytest -pandas==3.0.0rc0 +pandas==3.0.0rc2 # via -r nightly.in -pillow==12.0.0 +pillow==12.1.0 # via matplotlib platformdirs==4.5.1 # via pooch @@ -93,7 +94,7 @@ pydantic-core==2.41.5 # via pydantic pygments==2.19.2 # via pytest -pyparsing==3.3.0b1 +pyparsing==3.3.2 # via matplotlib pytest==9.0.2 # via -r nightly.in @@ -124,13 +125,13 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.17.0rc1 +scipy==1.17.0 # via # scippneutron # scippnexus six==1.17.0 # via python-dateutil -tof==25.12.1 +tof==26.1.0 # via -r nightly.in typing-extensions==4.15.0 # via @@ -139,7 +140,5 @@ typing-extensions==4.15.0 # typing-inspection typing-inspection==0.4.2 # via pydantic -tzdata==2025.3 - # via pandas -urllib3==2.6.2 +urllib3==2.6.3 # via requests diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index c71d195da..75cd3c9bc 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,11 +9,11 @@ cfgv==3.5.0 # via pre-commit distlib==0.4.0 # via virtualenv -filelock==3.20.1 +filelock==3.20.3 # via virtualenv -identify==2.6.15 +identify==2.6.16 # via pre-commit -nodeenv==1.9.1 +nodeenv==1.10.0 # via pre-commit platformdirs==4.5.1 # via virtualenv @@ -21,5 +21,5 @@ pre-commit==4.5.1 # via -r static.in pyyaml==6.0.3 # via pre-commit -virtualenv==20.35.4 +virtualenv==20.36.1 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 3558aae2e..3e37dfedc 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -5,7 +5,7 @@ # # requirements upgrade # -build==1.3.0 +build==1.4.0 # via -r wheels.in packaging==25.0 # via build From ef1ada2855e4fbf2d37f912db63d9e9ece6efbb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:32:22 +0000 Subject: [PATCH 285/330] Bump scipp from 25.12.0 to 26.1.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 25.12.0 to 26.1.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/25.12.0...26.1.0) --- updated-dependencies: - dependency-name: scipp dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 4485d0987..1da655184 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -95,7 +95,7 @@ sciline==25.11.1 # via # -r base.in # essreduce -scipp==25.12.0 +scipp==26.1.0 # via # -r base.in # essreduce From d945e06af0f8030eef805231b1b4f0d457983006 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 29 Jan 2026 07:39:57 +0100 Subject: [PATCH 286/330] Drop coords in tests of cut --- packages/essspectroscopy/tests/bifrost/cutting_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py index 71e8020e6..c13d5a24a 100644 --- a/packages/essspectroscopy/tests/bifrost/cutting_test.py +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -65,6 +65,8 @@ def test_cut_along_q_norm_and_energy_transfer_preserves_counts( # Verify no counts were lost during the cut total_counts_before = sc.sum(energy_data.sum()) + # Remove left over scalar coords that are dropped by `cut`: + total_counts_before = total_counts_before.drop_coords(total_counts_before.coords) total_counts_after = sc.sum(cut_data) sc.testing.assert_allclose(total_counts_before, total_counts_after) @@ -93,5 +95,7 @@ def test_cut_along_qx_direction_preserves_counts( # Verify no counts were lost during the cut total_counts_before = sc.sum(energy_data.sum()) + # Remove left over scalar coords that are dropped by `cut`: + total_counts_before = total_counts_before.drop_coords(total_counts_before.coords) total_counts_after = sc.sum(cut_data) sc.testing.assert_allclose(total_counts_before, total_counts_after) From 39a0f20168a222a0ead101c62c92a33d842b120b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Feb 2026 12:52:46 +0000 Subject: [PATCH 287/330] Bump scipp from 26.1.0 to 26.1.1 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 26.1.0 to 26.1.1. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/26.1.0...26.1.1) --- updated-dependencies: - dependency-name: scipp dependency-version: 26.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 1da655184..df9199951 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -95,7 +95,7 @@ sciline==25.11.1 # via # -r base.in # essreduce -scipp==26.1.0 +scipp==26.1.1 # via # -r base.in # essreduce From a52fbf6ddd47303d9e9e41667c420766253ed9e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 11:34:14 +0000 Subject: [PATCH 288/330] Bump scipp from 26.1.1 to 26.2.0 in /requirements Bumps [scipp](https://github.com/scipp/scipp) from 26.1.1 to 26.2.0. - [Release notes](https://github.com/scipp/scipp/releases) - [Commits](https://github.com/scipp/scipp/compare/26.1.1...26.2.0) --- updated-dependencies: - dependency-name: scipp dependency-version: 26.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/essspectroscopy/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index df9199951..13df1edfa 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -95,7 +95,7 @@ sciline==25.11.1 # via # -r base.in # essreduce -scipp==26.1.1 +scipp==26.2.0 # via # -r base.in # essreduce From eac1f14f9ec38a5ed697c2e91c327cf1f5b4fd64 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Mar 2026 10:36:07 +0100 Subject: [PATCH 289/330] Use new error limited tof table --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 2 +- .../bifrost-make-tof-lookup-table.ipynb | 4 +- .../bifrost/bifrost-reduction.ipynb | 14 ++++-- .../bifrost/single_crystal/time_of_flight.py | 6 ++- .../spectroscopy/indirect/time_of_flight.py | 47 +++++++++++++++++-- .../src/ess/spectroscopy/types.py | 6 ++- .../tests/bifrost/cutting_test.py | 10 +++- .../tests/bifrost/io/sqw_test.py | 9 +++- .../tests/bifrost/live_test.py | 10 +++- .../tests/bifrost/workflow_test.py | 10 +++- .../tools/docs/bifrost-thumbnails.ipynb | 2 +- 11 files changed, 99 insertions(+), 21 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index de9a94d0b..2b760ffe7 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -58,7 +58,7 @@ "source": [ "workflow = BifrostSimulationBraggPeakMonitorWorkflow()\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()" + "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()" ] }, { diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb index 430814d19..d362fe8d2 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb @@ -173,7 +173,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow.visualize(TimeOfFlightLookupTable, graph_attr={\"rankdir\": \"LR\"})" + "workflow.visualize(TofLookupTable, graph_attr={\"rankdir\": \"LR\"})" ] }, { @@ -191,7 +191,7 @@ "metadata": {}, "outputs": [], "source": [ - "table = workflow.compute(TimeOfFlightLookupTable)\n", + "table = workflow.compute(TofLookupTable)\n", "table" ] }, diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index d93a6b58a..e03c87a32 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -18,6 +18,7 @@ "metadata": {}, "outputs": [], "source": [ + "import numpy as np\n", "import scipp as sc\n", "import sciline\n", "import scippnexus as snx\n", @@ -90,7 +91,13 @@ "# Set the input file name:\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", "# Set the lookup table for frame unwrapping:\n", - "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", + "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()\n", + "# Set thresholds to mask ToF regions with large uncertainties.\n", + "# FOr this example, we do not mask anything:\n", + "workflow[LookupTableRelativeErrorThreshold] = {\n", + " 'detector': np.inf,\n", + " '110_frame_3': np.inf,\n", + "}\n", "# We need to read many objects from the file,\n", "# keeping it open improves performance: (optional)\n", "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)\n", @@ -104,8 +111,9 @@ "metadata": {}, "source": [ "Next, draw the workflow as a graph to inspect the steps it will take to reduce the data.\n", - "Note the groups where entries are labeled with `triplet=x`. (These labels will be `dim_0=x` if you don't have [Pandas](https://pandas.pydata.org/) installed.)\n", - "In this example, there are only two triplets but, as explained above, in a realistic case, there would be 45." + "\n", + "Note the groups where entries are labeled with `(triplet)`. (These labels will be `(dim_0)` if you don't have [Pandas](https://pandas.pydata.org/) installed.)\n", + "These groups indicate functions that are applied separately to each detector triplet." ] }, { diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py index 3dd4beef4..250ea0e2d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py @@ -3,21 +3,23 @@ """Utilities for computing real neutron time-of-flight.""" +import scippnexus as snx + from ess.reduce import time_of_flight as reduce_time_of_flight from ess.reduce.time_of_flight.types import DetectorLtotal from ess.spectroscopy.types import ( DataGroupedByRotation, + ErrorLimitedTofLookupTable, PulseStrideOffset, RawDetector, RunType, - TimeOfFlightLookupTable, TofDetector, ) def detector_time_of_flight_data( sample_data: DataGroupedByRotation[RunType], - lookup: TimeOfFlightLookupTable, + lookup: ErrorLimitedTofLookupTable[snx.NXdetector], ltotal: DetectorLtotal[RunType], pulse_stride_offset: PulseStrideOffset, ) -> TofDetector[RunType]: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index c674b6ebf..02df529c4 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -6,21 +6,25 @@ from collections.abc import Iterable import sciline +import scippnexus as snx from ess.reduce import time_of_flight as reduce_time_of_flight from ess.reduce.time_of_flight.types import DetectorLtotal from ..types import ( DataAtSample, + ErrorLimitedTofLookupTable, + LookupTableRelativeErrorThreshold, MonitorCoordTransformGraph, MonitorLtotal, MonitorType, + NeXusDetectorName, PulseStrideOffset, RawDetector, RawMonitor, RunType, - TimeOfFlightLookupTable, TofDetector, + TofLookupTable, TofMonitor, ) @@ -41,7 +45,7 @@ def TofWorkflow( def detector_time_of_flight_data( sample_data: DataAtSample[RunType], - lookup: TimeOfFlightLookupTable, + lookup: ErrorLimitedTofLookupTable[snx.NXdetector], pulse_stride_offset: PulseStrideOffset, ) -> TofDetector[RunType]: """ @@ -67,7 +71,7 @@ def detector_time_of_flight_data( def monitor_time_of_flight_data( monitor_data: RawMonitor[RunType, MonitorType], - lookup: TimeOfFlightLookupTable, + lookup: ErrorLimitedTofLookupTable[snx.NXdetector], ltotal: MonitorLtotal[RunType, MonitorType], pulse_stride_offset: PulseStrideOffset, ) -> TofMonitor[RunType, MonitorType]: @@ -105,9 +109,46 @@ def compute_monitor_ltotal( ) +def mask_large_uncertainty_in_lut_detector( + table: TofLookupTable, + error_threshold: LookupTableRelativeErrorThreshold, +) -> ErrorLimitedTofLookupTable[snx.NXdetector]: + """ + Mask regions in the time-of-flight lookup table with large uncertainty using NaNs. + + The threshold is looked up under the key ``'detector'``. + The same threshold is applied to all triplets. + + Parameters + ---------- + table: + Lookup table with time-of-flight as a function of distance and time-of-arrival. + error_threshold: + Threshold for the relative standard deviation (coefficient of variation) of the + projected time-of-flight above which values are masked. + + See also + -------- + essreduce.time_of_flight.mask_large_uncertainty_in_lut: + The underlying implementation. + """ + from ess.reduce.time_of_flight.eto_to_tof import ( + mask_large_uncertainty_in_lut_detector, + ) + + return ErrorLimitedTofLookupTable[snx.NXdetector]( + mask_large_uncertainty_in_lut_detector( + table=table, + error_threshold=error_threshold, + detector_name=NeXusDetectorName('detector'), + ) + ) + + providers = ( compute_monitor_ltotal, detector_time_of_flight_data, + mask_large_uncertainty_in_lut_detector, monitor_time_of_flight_data, ) """Providers for time-of-flight calculation on indirect geometry spectrometers. diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 4329e1a22..1f4900a8d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -56,11 +56,15 @@ TofDetector = time_of_flight.TofDetector TofMonitor = time_of_flight.TofMonitor +LookupTableRelativeErrorThreshold = time_of_flight.LookupTableRelativeErrorThreshold MonitorLtotal = time_of_flight.MonitorLtotal PulseStride = time_of_flight.PulseStride PulseStrideOffset = time_of_flight.PulseStrideOffset PulsePeriod = time_of_flight.PulsePeriod -TimeOfFlightLookupTable = time_of_flight.TimeOfFlightLookupTable +ErrorLimitedTofLookupTable = time_of_flight.ErrorLimitedTofLookupTable +TofLookupTable = time_of_flight.TofLookupTable +TofLookupTableFilename = time_of_flight.TofLookupTableFilename +# Legacy alias: TimeOfFlightLookupTableFilename = time_of_flight.TimeOfFlightLookupTableFilename # Custom types diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py index c13d5a24a..406aff239 100644 --- a/packages/essspectroscopy/tests/bifrost/cutting_test.py +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +import numpy as np import pytest import scipp as sc import scipp.testing @@ -14,9 +15,10 @@ from ess.spectroscopy.types import ( EnergyQDetector, Filename, + LookupTableRelativeErrorThreshold, NeXusDetectorName, SampleRun, - TimeOfFlightLookupTableFilename, + TofLookupTableFilename, UncertaintyBroadcastMode, ) @@ -34,7 +36,11 @@ def energy_data( ) -> EnergyQDetector[SampleRun]: workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() + workflow[TofLookupTableFilename] = tof_lookup_table_simulation() + workflow[LookupTableRelativeErrorThreshold] = { + 'detector': np.inf, + '110_frame_3': np.inf, + } workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop return workflow.compute(EnergyQDetector[SampleRun]) diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index 34e6d2753..72d2f49fc 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -27,12 +27,13 @@ from ess.spectroscopy.types import ( EnergyBins, Filename, + LookupTableRelativeErrorThreshold, NeXusDetectorName, OutFilename, PreopenNeXusFile, SampleRun, SQWBinSizes, - TimeOfFlightLookupTableFilename, + TofLookupTableFilename, UncertaintyBroadcastMode, ) @@ -73,7 +74,11 @@ def common_workflow( wf = bifrost.BifrostSimulationWorkflow(detector_names) wf[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - wf[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() + wf[TofLookupTableFilename] = tof_lookup_table_simulation() + wf[LookupTableRelativeErrorThreshold] = { + 'detector': np.inf, + '110_frame_3': np.inf, + } wf[PreopenNeXusFile] = PreopenNeXusFile(True) wf[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop wf[sqw.SqwIXSample] = sample diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py index 3a066116d..dc690939b 100644 --- a/packages/essspectroscopy/tests/bifrost/live_test.py +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +import numpy as np import pytest import sciline import scipp as sc @@ -13,10 +14,11 @@ from ess.bifrost.live import BifrostQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData from ess.spectroscopy.types import ( Filename, + LookupTableRelativeErrorThreshold, NeXusDetectorName, ProtonCharge, SampleRun, - TimeOfFlightLookupTableFilename, + TofLookupTableFilename, UncertaintyBroadcastMode, ) @@ -35,7 +37,11 @@ def qcut_workflow( ) -> sciline.Pipeline: workflow = BifrostQCutWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() + workflow[TofLookupTableFilename] = tof_lookup_table_simulation() + workflow[LookupTableRelativeErrorThreshold] = { + 'detector': np.inf, + '110_frame_3': np.inf, + } workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop workflow[ProtonCharge[SampleRun]] = sc.DataArray(sc.scalar(1.0, unit='pC')) return workflow diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 5f6a5af0e..f0b45c848 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +import numpy as np import pytest import sciline import scipp as sc @@ -16,11 +17,12 @@ EnergyQDetector, Filename, FrameMonitor3, + LookupTableRelativeErrorThreshold, NeXusDetectorName, RawDetector, RawMonitor, SampleRun, - TimeOfFlightLookupTableFilename, + TofLookupTableFilename, UncertaintyBroadcastMode, WavelengthMonitor, ) @@ -37,7 +39,11 @@ def simulation_detector_names() -> list[NeXusDetectorName]: def workflow(simulation_detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation() + workflow[TofLookupTableFilename] = tof_lookup_table_simulation() + workflow[LookupTableRelativeErrorThreshold] = { + 'detector': np.inf, + '110_frame_3': np.inf, + } workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop return workflow diff --git a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb index d62fca414..5fcdacb88 100644 --- a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb +++ b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb @@ -54,7 +54,7 @@ "source": [ "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TimeOfFlightLookupTableFilename] = tof_lookup_table_simulation()\n", + "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()\n", "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)" ] }, From d8f1ed935977ad327212d99116d89de2bc45cdda Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Mar 2026 10:44:37 +0100 Subject: [PATCH 290/330] Require essreduce>=26.3.1 Needed for new lookup table error masking. --- packages/essspectroscopy/pyproject.toml | 42 ++++++++--------- packages/essspectroscopy/requirements/base.in | 2 +- .../essspectroscopy/requirements/base.txt | 46 +++++++++---------- .../essspectroscopy/requirements/basetest.txt | 10 ++-- packages/essspectroscopy/requirements/ci.txt | 26 ++++++----- packages/essspectroscopy/requirements/dev.txt | 16 ++++--- .../essspectroscopy/requirements/docs.txt | 26 +++++------ .../essspectroscopy/requirements/mypy.txt | 4 +- .../essspectroscopy/requirements/nightly.txt | 35 +++++++------- .../essspectroscopy/requirements/static.txt | 18 +++++--- .../essspectroscopy/requirements/wheels.txt | 2 +- 11 files changed, 117 insertions(+), 110 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index a9fd57c68..2fd82fd26 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -1,7 +1,7 @@ [build-system] requires = [ - "setuptools>=77", - "setuptools_scm[toml]>=8.0", + "setuptools>=77", + "setuptools_scm[toml]>=8.0", ] build-backend = "setuptools.build_meta" @@ -30,14 +30,14 @@ requires-python = ">=3.11" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=25.11.3", - "graphviz>=0.20", - "pandas>=2.1.2", - "sciline>=25.4.1", - "scipp>=25.3.0", - "scippneutron>=25.11.2", - "scippnexus>=24.9.0", - "tof>=25.11.0", + "essreduce>=26.3.1", + "graphviz>=0.20", + "pandas>=2.1.2", + "sciline>=25.4.1", + "scipp>=25.3.0", + "scippneutron>=25.11.2", + "scippnexus>=24.9.0", + "tof>=25.11.0", ] dynamic = ["version"] @@ -66,9 +66,9 @@ addopts = """ """ testpaths = "tests" filterwarnings = [ - "error", - # Plotting related warnings. - 'ignore:\n Sentinel is not a public part of the traitlets API:DeprecationWarning', + "error", + # Plotting related warnings. + 'ignore:\n Sentinel is not a public part of the traitlets API:DeprecationWarning', ] [tool.ruff] @@ -93,16 +93,16 @@ pydocstyle.convention = "numpy" [tool.ruff.lint.per-file-ignores] # those files have an increased risk of relying on import order "tests/*" = [ - "S101", # asserts are fine in tests - "B018", # 'useless expressions' are ok because some tests just check for exceptions + "S101", # asserts are fine in tests + "B018", # 'useless expressions' are ok because some tests just check for exceptions ] "*.ipynb" = [ - "E501", # longer lines are sometimes more readable - "F403", # *-imports used with domain types - "F405", # linter may fail to find names because of *-imports - "I", # we don't collect imports at the top - "S101", # asserts are used for demonstration and are safe in notebooks - "T201", # printing is ok for demonstration purposes + "E501", # longer lines are sometimes more readable + "F403", # *-imports used with domain types + "F405", # linter may fail to find names because of *-imports + "I", # we don't collect imports at the top + "S101", # asserts are used for demonstration and are safe in notebooks + "T201", # printing is ok for demonstration purposes ] [tool.ruff.format] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 34313be98..d7bb5480e 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=25.11.3 +essreduce>=26.3.1 graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 13df1edfa..4b2ceaaa9 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:a63ce0b5579825930c99f7b52801c19375eb6ba5 +# SHA1:c5c781acacd322b401c05178bfdba47de93523bb # # This file was generated by pip-compile-multi. # To update, run: @@ -7,9 +7,9 @@ # annotated-types==0.7.0 # via pydantic -certifi==2026.1.4 +certifi==2026.2.25 # via requests -charset-normalizer==3.4.4 +charset-normalizer==3.4.6 # via requests contourpy==1.3.3 # via matplotlib @@ -21,13 +21,13 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==26.1.1 +essreduce==26.3.1 # via -r base.in -fonttools==4.61.1 +fonttools==4.62.1 # via matplotlib graphviz==0.21 # via -r base.in -h5py==3.15.1 +h5py==3.16.0 # via # scippneutron # scippnexus @@ -35,9 +35,9 @@ idna==3.11 # via # email-validator # requests -kiwisolver==1.4.9 +kiwisolver==1.5.0 # via matplotlib -lazy-loader==0.4 +lazy-loader==0.5 # via # plopp # scippneutron @@ -46,11 +46,11 @@ matplotlib==3.10.8 # via # mpltoolbox # plopp -mpltoolbox==25.10.0 +mpltoolbox==26.2.0 # via scippneutron networkx==3.6.1 # via cyclebane -numpy==2.4.1 +numpy==2.4.3 # via # contourpy # h5py @@ -59,22 +59,22 @@ numpy==2.4.1 # scipp # scippneutron # scipy -packaging==25.0 +packaging==26.0 # via # lazy-loader # matplotlib # pooch -pandas==2.3.3 +pandas==3.0.1 # via -r base.in -pillow==12.1.0 +pillow==12.1.1 # via matplotlib -platformdirs==4.5.1 +platformdirs==4.9.4 # via pooch -plopp==25.11.0 +plopp==26.3.1 # via # scippneutron # tof -pooch==1.8.2 +pooch==1.9.0 # via tof pydantic==2.12.5 # via scippneutron @@ -87,37 +87,35 @@ python-dateutil==2.9.0.post0 # matplotlib # pandas # scippneutron -pytz==2025.2 - # via pandas requests==2.32.5 # via pooch sciline==25.11.1 # via # -r base.in # essreduce -scipp==26.2.0 +scipp==26.3.1 # via # -r base.in # essreduce # scippneutron # scippnexus # tof -scippneutron==25.11.2 +scippneutron==26.3.0 # via # -r base.in # essreduce -scippnexus==26.1.0 +scippnexus==26.1.1 # via # -r base.in # essreduce # scippneutron -scipy==1.17.0 +scipy==1.17.1 # via # scippneutron # scippnexus six==1.17.0 # via python-dateutil -tof==26.1.0 +tof==26.3.0 # via -r base.in typing-extensions==4.15.0 # via @@ -126,7 +124,5 @@ typing-extensions==4.15.0 # typing-inspection typing-inspection==0.4.2 # via pydantic -tzdata==2025.3 - # via pandas urllib3==2.6.3 # via requests diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 9e4acb75e..4eb0e5cee 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -5,23 +5,23 @@ # # requirements upgrade # -certifi==2026.1.4 +certifi==2026.2.25 # via requests -charset-normalizer==3.4.4 +charset-normalizer==3.4.6 # via requests idna==3.11 # via requests iniconfig==2.3.0 # via pytest -packaging==25.0 +packaging==26.0 # via # pooch # pytest -platformdirs==4.5.1 +platformdirs==4.9.4 # via pooch pluggy==1.6.0 # via pytest -pooch==1.8.2 +pooch==1.9.0 # via -r basetest.in pygments==2.19.2 # via pytest diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 75ea55d34..28afd994f 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -5,20 +5,19 @@ # # requirements upgrade # -cachetools==6.2.4 +cachetools==7.0.5 # 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.6 # via requests colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.20.3 +filelock==3.25.2 # via + # python-discovery # tox # virtualenv gitdb==4.0.12 @@ -27,26 +26,31 @@ gitpython==3.1.46 # via -r ci.in idna==3.11 # via requests -packaging==25.0 +packaging==26.0 # via # -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.3 + # 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.1 # via -r ci.in urllib3==2.6.3 # via requests -virtualenv==20.36.1 +virtualenv==21.2.0 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 6694c3742..64d3f61a7 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -22,7 +22,7 @@ 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 @@ -30,9 +30,9 @@ click==8.3.1 # via # pip-compile-multi # pip-tools -copier==9.11.2 +copier==9.14.0 # via -r dev.in -dunamai==1.25.0 +dunamai==1.26.0 # via copier fqdn==1.5.1 # via jsonschema @@ -69,7 +69,7 @@ jupyter-server==2.17.0 # notebook-shim jupyter-server-terminals==0.5.4 # via jupyter-server -jupyterlab==4.5.2 +jupyterlab==4.5.6 # via -r dev.in jupyterlab-server==2.28.0 # via jupyterlab @@ -81,13 +81,13 @@ overrides==7.7.0 # via jupyter-server pip-compile-multi==3.2.2 # via -r dev.in -pip-tools==7.5.2 +pip-tools==7.5.3 # via pip-compile-multi plumbum==1.10.0 # via copier prometheus-client==0.24.1 # via jupyter-server -pycparser==2.23 +pycparser==3.0 # via cffi python-json-logger==4.0.0 # via jupyter-events @@ -111,13 +111,15 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi +tzdata==2025.3 + # via arrow uri-template==1.3.0 # via jsonschema webcolors==25.10.0 # via jsonschema websocket-client==1.9.0 # via jupyter-server -wheel==0.45.1 +wheel==0.46.3 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index ab8ea5fba..4b9e2d297 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -18,7 +18,7 @@ attrs==25.4.0 # referencing autodoc-pydantic==2.2.0 # via -r docs.in -babel==2.17.0 +babel==2.18.0 # via # pydata-sphinx-theme # sphinx @@ -32,7 +32,7 @@ comm==0.2.3 # via # ipykernel # ipywidgets -debugpy==1.8.19 +debugpy==1.8.20 # via ipykernel decorator==5.2.1 # via ipython @@ -48,13 +48,13 @@ executing==2.2.1 # via stack-data fastjsonschema==2.21.2 # via nbformat -imagesize==1.4.1 +imagesize==2.0.0 # via sphinx -ipykernel==7.1.0 +ipykernel==7.2.0 # via -r docs.in -ipympl==0.9.8 +ipympl==0.10.0 # via -r docs.in -ipython==9.9.0 +ipython==9.10.0 # via # -r docs.in # ipykernel @@ -115,7 +115,7 @@ myst-parser==5.0.0 # via -r docs.in nbclient==0.10.4 # via nbconvert -nbconvert==7.16.6 +nbconvert==7.17.0 # via nbsphinx nbformat==5.10.4 # via @@ -128,19 +128,19 @@ nest-asyncio==1.6.0 # via ipykernel pandocfilters==1.5.1 # via nbconvert -parso==0.8.5 +parso==0.8.6 # via jedi pexpect==4.9.0 # via ipython prompt-toolkit==3.0.52 # via ipython -psutil==7.2.1 +psutil==7.2.2 # via ipykernel ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pydantic-settings==2.12.0 +pydantic-settings==2.13.1 # via autodoc-pydantic pydata-sphinx-theme==0.16.1 # via -r docs.in @@ -152,7 +152,7 @@ pygments==2.19.2 # nbconvert # pydata-sphinx-theme # sphinx -python-dotenv==1.2.1 +python-dotenv==1.2.2 # via pydantic-settings pyyaml==6.0.3 # via myst-parser @@ -206,7 +206,7 @@ stack-data==0.6.3 # via ipython tinycss2==1.4.0 # via bleach -tornado==6.5.4 +tornado==6.5.5 # via # ipykernel # jupyter-client @@ -223,7 +223,7 @@ traitlets==5.14.3 # nbconvert # nbformat # nbsphinx -wcwidth==0.2.14 +wcwidth==0.6.0 # via prompt-toolkit webencodings==0.5.1 # via diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index 2ee61c57e..f90f757a5 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,11 +6,11 @@ # requirements upgrade # -r test.txt -librt==0.7.8 +librt==0.8.1 # via mypy mypy==1.19.1 # via -r mypy.in mypy-extensions==1.1.0 # via mypy -pathspec==1.0.3 +pathspec==1.0.4 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index f5326e4e5..1df764c6b 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -10,9 +10,9 @@ annotated-types==0.7.0 # via pydantic -certifi==2026.1.4 +certifi==2026.2.25 # via requests -charset-normalizer==3.4.4 +charset-normalizer==3.4.6 # via requests contourpy==1.3.3 # via matplotlib @@ -26,11 +26,11 @@ email-validator==2.3.0 # via scippneutron essreduce @ git+https://github.com/scipp/essreduce@main # via -r nightly.in -fonttools==4.61.1 +fonttools==4.62.1 # via matplotlib graphviz==0.21 # via -r nightly.in -h5py==3.15.1 +h5py==3.16.0 # via # scippneutron # scippnexus @@ -40,9 +40,9 @@ idna==3.11 # requests iniconfig==2.3.0 # via pytest -kiwisolver==1.4.10rc0 +kiwisolver==1.5.0 # via matplotlib -lazy-loader==0.4 +lazy-loader==0.5 # via # plopp # scippneutron @@ -51,31 +51,30 @@ matplotlib==3.10.8 # via # mpltoolbox # plopp -mpltoolbox==25.10.0 +mpltoolbox==26.2.0 # via scippneutron networkx==3.6.1 # via cyclebane -numpy==2.3.5 +numpy==2.4.3 # via # contourpy - # essreduce # h5py # matplotlib # pandas # scipp # scippneutron # scipy -packaging==26.0rc3 +packaging==26.0 # via # lazy-loader # matplotlib # pooch # pytest -pandas==3.0.0rc2 +pandas==3.0.1 # via -r nightly.in -pillow==12.1.0 +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 @@ -84,13 +83,13 @@ plopp @ git+https://github.com/scipp/plopp@main # tof pluggy==1.6.0 # via pytest -pooch==1.8.2 +pooch==1.9.0 # via # -r nightly.in # tof -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 pytest @@ -125,13 +124,13 @@ scippnexus @ git+https://github.com/scipp/scippnexus@main # -r nightly.in # essreduce # scippneutron -scipy==1.17.0 +scipy==1.17.1 # via # scippneutron # scippnexus six==1.17.0 # via python-dateutil -tof==26.1.0 +tof==26.3.0 # via -r nightly.in typing-extensions==4.15.0 # via diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 75cd3c9bc..abd79942f 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/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.2 + # via + # python-discovery + # virtualenv +identify==2.6.18 # 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.3 + # via virtualenv pyyaml==6.0.3 # via pre-commit -virtualenv==20.36.1 +virtualenv==21.2.0 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 3e37dfedc..0d70d60c7 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -7,7 +7,7 @@ # build==1.4.0 # via -r wheels.in -packaging==25.0 +packaging==26.0 # via build pyproject-hooks==1.2.0 # via build From ea6194e91393bc45813ff7fc33d0541df0958a42 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Mar 2026 14:32:31 +0100 Subject: [PATCH 291/330] Add missing threshold param --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index 2b760ffe7..636ddf41f 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -18,6 +18,7 @@ "metadata": {}, "outputs": [], "source": [ + "import numpy as np\n", "import scippnexus as snx\n", "\n", "from ess.bifrost.data import (\n", @@ -58,7 +59,11 @@ "source": [ "workflow = BifrostSimulationBraggPeakMonitorWorkflow()\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()" + "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()\n", + "workflow[LookupTableRelativeErrorThreshold] = {\n", + " 'detector': np.inf,\n", + " '110_frame_3': np.inf,\n", + "}" ] }, { @@ -88,8 +93,8 @@ "\n", "\n", "def assemble_detector_data_flatten(\n", - " detector: EmptyDetector[RunType],\n", - " data: NeXusData[snx.NXdetector, RunType],\n", + " detector: EmptyDetector[RunType],\n", + " data: NeXusData[snx.NXdetector, RunType],\n", ") -> McStasRawDetector[RunType]:\n", " from ess.reduce.nexus.workflow import assemble_detector_data as assemble\n", " base = assemble(detector, data)\n", @@ -105,18 +110,18 @@ "\n", "\n", "def detector_ltotal_from_straight_line_approximation(\n", - " detector_beamline: RawDetector[RunType],\n", - " source_position: Position[snx.NXsource, RunType],\n", - " sample_position: Position[snx.NXsample, RunType],\n", - " gravity: GravityVector,\n", + " detector_beamline: RawDetector[RunType],\n", + " source_position: Position[snx.NXsource, RunType],\n", + " sample_position: Position[snx.NXsample, RunType],\n", + " gravity: GravityVector,\n", ") -> DetectorLtotal[RunType]:\n", " from ess.reduce.time_of_flight import eto_to_tof\n", " return eto_to_tof.detector_ltotal_from_straight_line_approximation(\n", " detector_beamline, # type: ignore[arg-type]\n", "\n", - " source_position=source_position,\n", - " sample_position=sample_position,\n", - " gravity=gravity,\n", + " source_position=source_position,\n", + " sample_position=sample_position,\n", + " gravity=gravity,\n", " )\n", "\n", "\n", @@ -169,10 +174,10 @@ "outputs": [], "source": [ "make_q_map(counts,\n", - " q_parallel_bins=sc.linspace('Q_parallel', -3, 3, 100, unit='1/Ã…'),\n", - " q_perpendicular_bins=sc.linspace('Q_perpendicular', -3, 3, 100, unit='1/Ã…'),\n", - " sample_rotation_bins=sc.scalar(1.0, unit='deg'),\n", - ")" + " q_parallel_bins=sc.linspace('Q_parallel', -3, 3, 100, unit='1/Ã…'),\n", + " q_perpendicular_bins=sc.linspace('Q_perpendicular', -3, 3, 100, unit='1/Ã…'),\n", + " sample_rotation_bins=sc.scalar(1.0, unit='deg'),\n", + " )" ] } ], From 40461d0ab6f254731fc86ec6aa45152342e751be Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 16 Mar 2026 14:55:06 +0100 Subject: [PATCH 292/330] Use correct generic param --- .../src/ess/spectroscopy/indirect/time_of_flight.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index 02df529c4..8098871a3 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -71,7 +71,7 @@ def detector_time_of_flight_data( def monitor_time_of_flight_data( monitor_data: RawMonitor[RunType, MonitorType], - lookup: ErrorLimitedTofLookupTable[snx.NXdetector], + lookup: ErrorLimitedTofLookupTable[MonitorType], ltotal: MonitorLtotal[RunType, MonitorType], pulse_stride_offset: PulseStrideOffset, ) -> TofMonitor[RunType, MonitorType]: From 62b1ef88788b687a465ae50e3bc01e028be7d214 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 17 Mar 2026 09:42:13 +0100 Subject: [PATCH 293/330] Fix typo Co-authored-by: Neil Vaytet <39047984+nvaytet@users.noreply.github.com> --- .../docs/user-guide/bifrost/bifrost-reduction.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index e03c87a32..6ed5852a3 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -93,7 +93,7 @@ "# Set the lookup table for frame unwrapping:\n", "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()\n", "# Set thresholds to mask ToF regions with large uncertainties.\n", - "# FOr this example, we do not mask anything:\n", + "# For this example, we do not mask anything:\n", "workflow[LookupTableRelativeErrorThreshold] = {\n", " 'detector': np.inf,\n", " '110_frame_3': np.inf,\n", From ec5abdc04339b1af20e495cc1d751b776d30f134 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Thu, 19 Mar 2026 10:59:36 +0100 Subject: [PATCH 294/330] refactor: remove tof --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 10 +-- .../bifrost-make-tof-lookup-table.ipynb | 16 ++--- .../bifrost/bifrost-reduction.ipynb | 6 +- .../essspectroscopy/src/ess/bifrost/data.py | 14 ++-- .../ess/bifrost/single_crystal/conversion.py | 10 +-- .../bifrost/single_crystal/time_of_flight.py | 24 +++---- .../ess/bifrost/single_crystal/workflow.py | 6 +- .../ess/spectroscopy/indirect/conversion.py | 17 +++-- .../spectroscopy/indirect/time_of_flight.py | 70 +++++++++---------- .../src/ess/spectroscopy/types.py | 29 ++++---- .../tests/bifrost/cutting_test.py | 6 +- .../tests/bifrost/io/sqw_test.py | 6 +- .../tests/bifrost/live_test.py | 6 +- .../tests/bifrost/workflow_test.py | 6 +- .../tools/docs/bifrost-thumbnails.ipynb | 4 +- 15 files changed, 112 insertions(+), 118 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index 636ddf41f..5ee7ddb2a 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -23,12 +23,12 @@ "\n", "from ess.bifrost.data import (\n", " simulated_elastic_incoherent_with_phonon,\n", - " tof_lookup_table_simulation,\n", + " lookup_table_simulation,\n", ")\n", "from ess.bifrost.single_crystal import BifrostSimulationBraggPeakMonitorWorkflow, make_q_map\n", "from ess.bifrost.single_crystal.types import *\n", "from ess.bifrost.types import McStasRawDetector\n", - "from ess.reduce.time_of_flight import DetectorLtotal\n", + "from ess.reduce.unwrap import DetectorLtotal\n", "from ess.spectroscopy.types import *" ] }, @@ -59,7 +59,7 @@ "source": [ "workflow = BifrostSimulationBraggPeakMonitorWorkflow()\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()\n", + "workflow[LookupTableFilename] = lookup_table_simulation()\n", "workflow[LookupTableRelativeErrorThreshold] = {\n", " 'detector': np.inf,\n", " '110_frame_3': np.inf,\n", @@ -115,8 +115,8 @@ " sample_position: Position[snx.NXsample, RunType],\n", " gravity: GravityVector,\n", ") -> DetectorLtotal[RunType]:\n", - " from ess.reduce.time_of_flight import eto_to_tof\n", - " return eto_to_tof.detector_ltotal_from_straight_line_approximation(\n", + " from ess.reduce.wavelength import eto_to_wavelength\n", + " return eto_to_wavelength.detector_ltotal_from_straight_line_approximation(\n", " detector_beamline, # type: ignore[arg-type]\n", "\n", " source_position=source_position,\n", diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb index d362fe8d2..0e4181734 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb @@ -5,9 +5,9 @@ "id": "0", "metadata": {}, "source": [ - "# Create a time-of-flight lookup table for BIFROST\n", + "# Create a wavelength lookup table for BIFROST\n", "\n", - "This notebook shows how to create a time-of-flight lookup table for frame unwrapping at BIFROST." + "This notebook shows how to create a wavelength lookup table for frame unwrapping at BIFROST." ] }, { @@ -23,11 +23,11 @@ "from scippneutron.conversion.graph import beamline as beamline_graph\n", "import scippnexus as snx\n", "from ess.reduce.nexus.types import AnyRun, RawChoppers, DiskChoppers\n", - "from ess.reduce.time_of_flight.lut import (\n", + "from ess.reduce.unwrap.lut import (\n", " LtotalRange,\n", " NumberOfSimulatedNeutrons,\n", " SourcePosition,\n", - " TofLookupTableWorkflow,\n", + " LookupTableWorkflow,\n", ")\n", "from scippneutron.chopper import DiskChopper\n", "\n", @@ -157,7 +157,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow = TofLookupTableWorkflow()\n", + "workflow = LookupTableWorkflow()\n", "workflow[DiskChoppers[AnyRun]] = disk_choppers\n", "workflow[LtotalRange] = (l_min, l_max)\n", "workflow[SourcePosition] = source_position\n", @@ -173,7 +173,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow.visualize(TofLookupTable, graph_attr={\"rankdir\": \"LR\"})" + "workflow.visualize(LookupTable, graph_attr={\"rankdir\": \"LR\"})" ] }, { @@ -191,7 +191,7 @@ "metadata": {}, "outputs": [], "source": [ - "table = workflow.compute(TofLookupTable)\n", + "table = workflow.compute(LookupTable)\n", "table" ] }, @@ -220,7 +220,7 @@ "metadata": {}, "outputs": [], "source": [ - "table.save_hdf5('BIFROST-simulation-tof-lookup-table.h5')" + "table.save_hdf5('BIFROST-simulation-lookup-table.h5')" ] } ], diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index 6ed5852a3..7da461834 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -26,7 +26,7 @@ "from ess import bifrost\n", "from ess.bifrost.data import (\n", " simulated_elastic_incoherent_with_phonon,\n", - " tof_lookup_table_simulation\n", + " lookup_table_simulation\n", ")\n", "from ess.spectroscopy.types import *" ] @@ -91,8 +91,8 @@ "# Set the input file name:\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", "# Set the lookup table for frame unwrapping:\n", - "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()\n", - "# Set thresholds to mask ToF regions with large uncertainties.\n", + "workflow[LookupTableFilename] = lookup_table_simulation()\n", + "# Set thresholds to mask wavelength regions with large uncertainties.\n", "# For this example, we do not mask anything:\n", "workflow[LookupTableRelativeErrorThreshold] = {\n", " 'detector': np.inf,\n", diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 7abfbe115..8b13713d9 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -12,7 +12,7 @@ files={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", "computed_energy_data_simulated_5x2.h5": "blake2b:d21290ab012268391785a83ee59d5aa24a9a230fb341f8defb1f2672bc374616423bc76908078af1ff686a0adb7fd408d70c3e9bd8aae23c1fdd8dcfffca2f23", # noqa: E501 - "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 + "BIFROST-simulation-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 }, version="6", ) @@ -33,15 +33,15 @@ def simulated_elastic_incoherent_with_phonon() -> Path: return get_path("BIFROST_20240914T053723.h5") -def tof_lookup_table_simulation() -> Path: - """Time-of-flight lookup table for the simulated BIFROST data. +def lookup_table_simulation() -> Path: + """Wavelength lookup table for the simulated BIFROST data. This table was computed with `tof `_ - using `Create a time-of-flight lookup table for BIFROST - <../../user-guide/bifrost/bifrost-make-tof-lookup-table.rst>`_ + using `Create a wavelength lookup table for BIFROST + <../../user-guide/bifrost/bifrost-make-lookup-table.rst>`_ with ``NumberOfSimulatedNeutrons = 5_000_000``. """ - return get_path("BIFROST-simulation-tof-lookup-table.h5") + return get_path("BIFROST-simulation-lookup-table.h5") def computed_energy_data_simulated_5x2() -> Path: @@ -56,6 +56,6 @@ def computed_energy_data_simulated_5x2() -> Path: __all__ = [ "computed_energy_data_simulated_5x2", "get_path", + "lookup_table_simulation", "simulated_elastic_incoherent_with_phonon", - "tof_lookup_table_simulation", ] diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py index 5fc42fa02..eacd7c8fd 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py @@ -16,7 +16,7 @@ Position, QDetector, RunType, - TofDetector, + WavelengthDetector, ) @@ -40,13 +40,13 @@ def single_crystal_coordinate_transformation_graph( ) -def convert_tof_to_q( - with_tof: TofDetector[RunType], +def convert_wavelength_to_q( + with_wavelength: WavelengthDetector[RunType], *, graph: ElasticCoordTransformGraph[RunType], ) -> QDetector[RunType]: """Convert ToF to Q.""" - transformed = with_tof.transform_coords( + transformed = with_wavelength.transform_coords( ['a3', 'sample_table_momentum_transfer'], graph=graph, keep_intermediate=False, @@ -57,4 +57,4 @@ def convert_tof_to_q( return QDetector[RunType](transformed) -providers = (single_crystal_coordinate_transformation_graph, convert_tof_to_q) +providers = (single_crystal_coordinate_transformation_graph, convert_wavelength_to_q) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py index 250ea0e2d..3c32f98df 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py @@ -5,34 +5,34 @@ import scippnexus as snx -from ess.reduce import time_of_flight as reduce_time_of_flight -from ess.reduce.time_of_flight.types import DetectorLtotal +from ess.reduce import unwrap as reduce_unwrap +from ess.reduce.unwrap.types import DetectorLtotal from ess.spectroscopy.types import ( DataGroupedByRotation, - ErrorLimitedTofLookupTable, + ErrorLimitedLookupTable, PulseStrideOffset, RawDetector, RunType, - TofDetector, + WavelengthDetector, ) -def detector_time_of_flight_data( +def detector_wavelength_data( sample_data: DataGroupedByRotation[RunType], - lookup: ErrorLimitedTofLookupTable[snx.NXdetector], + lookup: ErrorLimitedLookupTable[snx.NXdetector], ltotal: DetectorLtotal[RunType], pulse_stride_offset: PulseStrideOffset, -) -> TofDetector[RunType]: +) -> WavelengthDetector[RunType]: """ - Convert the time-of-arrival data to time-of-flight data using a lookup table. + Convert the arrival-time data to wavelength data using a lookup table. - The output data will have a time-of-flight coordinate. + The output data will have a wavelength coordinate. This is a wrapper around - :func:`ess.reduce.time_of_flight.detector_time_of_flight_data` + :func:`ess.reduce.unwrap.detector_wavelength_data` for different input types. """ - return reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data( + return reduce_unwrap.eto_to_wavelength.detector_wavelength_data( detector_data=RawDetector[RunType](sample_data), lookup=lookup, ltotal=ltotal, @@ -40,4 +40,4 @@ def detector_time_of_flight_data( ) -providers = (detector_time_of_flight_data,) +providers = (detector_wavelength_data,) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py index 413697699..5e996a2ae 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py @@ -4,7 +4,7 @@ import sciline -from ess.reduce import time_of_flight as reduce_time_of_flight +from ess.reduce import unwrap as reduce_unwrap from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( FrameMonitor1, @@ -43,7 +43,7 @@ def BifrostBraggPeakMonitorWorkflow() -> sciline.Pipeline: monitor_types=(FrameMonitor1, FrameMonitor2, FrameMonitor3), ) # Use the vanilla implementation instead of the indirect geometry one: - workflow.insert(reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data) + workflow.insert(reduce_unwrap.eto_to_wavelength.detector_wavelength_data) for provider in _PROVIDERS: workflow.insert(provider) for key, val in default_parameters().items(): @@ -57,7 +57,7 @@ def BifrostSimulationBraggPeakMonitorWorkflow() -> sciline.Pipeline: monitor_types=(FrameMonitor1, FrameMonitor2, FrameMonitor3), ) # Use the vanilla implementation instead of the indirect geometry one: - workflow.insert(reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data) + workflow.insert(reduce_unwrap.eto_to_wavelength.detector_wavelength_data) for provider in _SIMULATION_PROVIDERS: workflow.insert(provider) for key, val in simulation_default_parameters().items(): diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 490c9c628..aa1081f26 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -9,7 +9,6 @@ import scippnexus as snx from scippneutron.conversion.tof import ( energy_from_wavelength, - wavelength_from_tof, wavevector_from_wavelength, ) @@ -25,8 +24,7 @@ PrimarySpecCoordTransformGraph, RunType, SecondarySpecCoordTransformGraph, - TofDetector, - TofMonitor, + WavelengthDetector, WavelengthMonitor, ) @@ -35,10 +33,11 @@ def incident_energy_from_wavelength(*, incident_wavelength: sc.Variable) -> sc.V return energy_from_wavelength(wavelength=incident_wavelength) -def incident_wavelength_from_tof( - *, sample_tof: sc.Variable, L1: sc.Variable +def incident_wavelength_from_wavelength( + *, + sample_wavelength: sc.Variable, ) -> sc.Variable: - return wavelength_from_tof(tof=sample_tof, Ltotal=L1) + return sample_wavelength def incident_wavevector_from_incident_wavelength( @@ -203,7 +202,7 @@ def inelastic_coordinate_transformation_graph_at_sample( { 'energy_transfer': energy_transfer, 'incident_energy': incident_energy_from_wavelength, - 'incident_wavelength': incident_wavelength_from_tof, + 'incident_wavelength': incident_wavelength_from_wavelength, 'incident_wavevector': incident_wavevector_from_incident_wavelength, 'gravity': lambda: gravity, 'lab_momentum_transfer': lab_momentum_transfer_from_wavevectors, @@ -233,7 +232,7 @@ def add_inelastic_coordinates( def add_incident_energy( - data: TofDetector[RunType], graph: InelasticCoordTransformGraph + data: WavelengthDetector[RunType], graph: InelasticCoordTransformGraph ) -> IncidentEnergyDetector[RunType]: transformed = data.transform_coords( [ @@ -311,7 +310,7 @@ def monitor_coordinate_transformation_graph( def add_monitor_wavelength_coord( - monitor: TofMonitor[RunType, MonitorType], graph: MonitorCoordTransformGraph + monitor: WavelengthMonitor[RunType, MonitorType], graph: MonitorCoordTransformGraph ) -> WavelengthMonitor[RunType, MonitorType]: return WavelengthMonitor[RunType, MonitorType]( monitor.transform_coords( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index 8098871a3..e6c0dc342 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -8,12 +8,13 @@ import sciline import scippnexus as snx -from ess.reduce import time_of_flight as reduce_time_of_flight -from ess.reduce.time_of_flight.types import DetectorLtotal +from ess.reduce import unwrap as reduce_unwrap +from ess.reduce.unwrap.types import DetectorLtotal from ..types import ( DataAtSample, - ErrorLimitedTofLookupTable, + ErrorLimitedLookupTable, + LookupTable, LookupTableRelativeErrorThreshold, MonitorCoordTransformGraph, MonitorLtotal, @@ -23,9 +24,8 @@ RawDetector, RawMonitor, RunType, - TofDetector, - TofLookupTable, - TofMonitor, + WavelengthDetector, + WavelengthMonitor, ) @@ -34,7 +34,7 @@ def TofWorkflow( run_types: Iterable[sciline.typing.Key], monitor_types: Iterable[sciline.typing.Key], ) -> sciline.Pipeline: - workflow = reduce_time_of_flight.GenericTofWorkflow( + workflow = reduce_unwrap.GenericTofWorkflow( run_types=run_types, monitor_types=monitor_types, ) @@ -43,48 +43,48 @@ def TofWorkflow( return workflow -def detector_time_of_flight_data( +def detector_wavelength_data( sample_data: DataAtSample[RunType], - lookup: ErrorLimitedTofLookupTable[snx.NXdetector], + lookup: ErrorLimitedLookupTable[snx.NXdetector], pulse_stride_offset: PulseStrideOffset, -) -> TofDetector[RunType]: +) -> WavelengthDetector[RunType]: """ - Convert the time-of-arrival data to time-of-flight data using a lookup table. + Convert the time-of-arrival data to wavelength data using a lookup table. - The output data will have a time-of-flight coordinate. + The output data will have a wavelength coordinate. This is a wrapper around - :func:`ess.reduce.time_of_flight.detector_time_of_flight_data` + :func:`ess.reduce.unwrap.detector_wavelength_data` for indirect geometry spectrometers. """ - result = reduce_time_of_flight.eto_to_tof.detector_time_of_flight_data( + result = reduce_unwrap.eto_to_tof.detector_wavelength_data( detector_data=RawDetector[RunType](sample_data), lookup=lookup, ltotal=DetectorLtotal(sample_data.coords['L1']), pulse_stride_offset=pulse_stride_offset, ) - # This is time-of-flight at the sample. - result.bins.coords['sample_tof'] = result.bins.coords.pop('tof') + # This is wavelength at the sample. + result.bins.coords['sample_wavelength'] = result.bins.coords.pop('wavelength') del result.bins.coords['event_time_zero'] return result -def monitor_time_of_flight_data( +def monitor_wavelength_data( monitor_data: RawMonitor[RunType, MonitorType], - lookup: ErrorLimitedTofLookupTable[MonitorType], + lookup: ErrorLimitedLookupTable[MonitorType], ltotal: MonitorLtotal[RunType, MonitorType], pulse_stride_offset: PulseStrideOffset, -) -> TofMonitor[RunType, MonitorType]: +) -> WavelengthMonitor[RunType, MonitorType]: """ - Convert the time-of-arrival data to time-of-flight data using a lookup table. + Convert the time-of-arrival data to wavelength data using a lookup table. - The output data will have a time-of-flight coordinate. + The output data will have a wavelength coordinate. This is a wrapper around - :func:`ess.reduce.time_of_flight.monitor_time_of_flight_data` + :func:`ess.reduce.unwrap.monitor_wavelength_data` for indirect geometry spectrometers. """ - result = reduce_time_of_flight.eto_to_tof.monitor_time_of_flight_data( + result = reduce_unwrap.eto_to_wavelength.monitor_wavelength_data( monitor_data=monitor_data.rename(t='tof'), lookup=lookup, ltotal=ltotal, @@ -110,11 +110,11 @@ def compute_monitor_ltotal( def mask_large_uncertainty_in_lut_detector( - table: TofLookupTable, + table: LookupTable, error_threshold: LookupTableRelativeErrorThreshold, -) -> ErrorLimitedTofLookupTable[snx.NXdetector]: +) -> ErrorLimitedLookupTable[snx.NXdetector]: """ - Mask regions in the time-of-flight lookup table with large uncertainty using NaNs. + Mask regions in the wavelength lookup table with large uncertainty using NaNs. The threshold is looked up under the key ``'detector'``. The same threshold is applied to all triplets. @@ -122,21 +122,21 @@ def mask_large_uncertainty_in_lut_detector( Parameters ---------- table: - Lookup table with time-of-flight as a function of distance and time-of-arrival. + Lookup table with wavelength as a function of distance and time-of-arrival. error_threshold: Threshold for the relative standard deviation (coefficient of variation) of the - projected time-of-flight above which values are masked. + projected wavelength above which values are masked. See also -------- - essreduce.time_of_flight.mask_large_uncertainty_in_lut: + essreduce.unwrap.mask_large_uncertainty_in_lut: The underlying implementation. """ - from ess.reduce.time_of_flight.eto_to_tof import ( + from ess.reduce.unwrap.eto_to_wavelength import ( mask_large_uncertainty_in_lut_detector, ) - return ErrorLimitedTofLookupTable[snx.NXdetector]( + return ErrorLimitedLookupTable[snx.NXdetector]( mask_large_uncertainty_in_lut_detector( table=table, error_threshold=error_threshold, @@ -147,13 +147,13 @@ def mask_large_uncertainty_in_lut_detector( providers = ( compute_monitor_ltotal, - detector_time_of_flight_data, + detector_wavelength_data, mask_large_uncertainty_in_lut_detector, - monitor_time_of_flight_data, + monitor_wavelength_data, ) -"""Providers for time-of-flight calculation on indirect geometry spectrometers. +"""Providers for wavelength calculation on indirect geometry spectrometers. The providers here override the default providers of -:class:`ess.reduce.time_of_flight.GenericTofWorkflow` +:class:`ess.reduce.wavelength.GenericUnwrapWorkflow` to customize the workflow for indirect geometry spectrometers. """ diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 1f4900a8d..64a30f398 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -8,7 +8,7 @@ import sciline import scipp as sc -from ess.reduce import time_of_flight +from ess.reduce import unwrap from ess.reduce.nexus import types as reduce_t from ess.reduce.uncertainty import UncertaintyBroadcastMode as _UncertaintyBroadcastMode @@ -54,18 +54,18 @@ # Time-of-flight types -TofDetector = time_of_flight.TofDetector -TofMonitor = time_of_flight.TofMonitor -LookupTableRelativeErrorThreshold = time_of_flight.LookupTableRelativeErrorThreshold -MonitorLtotal = time_of_flight.MonitorLtotal -PulseStride = time_of_flight.PulseStride -PulseStrideOffset = time_of_flight.PulseStrideOffset -PulsePeriod = time_of_flight.PulsePeriod -ErrorLimitedTofLookupTable = time_of_flight.ErrorLimitedTofLookupTable -TofLookupTable = time_of_flight.TofLookupTable -TofLookupTableFilename = time_of_flight.TofLookupTableFilename +WavelengthDetector = unwrap.WavelengthDetector +WavelengthMonitor = unwrap.WavelengthMonitor +LookupTableRelativeErrorThreshold = unwrap.LookupTableRelativeErrorThreshold +MonitorLtotal = unwrap.MonitorLtotal +PulseStride = unwrap.PulseStride +PulseStrideOffset = unwrap.PulseStrideOffset +PulsePeriod = unwrap.PulsePeriod +ErrorLimitedLookupTable = unwrap.ErrorLimitedLookupTable +LookupTable = unwrap.LookupTable +LookupTableFilename = unwrap.LookupTableFilename # Legacy alias: -TimeOfFlightLookupTableFilename = time_of_flight.TimeOfFlightLookupTableFilename +LookupTableFilename = unwrap.LookupTableFilename # Custom types @@ -149,11 +149,6 @@ class MonitorCoordTransformGraph(sciline.Scope[RunType, dict], dict): ... SQWBinSizes = NewType('SQWBinSizes', dict[str, int]) -class WavelengthMonitor( - sciline.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray -): ... - - UncertaintyBroadcastMode = _UncertaintyBroadcastMode diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py index 406aff239..225b91f46 100644 --- a/packages/essspectroscopy/tests/bifrost/cutting_test.py +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -8,17 +8,17 @@ from ess import bifrost from ess.bifrost.data import ( + lookup_table_simulation, simulated_elastic_incoherent_with_phonon, - tof_lookup_table_simulation, ) from ess.bifrost.live import CutAxis, CutAxis1, CutAxis2, arc_energy, cut from ess.spectroscopy.types import ( EnergyQDetector, Filename, + LookupTableFilename, LookupTableRelativeErrorThreshold, NeXusDetectorName, SampleRun, - TofLookupTableFilename, UncertaintyBroadcastMode, ) @@ -36,7 +36,7 @@ def energy_data( ) -> EnergyQDetector[SampleRun]: workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TofLookupTableFilename] = tof_lookup_table_simulation() + workflow[LookupTableFilename] = lookup_table_simulation() workflow[LookupTableRelativeErrorThreshold] = { 'detector': np.inf, '110_frame_3': np.inf, diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index 72d2f49fc..f8762f835 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -21,19 +21,19 @@ from ess import bifrost from ess.bifrost.data import ( + lookup_table_simulation, simulated_elastic_incoherent_with_phonon, - tof_lookup_table_simulation, ) from ess.spectroscopy.types import ( EnergyBins, Filename, + LookupTableFilename, LookupTableRelativeErrorThreshold, NeXusDetectorName, OutFilename, PreopenNeXusFile, SampleRun, SQWBinSizes, - TofLookupTableFilename, UncertaintyBroadcastMode, ) @@ -74,7 +74,7 @@ def common_workflow( wf = bifrost.BifrostSimulationWorkflow(detector_names) wf[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - wf[TofLookupTableFilename] = tof_lookup_table_simulation() + wf[LookupTableFilename] = lookup_table_simulation() wf[LookupTableRelativeErrorThreshold] = { 'detector': np.inf, '110_frame_3': np.inf, diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py index dc690939b..22823d2f0 100644 --- a/packages/essspectroscopy/tests/bifrost/live_test.py +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -8,17 +8,17 @@ import scippnexus as snx from ess.bifrost.data import ( + lookup_table_simulation, simulated_elastic_incoherent_with_phonon, - tof_lookup_table_simulation, ) from ess.bifrost.live import BifrostQCutWorkflow, CutAxis, CutAxis1, CutAxis2, CutData from ess.spectroscopy.types import ( Filename, + LookupTableFilename, LookupTableRelativeErrorThreshold, NeXusDetectorName, ProtonCharge, SampleRun, - TofLookupTableFilename, UncertaintyBroadcastMode, ) @@ -37,7 +37,7 @@ def qcut_workflow( ) -> sciline.Pipeline: workflow = BifrostQCutWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TofLookupTableFilename] = tof_lookup_table_simulation() + workflow[LookupTableFilename] = lookup_table_simulation() workflow[LookupTableRelativeErrorThreshold] = { 'detector': np.inf, '110_frame_3': np.inf, diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index f0b45c848..2fea260af 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -10,19 +10,19 @@ from ess import bifrost from ess.bifrost.data import ( computed_energy_data_simulated_5x2, + lookup_table_simulation, simulated_elastic_incoherent_with_phonon, - tof_lookup_table_simulation, ) from ess.spectroscopy.types import ( EnergyQDetector, Filename, FrameMonitor3, + LookupTableFilename, LookupTableRelativeErrorThreshold, NeXusDetectorName, RawDetector, RawMonitor, SampleRun, - TofLookupTableFilename, UncertaintyBroadcastMode, WavelengthMonitor, ) @@ -39,7 +39,7 @@ def simulation_detector_names() -> list[NeXusDetectorName]: def workflow(simulation_detector_names: list[NeXusDetectorName]) -> sciline.Pipeline: workflow = bifrost.BifrostSimulationWorkflow(simulation_detector_names) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() - workflow[TofLookupTableFilename] = tof_lookup_table_simulation() + workflow[LookupTableFilename] = lookup_table_simulation() workflow[LookupTableRelativeErrorThreshold] = { 'detector': np.inf, '110_frame_3': np.inf, diff --git a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb index 5fcdacb88..d8977b19e 100644 --- a/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb +++ b/packages/essspectroscopy/tools/docs/bifrost-thumbnails.ipynb @@ -29,7 +29,7 @@ "from ess import bifrost\n", "from ess.bifrost.data import (\n", " simulated_elastic_incoherent_with_phonon,\n", - " tof_lookup_table_simulation\n", + " lookup_table_simulation\n", ")\n", "from ess.spectroscopy.types import *" ] @@ -54,7 +54,7 @@ "source": [ "workflow = bifrost.BifrostSimulationWorkflow(detector_names)\n", "workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon()\n", - "workflow[TofLookupTableFilename] = tof_lookup_table_simulation()\n", + "workflow[LookupTableFilename] = lookup_table_simulation()\n", "workflow[PreopenNeXusFile] = PreopenNeXusFile(True)" ] }, From a6b1f5d19318b3c240942a715f4a416e750f4fd3 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Fri, 20 Mar 2026 09:13:42 +0100 Subject: [PATCH 295/330] fix: remove duplicate alias --- packages/essspectroscopy/src/ess/spectroscopy/types.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 64a30f398..2d850616b 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -64,8 +64,7 @@ ErrorLimitedLookupTable = unwrap.ErrorLimitedLookupTable LookupTable = unwrap.LookupTable LookupTableFilename = unwrap.LookupTableFilename -# Legacy alias: -LookupTableFilename = unwrap.LookupTableFilename + # Custom types From 4ed5b63cb0dd3878c043115f87462f6ede4f9941 Mon Sep 17 00:00:00 2001 From: jokasimr Date: Thu, 19 Mar 2026 16:16:58 +0100 Subject: [PATCH 296/330] Update src/ess/spectroscopy/indirect/time_of_flight.py Co-authored-by: Jan-Lukas Wynen --- .../src/ess/spectroscopy/indirect/time_of_flight.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index e6c0dc342..6c8b12d86 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -63,8 +63,8 @@ def detector_wavelength_data( ltotal=DetectorLtotal(sample_data.coords['L1']), pulse_stride_offset=pulse_stride_offset, ) - # This is wavelength at the sample. - result.bins.coords['sample_wavelength'] = result.bins.coords.pop('wavelength') + # This is the incident wavelength at the sample. + result.bins.coords['incident_wavelength'] = result.bins.coords.pop('wavelength') del result.bins.coords['event_time_zero'] return result From 329be4462324933e37ba95f70b26c062ab12cd37 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Fri, 20 Mar 2026 11:40:46 +0100 Subject: [PATCH 297/330] fixes --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 4 +-- ...ifrost-make-wavelength-lookup-table.ipynb} | 2 +- .../essspectroscopy/src/ess/bifrost/data.py | 4 +-- .../bifrost/single_crystal/time_of_flight.py | 2 +- .../ess/bifrost/single_crystal/workflow.py | 4 +-- .../ess/spectroscopy/indirect/conversion.py | 25 ------------------- .../spectroscopy/indirect/time_of_flight.py | 9 ++++--- 7 files changed, 13 insertions(+), 37 deletions(-) rename packages/essspectroscopy/docs/user-guide/bifrost/{bifrost-make-tof-lookup-table.ipynb => bifrost-make-wavelength-lookup-table.ipynb} (99%) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index 5ee7ddb2a..ecb5ba14b 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -115,8 +115,8 @@ " sample_position: Position[snx.NXsample, RunType],\n", " gravity: GravityVector,\n", ") -> DetectorLtotal[RunType]:\n", - " from ess.reduce.wavelength import eto_to_wavelength\n", - " return eto_to_wavelength.detector_ltotal_from_straight_line_approximation(\n", + " from ess.reduce.wavelength import to_wavelength\n", + " return to_wavelength.detector_ltotal_from_straight_line_approximation(\n", " detector_beamline, # type: ignore[arg-type]\n", "\n", " source_position=source_position,\n", diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb similarity index 99% rename from packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb rename to packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb index 0e4181734..e86478107 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-tof-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb @@ -163,7 +163,7 @@ "workflow[SourcePosition] = source_position\n", "\n", "# Increase this number for more reliable results:\n", - "workflow[NumberOfSimulatedNeutrons] = 600_000" + "workflow[NumberOfSimulatedNeutrons] = 6000_000" ] }, { diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 8b13713d9..af778d81a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -12,9 +12,9 @@ files={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", "computed_energy_data_simulated_5x2.h5": "blake2b:d21290ab012268391785a83ee59d5aa24a9a230fb341f8defb1f2672bc374616423bc76908078af1ff686a0adb7fd408d70c3e9bd8aae23c1fdd8dcfffca2f23", # noqa: E501 - "BIFROST-simulation-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 + "BIFROST-simulation-lookup-table.h5": "md5:6d776afa591d4a83c91ad0142bbfc53d", }, - version="6", + version="7", ) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py index 3c32f98df..265699519 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py @@ -32,7 +32,7 @@ def detector_wavelength_data( :func:`ess.reduce.unwrap.detector_wavelength_data` for different input types. """ - return reduce_unwrap.eto_to_wavelength.detector_wavelength_data( + return reduce_unwrap.to_wavelength.detector_wavelength_data( detector_data=RawDetector[RunType](sample_data), lookup=lookup, ltotal=ltotal, diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py index 5e996a2ae..88c7fdf64 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py @@ -43,7 +43,7 @@ def BifrostBraggPeakMonitorWorkflow() -> sciline.Pipeline: monitor_types=(FrameMonitor1, FrameMonitor2, FrameMonitor3), ) # Use the vanilla implementation instead of the indirect geometry one: - workflow.insert(reduce_unwrap.eto_to_wavelength.detector_wavelength_data) + workflow.insert(reduce_unwrap.to_wavelength.detector_wavelength_data) for provider in _PROVIDERS: workflow.insert(provider) for key, val in default_parameters().items(): @@ -57,7 +57,7 @@ def BifrostSimulationBraggPeakMonitorWorkflow() -> sciline.Pipeline: monitor_types=(FrameMonitor1, FrameMonitor2, FrameMonitor3), ) # Use the vanilla implementation instead of the indirect geometry one: - workflow.insert(reduce_unwrap.eto_to_wavelength.detector_wavelength_data) + workflow.insert(reduce_unwrap.to_wavelength.detector_wavelength_data) for provider in _SIMULATION_PROVIDERS: workflow.insert(provider) for key, val in simulation_default_parameters().items(): diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index aa1081f26..fa4196bf8 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -18,14 +18,12 @@ IncidentEnergyDetector, InelasticCoordTransformGraph, MonitorCoordTransformGraph, - MonitorType, NormalizedIncidentEnergyDetector, Position, PrimarySpecCoordTransformGraph, RunType, SecondarySpecCoordTransformGraph, WavelengthDetector, - WavelengthMonitor, ) @@ -33,13 +31,6 @@ def incident_energy_from_wavelength(*, incident_wavelength: sc.Variable) -> sc.V return energy_from_wavelength(wavelength=incident_wavelength) -def incident_wavelength_from_wavelength( - *, - sample_wavelength: sc.Variable, -) -> sc.Variable: - return sample_wavelength - - def incident_wavevector_from_incident_wavelength( *, incident_wavelength: sc.Variable, incident_beam: sc.Variable ) -> sc.Variable: @@ -202,7 +193,6 @@ def inelastic_coordinate_transformation_graph_at_sample( { 'energy_transfer': energy_transfer, 'incident_energy': incident_energy_from_wavelength, - 'incident_wavelength': incident_wavelength_from_wavelength, 'incident_wavevector': incident_wavevector_from_incident_wavelength, 'gravity': lambda: gravity, 'lab_momentum_transfer': lab_momentum_transfer_from_wavevectors, @@ -303,29 +293,14 @@ def monitor_coordinate_transformation_graph( { **beamline.beamline(scatter=False), **tof.elastic_wavelength(start='tof'), - 'incident_wavelength': 'wavelength', 'source_position': lambda: source_position, } ) -def add_monitor_wavelength_coord( - monitor: WavelengthMonitor[RunType, MonitorType], graph: MonitorCoordTransformGraph -) -> WavelengthMonitor[RunType, MonitorType]: - return WavelengthMonitor[RunType, MonitorType]( - monitor.transform_coords( - 'incident_wavelength', - graph=graph, - keep_intermediate=False, - keep_aliases=False, - ) - ) - - providers = ( add_inelastic_coordinates, add_incident_energy, - add_monitor_wavelength_coord, inelastic_coordinate_transformation_graph_at_sample, monitor_coordinate_transformation_graph, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index 6c8b12d86..bbdd4be2c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -34,7 +34,7 @@ def TofWorkflow( run_types: Iterable[sciline.typing.Key], monitor_types: Iterable[sciline.typing.Key], ) -> sciline.Pipeline: - workflow = reduce_unwrap.GenericTofWorkflow( + workflow = reduce_unwrap.GenericUnwrapWorkflow( run_types=run_types, monitor_types=monitor_types, ) @@ -57,7 +57,7 @@ def detector_wavelength_data( :func:`ess.reduce.unwrap.detector_wavelength_data` for indirect geometry spectrometers. """ - result = reduce_unwrap.eto_to_tof.detector_wavelength_data( + result = reduce_unwrap.to_wavelength.detector_wavelength_data( detector_data=RawDetector[RunType](sample_data), lookup=lookup, ltotal=DetectorLtotal(sample_data.coords['L1']), @@ -84,12 +84,13 @@ def monitor_wavelength_data( :func:`ess.reduce.unwrap.monitor_wavelength_data` for indirect geometry spectrometers. """ - result = reduce_unwrap.eto_to_wavelength.monitor_wavelength_data( + result = reduce_unwrap.to_wavelength.monitor_wavelength_data( monitor_data=monitor_data.rename(t='tof'), lookup=lookup, ltotal=ltotal, pulse_stride_offset=pulse_stride_offset, ) + result = result.rename(wavelength='incident_wavelength') return result @@ -132,7 +133,7 @@ def mask_large_uncertainty_in_lut_detector( essreduce.unwrap.mask_large_uncertainty_in_lut: The underlying implementation. """ - from ess.reduce.unwrap.eto_to_wavelength import ( + from ess.reduce.unwrap.to_wavelength import ( mask_large_uncertainty_in_lut_detector, ) From d0c27ae2bf06f07c14bff6245647c6618e0b7dd9 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Fri, 20 Mar 2026 11:44:49 +0100 Subject: [PATCH 298/330] fix --- packages/essspectroscopy/src/ess/bifrost/data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index af778d81a..862ef473d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -12,6 +12,7 @@ files={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", "computed_energy_data_simulated_5x2.h5": "blake2b:d21290ab012268391785a83ee59d5aa24a9a230fb341f8defb1f2672bc374616423bc76908078af1ff686a0adb7fd408d70c3e9bd8aae23c1fdd8dcfffca2f23", # noqa: E501 + "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 "BIFROST-simulation-lookup-table.h5": "md5:6d776afa591d4a83c91ad0142bbfc53d", }, version="7", From 16a48be2f0ab634e0e2786dd072854ac959597db Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Fri, 20 Mar 2026 11:45:53 +0100 Subject: [PATCH 299/330] fix: don't change wording --- .../src/ess/bifrost/single_crystal/time_of_flight.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py index 265699519..493be5979 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py @@ -24,7 +24,7 @@ def detector_wavelength_data( pulse_stride_offset: PulseStrideOffset, ) -> WavelengthDetector[RunType]: """ - Convert the arrival-time data to wavelength data using a lookup table. + Convert the time-of-arrival data to wavelength data using a lookup table. The output data will have a wavelength coordinate. From 8990877c131c82a7cc01c38dd977b2a3299a97e1 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Fri, 20 Mar 2026 14:36:31 +0100 Subject: [PATCH 300/330] test: update test data to match new (slightly different) results --- packages/essspectroscopy/src/ess/bifrost/data.py | 2 +- .../src/ess/spectroscopy/indirect/time_of_flight.py | 2 +- packages/essspectroscopy/tests/bifrost/workflow_test.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 862ef473d..821d4769a 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -11,7 +11,7 @@ 'ess/bifrost', files={ "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated_5x2.h5": "blake2b:d21290ab012268391785a83ee59d5aa24a9a230fb341f8defb1f2672bc374616423bc76908078af1ff686a0adb7fd408d70c3e9bd8aae23c1fdd8dcfffca2f23", # noqa: E501 + "computed_energy_data_simulated_5x2.h5": "md5:57408fa10aa4689c43630f994cff8d30", "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 "BIFROST-simulation-lookup-table.h5": "md5:6d776afa591d4a83c91ad0142bbfc53d", }, diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index bbdd4be2c..496df3e9c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -155,6 +155,6 @@ def mask_large_uncertainty_in_lut_detector( """Providers for wavelength calculation on indirect geometry spectrometers. The providers here override the default providers of -:class:`ess.reduce.wavelength.GenericUnwrapWorkflow` +:class:`ess.reduce.unwrap.GenericUnwrapWorkflow` to customize the workflow for indirect geometry spectrometers. """ diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 2fea260af..43206adce 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -111,6 +111,7 @@ def test_simulation_workflow_produces_the_same_data_as_before( workflow: sciline.Pipeline, ) -> None: energy_data = workflow.compute(EnergyQDetector[SampleRun]) + sc.io.save_hdf5(energy_data, 'computed_energy_data_simulated_5x2.h5') expected = sc.io.load_hdf5(computed_energy_data_simulated_5x2()) assert not energy_data.masks From c48296c41db89e684c01a5576183f6d270301769 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Mon, 23 Mar 2026 10:23:25 +0100 Subject: [PATCH 301/330] deps: bump scipp --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- packages/essspectroscopy/requirements/base.txt | 2 +- packages/essspectroscopy/requirements/ci.txt | 4 ++-- packages/essspectroscopy/requirements/dev.txt | 4 ++-- packages/essspectroscopy/requirements/docs.txt | 2 +- packages/essspectroscopy/requirements/static.txt | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 2fd82fd26..b1eaf2ad1 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -34,7 +34,7 @@ dependencies = [ "graphviz>=0.20", "pandas>=2.1.2", "sciline>=25.4.1", - "scipp>=25.3.0", + "scipp>=26.1.0", "scippneutron>=25.11.2", "scippnexus>=24.9.0", "tof>=25.11.0", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index d7bb5480e..04e81ea8b 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -6,7 +6,7 @@ essreduce>=26.3.1 graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 -scipp>=25.3.0 +scipp>=26.1.0 scippneutron>=25.11.2 scippnexus>=24.9.0 tof>=25.11.0 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 4b2ceaaa9..baf456a10 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:c5c781acacd322b401c05178bfdba47de93523bb +# SHA1:b4cdc153e8e2e079e6b0be49258477d55e265ec9 # # This file was generated by pip-compile-multi. # To update, run: diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index 28afd994f..dedea3a98 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -40,7 +40,7 @@ pluggy==1.6.0 # via tox pyproject-api==1.10.0 # via tox -python-discovery==1.1.3 +python-discovery==1.2.0 # via virtualenv requests==2.32.5 # via -r ci.in @@ -48,7 +48,7 @@ smmap==5.0.3 # via gitdb tomli-w==1.2.0 # via tox -tox==4.49.1 +tox==4.50.3 # via -r ci.in urllib3==2.6.3 # via requests diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 64d3f61a7..882f641f6 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -22,7 +22,7 @@ argon2-cffi-bindings==25.1.0 # via argon2-cffi arrow==1.4.0 # via isoduration -async-lru==2.2.0 +async-lru==2.3.0 # via jupyterlab cffi==2.0.0 # via argon2-cffi-bindings @@ -50,7 +50,7 @@ jinja2-ansible-filters==1.3.2 # via copier json5==0.13.0 # via jupyterlab-server -jsonpointer==3.0.0 +jsonpointer==3.1.0 # via jsonschema jsonschema[format-nongpl]==4.26.0 # via diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 4b9e2d297..2793e92e2 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -12,7 +12,7 @@ alabaster==1.0.0 # via sphinx asttokens==3.0.1 # via stack-data -attrs==25.4.0 +attrs==26.1.0 # via # jsonschema # referencing diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index abd79942f..02cb746f8 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -23,7 +23,7 @@ platformdirs==4.9.4 # virtualenv pre-commit==4.5.1 # via -r static.in -python-discovery==1.1.3 +python-discovery==1.2.0 # via virtualenv pyyaml==6.0.3 # via pre-commit From 25e922bc43b97c61ff50162623a89100059930ed Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Tue, 24 Mar 2026 15:55:47 +0100 Subject: [PATCH 302/330] bump essreduce --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- packages/essspectroscopy/requirements/base.txt | 4 ++-- packages/essspectroscopy/requirements/dev.txt | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index b1eaf2ad1..3a7d263e4 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,7 +30,7 @@ requires-python = ">=3.11" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=26.3.1", + "essreduce>=26.4.0", "graphviz>=0.20", "pandas>=2.1.2", "sciline>=25.4.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index 04e81ea8b..e6807c85c 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=26.3.1 +essreduce>=26.4.0 graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index baf456a10..8467d71b3 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:b4cdc153e8e2e079e6b0be49258477d55e265ec9 +# SHA1:b30fe4f8b8899208801c1e28bbca8fdf94dbc938 # # This file was generated by pip-compile-multi. # To update, run: @@ -21,7 +21,7 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==26.3.1 +essreduce==26.4.0 # via -r base.in fonttools==4.62.1 # via matplotlib diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index 882f641f6..e6f94c4d6 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -12,7 +12,7 @@ -r static.txt -r test.txt -r wheels.txt -anyio==4.12.1 +anyio==4.13.0 # via # httpx # jupyter-server @@ -50,7 +50,7 @@ jinja2-ansible-filters==1.3.2 # via copier json5==0.13.0 # via jupyterlab-server -jsonpointer==3.1.0 +jsonpointer==3.1.1 # via jsonschema jsonschema[format-nongpl]==4.26.0 # via From c8a182a79855dd170c155df0972a6a9069c1b5dc Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Tue, 24 Mar 2026 16:01:50 +0100 Subject: [PATCH 303/330] fix --- .../docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index ecb5ba14b..02d0f3fbb 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -115,7 +115,7 @@ " sample_position: Position[snx.NXsample, RunType],\n", " gravity: GravityVector,\n", ") -> DetectorLtotal[RunType]:\n", - " from ess.reduce.wavelength import to_wavelength\n", + " from ess.reduce.unwrap import to_wavelength\n", " return to_wavelength.detector_ltotal_from_straight_line_approximation(\n", " detector_beamline, # type: ignore[arg-type]\n", "\n", From 5755710debefaca48d9ebdb442a188d42c6e75b6 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 26 Mar 2026 13:51:24 +0100 Subject: [PATCH 304/330] Ignore links to zenodo Linkcheck gets an access denied response. --- packages/essspectroscopy/docs/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/conf.py b/packages/essspectroscopy/docs/conf.py index bf3e9a4ce..f17535407 100644 --- a/packages/essspectroscopy/docs/conf.py +++ b/packages/essspectroscopy/docs/conf.py @@ -271,7 +271,8 @@ def do_not_plot(*args, **kwargs): r'https?://github\.com/.*?/blob/[a-f0-9]+/.+?#', # Linkcheck seems to be denied access by some DOI resolvers. # Since DOIs are supposed to be permanent, we don't need to check them.' - r'https://doi\.org/', + r'https?://doi\.org/', + r'https?://zenodo\.org/', # ESS Jira is not publicly accessible. r'https?://jira\.ess\.eu', r'https?://dx\.doi\.org/', From 5afb972d7b4b4b8406c6c14ff2ebf82adce1e961 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 26 Mar 2026 13:51:38 +0100 Subject: [PATCH 305/330] Fix link to notebook --- packages/essspectroscopy/src/ess/bifrost/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 821d4769a..5a27e372e 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -39,7 +39,7 @@ def lookup_table_simulation() -> Path: This table was computed with `tof `_ using `Create a wavelength lookup table for BIFROST - <../../user-guide/bifrost/bifrost-make-lookup-table.rst>`_ + <../../user-guide/bifrost/bifrost-make-wavelength-lookup-table.rst>`_ with ``NumberOfSimulatedNeutrons = 5_000_000``. """ return get_path("BIFROST-simulation-lookup-table.h5") From 9e2fe16a75e833141d1b5f696a99f17bc453af07 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 26 Mar 2026 14:02:36 +0100 Subject: [PATCH 306/330] Fix toc entry --- packages/essspectroscopy/docs/user-guide/bifrost/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/index.md b/packages/essspectroscopy/docs/user-guide/bifrost/index.md index c7cca4364..c982681be 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/index.md +++ b/packages/essspectroscopy/docs/user-guide/bifrost/index.md @@ -35,5 +35,5 @@ bifrost-bragg-peak-monitor maxdepth: 1 --- -bifrost-make-tof-lookup-table +bifrost-make-wavelength-lookup-table ``` From 4c2675382a0b998b00beb73266bcb279185f890f Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Fri, 27 Feb 2026 10:21:31 +0100 Subject: [PATCH 307/330] [Fix] Remove time-dependence from geometry calcs The positions and orientation of components after the sample position are, strictly speaking, time-dependent parameters. Previously their transformation chains lacked this fidelity due to limitations in creating the NeXus Structure JSON via `moreniius`. Those limitations have been lifted and newly-generated BIFROST simulation files include NXtransformation groups with NXlog constituents. In order to calculate the correct analyzer and sample scattering angle for each detector pixel, the BIFROST workflow performs some geometry calculations in the coordinate frame which rotates with the detector tank, around the sample position. Since the analyzers and detectors are stationary in this frame, we can (and must) remove any time-dependence from their positions and orientations. This PR introduces a quick-and-dirty hack to only use the first time-point from any time-dependent transformation result for the - sample - analyzers - detectors --- .../src/ess/spectroscopy/indirect/kf.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index e62d09aff..54f03e4c2 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -19,6 +19,14 @@ ) +def _no_time(x: sc.Variable | sc.DataArray) -> sc.Variable: + if isinstance(x, sc.DataArray) and 'time' in x.coords: + return x['time', 0].data + elif isinstance(x, sc.DataArray): + raise ValueError("Only `DataArray`s with a time-coordinate allowed") + return x + + def sample_analyzer_vector( sample_position: sc.Variable, analyzer_position: sc.Variable, @@ -52,6 +60,17 @@ def sample_analyzer_vector( The vector from the sample position to the interaction point on the analyzer for each detector element. """ + # FIXME time-dependent depends-on chains produce positions and transformations + # which are `scipp.DataArray`s with a 'time' coordinate. We don't need the + # time-dependence here since all calculations are done in the rotating + # detector-tank coordinate system where these *have no* time-dependence + # TODO: Verify that we are actually using the rotating detector-tank coordinate + # frame, otherwise we will misidentify the Q vector for each detector + sample_position = _no_time(sample_position) + analyzer_position = _no_time(analyzer_position) + analyzer_transform = _no_time(analyzer_transform) + detector_position = _no_time(detector_position) + # Scipp does not distinguish between coordinates and directions, so we need to do # some extra legwork to ensure we can apply the orientation transformation # _and_ obtain a dimensionless direction vector @@ -123,6 +142,16 @@ def analyzer_detector_vector( detector_position: sc.Variable, ) -> sc.Variable: """Calculate the analyzer-detector vector""" + # FIXME time-dependent depends-on chains produce positions and transformations + # which are `scipp.DataArray`s with a 'time' coordinate. We don't need the + # time-dependence here since all calculations are done in the rotating + # detector-tank coordinate system where these *have no* time-dependence + # TODO: Verify that we are actually using the rotating detector-tank coordinate + # frame, otherwise we will misidentify the Q vector for each detector + sample_position = _no_time(sample_position) + sample_analyzer_vector = _no_time(sample_analyzer_vector) # FIXME unnecessary? + detector_position = _no_time(detector_position) + analyzer_position = sample_position + sample_analyzer_vector.to( unit=sample_analyzer_vector.unit ) From c5bad3c2b34a83d223e8caaee67c1082df0df264 Mon Sep 17 00:00:00 2001 From: Gregory Tucker Date: Fri, 27 Feb 2026 11:19:08 +0100 Subject: [PATCH 308/330] [Add] @inputs for detector->analyzer resolution The NeXus format specification now allows most base objects to specify two attributes which help define the *expected* beam path through a collection of instrument components: `@inputs` and `@outputs`. Updates to `moreniius` mean that the BIFROST NeXus Structure JSON now contains these attributes, including the one-to-many and many-to-one transitions between, e.g., the sample position and the 45 analyzers. Given a detector's HDF5 Group, it is possible to follow the @inputs attributes analagously to a depends-on chain to identify which analyzer the detector should have received its neutron events from. This commit adds functionality which has only been tested outside of the workflow, by defining the `DetectorAnalyzerMap` at repl scope and the patching `ess.bifrost.io.nexus._get_analyzer_for_detector_name` to use the static relational information. I imagine it needs work to mold it into an appropriate `sciline` workflow. --- .../src/ess/bifrost/io/nexus.py | 93 +++++++++++++++++-- .../essspectroscopy/src/ess/bifrost/types.py | 3 + 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 41b32975a..25cd0ab4c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -6,6 +6,7 @@ import scipp as sc import scippnexus as snx +from ess.bifrost.types import DetectorAnalyzerMap from ess.reduce.nexus import load_all_components, open_component_group from ess.reduce.nexus.types import NeXusAllLocationSpec, NeXusLocationSpec from ess.spectroscopy.types import ( @@ -59,20 +60,85 @@ def load_analyzers(file_spec: NeXusFileSpec[RunType]) -> Analyzers[RunType]: ) -def _get_analyzer_for_detector_name( - detector_name: str, analyzers: Analyzers[RunType] -) -> Analyzers[RunType]: - detector_index = int(detector_name.split('_', 1)[0]) - analyzer_index = str(detector_index - 2) - for name, analyzer in analyzers.items(): - if name.startswith(analyzer_index): - return analyzer - raise RuntimeError(f"No analyzer found for detector {detector_name}") +def _do_breadth_first_search(group, targets, obj_deque, obj_next): + """ + Look for a unique element of targets by following the 'next' for object in a queue + + Parameters + ---------- + group: HDF5 Group + The group that contains all possible next named groups + targets: + A structure with named targets that supports `name in targets` + obj_deque: + A queue.deque of HDF5 Groups to be checked + obj_next: + A function that extracts a list of named groups to check from a given group + """ + while len(obj_deque) > 0: + check = obj_next(obj_deque.popleft()) + matches = [element for element in check if element in targets] + if len(matches) > 1: + raise ValueError("Non-unique elmeent match") + if len(matches) == 1: + return matches[0] + for element in check: + obj_deque.append(group[element]) + raise ValueError("No unique element found") + + +def analyzer_search(hdf5_instrument_group, analyzers, hdf5_detector_group): + """ + Use a NeXus Group's @inputs attribute to find an analyzer given a detector group + + Parameters + ---------- + hdf5_instrument_group: hdf5.Group + works if inside of a context group + ``` + scippnexus.File(filename, 'r') as f: + hdf5_instrument_group = f['/entry/instrument'] + ``` + analyzers: Anything with __contains__(str), e.g. dict[str, hdf5.Group] + Something to identify whether we've found a valid analyzer (by name) + hdf5_detector_group: hdf5.Group + any of f['/entry/detector'][scippnexus.NXdectector].values() + """ + from queue import deque + + from h5py import Group + + def obj_inputs(obj: Group) -> list[str]: + """Return the specified preceding component(s) list""" + if 'inputs' not in obj.attrs: + raise ValueError('@inputs attribute required for this search to work') + val = obj.attrs['inputs'] + # Deal with nexusformat (Python module) or kafka-to-nexus (filewriter) + # silently converting a len(list[str]) == 1 attribute to a str attribute: + return [val] if isinstance(val, str) else val + + return _do_breadth_first_search( + hdf5_instrument_group, analyzers, deque([hdf5_detector_group]), obj_inputs + ) + + +def get_detector_analyzer_map(file_spec: NeXusFileSpec[RunType]) -> DetectorAnalyzerMap: + """Probably not the right sciline way to do this.""" + + from scippnexus import File, NXcrystal, NXdetector + + filename = file_spec.value + with File(filename, 'r') as file: + inst = file['entry/instrument'] + analyzers = inst[NXcrystal] + detectors = inst[NXdetector] + return {k: analyzer_search(inst, analyzers, v) for k, v in detectors.items()} def analyzer_for_detector( analyzers: Analyzers[RunType], detector_location: NeXusComponentLocationSpec[snx.NXdetector, RunType], + detector_analyzer_map: DetectorAnalyzerMap, ) -> Analyzer[RunType]: """Extract the analyzer for a given detector. @@ -98,8 +164,14 @@ def analyzer_for_detector( """ if detector_location.component_name is None: raise ValueError("Detector component name is None") + if ( + analyzer_name := detector_analyzer_map.get(detector_location.component_name) + ) is None: + raise RuntimeError( + f"No analyzer found for detector {detector_location.component_name}" + ) analyzer = snx.compute_positions( - _get_analyzer_for_detector_name(detector_location.component_name, analyzers), + analyzers[analyzer_name], store_transform='transform', ) return Analyzer[RunType]( @@ -117,4 +189,5 @@ def analyzer_for_detector( load_instrument_angle, load_sample_angle, moderator_class_for_source, + get_detector_analyzer_map, ) diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 46a0018c5..38647c2ec 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -21,3 +21,6 @@ class McStasRawDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... ArcEnergy = NewType('ArcEnergy', sc.Variable) + + +DetectorAnalyzerMap = NewType('DetectorAnalyzerMap', dict[str, str]) From cac5678e2962719fa8931a89fa34eea84aade30c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 4 Mar 2026 16:58:35 +0100 Subject: [PATCH 309/330] Patches to use workflow --- ...bifrost-make-wavelength-lookup-table.ipynb | 2 +- .../src/ess/bifrost/io/nexus.py | 12 ++++--- .../src/ess/bifrost/normalization.py | 4 +-- .../ess/bifrost/single_crystal/workflow.py | 9 +++-- .../essspectroscopy/src/ess/bifrost/types.py | 2 +- .../src/ess/bifrost/workflow.py | 36 ++++++++++++------- .../src/ess/spectroscopy/types.py | 15 ++++---- .../tests/bifrost/workflow_test.py | 6 ++-- 8 files changed, 48 insertions(+), 38 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb index e86478107..a8533cfe3 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb @@ -69,7 +69,7 @@ "bifrost_workflow = BifrostSimulationWorkflow(detector_names)\n", "bifrost_workflow[Filename[SampleRun]] = input_filename\n", "\n", - "M = nexus.types.EmptyMonitor[SampleRun, FrameMonitor3]\n", + "M = nexus.types.EmptyMonitor[SampleRun, NormalizationMonitor]\n", "C = RawChoppers[SampleRun]\n", "SOURCE = Position[snx.NXsource, SampleRun]\n", "SAMPLE = Position[snx.NXsample, SampleRun]\n", diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 25cd0ab4c..88716d3ab 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -7,7 +7,7 @@ import scippnexus as snx from ess.bifrost.types import DetectorAnalyzerMap -from ess.reduce.nexus import load_all_components, open_component_group +from ess.reduce.nexus import load_all_components, open_component_group, open_nexus_file from ess.reduce.nexus.types import NeXusAllLocationSpec, NeXusLocationSpec from ess.spectroscopy.types import ( Analyzer, @@ -122,13 +122,15 @@ def obj_inputs(obj: Group) -> list[str]: ) -def get_detector_analyzer_map(file_spec: NeXusFileSpec[RunType]) -> DetectorAnalyzerMap: +def get_detector_analyzer_map( + file_spec: NeXusFileSpec[RunType], +) -> DetectorAnalyzerMap[RunType]: """Probably not the right sciline way to do this.""" - from scippnexus import File, NXcrystal, NXdetector + from scippnexus import NXcrystal, NXdetector filename = file_spec.value - with File(filename, 'r') as file: + with open_nexus_file(filename) as file: inst = file['entry/instrument'] analyzers = inst[NXcrystal] detectors = inst[NXdetector] @@ -138,7 +140,7 @@ def get_detector_analyzer_map(file_spec: NeXusFileSpec[RunType]) -> DetectorAnal def analyzer_for_detector( analyzers: Analyzers[RunType], detector_location: NeXusComponentLocationSpec[snx.NXdetector, RunType], - detector_analyzer_map: DetectorAnalyzerMap, + detector_analyzer_map: DetectorAnalyzerMap[RunType], ) -> Analyzer[RunType]: """Extract the analyzer for a given detector. diff --git a/packages/essspectroscopy/src/ess/bifrost/normalization.py b/packages/essspectroscopy/src/ess/bifrost/normalization.py index 074bf3b54..41bfa232c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/normalization.py +++ b/packages/essspectroscopy/src/ess/bifrost/normalization.py @@ -7,8 +7,8 @@ from ess.reduce.uncertainty import broadcast_uncertainties from ess.spectroscopy.types import ( - FrameMonitor3, IncidentEnergyDetector, + NormalizationMonitor, NormalizedIncidentEnergyDetector, ProtonCharge, RunType, @@ -19,7 +19,7 @@ def normalize_by_monitor_and_proton_charge( detector: IncidentEnergyDetector[RunType], - monitor: WavelengthMonitor[RunType, FrameMonitor3], + monitor: WavelengthMonitor[RunType, NormalizationMonitor], proton_charge: ProtonCharge[RunType], uncertainty_broadcast_mode: UncertaintyBroadcastMode, ) -> NormalizedIncidentEnergyDetector[RunType]: diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py index 88c7fdf64..49addb6f7 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py @@ -7,9 +7,8 @@ from ess.reduce import unwrap as reduce_unwrap from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( - FrameMonitor1, - FrameMonitor2, - FrameMonitor3, + ElasticMonitor, + NormalizationMonitor, SampleRun, ) @@ -40,7 +39,7 @@ def BifrostBraggPeakMonitorWorkflow() -> sciline.Pipeline: workflow = TofWorkflow( run_types=(SampleRun,), - monitor_types=(FrameMonitor1, FrameMonitor2, FrameMonitor3), + monitor_types=(ElasticMonitor, NormalizationMonitor), ) # Use the vanilla implementation instead of the indirect geometry one: workflow.insert(reduce_unwrap.to_wavelength.detector_wavelength_data) @@ -54,7 +53,7 @@ def BifrostBraggPeakMonitorWorkflow() -> sciline.Pipeline: def BifrostSimulationBraggPeakMonitorWorkflow() -> sciline.Pipeline: workflow = TofWorkflow( run_types=(SampleRun,), - monitor_types=(FrameMonitor1, FrameMonitor2, FrameMonitor3), + monitor_types=(ElasticMonitor, NormalizationMonitor), ) # Use the vanilla implementation instead of the indirect geometry one: workflow.insert(reduce_unwrap.to_wavelength.detector_wavelength_data) diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 38647c2ec..16af2e86c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -23,4 +23,4 @@ class McStasRawDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... ArcEnergy = NewType('ArcEnergy', sc.Variable) -DetectorAnalyzerMap = NewType('DetectorAnalyzerMap', dict[str, str]) +class DetectorAnalyzerMap(sciline.Scope[RunType, dict[str, str]], dict): ... diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index ff158bbd4..b328a5cf0 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -14,15 +14,15 @@ from ess.spectroscopy.indirect.ki import providers as ki_providers from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( + ElasticMonitor, EmptyDetector, - FrameMonitor0, - FrameMonitor1, - FrameMonitor2, - FrameMonitor3, NeXusData, NeXusDetectorName, NeXusMonitorName, + NormalizationMonitor, + OverlapMonitor, ProtonCharge, + PSCMonitor, PulsePeriod, RawDetector, SampleRun, @@ -39,9 +39,10 @@ def default_parameters() -> dict[type, Any]: """Default parameters for BifrostWorkflow.""" return { - NeXusMonitorName[FrameMonitor1]: '090_frame_1', - NeXusMonitorName[FrameMonitor2]: '097_frame_2', - NeXusMonitorName[FrameMonitor3]: '110_frame_3', + NeXusMonitorName[ElasticMonitor]: "elastic_monitor", + NeXusMonitorName[NormalizationMonitor]: "normalization_monitor", + NeXusMonitorName[OverlapMonitor]: "overlap_monitor", + NeXusMonitorName[PSCMonitor]: "psc_monitor", PulsePeriod: 1.0 / sc.scalar(14.0, unit="Hz"), UncertaintyBroadcastMode: UncertaintyBroadcastMode.fail, } @@ -50,9 +51,10 @@ def default_parameters() -> dict[type, Any]: def simulation_default_parameters() -> dict[type, Any]: """Default parameters for BifrostSimulationWorkflow.""" return { - NeXusMonitorName[FrameMonitor1]: '090_frame_1', - NeXusMonitorName[FrameMonitor2]: '097_frame_2', - NeXusMonitorName[FrameMonitor3]: '110_frame_3', + NeXusMonitorName[ElasticMonitor]: "elastic_monitor", + NeXusMonitorName[NormalizationMonitor]: "normalization_monitor", + NeXusMonitorName[OverlapMonitor]: "overlap_monitor", + NeXusMonitorName[PSCMonitor]: "psc_monitor", PulsePeriod: 1.0 / sc.scalar(14.0, unit="Hz"), ProtonCharge[SampleRun]: sc.DataArray(sc.scalar(1.0, unit='pC')), UncertaintyBroadcastMode: UncertaintyBroadcastMode.fail, @@ -98,7 +100,12 @@ def BifrostSimulationWorkflow( """ workflow = TofWorkflow( run_types=(SampleRun,), - monitor_types=(FrameMonitor0, FrameMonitor1, FrameMonitor2, FrameMonitor3), + monitor_types=( + ElasticMonitor, + NormalizationMonitor, + OverlapMonitor, + PSCMonitor, + ), ) for provider in _SIMULATION_PROVIDERS: workflow.insert(provider) @@ -120,7 +127,12 @@ def BifrostWorkflow( """Data reduction workflow for BIFROST.""" workflow = TofWorkflow( run_types=(SampleRun,), - monitor_types=(FrameMonitor0, FrameMonitor1, FrameMonitor2, FrameMonitor3), + monitor_types=( + ElasticMonitor, + NormalizationMonitor, + OverlapMonitor, + PSCMonitor, + ), ) for provider in _PROVIDERS: workflow.insert(provider) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 2d850616b..161f2dafa 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -36,20 +36,17 @@ SampleRun = reduce_t.SampleRun VanadiumRun = reduce_t.VanadiumRun -FrameMonitor0 = reduce_t.FrameMonitor0 -FrameMonitor1 = reduce_t.FrameMonitor1 -FrameMonitor2 = reduce_t.FrameMonitor2 -FrameMonitor3 = reduce_t.FrameMonitor3 +# BIFROST monitors +ElasticMonitor = NewType('ElasticMonitor', int) +NormalizationMonitor = NewType('NormalizationMonitor', int) +PSCMonitor = NewType('PSCMonitor', int) +OverlapMonitor = NewType('OverlapMonitor', int) # Type vars RunType = TypeVar("RunType", SampleRun, VanadiumRun) MonitorType = TypeVar( - "MonitorType", - FrameMonitor0, - FrameMonitor1, - FrameMonitor2, - FrameMonitor3, + "MonitorType", ElasticMonitor, NormalizationMonitor, PSCMonitor, OverlapMonitor ) # Time-of-flight types diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 43206adce..5d5b1a177 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -16,10 +16,10 @@ from ess.spectroscopy.types import ( EnergyQDetector, Filename, - FrameMonitor3, LookupTableFilename, LookupTableRelativeErrorThreshold, NeXusDetectorName, + NormalizationMonitor, RawDetector, RawMonitor, SampleRun, @@ -63,7 +63,7 @@ def test_simulation_workflow_can_load_detector() -> None: def test_simulation_workflow_can_load_monitor(workflow: sciline.Pipeline) -> None: - result = workflow.compute(RawMonitor[SampleRun, FrameMonitor3]) + result = workflow.compute(RawMonitor[SampleRun, NormalizationMonitor]) assert result.bins is None assert 'position' in result.coords @@ -100,7 +100,7 @@ def test_simulation_workflow_can_compute_energy_data( def test_simulation_workflow_can_compute_wavelength_monitor( workflow: sciline.Pipeline, ) -> None: - monitor = workflow.compute(WavelengthMonitor[SampleRun, FrameMonitor3]) + monitor = workflow.compute(WavelengthMonitor[SampleRun, NormalizationMonitor]) assert set(monitor.dims) == {'time', 'incident_wavelength'} expected_coords = {'position', 'incident_wavelength', 'time'} assert expected_coords.issubset(monitor.coords) From cd50d5c3b6b5aad1bd3ca255290d420eee7c10fd Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 11 Mar 2026 10:07:42 +0100 Subject: [PATCH 310/330] Start handling time-dep analyzers --- .../essspectroscopy/src/ess/bifrost/detector.py | 6 +++++- .../essspectroscopy/src/ess/bifrost/workflow.py | 7 +------ .../src/ess/spectroscopy/indirect/conversion.py | 17 +++++++++++++---- .../src/ess/spectroscopy/indirect/kf.py | 17 ++++------------- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 24acd57f3..cad5cce4d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -8,6 +8,7 @@ from ess.spectroscopy.indirect.conversion import add_spectrometer_coords from ess.spectroscopy.types import ( + Analyzer, DetectorPositionOffset, EmptyDetector, NeXusComponent, @@ -78,6 +79,7 @@ def arc_and_channel_from_detector_number( def get_calibrated_detector_bifrost( detector: NeXusComponent[snx.NXdetector, RunType], + analyzer: Analyzer[RunType], *, transform: NeXusTransformation[snx.NXdetector, RunType], offset: DetectorPositionOffset[RunType], @@ -97,6 +99,8 @@ def get_calibrated_detector_bifrost( ---------- detector: Loaded NeXus detector. + analyzer: + Loaded analyzer parameters. transform: Transformation that determines the detector position. offset: @@ -131,7 +135,7 @@ def get_calibrated_detector_bifrost( da.coords['arc'] = arc da.coords['channel'] = channel - da = add_spectrometer_coords(da, primary_graph, secondary_graph) + da = add_spectrometer_coords(da, analyzer, primary_graph, secondary_graph) return EmptyDetector[RunType](da) diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index b328a5cf0..4f3fb57a7 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -51,13 +51,8 @@ def default_parameters() -> dict[type, Any]: def simulation_default_parameters() -> dict[type, Any]: """Default parameters for BifrostSimulationWorkflow.""" return { - NeXusMonitorName[ElasticMonitor]: "elastic_monitor", - NeXusMonitorName[NormalizationMonitor]: "normalization_monitor", - NeXusMonitorName[OverlapMonitor]: "overlap_monitor", - NeXusMonitorName[PSCMonitor]: "psc_monitor", - PulsePeriod: 1.0 / sc.scalar(14.0, unit="Hz"), + **default_parameters(), ProtonCharge[SampleRun]: sc.DataArray(sc.scalar(1.0, unit='pC')), - UncertaintyBroadcastMode: UncertaintyBroadcastMode.fail, } diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index fa4196bf8..d1fe9e380 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -13,6 +13,7 @@ ) from ..types import ( + Analyzer, EnergyQDetector, GravityVector, IncidentEnergyDetector, @@ -244,7 +245,8 @@ def add_incident_energy( def add_spectrometer_coords( - data: sc.DataArray, + detector: sc.DataArray, + analyzer: Analyzer[RunType], primary_graph: PrimarySpecCoordTransformGraph[RunType], secondary_graph: SecondarySpecCoordTransformGraph[RunType], ) -> sc.DataArray: @@ -252,10 +254,12 @@ def add_spectrometer_coords( Parameters ---------- - data: + detector: Data array with beamline coordinates "position", "source_position", and "sample_position". Does not need to contain events or flight times. + analyzer: + Data group with analyzer parameters. primary_graph: Coordinate transformation graph for the primary spectrometer. secondary_graph: @@ -269,7 +273,12 @@ def add_spectrometer_coords( Input data with added spectrometer coordinates. This includes "final_energy", "secondary_flight_time", and "L1". """ - return data.transform_coords( + # TODO lookup time-dep analyzers based on `data` and isert into graph + + # "analyzer_dspacing": lambda: analyzer["dspacing"], + # "analyzer_position": lambda: analyzer["position"], + # "analyzer_transform": lambda: analyzer["transform"], + return detector.transform_coords( ( 'final_energy', 'final_wavevector', @@ -278,7 +287,7 @@ def add_spectrometer_coords( 'secondary_flight_time', ), graph={**primary_graph, **secondary_graph}, - keep_intermediate=False, + keep_intermediate=True, # TODO keep_aliases=False, rename_dims=False, ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 54f03e4c2..080a77da2 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -10,7 +10,6 @@ ) from ess.spectroscopy.types import ( - Analyzer, DataAtSample, DataGroupedByRotation, PulsePeriod, @@ -19,6 +18,7 @@ ) +# TODO remove? def _no_time(x: sc.Variable | sc.DataArray) -> sc.Variable: if isinstance(x, sc.DataArray) and 'time' in x.coords: return x['time', 0].data @@ -240,30 +240,21 @@ def secondary_flight_time( return sc.to_unit(L2 / velocity, 'ms', copy=False) -def secondary_spectrometer_coordinate_transformation_graph( - analyzer: Analyzer[RunType], -) -> SecondarySpecCoordTransformGraph[RunType]: +def secondary_spectrometer_coordinate_transformation_graph() -> ( + SecondarySpecCoordTransformGraph[RunType] +): """Return a coordinate transformation graph for the secondary spectrometer. - Parameters - ---------- - analyzer: - Data group with analyzer parameters. - Returns ------- : Coordinate transformation graph for the secondary spectrometer. - The graph captures the relevant parameters of ``analyzer``. """ from scippneutron.conversion.beamline import beam_aligned_unit_vectors return SecondarySpecCoordTransformGraph[RunType]( { "a4": detector_geometric_a4, - "analyzer_dspacing": lambda: analyzer["dspacing"], - "analyzer_position": lambda: analyzer["position"], - "analyzer_transform": lambda: analyzer["transform"], "beam_aligned_unit_vectors": beam_aligned_unit_vectors, "detector_position": "position", "sample_analyzer_vector": sample_analyzer_vector, From 124243770d15f1eeb7c7c23c3d0cae5f8dd746f9 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 11 Mar 2026 14:13:21 +0100 Subject: [PATCH 311/330] Load analyzer w default mechanism --- .../src/ess/bifrost/io/nexus.py | 191 +++++++----------- .../essspectroscopy/src/ess/bifrost/types.py | 3 - .../src/ess/spectroscopy/types.py | 4 - 3 files changed, 76 insertions(+), 122 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 88716d3ab..eac6e37c8 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -3,19 +3,22 @@ """NeXus input/output for BIFROST.""" +import warnings + import scipp as sc import scippnexus as snx -from ess.bifrost.types import DetectorAnalyzerMap -from ess.reduce.nexus import load_all_components, open_component_group, open_nexus_file -from ess.reduce.nexus.types import NeXusAllLocationSpec, NeXusLocationSpec +from ess.reduce.nexus import open_component_group +from ess.reduce.nexus.types import NeXusLocationSpec from ess.spectroscopy.types import ( Analyzer, - Analyzers, InstrumentAngle, NeXusClass, + NeXusComponent, NeXusComponentLocationSpec, NeXusFileSpec, + NeXusTransformation, + Position, RunType, SampleAngle, ) @@ -50,146 +53,104 @@ def _load_experiment_parameter( return group[param_name][()]['value'] -def load_analyzers(file_spec: NeXusFileSpec[RunType]) -> Analyzers[RunType]: - """Load all analyzers in a NeXus file.""" - return Analyzers[RunType]( - load_all_components( - NeXusAllLocationSpec(filename=file_spec.value), - nx_class=snx.NXcrystal, +def load_analyzer_for_detector( + detector_location: NeXusComponentLocationSpec[snx.NXdetector, RunType], +) -> NeXusComponent[snx.NXcrystal, RunType]: + """Load the analyzer component for the given detector. + + This function searches for an ``NXcrystal`` in the inputs (via the + 'input' attribute) of the detector and loads the first NeXus group it finds. + """ + with open_component_group(detector_location, nx_class=snx.NXdetector) as det_group: + analyzer_group = _find_class_in_inputs( + group=det_group.parent, target=snx.NXcrystal, start=det_group ) - ) + return analyzer_group[()] -def _do_breadth_first_search(group, targets, obj_deque, obj_next): - """ - Look for a unique element of targets by following the 'next' for object in a queue +def _find_class_in_inputs( + group: snx.Group, target: type, start: snx.Group +) -> snx.Group: + """Search for a NeXus class in a group's inputs. + + This function uses a breadth-first search through ``'input'`` attributes. + It begins at ``start`` and walks along chains of inputs until a group with the + given class is found, the chain ends, or the chain leads outside ``group``. Parameters ---------- group: HDF5 Group The group that contains all possible next named groups - targets: - A structure with named targets that supports `name in targets` - obj_deque: - A queue.deque of HDF5 Groups to be checked - obj_next: - A function that extracts a list of named groups to check from a given group - """ - while len(obj_deque) > 0: - check = obj_next(obj_deque.popleft()) - matches = [element for element in check if element in targets] - if len(matches) > 1: - raise ValueError("Non-unique elmeent match") - if len(matches) == 1: - return matches[0] - for element in check: - obj_deque.append(group[element]) - raise ValueError("No unique element found") - - -def analyzer_search(hdf5_instrument_group, analyzers, hdf5_detector_group): - """ - Use a NeXus Group's @inputs attribute to find an analyzer given a detector group + target: + The NeXus class to look for. - Parameters - ---------- - hdf5_instrument_group: hdf5.Group - works if inside of a context group - ``` - scippnexus.File(filename, 'r') as f: - hdf5_instrument_group = f['/entry/instrument'] - ``` - analyzers: Anything with __contains__(str), e.g. dict[str, hdf5.Group] - Something to identify whether we've found a valid analyzer (by name) - hdf5_detector_group: hdf5.Group - any of f['/entry/detector'][scippnexus.NXdectector].values() + Returns + ------- + : + The group with the target NeXus class found within ``group``. """ - from queue import deque - - from h5py import Group - - def obj_inputs(obj: Group) -> list[str]: - """Return the specified preceding component(s) list""" - if 'inputs' not in obj.attrs: - raise ValueError('@inputs attribute required for this search to work') - val = obj.attrs['inputs'] - # Deal with nexusformat (Python module) or kafka-to-nexus (filewriter) - # silently converting a len(list[str]) == 1 attribute to a str attribute: - return [val] if isinstance(val, str) else val - - return _do_breadth_first_search( - hdf5_instrument_group, analyzers, deque([hdf5_detector_group]), obj_inputs - ) - - -def get_detector_analyzer_map( - file_spec: NeXusFileSpec[RunType], -) -> DetectorAnalyzerMap[RunType]: - """Probably not the right sciline way to do this.""" - - from scippnexus import NXcrystal, NXdetector - - filename = file_spec.value - with open_nexus_file(filename) as file: - inst = file['entry/instrument'] - analyzers = inst[NXcrystal] - detectors = inst[NXdetector] - return {k: analyzer_search(inst, analyzers, v) for k, v in detectors.items()} - - -def analyzer_for_detector( - analyzers: Analyzers[RunType], - detector_location: NeXusComponentLocationSpec[snx.NXdetector, RunType], - detector_analyzer_map: DetectorAnalyzerMap[RunType], + pending = [start] + while pending: + element = pending.pop(0) + if element.nx_class == target: + return element + for name in _get_inputs(element): + try: + pending.append(group[name]) + except KeyError: + warnings.warn(f"No '{name}' in NeXus group {group.name}", stacklevel=2) + continue + raise ValueError(f"No {target} found in the inputs of {start.name}") + + +def _get_inputs(group: snx.Group) -> list[str]: + try: + inputs = group.attrs['inputs'] + except KeyError: + return [] + # Deal with nexusformat (Python module) or kafka-to-nexus (filewriter) + # silently converting a len(list[str]) == 1 attribute to a str attribute: + return [inputs] if isinstance(inputs, str) else inputs + + +# This function is separate from load_analyzer_for_detector so we get the default +# behavior for resolving NXtransformations. +def get_calibrated_analyzer( + analyzer_component: NeXusComponent[snx.NXcrystal, RunType], + analyzer_transform: NeXusTransformation[snx.NXcrystal, RunType], + analyzer_position: Position[snx.NXcrystal, RunType], ) -> Analyzer[RunType]: - """Extract the analyzer for a given detector. - - Note - ---- - Depends heavily on the names of components being preceded by an instrument index, - and the analyzer and detector components being separated in index by 2. - If either condition changes, this function will need to be modified. + """Collect the data for a single analyzer. Parameters ---------- - analyzers: + analyzer_component: Data group of loaded analyzers. - detector_location: - The location of an NXdetector in the NeXus file. - The analyzer is identified based on this location. + analyzer_transform: + Transformation matrix of the analyzer. + analyzer_position: + The computed position vector of the analyzer. Returns ------- : - The analyzer for the given detector triplet. + A given analyzer. Only a subset of fields is returned. """ - if detector_location.component_name is None: - raise ValueError("Detector component name is None") - if ( - analyzer_name := detector_analyzer_map.get(detector_location.component_name) - ) is None: - raise RuntimeError( - f"No analyzer found for detector {detector_location.component_name}" - ) - analyzer = snx.compute_positions( - analyzers[analyzer_name], - store_transform='transform', - ) + return Analyzer[RunType]( sc.DataGroup( - dspacing=analyzer['d_spacing'], - position=analyzer['position'], - transform=analyzer['transform'], + dspacing=analyzer_component['d_spacing'], + position=analyzer_position, + transform=analyzer_transform, ) ) providers = ( - analyzer_for_detector, - load_analyzers, + get_calibrated_analyzer, + load_analyzer_for_detector, load_instrument_angle, load_sample_angle, moderator_class_for_source, - get_detector_analyzer_map, ) diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 16af2e86c..46a0018c5 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -21,6 +21,3 @@ class McStasRawDetector(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... ArcEnergy = NewType('ArcEnergy', sc.Variable) - - -class DetectorAnalyzerMap(sciline.Scope[RunType, dict[str, str]], dict): ... diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 161f2dafa..3ad4c59d5 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -73,10 +73,6 @@ class Analyzer(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): """ -class Analyzers(sciline.Scope[RunType, sc.DataGroup[Any]], sc.DataGroup[Any]): - """All wavelength analyzers loaded from a NXcrystals.""" - - class DataAtSample(sciline.Scope[RunType, sc.DataArray], sc.DataArray): ... From 7f32442f1d269e06309278fbf3838d713090b157 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 11 Mar 2026 15:12:07 +0100 Subject: [PATCH 312/330] Add analyzer coords to calibrated detector --- .../src/ess/bifrost/detector.py | 34 ++++++++++++++++++- .../ess/spectroscopy/indirect/conversion.py | 11 +----- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index cad5cce4d..1ec35245f 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -135,11 +135,43 @@ def get_calibrated_detector_bifrost( da.coords['arc'] = arc da.coords['channel'] = channel - da = add_spectrometer_coords(da, analyzer, primary_graph, secondary_graph) + da = _add_analyzer_coords(da, analyzer) + da = add_spectrometer_coords(da, primary_graph, secondary_graph) return EmptyDetector[RunType](da) +def _add_analyzer_coords( + detector: sc.DataArray, + analyzer: Analyzer[RunType], +) -> sc.DataArray: + ana_pos = analyzer['position'] + if isinstance(ana_pos, sc.DataArray): + if 'time' not in detector.coords: + raise sc.CoordError( + "The analyzer position is time-dependent but the detector is not" + ) + if not sc.identical(ana_pos.coords['time'], detector.coords['time']): + raise sc.CoordError( + f"The analyzer and detector positions are not at the same times.\n" + f"Analyzer: {ana_pos.coords['time']}\n" + f"Detector: {detector.coords['time']}\n" + "This is likely due to a change in the NeXus structure. It used to " + "guarantee that the times are identical." + ) + analyzer_position = ana_pos.data + analyzer_transform = analyzer['transform'].value.data + else: + analyzer_position = ana_pos + analyzer_transform = analyzer['transform'].value + + return detector.assign_coords( + analyzer_dspacing=analyzer['dspacing'], + analyzer_position=analyzer_position, + analyzer_transform=analyzer_transform, + ) + + def merge_triplets( *triplets: sc.DataArray, ) -> sc.DataArray: diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index d1fe9e380..6fa1f1342 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -13,7 +13,6 @@ ) from ..types import ( - Analyzer, EnergyQDetector, GravityVector, IncidentEnergyDetector, @@ -246,7 +245,6 @@ def add_incident_energy( def add_spectrometer_coords( detector: sc.DataArray, - analyzer: Analyzer[RunType], primary_graph: PrimarySpecCoordTransformGraph[RunType], secondary_graph: SecondarySpecCoordTransformGraph[RunType], ) -> sc.DataArray: @@ -258,8 +256,6 @@ def add_spectrometer_coords( Data array with beamline coordinates "position", "source_position", and "sample_position". Does not need to contain events or flight times. - analyzer: - Data group with analyzer parameters. primary_graph: Coordinate transformation graph for the primary spectrometer. secondary_graph: @@ -273,11 +269,6 @@ def add_spectrometer_coords( Input data with added spectrometer coordinates. This includes "final_energy", "secondary_flight_time", and "L1". """ - # TODO lookup time-dep analyzers based on `data` and isert into graph - - # "analyzer_dspacing": lambda: analyzer["dspacing"], - # "analyzer_position": lambda: analyzer["position"], - # "analyzer_transform": lambda: analyzer["transform"], return detector.transform_coords( ( 'final_energy', @@ -287,7 +278,7 @@ def add_spectrometer_coords( 'secondary_flight_time', ), graph={**primary_graph, **secondary_graph}, - keep_intermediate=True, # TODO + keep_intermediate=False, keep_aliases=False, rename_dims=False, ) From be1bdf32eefade8bd64861e8507b3ff46289e2f9 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 11 Mar 2026 15:18:19 +0100 Subject: [PATCH 313/330] Provider analyzer coords to coord transform --- .../src/ess/bifrost/detector.py | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 1ec35245f..f50446d74 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -3,6 +3,8 @@ """Detector handling for BIFROST.""" +from collections.abc import Callable + import scipp as sc import scippnexus as snx @@ -135,16 +137,25 @@ def get_calibrated_detector_bifrost( da.coords['arc'] = arc da.coords['channel'] = channel - da = _add_analyzer_coords(da, analyzer) - da = add_spectrometer_coords(da, primary_graph, secondary_graph) + da = add_spectrometer_coords( + da, + primary_graph, + SecondarySpecCoordTransformGraph[RunType]( + {**secondary_graph, **_make_analyzer_coord_graph(da, analyzer)} + ), + ) return EmptyDetector[RunType](da) -def _add_analyzer_coords( +# We insert the analyzer coords into the graph so that they don't end up as coords +# in the output. This could be done in the provider of SecondarySpecCoordTransformGraph +# but that provider would then have to request the detector component to check +# the time coordinates. +def _make_analyzer_coord_graph( detector: sc.DataArray, analyzer: Analyzer[RunType], -) -> sc.DataArray: +) -> dict[str, Callable[[], sc.Variable]]: ana_pos = analyzer['position'] if isinstance(ana_pos, sc.DataArray): if 'time' not in detector.coords: @@ -165,11 +176,11 @@ def _add_analyzer_coords( analyzer_position = ana_pos analyzer_transform = analyzer['transform'].value - return detector.assign_coords( - analyzer_dspacing=analyzer['dspacing'], - analyzer_position=analyzer_position, - analyzer_transform=analyzer_transform, - ) + return { + 'analyzer_dspacing': lambda: analyzer['dspacing'], + 'analyzer_position': lambda: analyzer_position, + 'analyzer_transform': lambda: analyzer_transform, + } def merge_triplets( From c839ad8706311288f823f05c5e81aa1b3de3ad22 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 11 Mar 2026 15:28:33 +0100 Subject: [PATCH 314/330] Remove time slicing --- .../src/ess/spectroscopy/indirect/kf.py | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index 080a77da2..a191992e5 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -18,15 +18,6 @@ ) -# TODO remove? -def _no_time(x: sc.Variable | sc.DataArray) -> sc.Variable: - if isinstance(x, sc.DataArray) and 'time' in x.coords: - return x['time', 0].data - elif isinstance(x, sc.DataArray): - raise ValueError("Only `DataArray`s with a time-coordinate allowed") - return x - - def sample_analyzer_vector( sample_position: sc.Variable, analyzer_position: sc.Variable, @@ -60,17 +51,6 @@ def sample_analyzer_vector( The vector from the sample position to the interaction point on the analyzer for each detector element. """ - # FIXME time-dependent depends-on chains produce positions and transformations - # which are `scipp.DataArray`s with a 'time' coordinate. We don't need the - # time-dependence here since all calculations are done in the rotating - # detector-tank coordinate system where these *have no* time-dependence - # TODO: Verify that we are actually using the rotating detector-tank coordinate - # frame, otherwise we will misidentify the Q vector for each detector - sample_position = _no_time(sample_position) - analyzer_position = _no_time(analyzer_position) - analyzer_transform = _no_time(analyzer_transform) - detector_position = _no_time(detector_position) - # Scipp does not distinguish between coordinates and directions, so we need to do # some extra legwork to ensure we can apply the orientation transformation # _and_ obtain a dimensionless direction vector @@ -142,16 +122,6 @@ def analyzer_detector_vector( detector_position: sc.Variable, ) -> sc.Variable: """Calculate the analyzer-detector vector""" - # FIXME time-dependent depends-on chains produce positions and transformations - # which are `scipp.DataArray`s with a 'time' coordinate. We don't need the - # time-dependence here since all calculations are done in the rotating - # detector-tank coordinate system where these *have no* time-dependence - # TODO: Verify that we are actually using the rotating detector-tank coordinate - # frame, otherwise we will misidentify the Q vector for each detector - sample_position = _no_time(sample_position) - sample_analyzer_vector = _no_time(sample_analyzer_vector) # FIXME unnecessary? - detector_position = _no_time(detector_position) - analyzer_position = sample_position + sample_analyzer_vector.to( unit=sample_analyzer_vector.unit ) From c6c2f994ddcf03f1febda0f89e1e7578ce067519 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 13 Mar 2026 14:57:16 +0100 Subject: [PATCH 315/330] Working group by a4 for time-dep det --- .../src/ess/bifrost/cutting.py | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/cutting.py b/packages/essspectroscopy/src/ess/bifrost/cutting.py index 6388e055b..52d4b29b5 100644 --- a/packages/essspectroscopy/src/ess/bifrost/cutting.py +++ b/packages/essspectroscopy/src/ess/bifrost/cutting.py @@ -39,11 +39,29 @@ def group_by_rotation( : ``data`` grouped by rotation angles "a3" and "a4". """ - graph = { - 'a3': _make_angle_from_time_calculator(sample_angle), - 'a4': _make_angle_from_time_calculator(instrument_angle), - } - grouped = data.transform_coords(('a3', 'a4'), graph=graph).group('a3', 'a4') + graph = {'a3': _make_angle_from_time_calculator(sample_angle)} + group_coords = ['a3'] + drop_coords = [] + + if 'time' in data.dims: + # If the data is time-dependent, a4 corresponds to that time-dependence + # (the instrument angle is the only dynamic parameter). The data has a 'time' + # bin-edge coord in this case. Since a4 changes at the bin edges, not within + # each bin, we can look it up safely using midpoints. + graph['a4'] = lambda time: sc.lookup( + instrument_angle, dim='time', mode='previous' + )[sc.midpoints(time)] + # a4 replaces the 'time' coord. + drop_coords.append('time') + else: + graph['a4'] = _make_angle_from_time_calculator(instrument_angle) + group_coords.append('a4') + + grouped = ( + data.transform_coords(('a3', 'a4'), graph=graph) + .group(*group_coords) + .drop_coords(drop_coords) + ) return DataGroupedByRotation[RunType](grouped) @@ -51,7 +69,7 @@ def _make_angle_from_time_calculator(angle: sc.DataArray) -> Callable[..., sc.Va if angle.ndim == 0: return lambda: angle.data else: - lut = sc.lookup(angle, 'time') + lut = sc.lookup(angle, 'time', mode='previous') return lambda event_time_zero: lut[event_time_zero] From a6a2cda612fbbc1fd759bc241ffc231336ed16a7 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 17 Mar 2026 13:33:14 +0100 Subject: [PATCH 316/330] Use more explicit name --- .../src/ess/spectroscopy/indirect/time_of_flight.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py index 496df3e9c..f19ef099e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/time_of_flight.py @@ -85,7 +85,7 @@ def monitor_wavelength_data( for indirect geometry spectrometers. """ result = reduce_unwrap.to_wavelength.monitor_wavelength_data( - monitor_data=monitor_data.rename(t='tof'), + monitor_data=monitor_data.rename(t='frame_time'), lookup=lookup, ltotal=ltotal, pulse_stride_offset=pulse_stride_offset, From 5ea13629587058fb91d4191e32833b87c74cc827 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Tue, 7 Apr 2026 14:17:48 +0200 Subject: [PATCH 317/330] Use new Position class --- .../essspectroscopy/src/ess/bifrost/detector.py | 14 ++++++++------ .../src/ess/spectroscopy/indirect/conversion.py | 7 +++---- .../src/ess/spectroscopy/indirect/ki.py | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index f50446d74..b81a67d07 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -8,6 +8,7 @@ import scipp as sc import scippnexus as snx +from ess.reduce.nexus.types import Position from ess.spectroscopy.indirect.conversion import add_spectrometer_coords from ess.spectroscopy.types import ( Analyzer, @@ -156,24 +157,25 @@ def _make_analyzer_coord_graph( detector: sc.DataArray, analyzer: Analyzer[RunType], ) -> dict[str, Callable[[], sc.Variable]]: - ana_pos = analyzer['position'] - if isinstance(ana_pos, sc.DataArray): + ana_pos: Position[snx.NXcrystal, RunType] = analyzer['position'] + if ana_pos.is_dynamic: if 'time' not in detector.coords: raise sc.CoordError( "The analyzer position is time-dependent but the detector is not" ) - if not sc.identical(ana_pos.coords['time'], detector.coords['time']): + analyzer_positions = ana_pos.positions + if not sc.identical(analyzer_positions.coords['time'], detector.coords['time']): raise sc.CoordError( f"The analyzer and detector positions are not at the same times.\n" - f"Analyzer: {ana_pos.coords['time']}\n" + f"Analyzer: {analyzer_positions.coords['time']}\n" f"Detector: {detector.coords['time']}\n" "This is likely due to a change in the NeXus structure. It used to " "guarantee that the times are identical." ) - analyzer_position = ana_pos.data + analyzer_position = analyzer_positions.data analyzer_transform = analyzer['transform'].value.data else: - analyzer_position = ana_pos + analyzer_position = ana_pos.position analyzer_transform = analyzer['transform'].value return { diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index 6fa1f1342..d60b7f143 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -253,9 +253,8 @@ def add_spectrometer_coords( Parameters ---------- detector: - Data array with beamline coordinates "position", "source_position", and - "sample_position". - Does not need to contain events or flight times. + Data array with a "position" coordinate. + Does not need to contain events, wavelength, or flight times. primary_graph: Coordinate transformation graph for the primary spectrometer. secondary_graph: @@ -293,7 +292,7 @@ def monitor_coordinate_transformation_graph( { **beamline.beamline(scatter=False), **tof.elastic_wavelength(start='tof'), - 'source_position': lambda: source_position, + 'source_position': lambda: source_position.position, } ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 0b8c2901c..da640e00e 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -50,8 +50,8 @@ def primary_spectrometer_coordinate_transformation_graph( { "incident_beam": straight_incident_beam, "L1": L1, - "sample_position": lambda: sample_position, - "source_position": lambda: source_position, + "sample_position": lambda: sample_position.position, + "source_position": lambda: source_position.position, "gravity": lambda: gravity, } ) From 36a7923644f10b5390c4381678bb1c4d668292e7 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 10 Apr 2026 13:27:09 +0200 Subject: [PATCH 318/330] Customize time-dep transform loading --- .../src/ess/bifrost/detector.py | 27 +++++++---- .../src/ess/bifrost/io/nexus.py | 47 ++++++++++++++++++- .../src/ess/bifrost/workflow.py | 1 + 3 files changed, 64 insertions(+), 11 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index b81a67d07..e8c678b71 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -122,18 +122,14 @@ def get_calibrated_detector_bifrost( This includes "final_energy", "secondary_flight_time", and "L1". """ - from ess.reduce.nexus.types import DetectorBankSizes - from ess.reduce.nexus.workflow import get_calibrated_detector - - da = get_calibrated_detector( - detector=detector, - transform=transform, - offset=offset, - # The detectors are folded in the file, no need to do that here. - bank_sizes=DetectorBankSizes({}), - ) + from ess.reduce.nexus import compute_detector_position, extract_signal_data_array + + da = extract_signal_data_array(detector) da = da.rename(dim_0='tube', dim_1='length') + position = compute_detector_position(da, transform=transform, offset=offset) + da = _assign_detector_position(da, position) + arc, channel = arc_and_channel_from_detector_number(da.coords['detector_number']) da.coords['arc'] = arc da.coords['channel'] = channel @@ -149,6 +145,17 @@ def get_calibrated_detector_bifrost( return EmptyDetector[RunType](da) +def _assign_detector_position( + da: sc.DataArray, position: sc.Variable | sc.DataArray +) -> sc.DataArray: + if isinstance(position, sc.DataArray): # time-dependent transform + # Store position and time as separate coords because we can't store data arrays. + return da.broadcast( + dims=['time', *da.dims], shape=[position.sizes['time'], *da.shape] + ).assign_coords(position=position.data, time=position.coords['time']) + return da.assign_coords(position=position) + + # We insert the analyzer coords into the graph so that they don't end up as coords # in the output. This could be done in the provider of SecondarySpecCoordTransformGraph # but that provider would then have to request the detector component to check diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index eac6e37c8..bccee96ea 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -5,11 +5,12 @@ import warnings +import numpy as np import scipp as sc import scippnexus as snx from ess.reduce.nexus import open_component_group -from ess.reduce.nexus.types import NeXusLocationSpec +from ess.reduce.nexus.types import NeXusLocationSpec, TransformationTimeFilter from ess.spectroscopy.types import ( Analyzer, InstrumentAngle, @@ -147,6 +148,46 @@ def get_calibrated_analyzer( ) +def _collapse_runs(transform: sc.DataArray, dim: str) -> sc.DataArray: + """Collapse runs of equal values into a single value.""" + # Find indices where the data changes + different_from_previous = np.hstack( + [True, ~np.isclose(transform.values[:-1], transform.values[1:])] + ) + change_indices = np.flatnonzero(different_from_previous) + if change_indices.shape == transform.shape: + return transform # Return early to avoid expensive indexing + # Get unique values + unique_values = transform[change_indices] + + # Make bin-edges and extend range to include the whole measurement + last = unique_values.coords[dim][-1] + unique_values.coords[dim] = sc.concat( + [ + # bin-edges are left-inclusive, so we can start with coord[0] as first edge + unique_values.coords[dim], + # Surely, no experiment will last more than 10 years... + last + sc.scalar(10, unit='Y').to(unit=last.unit), + ], + dim=dim, + ) + + return unique_values + + +def stepwise_transformation_time_filter(transform: sc.DataArray) -> sc.DataArray: + """Collapse runs of equal values into a single value. + + This can be used as a time filter for NeXus transformations when the component + mostly stays at a position and only rarely moves. + For example, a stepwise scan across detector rotations. + """ + collapsed = _collapse_runs(transform, 'time') + if collapsed.sizes['time'] == 1: + return collapsed.squeeze('time') + return collapsed + + providers = ( get_calibrated_analyzer, load_analyzer_for_detector, @@ -154,3 +195,7 @@ def get_calibrated_analyzer( load_sample_angle, moderator_class_for_source, ) + +parameters = { + TransformationTimeFilter: stepwise_transformation_time_filter, +} diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 4f3fb57a7..4b1b796c0 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -45,6 +45,7 @@ def default_parameters() -> dict[type, Any]: NeXusMonitorName[PSCMonitor]: "psc_monitor", PulsePeriod: 1.0 / sc.scalar(14.0, unit="Hz"), UncertaintyBroadcastMode: UncertaintyBroadcastMode.fail, + **nexus.parameters, } From 99c723848e5f51f7ca39f9d4e4d4956919ab71de Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Thu, 16 Apr 2026 13:05:56 +0200 Subject: [PATCH 319/330] Use new DynamicPosition --- packages/essspectroscopy/src/ess/bifrost/io/nexus.py | 4 ++-- .../src/ess/spectroscopy/indirect/conversion.py | 2 +- packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py | 4 ++-- packages/essspectroscopy/src/ess/spectroscopy/types.py | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index bccee96ea..3ebe77f4c 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -13,13 +13,13 @@ from ess.reduce.nexus.types import NeXusLocationSpec, TransformationTimeFilter from ess.spectroscopy.types import ( Analyzer, + DynamicPosition, InstrumentAngle, NeXusClass, NeXusComponent, NeXusComponentLocationSpec, NeXusFileSpec, NeXusTransformation, - Position, RunType, SampleAngle, ) @@ -119,7 +119,7 @@ def _get_inputs(group: snx.Group) -> list[str]: def get_calibrated_analyzer( analyzer_component: NeXusComponent[snx.NXcrystal, RunType], analyzer_transform: NeXusTransformation[snx.NXcrystal, RunType], - analyzer_position: Position[snx.NXcrystal, RunType], + analyzer_position: DynamicPosition[snx.NXcrystal, RunType], ) -> Analyzer[RunType]: """Collect the data for a single analyzer. diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py index d60b7f143..37fcaeae3 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/conversion.py @@ -292,7 +292,7 @@ def monitor_coordinate_transformation_graph( { **beamline.beamline(scatter=False), **tof.elastic_wavelength(start='tof'), - 'source_position': lambda: source_position.position, + 'source_position': lambda: source_position, } ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index da640e00e..0b8c2901c 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -50,8 +50,8 @@ def primary_spectrometer_coordinate_transformation_graph( { "incident_beam": straight_incident_beam, "L1": L1, - "sample_position": lambda: sample_position.position, - "source_position": lambda: source_position.position, + "sample_position": lambda: sample_position, + "source_position": lambda: source_position, "gravity": lambda: gravity, } ) diff --git a/packages/essspectroscopy/src/ess/spectroscopy/types.py b/packages/essspectroscopy/src/ess/spectroscopy/types.py index 3ad4c59d5..d2be4e030 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/types.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/types.py @@ -16,6 +16,7 @@ Beamline = reduce_t.Beamline DetectorPositionOffset = reduce_t.DetectorPositionOffset +DynamicPosition = reduce_t.DynamicPosition EmptyDetector = reduce_t.EmptyDetector Filename = reduce_t.Filename GravityVector = reduce_t.GravityVector From a2f4957f72e8c388e6e8c8f70990325fa2d99307 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 20 Apr 2026 14:48:36 +0200 Subject: [PATCH 320/330] Require essreduce>=26.4.1 For time-dependent NeXus transformations. --- packages/essspectroscopy/pyproject.toml | 2 +- packages/essspectroscopy/requirements/base.in | 2 +- .../essspectroscopy/requirements/base.txt | 24 +++++++++---------- .../essspectroscopy/requirements/basetest.txt | 12 +++++----- packages/essspectroscopy/requirements/ci.txt | 20 +++++++++------- packages/essspectroscopy/requirements/dev.txt | 18 +++++++------- .../essspectroscopy/requirements/docs.txt | 8 +++---- .../essspectroscopy/requirements/mypy.txt | 4 ++-- .../essspectroscopy/requirements/nightly.txt | 22 ++++++++--------- .../essspectroscopy/requirements/static.txt | 10 ++++---- .../essspectroscopy/requirements/wheels.txt | 4 ++-- 11 files changed, 64 insertions(+), 62 deletions(-) diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 3a7d263e4..51c843544 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -30,7 +30,7 @@ requires-python = ">=3.11" # Run 'tox -e deps' after making changes here. This will update requirement files. # Make sure to list one dependency per line. dependencies = [ - "essreduce>=26.4.0", + "essreduce>=26.4.1", "graphviz>=0.20", "pandas>=2.1.2", "sciline>=25.4.1", diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in index e6807c85c..9b9d0b5ee 100644 --- a/packages/essspectroscopy/requirements/base.in +++ b/packages/essspectroscopy/requirements/base.in @@ -2,7 +2,7 @@ # will not be touched by ``make_base.py`` # --- END OF CUSTOM SECTION --- # The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=26.4.0 +essreduce>=26.4.1 graphviz>=0.20 pandas>=2.1.2 sciline>=25.4.1 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt index 8467d71b3..3f66a0cd3 100644 --- a/packages/essspectroscopy/requirements/base.txt +++ b/packages/essspectroscopy/requirements/base.txt @@ -1,4 +1,4 @@ -# SHA1:b30fe4f8b8899208801c1e28bbca8fdf94dbc938 +# SHA1:db0b6133057674a1a7c9f64ad9fe7e4f411c9e8f # # This file was generated by pip-compile-multi. # To update, run: @@ -9,7 +9,7 @@ annotated-types==0.7.0 # via pydantic certifi==2026.2.25 # via requests -charset-normalizer==3.4.6 +charset-normalizer==3.4.7 # via requests contourpy==1.3.3 # via matplotlib @@ -21,7 +21,7 @@ dnspython==2.8.0 # via email-validator email-validator==2.3.0 # via scippneutron -essreduce==26.4.0 +essreduce==26.4.1 # via -r base.in fonttools==4.62.1 # via matplotlib @@ -50,7 +50,7 @@ mpltoolbox==26.2.0 # via scippneutron networkx==3.6.1 # via cyclebane -numpy==2.4.3 +numpy==2.4.4 # via # contourpy # h5py @@ -59,26 +59,26 @@ numpy==2.4.3 # scipp # scippneutron # scipy -packaging==26.0 +packaging==26.1 # via # lazy-loader # matplotlib # pooch -pandas==3.0.1 +pandas==3.0.2 # via -r base.in -pillow==12.1.1 +pillow==12.2.0 # via matplotlib -platformdirs==4.9.4 +platformdirs==4.9.6 # via pooch -plopp==26.3.1 +plopp==26.4.0 # via # scippneutron # tof pooch==1.9.0 # via tof -pydantic==2.12.5 +pydantic==2.13.2 # via scippneutron -pydantic-core==2.41.5 +pydantic-core==2.46.2 # via pydantic pyparsing==3.3.2 # via matplotlib @@ -87,7 +87,7 @@ python-dateutil==2.9.0.post0 # matplotlib # pandas # scippneutron -requests==2.32.5 +requests==2.33.1 # via pooch sciline==25.11.1 # via diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt index 4eb0e5cee..acd47428d 100644 --- a/packages/essspectroscopy/requirements/basetest.txt +++ b/packages/essspectroscopy/requirements/basetest.txt @@ -7,27 +7,27 @@ # certifi==2026.2.25 # via requests -charset-normalizer==3.4.6 +charset-normalizer==3.4.7 # via requests idna==3.11 # via requests iniconfig==2.3.0 # via pytest -packaging==26.0 +packaging==26.1 # via # pooch # pytest -platformdirs==4.9.4 +platformdirs==4.9.6 # via pooch pluggy==1.6.0 # via pytest pooch==1.9.0 # via -r basetest.in -pygments==2.19.2 +pygments==2.20.0 # via pytest -pytest==9.0.2 +pytest==9.0.3 # via -r basetest.in -requests==2.32.5 +requests==2.33.1 # via pooch urllib3==2.6.3 # via requests diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt index dedea3a98..d1c46af0c 100644 --- a/packages/essspectroscopy/requirements/ci.txt +++ b/packages/essspectroscopy/requirements/ci.txt @@ -9,13 +9,13 @@ cachetools==7.0.5 # via tox certifi==2026.2.25 # via requests -charset-normalizer==3.4.6 +charset-normalizer==3.4.7 # via requests colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.25.2 +filelock==3.29.0 # via # python-discovery # tox @@ -26,12 +26,12 @@ gitpython==3.1.46 # via -r ci.in idna==3.11 # via requests -packaging==26.0 +packaging==26.1 # via # -r ci.in # pyproject-api # tox -platformdirs==4.9.4 +platformdirs==4.9.6 # via # python-discovery # tox @@ -40,17 +40,19 @@ pluggy==1.6.0 # via tox pyproject-api==1.10.0 # via tox -python-discovery==1.2.0 - # via virtualenv -requests==2.32.5 +python-discovery==1.2.2 + # via + # tox + # virtualenv +requests==2.33.1 # via -r ci.in smmap==5.0.3 # via gitdb tomli-w==1.2.0 # via tox -tox==4.50.3 +tox==4.53.0 # via -r ci.in urllib3==2.6.3 # via requests -virtualenv==21.2.0 +virtualenv==21.2.4 # via tox diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt index e6f94c4d6..eb4972c96 100644 --- a/packages/essspectroscopy/requirements/dev.txt +++ b/packages/essspectroscopy/requirements/dev.txt @@ -26,13 +26,13 @@ async-lru==2.3.0 # via jupyterlab cffi==2.0.0 # via argon2-cffi-bindings -click==8.3.1 +click==8.3.2 # via # pip-compile-multi # pip-tools -copier==9.14.0 +copier==9.14.3 # via -r dev.in -dunamai==1.26.0 +dunamai==1.26.1 # via copier fqdn==1.5.1 # via jsonschema @@ -48,7 +48,7 @@ isoduration==20.11.0 # via jsonschema jinja2-ansible-filters==1.3.2 # via copier -json5==0.13.0 +json5==0.14.0 # via jupyterlab-server jsonpointer==3.1.1 # via jsonschema @@ -59,7 +59,7 @@ jsonschema[format-nongpl]==4.26.0 # nbformat jupyter-events==0.12.0 # via jupyter-server -jupyter-lsp==2.3.0 +jupyter-lsp==2.3.1 # via jupyterlab jupyter-server==2.17.0 # via @@ -79,17 +79,17 @@ notebook-shim==0.2.4 # via jupyterlab overrides==7.7.0 # via jupyter-server -pip-compile-multi==3.2.2 +pip-compile-multi==3.3.1 # via -r dev.in pip-tools==7.5.3 # via pip-compile-multi plumbum==1.10.0 # via copier -prometheus-client==0.24.1 +prometheus-client==0.25.0 # via jupyter-server pycparser==3.0 # via cffi -python-json-logger==4.0.0 +python-json-logger==4.1.0 # via jupyter-events questionary==2.1.1 # via copier @@ -111,7 +111,7 @@ terminado==0.18.1 # jupyter-server-terminals toposort==1.10 # via pip-compile-multi -tzdata==2025.3 +tzdata==2026.1 # via arrow uri-template==1.3.0 # via jsonschema diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt index 2793e92e2..0ceeccc33 100644 --- a/packages/essspectroscopy/requirements/docs.txt +++ b/packages/essspectroscopy/requirements/docs.txt @@ -54,7 +54,7 @@ ipykernel==7.2.0 # via -r docs.in ipympl==0.10.0 # via -r docs.in -ipython==9.10.0 +ipython==9.10.1 # via # -r docs.in # ipykernel @@ -115,7 +115,7 @@ myst-parser==5.0.0 # via -r docs.in nbclient==0.10.4 # via nbconvert -nbconvert==7.17.0 +nbconvert==7.17.1 # via nbsphinx nbformat==5.10.4 # via @@ -142,9 +142,9 @@ pure-eval==0.2.3 # via stack-data pydantic-settings==2.13.1 # via autodoc-pydantic -pydata-sphinx-theme==0.16.1 +pydata-sphinx-theme==0.17.0 # via -r docs.in -pygments==2.19.2 +pygments==2.20.0 # via # accessible-pygments # ipython diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt index f90f757a5..725c54653 100644 --- a/packages/essspectroscopy/requirements/mypy.txt +++ b/packages/essspectroscopy/requirements/mypy.txt @@ -6,9 +6,9 @@ # requirements upgrade # -r test.txt -librt==0.8.1 +librt==0.9.0 # via mypy -mypy==1.19.1 +mypy==1.20.1 # via -r mypy.in mypy-extensions==1.1.0 # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt index 1df764c6b..e6115d56c 100644 --- a/packages/essspectroscopy/requirements/nightly.txt +++ b/packages/essspectroscopy/requirements/nightly.txt @@ -12,7 +12,7 @@ annotated-types==0.7.0 # via pydantic certifi==2026.2.25 # via requests -charset-normalizer==3.4.6 +charset-normalizer==3.4.7 # via requests contourpy==1.3.3 # via matplotlib @@ -55,7 +55,7 @@ mpltoolbox==26.2.0 # via scippneutron networkx==3.6.1 # via cyclebane -numpy==2.4.3 +numpy==2.4.4 # via # contourpy # h5py @@ -64,17 +64,17 @@ numpy==2.4.3 # scipp # scippneutron # scipy -packaging==26.0 +packaging==26.1 # via # lazy-loader # matplotlib # pooch # pytest -pandas==3.0.1 +pandas==3.0.2 # via -r nightly.in -pillow==12.1.1 +pillow==12.2.0 # via matplotlib -platformdirs==4.9.4 +platformdirs==4.9.6 # via pooch plopp @ git+https://github.com/scipp/plopp@main # via @@ -87,22 +87,22 @@ pooch==1.9.0 # via # -r nightly.in # tof -pydantic==2.13.0b2 +pydantic==2.13.2 # via scippneutron -pydantic-core==2.42.0 +pydantic-core==2.46.2 # via pydantic -pygments==2.19.2 +pygments==2.20.0 # via pytest pyparsing==3.3.2 # via matplotlib -pytest==9.0.2 +pytest==9.0.3 # via -r nightly.in python-dateutil==2.9.0.post0 # via # matplotlib # pandas # scippneutron -requests==2.32.5 +requests==2.33.1 # via pooch sciline @ git+https://github.com/scipp/sciline@main # via diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt index 02cb746f8..ee4589653 100644 --- a/packages/essspectroscopy/requirements/static.txt +++ b/packages/essspectroscopy/requirements/static.txt @@ -9,23 +9,23 @@ cfgv==3.5.0 # via pre-commit distlib==0.4.0 # via virtualenv -filelock==3.25.2 +filelock==3.29.0 # via # python-discovery # virtualenv -identify==2.6.18 +identify==2.6.19 # via pre-commit nodeenv==1.10.0 # via pre-commit -platformdirs==4.9.4 +platformdirs==4.9.6 # via # python-discovery # virtualenv pre-commit==4.5.1 # via -r static.in -python-discovery==1.2.0 +python-discovery==1.2.2 # via virtualenv pyyaml==6.0.3 # via pre-commit -virtualenv==21.2.0 +virtualenv==21.2.4 # via pre-commit diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt index 0d70d60c7..0a50fd041 100644 --- a/packages/essspectroscopy/requirements/wheels.txt +++ b/packages/essspectroscopy/requirements/wheels.txt @@ -5,9 +5,9 @@ # # requirements upgrade # -build==1.4.0 +build==1.4.3 # via -r wheels.in -packaging==26.0 +packaging==26.1 # via build pyproject-hooks==1.2.0 # via build From 40ac082c3740dbc27601e218b6c3778a857d578a Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 4 May 2026 14:59:49 +0200 Subject: [PATCH 321/330] Tmp fix: invert chopper phase --- .../bifrost/bifrost-make-wavelength-lookup-table.ipynb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb index a8533cfe3..716cfac51 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-make-wavelength-lookup-table.ipynb @@ -128,6 +128,13 @@ " processed['phase'] = processed['phase'].data.mean()\n", " # Guessing here as this is not stored in the file.\n", " processed['beam_position'] = sc.scalar(0.0, unit='deg')\n", + "\n", + " # FIXME Get rid of this bad hack if/when McStas' DiskChopper is fixed\n", + " # Currently, it sets a delay-time by `delta = 2 * pi * phase/|frequency|`\n", + " # But it should set `delta = 2 * pi * phase / frequency`\n", + " # So phases reported here have the wrong sign if frequency < 0\n", + " processed['phase'] = -processed['phase'] if processed['rotation_speed'].value < 0 else processed['phase']\n", + "\n", " return DiskChopper.from_nexus(processed)\n", "\n", "\n", @@ -163,7 +170,7 @@ "workflow[SourcePosition] = source_position\n", "\n", "# Increase this number for more reliable results:\n", - "workflow[NumberOfSimulatedNeutrons] = 6000_000" + "workflow[NumberOfSimulatedNeutrons] = 6_000_000" ] }, { From dd8ccce5e281102479cfdd2a871101d90563520c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 4 May 2026 15:00:48 +0200 Subject: [PATCH 322/330] Do not slice a4 in docs --- .../docs/user-guide/bifrost/bifrost-reduction.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb index 7da461834..497ba21cb 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-reduction.ipynb @@ -96,7 +96,7 @@ "# For this example, we do not mask anything:\n", "workflow[LookupTableRelativeErrorThreshold] = {\n", " 'detector': np.inf,\n", - " '110_frame_3': np.inf,\n", + " 'normalization_monitor': np.inf,\n", "}\n", "# We need to read many objects from the file,\n", "# keeping it open improves performance: (optional)\n", @@ -183,9 +183,9 @@ "outputs": [], "source": [ "(\n", - " data['a4', 0]\n", + " data\n", " .bins.concat()\n", - " .hist(energy_transfer=sc.linspace('energy_transfer', -0.05, 0.05, 200, unit='meV'))\n", + " .hist(energy_transfer=500)\n", ").plot()" ] }, @@ -211,7 +211,7 @@ "metadata": {}, "outputs": [], "source": [ - "d = data['a4', 0].bins.concat().copy()\n", + "d = data.bins.concat().copy()\n", "x = sc.vector([1, 0, 0])\n", "z = sc.vector([0, 0, 1])\n", "d.bins.coords['Qx'] = sc.dot(x, d.bins.coords['sample_table_momentum_transfer'])\n", From 802c6d0ff62133351490496e12c1486a6f0fb2f5 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 4 May 2026 15:29:13 +0200 Subject: [PATCH 323/330] Use new data and fix tests --- packages/essspectroscopy/src/ess/bifrost/data.py | 11 +++++------ .../essspectroscopy/tests/bifrost/cutting_test.py | 8 ++++---- packages/essspectroscopy/tests/bifrost/io/sqw_test.py | 2 +- packages/essspectroscopy/tests/bifrost/live_test.py | 2 +- .../essspectroscopy/tests/bifrost/workflow_test.py | 9 ++++----- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/data.py b/packages/essspectroscopy/src/ess/bifrost/data.py index 5a27e372e..231e99b8f 100644 --- a/packages/essspectroscopy/src/ess/bifrost/data.py +++ b/packages/essspectroscopy/src/ess/bifrost/data.py @@ -10,12 +10,11 @@ _registry = make_registry( 'ess/bifrost', files={ - "BIFROST_20240914T053723.h5": "md5:0f2fa5c9a851f8e3a4fa61defaa3752e", - "computed_energy_data_simulated_5x2.h5": "md5:57408fa10aa4689c43630f994cff8d30", - "BIFROST-simulation-tof-lookup-table.h5": "blake2b:682021920a355f789da37b18029719fe20569d86db26cdaf5f3d916d2f76f9360907960ba86903be4cab489d39f1b6f9f265f3a4ab3f82c5e095afa4a2c456af", # noqa: E501 - "BIFROST-simulation-lookup-table.h5": "md5:6d776afa591d4a83c91ad0142bbfc53d", + "bifrost_260418T170408.h5": "md5:5fe544c2eccfb6c4ec52beca9957f528", + "computed_energy_data_simulated_5x2.h5": "md5:1a24a1067ae2968dfc162c5c72dcb073", + "BIFROST-simulation-lookup-table.h5": "md5:237e26125b22aa9cb0c68454206896a2", }, - version="7", + version="8", ) @@ -31,7 +30,7 @@ def get_path(name: str) -> Path: def simulated_elastic_incoherent_with_phonon() -> Path: """Simulated data for elastic incoherent scattering including a phonon.""" - return get_path("BIFROST_20240914T053723.h5") + return get_path("bifrost_260418T170408.h5") def lookup_table_simulation() -> Path: diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py index 225b91f46..d49fe1dcc 100644 --- a/packages/essspectroscopy/tests/bifrost/cutting_test.py +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -39,7 +39,7 @@ def energy_data( workflow[LookupTableFilename] = lookup_table_simulation() workflow[LookupTableRelativeErrorThreshold] = { 'detector': np.inf, - '110_frame_3': np.inf, + 'normalization_monitor': np.inf, } workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop return workflow.compute(EnergyQDetector[SampleRun]) @@ -59,7 +59,7 @@ def test_cut_along_q_norm_and_energy_transfer_preserves_counts( axis_2 = CutAxis( output='E', fn=lambda energy_transfer: energy_transfer, - bins=sc.linspace(dim='E', start=-10.0, stop=10.0, num=50, unit='meV'), + bins=sc.linspace(dim='E', start=-10.0, stop=15.0, num=50, unit='meV'), ) cut_data = cut( @@ -84,12 +84,12 @@ def test_cut_along_qx_direction_preserves_counts( axis_1 = CutAxis.from_q_vector( output='Qx', vec=sc.vector([1, 0, 0]), - bins=sc.linspace(dim='Qx', start=-2.0, stop=2.0, num=40, unit='1/angstrom'), + bins=sc.linspace(dim='Qx', start=-3.0, stop=2.0, num=40, unit='1/angstrom'), ) axis_2 = CutAxis( output='E', fn=lambda energy_transfer: energy_transfer, - bins=sc.linspace(dim='E', start=-5.0, stop=5.0, num=30, unit='meV'), + bins=sc.linspace(dim='E', start=-10.0, stop=15.0, num=30, unit='meV'), ) cut_data = cut( diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index f8762f835..df13db29a 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -77,7 +77,7 @@ def common_workflow( wf[LookupTableFilename] = lookup_table_simulation() wf[LookupTableRelativeErrorThreshold] = { 'detector': np.inf, - '110_frame_3': np.inf, + 'normalization_monitor': np.inf, } wf[PreopenNeXusFile] = PreopenNeXusFile(True) wf[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py index 22823d2f0..ada00c1a7 100644 --- a/packages/essspectroscopy/tests/bifrost/live_test.py +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -40,7 +40,7 @@ def qcut_workflow( workflow[LookupTableFilename] = lookup_table_simulation() workflow[LookupTableRelativeErrorThreshold] = { 'detector': np.inf, - '110_frame_3': np.inf, + 'normalization_monitor': np.inf, } workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop workflow[ProtonCharge[SampleRun]] = sc.DataArray(sc.scalar(1.0, unit='pC')) diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index 5d5b1a177..b5abc00d3 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -42,7 +42,7 @@ def workflow(simulation_detector_names: list[NeXusDetectorName]) -> sciline.Pipe workflow[LookupTableFilename] = lookup_table_simulation() workflow[LookupTableRelativeErrorThreshold] = { 'detector': np.inf, - '110_frame_3': np.inf, + 'normalization_monitor': np.inf, } workflow[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.drop return workflow @@ -50,14 +50,14 @@ def workflow(simulation_detector_names: list[NeXusDetectorName]) -> sciline.Pipe def test_simulation_workflow_can_load_detector() -> None: workflow = bifrost.BifrostSimulationWorkflow( - [NeXusDetectorName("125_channel_1_1_triplet")] + [NeXusDetectorName("channel_3_1_triplet")] ) workflow[Filename[SampleRun]] = simulated_elastic_incoherent_with_phonon() results = sciline.compute_mapped(workflow, RawDetector[SampleRun]) result = results.iloc[0] assert result.bins is not None - assert set(result.dims) == {'tube', 'length'} + assert set(result.dims) == {'tube', 'length', 'time'} assert result.sizes['tube'] == 3 assert 'position' in result.coords @@ -80,7 +80,7 @@ def test_simulation_workflow_can_compute_energy_data( 'tube': 3, 'length': 100, 'a3': 180, - 'a4': 1, + 'a4': 2, } expected_coords = {'a3', 'a4', 'detector_number'} assert expected_coords.issubset(energy_data.coords) @@ -111,7 +111,6 @@ def test_simulation_workflow_produces_the_same_data_as_before( workflow: sciline.Pipeline, ) -> None: energy_data = workflow.compute(EnergyQDetector[SampleRun]) - sc.io.save_hdf5(energy_data, 'computed_energy_data_simulated_5x2.h5') expected = sc.io.load_hdf5(computed_energy_data_simulated_5x2()) assert not energy_data.masks From 101e8e7584e3e0d83bbbc345413459f85c133552 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 6 May 2026 09:38:55 +0200 Subject: [PATCH 324/330] Support det rotation in single crystal workflow --- .../bifrost/bifrost-bragg-peak-monitor.ipynb | 22 +++---- .../docs/user-guide/bifrost/index.md | 5 +- .../src/ess/bifrost/detector.py | 57 +++++++++++++++---- .../ess/bifrost/single_crystal/detector.py | 50 ++++++++++++++++ .../src/ess/bifrost/single_crystal/q_map.py | 3 + .../ess/bifrost/single_crystal/workflow.py | 4 +- 6 files changed, 112 insertions(+), 29 deletions(-) create mode 100644 packages/essspectroscopy/src/ess/bifrost/single_crystal/detector.py diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb index 02d0f3fbb..b8eaf3d8f 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb +++ b/packages/essspectroscopy/docs/user-guide/bifrost/bifrost-bragg-peak-monitor.ipynb @@ -62,7 +62,7 @@ "workflow[LookupTableFilename] = lookup_table_simulation()\n", "workflow[LookupTableRelativeErrorThreshold] = {\n", " 'detector': np.inf,\n", - " '110_frame_3': np.inf,\n", + " 'normalization_monitor': np.inf,\n", "}" ] }, @@ -89,7 +89,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow[NeXusDetectorName] = \"309_channel_9_5_triplet\"\n", + "workflow[NeXusDetectorName] = \"channel_9_5_triplet\"\n", "\n", "\n", "def assemble_detector_data_flatten(\n", @@ -139,18 +139,10 @@ "workflow.visualize(CountsWithQMapCoords[SampleRun], graph_attr={\"rankdir\": \"LR\"})" ] }, - { - "cell_type": "markdown", - "id": "8", - "metadata": {}, - "source": [ - "Compute the data projected onto Q:" - ] - }, { "cell_type": "code", "execution_count": null, - "id": "9", + "id": "8", "metadata": {}, "outputs": [], "source": [ @@ -159,7 +151,7 @@ }, { "cell_type": "markdown", - "id": "10", + "id": "9", "metadata": {}, "source": [ "Make an interactive figure.\n", @@ -169,13 +161,13 @@ { "cell_type": "code", "execution_count": null, - "id": "11", + "id": "10", "metadata": {}, "outputs": [], "source": [ "make_q_map(counts,\n", - " q_parallel_bins=sc.linspace('Q_parallel', -3, 3, 100, unit='1/Ã…'),\n", - " q_perpendicular_bins=sc.linspace('Q_perpendicular', -3, 3, 100, unit='1/Ã…'),\n", + " q_parallel_bins=sc.linspace('Q_parallel', -4.5, 4.5, 100, unit='1/Ã…'),\n", + " q_perpendicular_bins=sc.linspace('Q_perpendicular', -4.5, 4.5, 100, unit='1/Ã…'),\n", " sample_rotation_bins=sc.scalar(1.0, unit='deg'),\n", " )" ] diff --git a/packages/essspectroscopy/docs/user-guide/bifrost/index.md b/packages/essspectroscopy/docs/user-guide/bifrost/index.md index c982681be..380fe16e7 100644 --- a/packages/essspectroscopy/docs/user-guide/bifrost/index.md +++ b/packages/essspectroscopy/docs/user-guide/bifrost/index.md @@ -1,4 +1,5 @@ # BIFROST + ## Reduction Workflows ::::{grid} 3 @@ -11,10 +12,12 @@ :class: only-light :width: 100% ``` + ```{image} ../../_static/thumbnails/bifrost_reduction_dark.svg :class: only-dark :width: 100% ``` + ::: :::: @@ -25,7 +28,6 @@ hidden: --- bifrost-reduction -bifrost-bragg-peak-monitor ``` ## Advanced Tools @@ -35,5 +37,6 @@ bifrost-bragg-peak-monitor maxdepth: 1 --- +bifrost-bragg-peak-monitor bifrost-make-wavelength-lookup-table ``` diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index e8c678b71..9b250557d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -91,12 +91,12 @@ def get_calibrated_detector_bifrost( ) -> EmptyDetector[RunType]: """Extract the data array corresponding to a detector's signal field. - The data array is reshaped to the logical detector shape. + This includes: - This function is specific to BIFROST and differs from the generic - :func:`ess.reduce.nexus.workflow.get_calibrated_detector` in that it does not - fold the detectors into logical dimensions because the files already contain - the detectors in the correct shape. + - Reshaping the data array is reshaped to the logical detector shape. + - Assigning geometry coordinate "position". + - Assigning spectrometer coordinates such as "final_energy", + "secondary_flight_time", and "L1". Parameters ---------- @@ -119,17 +119,13 @@ def get_calibrated_detector_bifrost( ------- : Detector geometry and spectrometer coordinates. - This includes "final_energy", "secondary_flight_time", and "L1". """ - from ess.reduce.nexus import compute_detector_position, extract_signal_data_array - - da = extract_signal_data_array(detector) + da = get_base_calibrated_detector_bifrost( + detector, analyzer, transform=transform, offset=offset + ) da = da.rename(dim_0='tube', dim_1='length') - position = compute_detector_position(da, transform=transform, offset=offset) - da = _assign_detector_position(da, position) - arc, channel = arc_and_channel_from_detector_number(da.coords['detector_number']) da.coords['arc'] = arc da.coords['channel'] = channel @@ -145,6 +141,43 @@ def get_calibrated_detector_bifrost( return EmptyDetector[RunType](da) +def get_base_calibrated_detector_bifrost( + detector: NeXusComponent[snx.NXdetector, RunType], + analyzer: Analyzer[RunType], + *, + transform: NeXusTransformation[snx.NXdetector, RunType], + offset: DetectorPositionOffset[RunType], +) -> sc.DataArray: + """Extract the data array corresponding to a detector's signal field. + + This function is specific to BIFROST and differs from the generic + :func:`ess.reduce.nexus.workflow.get_calibrated_detector` in that it + assigns time-dependent positions by broadcasting the data into the 'time' dimension. + + Parameters + ---------- + detector: + Loaded NeXus detector. + analyzer: + Loaded analyzer parameters. + transform: + Transformation that determines the detector position. + offset: + Offset to add to the detector position. + + Returns + ------- + : + Detector with geometry coordinates. + """ + + from ess.reduce.nexus import compute_detector_position, extract_signal_data_array + + da = extract_signal_data_array(detector) + position = compute_detector_position(da, transform=transform, offset=offset) + return _assign_detector_position(da, position) + + def _assign_detector_position( da: sc.DataArray, position: sc.Variable | sc.DataArray ) -> sc.DataArray: diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/detector.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/detector.py new file mode 100644 index 000000000..320b9a601 --- /dev/null +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/detector.py @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2026 Scipp contributors (https://github.com/scipp) + +"""Bragg peak detector handling for BIFROST.""" + +import scippnexus as snx + +from ess.spectroscopy.types import ( + Analyzer, + DetectorPositionOffset, + EmptyDetector, + NeXusComponent, + NeXusTransformation, + RunType, +) + +from ..detector import get_base_calibrated_detector_bifrost + + +def get_calibrated_bragg_peak_detector( + detector: NeXusComponent[snx.NXdetector, RunType], + analyzer: Analyzer[RunType], + *, + transform: NeXusTransformation[snx.NXdetector, RunType], + offset: DetectorPositionOffset[RunType], +) -> EmptyDetector[RunType]: + """Extract the data array corresponding to the Bragg peak detector's signal field. + + Parameters + ---------- + detector: + Loaded NeXus detector. + analyzer: + Loaded analyzer parameters. + transform: + Transformation that determines the detector position. + offset: + Offset to add to the detector position. + + Returns + ------- + : + Detector with geometry coordinates. + """ + return get_base_calibrated_detector_bifrost( + detector, analyzer, transform=transform, offset=offset + ) + + +providers = (get_calibrated_bragg_peak_detector,) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index a1cb863ce..9914fc5b1 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -47,6 +47,9 @@ def project_momentum_transfer( transformed.bins.coords['a3'] = sc.bins_like( transformed, transformed.coords['a3'] ) + transformed.bins.coords['a4'] = sc.bins_like( + transformed, transformed.coords['a4'] + ) transformed = transformed.bins.concat() return CountsWithQMapCoords[RunType](transformed) diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py index 49addb6f7..ac4bb98a9 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py @@ -16,11 +16,12 @@ from ..io import nexus from ..io.mcstas import convert_simulated_time_to_event_time_offset from ..workflow import default_parameters, simulation_default_parameters -from . import conversion, q_map, time_of_flight +from . import conversion, detector, q_map, time_of_flight _PROVIDERS = ( *nexus.providers, *conversion.providers, + *detector.providers, *q_map.providers, *time_of_flight.providers, group_by_rotation, @@ -29,6 +30,7 @@ _SIMULATION_PROVIDERS = ( *nexus.providers, *conversion.providers, + *detector.providers, *q_map.providers, *time_of_flight.providers, convert_simulated_time_to_event_time_offset, From 4fc0d9bf62cd12303eb34017ae56a746d4cfe916 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Wed, 6 May 2026 13:32:41 +0200 Subject: [PATCH 325/330] Support multi a4 in SQW --- .../essspectroscopy/src/ess/bifrost/io/sqw.py | 22 +++++++------- .../tests/bifrost/io/sqw_test.py | 30 ++++++++++++++----- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 28444abda..9528354cb 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -106,19 +106,13 @@ def save_sqw( scippneutron.io.sqw: For low-level SQW I/O and the underlying implementation of ``save_sqw``. """ - if np.unique(events.coords['a4'].values).size != 1: - # We need to support this eventually, but we don't - # have data for a moving detector vessel yet. - raise NotImplementedError("a4 must be constant for all events") - flat_events = _flatten_events(events) del events # 'move' events into _flatten_events _filter_and_convert_coords_in_place(flat_events) - sample_angle = flat_events.coords['a3'] - observations = _histogram_detector_setting_ei(flat_events, energy_bins=energy_bins) del flat_events # 'move' flat_events into _histogram_detector_setting_ei + sample_angle = observations.coords['a3'] final_energy = observations.coords['final_energy'] observations = _with_inelastic_coords(observations, gravity) energy_transfer = observations.coords['energy_transfer'].rename_dims( @@ -161,7 +155,7 @@ def _flatten_events( n_a3 = aux.sizes['a3'] aux.coords['i_a3'] = sc.arange('a3', n_a3, dtype='float32', unit=None) aux.coords['i_a4'] = sc.arange('a4', aux.sizes['a4'], dtype='float32', unit=None) - flat = aux.flatten(['a3', 'a4'], 'setting') + flat = aux.transpose(['detector', 'a4', 'a3']).flatten(['a4', 'a3'], 'setting') return flat.assign_coords( irun=flat.coords.pop('i_a3') + flat.coords.pop('i_a4') * sc.index(n_a3) @@ -422,9 +416,9 @@ def _make_experiments( ) -> list[sqw.SqwIXExperiment]: experiment_template = sqw.SqwIXExperiment( run_id=0, # converted to 1-based by ScippNeutron - efix=final_energy, emode=sqw.EnergyMode.indirect, - en=energy_transfer, + efix=None, # type: ignore[assignment] (overridden below) + en=None, # type: ignore[assignment] psi=sc.scalar(0.0, unit="rad"), u=_AXIS_U, v=_AXIS_V, @@ -434,6 +428,12 @@ def _make_experiments( gs=sc.scalar(0.0, unit="rad"), ) return [ - dataclasses.replace(experiment_template, run_id=i, psi=a3) + dataclasses.replace( + experiment_template, + run_id=i, + psi=a3, + efix=final_energy['setting', i], + en=energy_transfer['setting', i], + ) for i, a3 in enumerate(sample_angle) ] diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index df13db29a..6bd5d4dc9 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -7,6 +7,7 @@ # Function-scoped fixtures allow accessing that file for reading. import itertools +from collections import Counter from collections.abc import Generator from pathlib import Path @@ -38,7 +39,8 @@ ) N_DETECTORS = 3 -N_ANGLES = 180 +N_ANGLES = 178 +N_DET_ROTATIONS = 2 BIN_SIZES = {'u1': 6, 'u2': 7, 'u3': 8, 'u4': 9} ENERGY_BIN_SIZE = 13 @@ -108,13 +110,13 @@ def output_file(write_file: Path) -> Generator[sqw.Sqw, None, None]: def test_save_sqw_writes_instrument_metadata(output_file: sqw.Sqw) -> None: instruments = output_file.read_data_block("experiment_info", "instruments") - assert len(instruments) == N_ANGLES + assert len(instruments) == N_ANGLES * N_DET_ROTATIONS # All instruments are the same: for instrument in instruments[1:]: sc.testing.assert_identical(instrument, instruments[0]) instrument = instruments[0] - assert instrument.name == "BIFROST" + assert instrument.name == "bifrost" sc.testing.assert_identical(instrument.source.frequency, sc.scalar(14.0, unit="Hz")) @@ -123,7 +125,7 @@ def test_save_sqw_writes_sample_metadata( ) -> None: samples = output_file.read_data_block("experiment_info", "samples") - assert len(samples) == N_ANGLES + assert len(samples) == N_ANGLES * N_DET_ROTATIONS # All samples are the same: for s in samples: sc.testing.assert_identical(s, sample) @@ -132,14 +134,22 @@ def test_save_sqw_writes_sample_metadata( def test_save_sqw_writes_experiment_metadata(output_file: sqw.Sqw) -> None: experiments = output_file.read_data_block("experiment_info", "expdata") - assert len(experiments) == N_ANGLES + assert len(experiments) == N_ANGLES * N_DET_ROTATIONS # N unique run ids - assert len({experiment.run_id for experiment in experiments}) == N_ANGLES + assert ( + len({experiment.run_id for experiment in experiments}) + == N_ANGLES * N_DET_ROTATIONS + ) for experiment in experiments: assert experiment.emode == sqw.EnergyMode.indirect assert experiment.u == U assert experiment.v == V + # Every a3 (psi) is represented once per detector rotation + # because we have a regular grid. + psi_counts = Counter(experiment.psi.value for experiment in experiments) + assert all(count == N_DET_ROTATIONS for count in psi_counts.values()) + def test_save_sqw_writes_dnd_metadata( output_file: sqw.Sqw, sample: sqw.SqwIXSample @@ -176,7 +186,11 @@ def test_save_sqw_writes_pixel_data(output_file: sqw.Sqw) -> None: pix = output_file.read_data_block("pix", "data_wrap") assert pix.shape == ( - N_DETECTORS * N_PIXELS_PER_DETECTOR * N_ANGLES * ENERGY_BIN_SIZE, + N_DETECTORS + * N_PIXELS_PER_DETECTOR + * N_ANGLES + * ENERGY_BIN_SIZE + * N_DET_ROTATIONS, 9, ) @@ -222,7 +236,7 @@ def check_pixel_indices_in_ranges(pix: npt.NDArray[np.float32]) -> None: # 1-based indices! assert irun.min() == 1 - assert irun.max() == N_ANGLES + assert irun.max() == N_ANGLES * N_DET_ROTATIONS assert ien.min() == 1 assert ien.max() == ENERGY_BIN_SIZE From fef982a46601d08a733b5dbbb10af7990f820df4 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Fri, 8 May 2026 12:52:16 +0200 Subject: [PATCH 326/330] Explain analyzer loading --- .../essspectroscopy/src/ess/bifrost/io/nexus.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 3ebe77f4c..ff32b9a42 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -61,6 +61,11 @@ def load_analyzer_for_detector( This function searches for an ``NXcrystal`` in the inputs (via the 'input' attribute) of the detector and loads the first NeXus group it finds. + + See Also + -------- + get_calibrated_analyzer: + A provider that combines loaded analyzer data into an ``Analyzer`` object. """ with open_component_group(detector_location, nx_class=snx.NXdetector) as det_group: analyzer_group = _find_class_in_inputs( @@ -114,8 +119,6 @@ def _get_inputs(group: snx.Group) -> list[str]: return [inputs] if isinstance(inputs, str) else inputs -# This function is separate from load_analyzer_for_detector so we get the default -# behavior for resolving NXtransformations. def get_calibrated_analyzer( analyzer_component: NeXusComponent[snx.NXcrystal, RunType], analyzer_transform: NeXusTransformation[snx.NXcrystal, RunType], @@ -123,6 +126,13 @@ def get_calibrated_analyzer( ) -> Analyzer[RunType]: """Collect the data for a single analyzer. + This provider works together with :func:`load_analyzer_for_detector` and the + generic NeXus workflow from ESSreduce. + ``load_analyzer_for_detector`` loads a raw analyzer component. + Then the default providers from ESSreduce extract a transform and position like + for any other component. + Finally, this provider combines the data into a single Analyzer object. + Parameters ---------- analyzer_component: From 46633b052b185465dd8a53f24ed1f59cb22efd5f Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 11 May 2026 10:24:17 +0200 Subject: [PATCH 327/330] Explain stepwise time filter --- .../essspectroscopy/src/ess/bifrost/io/nexus.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index ff32b9a42..1a7ccbc90 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -189,8 +189,20 @@ def stepwise_transformation_time_filter(transform: sc.DataArray) -> sc.DataArray """Collapse runs of equal values into a single value. This can be used as a time filter for NeXus transformations when the component - mostly stays at a position and only rarely moves. + mostly stays at one position and only rarely moves. For example, a stepwise scan across detector rotations. + + Repeated values are identified using :func:`numpy.isclose` with default tolerances + applied to the individual transformation components. + I.e., for the BIFROST detector, the detector angle (currently in degrees) + is checked for approximate equality between consecutive values. + + Note + ---- + This approach is meant to handle noisy NXlogs if they are written + from readback values or repeated setpoint values. + We currently do not know enough about how ESS NeXus files will be written for + real measurements, so we may need to revisit this approach. """ collapsed = _collapse_runs(transform, 'time') if collapsed.sizes['time'] == 1: From 6b953c1907597abcb2e30a79d0c141f7cdee9016 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 11 May 2026 14:17:01 +0200 Subject: [PATCH 328/330] Update spectroscopy for monorepo --- .github/workflows/ci.yml | 9 + .github/workflows/docs-deploy.yml | 1 + .github/workflows/nightly.yml | 1 + .github/workflows/weekly-platform.yml | 1 + .../ISSUE_TEMPLATE/high-level-requirement.yml | 97 - .../essspectroscopy/.github/dependabot.yml | 13 - .../essspectroscopy/.github/workflows/ci.yml | 58 - .../.github/workflows/docs.yml | 79 - .../.github/workflows/nightly_at_main.yml | 34 - .../workflows/nightly_at_main_lower_bound.yml | 37 - .../.github/workflows/nightly_at_release.yml | 41 - .../.github/workflows/python-version-ci | 1 - .../.github/workflows/release.yml | 73 - .../.github/workflows/test.yml | 79 - .../.github/workflows/unpinned.yml | 41 - .../workflows/weekly_windows_macos.yml | 42 - packages/essspectroscopy/.gitignore | 48 - .../essspectroscopy/.pre-commit-config.yaml | 55 - packages/essspectroscopy/.python-version | 1 - packages/essspectroscopy/CODE_OF_CONDUCT.md | 134 - packages/essspectroscopy/CONTRIBUTING.md | 20 - packages/essspectroscopy/LICENSE | 29 - packages/essspectroscopy/MANIFEST.in | 1 - packages/essspectroscopy/pyproject.toml | 64 +- packages/essspectroscopy/requirements/base.in | 12 - .../essspectroscopy/requirements/base.txt | 128 - .../essspectroscopy/requirements/basetest.in | 11 - .../essspectroscopy/requirements/basetest.txt | 33 - packages/essspectroscopy/requirements/ci.in | 4 - packages/essspectroscopy/requirements/ci.txt | 58 - packages/essspectroscopy/requirements/dev.in | 11 - packages/essspectroscopy/requirements/dev.txt | 127 - packages/essspectroscopy/requirements/docs.in | 15 - .../essspectroscopy/requirements/docs.txt | 233 - .../essspectroscopy/requirements/make_base.py | 78 - packages/essspectroscopy/requirements/mypy.in | 2 - .../essspectroscopy/requirements/mypy.txt | 16 - .../essspectroscopy/requirements/nightly.in | 17 - .../essspectroscopy/requirements/nightly.txt | 143 - .../essspectroscopy/requirements/static.in | 1 - .../essspectroscopy/requirements/static.txt | 31 - packages/essspectroscopy/requirements/test.in | 4 - .../essspectroscopy/requirements/test.txt | 9 - .../essspectroscopy/requirements/wheels.in | 1 - .../essspectroscopy/requirements/wheels.txt | 13 - packages/essspectroscopy/tox.ini | 72 - pixi.lock | 13257 +++++++++------- pixi.toml | 15 +- 48 files changed, 7611 insertions(+), 7639 deletions(-) delete mode 100644 packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml delete mode 100644 packages/essspectroscopy/.github/dependabot.yml delete mode 100644 packages/essspectroscopy/.github/workflows/ci.yml delete mode 100644 packages/essspectroscopy/.github/workflows/docs.yml delete mode 100644 packages/essspectroscopy/.github/workflows/nightly_at_main.yml delete mode 100644 packages/essspectroscopy/.github/workflows/nightly_at_main_lower_bound.yml delete mode 100644 packages/essspectroscopy/.github/workflows/nightly_at_release.yml delete mode 100644 packages/essspectroscopy/.github/workflows/python-version-ci delete mode 100644 packages/essspectroscopy/.github/workflows/release.yml delete mode 100644 packages/essspectroscopy/.github/workflows/test.yml delete mode 100644 packages/essspectroscopy/.github/workflows/unpinned.yml delete mode 100644 packages/essspectroscopy/.github/workflows/weekly_windows_macos.yml delete mode 100644 packages/essspectroscopy/.gitignore delete mode 100644 packages/essspectroscopy/.pre-commit-config.yaml delete mode 100644 packages/essspectroscopy/.python-version delete mode 100644 packages/essspectroscopy/CODE_OF_CONDUCT.md delete mode 100644 packages/essspectroscopy/CONTRIBUTING.md delete mode 100644 packages/essspectroscopy/LICENSE delete mode 100644 packages/essspectroscopy/MANIFEST.in delete mode 100644 packages/essspectroscopy/requirements/base.in delete mode 100644 packages/essspectroscopy/requirements/base.txt delete mode 100644 packages/essspectroscopy/requirements/basetest.in delete mode 100644 packages/essspectroscopy/requirements/basetest.txt delete mode 100644 packages/essspectroscopy/requirements/ci.in delete mode 100644 packages/essspectroscopy/requirements/ci.txt delete mode 100644 packages/essspectroscopy/requirements/dev.in delete mode 100644 packages/essspectroscopy/requirements/dev.txt delete mode 100644 packages/essspectroscopy/requirements/docs.in delete mode 100644 packages/essspectroscopy/requirements/docs.txt delete mode 100644 packages/essspectroscopy/requirements/make_base.py delete mode 100644 packages/essspectroscopy/requirements/mypy.in delete mode 100644 packages/essspectroscopy/requirements/mypy.txt delete mode 100644 packages/essspectroscopy/requirements/nightly.in delete mode 100644 packages/essspectroscopy/requirements/nightly.txt delete mode 100644 packages/essspectroscopy/requirements/static.in delete mode 100644 packages/essspectroscopy/requirements/static.txt delete mode 100644 packages/essspectroscopy/requirements/test.in delete mode 100644 packages/essspectroscopy/requirements/test.txt delete mode 100644 packages/essspectroscopy/requirements/wheels.in delete mode 100644 packages/essspectroscopy/requirements/wheels.txt delete mode 100644 packages/essspectroscopy/tox.ini diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bcb36aefe..029ae84ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,6 +82,15 @@ jobs: - '.github/workflows/ci.yml' - '.pre-commit-config.yaml' - '.python-version' + essspectroscopy: + - 'packages/essspectroscopy/**' + - 'packages/essreduce/**' + - 'pyproject.toml' + - 'pixi.lock' + - 'pixi.toml' + - '.github/workflows/ci.yml' + - '.pre-commit-config.yaml' + - '.python-version' formatting: name: Formatting and static analysis diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 78a4f5813..2d3c4eef8 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -14,6 +14,7 @@ on: - essdiffraction - essreflectometry - esssans + - essspectroscopy publish: default: false type: boolean diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index e56c9bd8d..6329226b2 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -22,6 +22,7 @@ jobs: - essdiffraction - essreflectometry - esssans + - essspectroscopy runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 diff --git a/.github/workflows/weekly-platform.yml b/.github/workflows/weekly-platform.yml index 6c59d4056..c98946534 100644 --- a/.github/workflows/weekly-platform.yml +++ b/.github/workflows/weekly-platform.yml @@ -23,6 +23,7 @@ jobs: - essdiffraction - essreflectometry - esssans + - essspectroscopy runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v6 diff --git a/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml b/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml deleted file mode 100644 index 4d87603ba..000000000 --- a/packages/essspectroscopy/.github/ISSUE_TEMPLATE/high-level-requirement.yml +++ /dev/null @@ -1,97 +0,0 @@ -name: High-level requirement -description: Describe a high-level requirement -title: "[Requirement] " -labels: ["requirement"] -projects: [] -body: - - type: markdown - attributes: - value: | - Thanks for taking the time to provide as many details as possible for this requirement! - - type: input - id: summary - attributes: - label: Executive summary - description: Provide a short summary of the requirement - placeholder: "Example: We need to correct for X when processing Y." - validations: - required: true - - type: textarea - id: context - attributes: - label: Context and background knowledge - description: | - - What is the context of this requirement? - - What background knowledge is required to understand it? - - Does this depend on previous tasks? Provide links! - - Is there follow-up work? - placeholder: "Example: See summary on Wikipedia, or the following paper." - validations: - required: true - - type: textarea - id: inputs - attributes: - label: Inputs - description: | - Describe in detail all the input data and data properties that are known. - This is not about test data (see below), but about general properties of data that will be used in practice. - placeholder: "Example: A single 1-D spectrum with a known wavelength range." - validations: - required: true - - type: textarea - id: methodology - attributes: - label: Methodology - description: | - Describe, e.g., the computation to be performed. - When linking to references, please refer to the specific section, page, or equation. - placeholder: "Remember you can write equations such as $n\\lambda = 2d\\sin(\\theta)$ using LaTeX syntax, as well as other Markdown formatting." - validations: - required: true - - type: textarea - id: outputs - attributes: - label: Outputs - description: | - Describe in detail all the output data and data properties. - This is not about test data (see below), but about general properties of data that will be used in practice. - placeholder: "Example: The position of the peak in the spectrum." - validations: - required: true - - type: dropdown - id: interfaces - attributes: - label: Which interfaces are required? - multiple: true - options: - - Integrated into reduction workflow - - Python module / function - - Python script - - Jupyter notebook - - Other (please describe in comments) - default: 0 - validations: - required: true - - type: textarea - id: testcases - attributes: - label: Test cases - description: How can we test this requirement? Links to tests data and reference data, or other suggestions. - validations: - required: true - - type: textarea - id: existingimplementations - attributes: - label: Existing implementations - description: Are there any existing implementations or proof-of-concept implementations that we can imitate? This field is specifically for linking to source code. - placeholder: "Example: See this repository ... This script implements the procedure: https://file-storage.server.eu/script.code." - validations: - required: false - - type: textarea - id: comments - attributes: - label: Comments - description: Do you have other comments that do not fall in the above categories? - placeholder: "Example: Depends on issues #1234, blocked by #666." - validations: - required: false diff --git a/packages/essspectroscopy/.github/dependabot.yml b/packages/essspectroscopy/.github/dependabot.yml deleted file mode 100644 index c8076bb1f..000000000 --- a/packages/essspectroscopy/.github/dependabot.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: 2 -updates: - # Note: We are not listing package-ecosystem: "github-actions". This causes - # noise in all template instances. Instead dependabot.yml in scipp/copier_template - # triggers updates of github-actions in the *template*. We then use `copier update` - # in template instances. - - package-ecosystem: "pip" - directory: "/requirements" - schedule: - interval: "daily" - allow: - - dependency-name: "scipp" - dependency-type: "direct" diff --git a/packages/essspectroscopy/.github/workflows/ci.yml b/packages/essspectroscopy/.github/workflows/ci.yml deleted file mode 100644 index b273e6844..000000000 --- a/packages/essspectroscopy/.github/workflows/ci.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: CI - -on: - push: - branches: - - main - - release - pull_request: - -jobs: - formatting: - name: Formatting and static analysis - runs-on: 'ubuntu-24.04' - outputs: - min_python: ${{ steps.vars.outputs.min_python }} - min_tox_env: ${{ steps.vars.outputs.min_tox_env }} - steps: - - uses: actions/checkout@v4 - - name: Get Python version for other CI jobs - id: vars - run: | - echo "min_python=$(< .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" - echo "min_tox_env=py$(sed 's/\.//g' < .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" - - uses: actions/setup-python@v5 - with: - python-version-file: '.github/workflows/python-version-ci' - - uses: pre-commit/action@v3.0.1 - with: - extra_args: --all-files - - uses: pre-commit-ci/lite-action@v1.1.0 - if: always() - with: - msg: Apply automatic formatting - - tests: - name: Tests - needs: formatting - strategy: - matrix: - os: ['ubuntu-24.04'] - python: - - version: '${{needs.formatting.outputs.min_python}}' - tox-env: '${{needs.formatting.outputs.min_tox_env}}' - uses: ./.github/workflows/test.yml - with: - os-variant: ${{ matrix.os }} - python-version: ${{ matrix.python.version }} - tox-env: ${{ matrix.python.tox-env }} - secrets: inherit - - docs: - needs: tests - uses: ./.github/workflows/docs.yml - with: - publish: false - linkcheck: ${{ github.ref == 'refs/heads/main' }} - branch: ${{ github.head_ref == '' && github.ref_name || github.head_ref }} - secrets: inherit diff --git a/packages/essspectroscopy/.github/workflows/docs.yml b/packages/essspectroscopy/.github/workflows/docs.yml deleted file mode 100644 index 47294b922..000000000 --- a/packages/essspectroscopy/.github/workflows/docs.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: Docs - -on: - workflow_dispatch: - inputs: - publish: - default: false - type: boolean - version: - default: '' - required: false - type: string - branch: - description: 'Branch/tag with documentation source. If not set, the current branch will be used.' - default: '' - required: false - type: string - workflow_call: - inputs: - publish: - default: false - type: boolean - version: - default: '' - required: false - type: string - branch: - description: 'Branch/tag with documentation source. If not set, the current branch will be used.' - default: '' - required: false - type: string - linkcheck: - description: 'Run the link checker. If not set the link checker will not be run.' - default: false - required: false - type: boolean - -env: - VERSION: ${{ inputs.version }} - -jobs: - docs: - name: Build documentation - runs-on: 'ubuntu-24.04' - env: - ESS_PROTECTED_FILESTORE_USERNAME: ${{ secrets.ESS_PROTECTED_FILESTORE_USERNAME }} - ESS_PROTECTED_FILESTORE_PASSWORD: ${{ secrets.ESS_PROTECTED_FILESTORE_PASSWORD }} - - steps: - - run: sudo apt install --yes graphviz pandoc - - uses: actions/checkout@v4 - with: - ref: ${{ inputs.branch == '' && github.ref_name || inputs.branch }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 # history required so cmake can determine version - - uses: actions/setup-python@v5 - with: - python-version-file: '.github/workflows/python-version-ci' - - run: python -m pip install --upgrade pip - - run: python -m pip install -r requirements/ci.txt - - run: tox -e releasedocs -- "${VERSION}" - if: ${{ inputs.version != '' }} - - run: tox -e docs - if: ${{ inputs.version == '' }} - - run: tox -e linkcheck - if: ${{ inputs.linkcheck }} - - uses: actions/upload-artifact@v4 - id: artifact-upload-step - with: - name: docs_html - path: html/ - - run: echo "::notice::https://remote-unzip.deno.dev/${{ github.repository }}/artifacts/${{ steps.artifact-upload-step.outputs.artifact-id }}" - - - uses: JamesIves/github-pages-deploy-action@v4.7.3 - if: ${{ inputs.publish }} - with: - branch: gh-pages - folder: html - single-commit: true diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml b/packages/essspectroscopy/.github/workflows/nightly_at_main.yml deleted file mode 100644 index 20e9ee4a8..000000000 --- a/packages/essspectroscopy/.github/workflows/nightly_at_main.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Nightly test at main branch - -on: - workflow_dispatch: - schedule: - - cron: '30 1 * * 1-5' - -jobs: - setup: - name: Setup variables - runs-on: 'ubuntu-24.04' - outputs: - min_python: ${{ steps.vars.outputs.min_python }} - steps: - - uses: actions/checkout@v4 - - name: Get Python version for other CI jobs - id: vars - run: echo "min_python=$(< .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" - - tests: - name: Tests - needs: setup - strategy: - matrix: - os: ['ubuntu-24.04'] - python: - - version: '${{needs.setup.outputs.min_python}}' - tox-env: 'nightly' - uses: ./.github/workflows/test.yml - with: - os-variant: ${{ matrix.os }} - python-version: ${{ matrix.python.version }} - tox-env: ${{ matrix.python.tox-env }} - secrets: inherit diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_main_lower_bound.yml b/packages/essspectroscopy/.github/workflows/nightly_at_main_lower_bound.yml deleted file mode 100644 index c13c3f784..000000000 --- a/packages/essspectroscopy/.github/workflows/nightly_at_main_lower_bound.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Nightly test using lower bound dependencies - -on: - workflow_dispatch: - schedule: - - cron: '30 1 * * 1-5' - -jobs: - setup: - name: Setup variables - runs-on: 'ubuntu-24.04' - outputs: - min_python: ${{ steps.vars.outputs.min_python }} - steps: - - uses: actions/checkout@v4 - - name: Get Python version for other CI jobs - id: vars - run: echo "min_python=$(< .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" - - tests: - name: Tests at lower bound - needs: setup - strategy: - matrix: - os: ['ubuntu-24.04'] - python: - - version: '${{needs.setup.outputs.min_python}}' - runs-on: ${{ matrix.os }} - env: - ESS_PROTECTED_FILESTORE_USERNAME: ${{ secrets.ESS_PROTECTED_FILESTORE_USERNAME }} - ESS_PROTECTED_FILESTORE_PASSWORD: ${{ secrets.ESS_PROTECTED_FILESTORE_PASSWORD }} - steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 - with: - python-version: ${{ matrix.python.version }} - - run: uv run --extra=test --resolution=lowest-direct pytest diff --git a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml b/packages/essspectroscopy/.github/workflows/nightly_at_release.yml deleted file mode 100644 index 14b752135..000000000 --- a/packages/essspectroscopy/.github/workflows/nightly_at_release.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Nightly tests at latest release - -on: - workflow_dispatch: - schedule: - - cron: '0 1 * * 1-5' - -jobs: - setup: - name: Setup variables - runs-on: 'ubuntu-24.04' - outputs: - min_python: ${{ steps.vars.outputs.min_python }} - release_tag: ${{ steps.release.outputs.release_tag }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # history required so we can determine latest release tag - - name: Get last release tag from git - id: release - run: echo "release_tag=$(git describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*')" >> "$GITHUB_OUTPUT" - - name: Get Python version for other CI jobs - id: vars - run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" - - tests: - name: Tests - needs: setup - strategy: - matrix: - os: ['ubuntu-24.04'] - python: - - version: '${{needs.setup.outputs.min_python}}' - tox-env: 'nightly' - uses: ./.github/workflows/test.yml - with: - os-variant: ${{ matrix.os }} - python-version: ${{ matrix.python.version }} - tox-env: ${{ matrix.python.tox-env }} - checkout_ref: ${{ needs.setup.outputs.release_tag }} - secrets: inherit diff --git a/packages/essspectroscopy/.github/workflows/python-version-ci b/packages/essspectroscopy/.github/workflows/python-version-ci deleted file mode 100644 index 2c0733315..000000000 --- a/packages/essspectroscopy/.github/workflows/python-version-ci +++ /dev/null @@ -1 +0,0 @@ -3.11 diff --git a/packages/essspectroscopy/.github/workflows/release.yml b/packages/essspectroscopy/.github/workflows/release.yml deleted file mode 100644 index 66b8a9423..000000000 --- a/packages/essspectroscopy/.github/workflows/release.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: Release - -on: - release: - types: [published] - workflow_dispatch: - -defaults: - run: - shell: bash -l {0} # required for conda env - -jobs: - build_wheels: - name: Wheels - runs-on: 'ubuntu-24.04' - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # history required so setuptools_scm can determine version - - - uses: actions/setup-python@v5 - with: - python-version-file: '.github/workflows/python-version-ci' - - - run: python -m pip install --upgrade pip - - run: python -m pip install -r requirements/wheels.txt - - - name: Build wheels - run: python -m build - - - name: Upload wheels - uses: actions/upload-artifact@v4 - with: - name: dist - path: dist - - upload_pypi: - name: Deploy PyPI - needs: [build_wheels] - runs-on: 'ubuntu-24.04' - environment: release - permissions: - id-token: write - if: github.event_name == 'release' && github.event.action == 'published' - steps: - - uses: actions/download-artifact@v4 - - uses: pypa/gh-action-pypi-publish@v1.12.4 - - docs: - needs: [upload_pypi] - uses: ./.github/workflows/docs.yml - with: - publish: ${{ github.event_name == 'release' && github.event.action == 'published' }} - secrets: inherit - - assets: - name: Upload docs - needs: docs - runs-on: 'ubuntu-24.04' - permissions: - contents: write # This is needed so that the action can upload the asset - steps: - - uses: actions/download-artifact@v4 - - name: Zip documentation - run: | - mv docs_html documentation-${{ github.ref_name }} - zip -r documentation-${{ github.ref_name }}.zip documentation-${{ github.ref_name }} - - name: Upload release assets - uses: svenstaro/upload-release-action@v2 - with: - file: ./documentation-${{ github.ref_name }}.zip - overwrite: false diff --git a/packages/essspectroscopy/.github/workflows/test.yml b/packages/essspectroscopy/.github/workflows/test.yml deleted file mode 100644 index ca40b253e..000000000 --- a/packages/essspectroscopy/.github/workflows/test.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: Test - -on: - workflow_dispatch: - inputs: - os-variant: - default: 'ubuntu-24.04' - type: string - python-version: - type: string - tox-env: - default: 'test' - type: string - pip-recipe: - default: 'requirements/ci.txt' - type: string - coverage-report: - default: false - type: boolean - checkout_ref: - default: '' - type: string - workflow_call: - inputs: - os-variant: - default: 'ubuntu-24.04' - type: string - python-version: - type: string - tox-env: - default: 'test' - type: string - pip-recipe: - default: 'requirements/ci.txt' - type: string - coverage-report: - default: false - type: boolean - checkout_ref: - default: '' - type: string - -jobs: - package-test: - runs-on: ${{ inputs.os-variant }} - - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ inputs.checkout_ref }} - - uses: actions/setup-python@v5 - with: - python-version: ${{ inputs.python-version }} - - run: python -m pip install --upgrade pip - - run: python -m pip install . - - run: python tests/package_test.py - name: Run package tests - - test: - runs-on: ${{ inputs.os-variant }} - env: - ESS_PROTECTED_FILESTORE_USERNAME: ${{ secrets.ESS_PROTECTED_FILESTORE_USERNAME }} - ESS_PROTECTED_FILESTORE_PASSWORD: ${{ secrets.ESS_PROTECTED_FILESTORE_PASSWORD }} - - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ inputs.checkout_ref }} - - uses: actions/setup-python@v5 - with: - python-version: ${{ inputs.python-version }} - - run: python -m pip install --upgrade pip - - run: python -m pip install -r ${{ inputs.pip-recipe }} - - run: tox -e ${{ inputs.tox-env }} - - uses: actions/upload-artifact@v4 - if: ${{ inputs.coverage-report }} - with: - name: CoverageReport - path: coverage_html/ diff --git a/packages/essspectroscopy/.github/workflows/unpinned.yml b/packages/essspectroscopy/.github/workflows/unpinned.yml deleted file mode 100644 index ff03faa18..000000000 --- a/packages/essspectroscopy/.github/workflows/unpinned.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Unpinned tests at latest release - -on: - workflow_dispatch: - schedule: - - cron: '0 2 * * 1' - -jobs: - setup: - name: Setup variables - runs-on: 'ubuntu-24.04' - outputs: - min_python: ${{ steps.vars.outputs.min_python }} - release_tag: ${{ steps.release.outputs.release_tag }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # history required so we can determine latest release tag - - name: Get last release tag from git - id: release - run: echo "release_tag=$(git describe --tags --abbrev=0 --match '[0-9]*.[0-9]*.[0-9]*')" >> "$GITHUB_OUTPUT" - - name: Get Python version for other CI jobs - id: vars - run: echo "min_python=$(cat .github/workflows/python-version-ci)" >> "$GITHUB_OUTPUT" - - tests: - name: Tests - needs: setup - strategy: - matrix: - os: ['ubuntu-24.04'] - python: - - version: '${{needs.setup.outputs.min_python}}' - tox-env: 'unpinned' - uses: ./.github/workflows/test.yml - with: - os-variant: ${{ matrix.os }} - python-version: ${{ matrix.python.version }} - tox-env: ${{ matrix.python.tox-env }} - checkout_ref: ${{ needs.setup.outputs.release_tag }} - secrets: inherit diff --git a/packages/essspectroscopy/.github/workflows/weekly_windows_macos.yml b/packages/essspectroscopy/.github/workflows/weekly_windows_macos.yml deleted file mode 100644 index 1544d7f97..000000000 --- a/packages/essspectroscopy/.github/workflows/weekly_windows_macos.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Windows and MacOS weekly tests - -on: - workflow_dispatch: - schedule: - - cron: '0 2 * * 1' - -jobs: - pytox: - name: Python and Tox env - runs-on: 'ubuntu-24.04' - outputs: - min_python: ${{ steps.vars.outputs.min_python }} - min_tox_env: ${{ steps.vars.outputs.min_tox_env }} - steps: - - uses: actions/checkout@v4 - - name: Get Python version for other CI jobs - id: vars - run: | - echo "min_python=$(cat .github/workflows/python-version-ci)" >> $GITHUB_OUTPUT - echo "min_tox_env=py$(cat .github/workflows/python-version-ci | sed 's/\.//g')" >> $GITHUB_OUTPUT - tests: - name: Tests - needs: pytox - strategy: - matrix: - os: ['macos-latest', 'windows-latest'] - python: - - version: '${{needs.pytox.outputs.min_python}}' - tox-env: '${{needs.pytox.outputs.min_tox_env}}' - uses: ./.github/workflows/test.yml - with: - os-variant: ${{ matrix.os }} - python-version: ${{ matrix.python.version }} - tox-env: ${{ matrix.python.tox-env }} - - docs: - needs: tests - uses: ./.github/workflows/docs.yml - with: - publish: false - branch: ${{ github.head_ref == '' && github.ref_name || github.head_ref }} diff --git a/packages/essspectroscopy/.gitignore b/packages/essspectroscopy/.gitignore deleted file mode 100644 index 720318ba4..000000000 --- a/packages/essspectroscopy/.gitignore +++ /dev/null @@ -1,48 +0,0 @@ -# Build artifacts -build -dist -html -.tox -*.egg-info -# we lock dependencies with pip-compile, not uv -uv.lock - -*.sw? - -# Environments -venv -.venv - -# Caches -*.DS_Store -.clangd/ -*.ipynb_checkpoints -__pycache__/ -.vs/ -.virtual_documents -.hypothesis -.pytest_cache -.mypy_cache -docs/generated/ -.ruff_cache - -# Editor settings -.idea/ -.vscode/ - -# Data files -*.data -*.dat -*.csv -*.xye -*.h5 -*.hdf5 -*.hdf -*.nxs -*.raw -*.cif -*.rcif -*.ort -*.zip -*.sqw -*.nxspe diff --git a/packages/essspectroscopy/.pre-commit-config.yaml b/packages/essspectroscopy/.pre-commit-config.yaml deleted file mode 100644 index 753ce88e1..000000000 --- a/packages/essspectroscopy/.pre-commit-config.yaml +++ /dev/null @@ -1,55 +0,0 @@ -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 - hooks: - - id: check-added-large-files - - id: check-case-conflict - - id: check-illegal-windows-names - - id: check-json - exclude: asv.conf.json - - id: check-merge-conflict - - id: check-toml - - id: check-yaml - - id: detect-private-key - - id: trailing-whitespace - args: [ --markdown-linebreak-ext=md ] - exclude: '\.svg' - - repo: https://github.com/kynan/nbstripout - rev: 0.8.1 - hooks: - - id: nbstripout - types: [ "jupyter" ] - args: [ "--drop-empty-cells", - "--extra-keys 'metadata.language_info.version cell.metadata.jp-MarkdownHeadingCollapsed cell.metadata.pycharm'" ] - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.11 - hooks: - - id: ruff - args: [ --fix ] - types_or: [ python, pyi, jupyter ] - - id: ruff-format - types_or: [ python, pyi ] - - repo: https://github.com/codespell-project/codespell - rev: v2.4.1 - hooks: - - id: codespell - additional_dependencies: - - tomli - exclude_types: - - svg - - repo: https://github.com/pre-commit/pygrep-hooks - rev: v1.10.0 - hooks: - - id: python-no-eval - - id: python-no-log-warn - - id: python-use-type-annotations - - id: rst-backticks - - id: rst-directive-colons - - id: rst-inline-touching-normal - - id: text-unicode-replacement-char - - repo: https://github.com/rhysd/actionlint - rev: v1.7.7 - hooks: - - id: actionlint - # Disable because of false-positive SC2046 - args: ["-shellcheck="] diff --git a/packages/essspectroscopy/.python-version b/packages/essspectroscopy/.python-version deleted file mode 100644 index 2c0733315..000000000 --- a/packages/essspectroscopy/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.11 diff --git a/packages/essspectroscopy/CODE_OF_CONDUCT.md b/packages/essspectroscopy/CODE_OF_CONDUCT.md deleted file mode 100644 index 1c3746e41..000000000 --- a/packages/essspectroscopy/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,134 +0,0 @@ - -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, caste, color, religion, or sexual -identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the overall - community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or advances of - any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email address, - without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -scipp[at]ess.eu. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series of -actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or permanent -ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within the -community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.1, available at -[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at -[https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations - diff --git a/packages/essspectroscopy/CONTRIBUTING.md b/packages/essspectroscopy/CONTRIBUTING.md deleted file mode 100644 index daeb6f875..000000000 --- a/packages/essspectroscopy/CONTRIBUTING.md +++ /dev/null @@ -1,20 +0,0 @@ -## Contributing to ESSspectroscopy - -Welcome to the developer side of ESSspectroscopy! - -Contributions are always welcome. -This includes reporting bugs or other issues, submitting pull requests, requesting new features, etc. - -If you need help with using ESSspectroscopy or contributing to it, have a look at the GitHub [discussions](https://github.com/scipp/essspectroscopy/discussions) and start a new [Q&A discussion](https://github.com/scipp/essspectroscopy/discussions/categories/q-a) if you can't find what you are looking for. - -For bug reports and other problems, please open an [issue](https://github.com/scipp/essspectroscopy/issues/new) in GitHub. - -You are welcome to submit pull requests at any time. -But to avoid having to make large modifications during review or even have your PR rejected, please first open an issue first to discuss your idea! - -Check out the subsections of the [Developer documentation](https://scipp.github.io/essspectroscopy/developer/index.html) for details on how ESSspectroscopy is developed. - -## Code of conduct - -This project is a community effort, and everyone is welcome to contribute. -Everyone within the community is expected to abide by our [code of conduct](https://github.com/scipp/essspectroscopy/blob/main/CODE_OF_CONDUCT.md). diff --git a/packages/essspectroscopy/LICENSE b/packages/essspectroscopy/LICENSE deleted file mode 100644 index 7d62083d5..000000000 --- a/packages/essspectroscopy/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2025, Scipp contributors (https://github.com/scipp) -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/essspectroscopy/MANIFEST.in b/packages/essspectroscopy/MANIFEST.in deleted file mode 100644 index 1aba38f67..000000000 --- a/packages/essspectroscopy/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include LICENSE diff --git a/packages/essspectroscopy/pyproject.toml b/packages/essspectroscopy/pyproject.toml index 51c843544..bb661c2c3 100644 --- a/packages/essspectroscopy/pyproject.toml +++ b/packages/essspectroscopy/pyproject.toml @@ -47,6 +47,22 @@ test = [ "pooch>=1.5", "pytest>=7.0", ] +docs = [ + "autodoc-pydantic", + "ipykernel", + "ipympl", + "ipython!=8.7.0", # Breaks syntax highlighting in Jupyter code cells. + "ipywidgets", + "myst-parser", + "nbsphinx", + "pandas", + "pooch", + "pydata-sphinx-theme>=0.14", + "sphinx", + "sphinx-autodoc-typehints", + "sphinx-copybutton", + "sphinx-design", +] [project.urls] "Bug Tracker" = "https://github.com/scipp/essspectroscopy/issues" @@ -54,6 +70,9 @@ test = [ "Source" = "https://github.com/scipp/essspectroscopy" [tool.setuptools_scm] +root = "../.." +tag_regex = "^essspectroscopy/(?P[vV]?\\d+(?:\\.\\d+)*(?:[._-]?\\w+)*)$" +git_describe_command = ["git", "describe", "--dirty", "--tags", "--long", "--match", "essspectroscopy/*[0-9]*"] [tool.pytest.ini_options] minversion = "7.0" @@ -71,43 +90,6 @@ filterwarnings = [ 'ignore:\n Sentinel is not a public part of the traitlets API:DeprecationWarning', ] -[tool.ruff] -line-length = 88 -extend-include = ["*.ipynb"] -extend-exclude = [ - ".*", "__pycache__", "build", "dist", "install", -] - -[tool.ruff.lint] -# See https://docs.astral.sh/ruff/rules/ -select = ["B", "C4", "DTZ", "E", "F", "G", "I", "PERF", "PGH", "PT", "PYI", "RUF", "S", "T20", "UP", "W"] -ignore = [ - # Conflict with ruff format, see - # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules - "COM812", "COM819", "D206", "D300", "E111", "E114", "E117", "ISC001", "ISC002", "Q000", "Q001", "Q002", "Q003", "W191", -] -fixable = ["B010", "I001", "PT001", "RUF022"] -isort.known-first-party = ["ess.spectroscopy"] -pydocstyle.convention = "numpy" - -[tool.ruff.lint.per-file-ignores] -# those files have an increased risk of relying on import order -"tests/*" = [ - "S101", # asserts are fine in tests - "B018", # 'useless expressions' are ok because some tests just check for exceptions -] -"*.ipynb" = [ - "E501", # longer lines are sometimes more readable - "F403", # *-imports used with domain types - "F405", # linter may fail to find names because of *-imports - "I", # we don't collect imports at the top - "S101", # asserts are used for demonstration and are safe in notebooks - "T201", # printing is ok for demonstration purposes -] - -[tool.ruff.format] -quote-style = "preserve" - [tool.mypy] strict = true ignore_missing_imports = true @@ -117,11 +99,3 @@ enable_error_code = [ "truthy-bool", ] warn_unreachable = true - -[tool.codespell] -ignore-words-list = [ - # Codespell wants "socioeconomic" which seems to be the standard spelling. - # But we use the word in our code of conduct which is the contributor covenant. - # Let's not modify it if we don't have to. - "socio-economic", -] diff --git a/packages/essspectroscopy/requirements/base.in b/packages/essspectroscopy/requirements/base.in deleted file mode 100644 index 9b9d0b5ee..000000000 --- a/packages/essspectroscopy/requirements/base.in +++ /dev/null @@ -1,12 +0,0 @@ -# Anything above "--- END OF CUSTOM SECTION ---" -# will not be touched by ``make_base.py`` -# --- END OF CUSTOM SECTION --- -# The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -essreduce>=26.4.1 -graphviz>=0.20 -pandas>=2.1.2 -sciline>=25.4.1 -scipp>=26.1.0 -scippneutron>=25.11.2 -scippnexus>=24.9.0 -tof>=25.11.0 diff --git a/packages/essspectroscopy/requirements/base.txt b/packages/essspectroscopy/requirements/base.txt deleted file mode 100644 index 3f66a0cd3..000000000 --- a/packages/essspectroscopy/requirements/base.txt +++ /dev/null @@ -1,128 +0,0 @@ -# SHA1:db0b6133057674a1a7c9f64ad9fe7e4f411c9e8f -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# -annotated-types==0.7.0 - # via pydantic -certifi==2026.2.25 - # via requests -charset-normalizer==3.4.7 - # via requests -contourpy==1.3.3 - # via matplotlib -cyclebane==24.10.0 - # via sciline -cycler==0.12.1 - # via matplotlib -dnspython==2.8.0 - # via email-validator -email-validator==2.3.0 - # via scippneutron -essreduce==26.4.1 - # via -r base.in -fonttools==4.62.1 - # via matplotlib -graphviz==0.21 - # via -r base.in -h5py==3.16.0 - # via - # scippneutron - # scippnexus -idna==3.11 - # via - # email-validator - # requests -kiwisolver==1.5.0 - # via matplotlib -lazy-loader==0.5 - # via - # plopp - # scippneutron - # tof -matplotlib==3.10.8 - # via - # mpltoolbox - # plopp -mpltoolbox==26.2.0 - # via scippneutron -networkx==3.6.1 - # via cyclebane -numpy==2.4.4 - # via - # contourpy - # h5py - # matplotlib - # pandas - # scipp - # scippneutron - # scipy -packaging==26.1 - # via - # lazy-loader - # matplotlib - # pooch -pandas==3.0.2 - # via -r base.in -pillow==12.2.0 - # via matplotlib -platformdirs==4.9.6 - # via pooch -plopp==26.4.0 - # via - # scippneutron - # tof -pooch==1.9.0 - # via tof -pydantic==2.13.2 - # via scippneutron -pydantic-core==2.46.2 - # via pydantic -pyparsing==3.3.2 - # via matplotlib -python-dateutil==2.9.0.post0 - # via - # matplotlib - # pandas - # scippneutron -requests==2.33.1 - # via pooch -sciline==25.11.1 - # via - # -r base.in - # essreduce -scipp==26.3.1 - # via - # -r base.in - # essreduce - # scippneutron - # scippnexus - # tof -scippneutron==26.3.0 - # via - # -r base.in - # essreduce -scippnexus==26.1.1 - # via - # -r base.in - # essreduce - # scippneutron -scipy==1.17.1 - # via - # scippneutron - # scippnexus -six==1.17.0 - # via python-dateutil -tof==26.3.0 - # via -r base.in -typing-extensions==4.15.0 - # via - # pydantic - # pydantic-core - # typing-inspection -typing-inspection==0.4.2 - # via pydantic -urllib3==2.6.3 - # via requests diff --git a/packages/essspectroscopy/requirements/basetest.in b/packages/essspectroscopy/requirements/basetest.in deleted file mode 100644 index efed8f448..000000000 --- a/packages/essspectroscopy/requirements/basetest.in +++ /dev/null @@ -1,11 +0,0 @@ -# Dependencies that are only used by tests. -# Do not make an environment from this file, use test.txt instead! -# Add more dependencies in the ``test`` list -# under ``[project.optional-dependencies]`` section, in ``pyproject.toml`` - -# Anything above "--- END OF CUSTOM SECTION ---" -# will not be touched by ``make_base.py`` -# --- END OF CUSTOM SECTION --- -# The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -pooch>=1.5 -pytest>=7.0 diff --git a/packages/essspectroscopy/requirements/basetest.txt b/packages/essspectroscopy/requirements/basetest.txt deleted file mode 100644 index acd47428d..000000000 --- a/packages/essspectroscopy/requirements/basetest.txt +++ /dev/null @@ -1,33 +0,0 @@ -# SHA1:ca39ad2dd07c303d616b3b63afee59b3c41e83fe -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# -certifi==2026.2.25 - # via requests -charset-normalizer==3.4.7 - # via requests -idna==3.11 - # via requests -iniconfig==2.3.0 - # via pytest -packaging==26.1 - # via - # pooch - # pytest -platformdirs==4.9.6 - # via pooch -pluggy==1.6.0 - # via pytest -pooch==1.9.0 - # via -r basetest.in -pygments==2.20.0 - # via pytest -pytest==9.0.3 - # via -r basetest.in -requests==2.33.1 - # via pooch -urllib3==2.6.3 - # via requests diff --git a/packages/essspectroscopy/requirements/ci.in b/packages/essspectroscopy/requirements/ci.in deleted file mode 100644 index e5c3075aa..000000000 --- a/packages/essspectroscopy/requirements/ci.in +++ /dev/null @@ -1,4 +0,0 @@ -gitpython -packaging -requests -tox diff --git a/packages/essspectroscopy/requirements/ci.txt b/packages/essspectroscopy/requirements/ci.txt deleted file mode 100644 index d1c46af0c..000000000 --- a/packages/essspectroscopy/requirements/ci.txt +++ /dev/null @@ -1,58 +0,0 @@ -# SHA1:6344d52635ea11dca331a3bc6eb1833c4c64d585 -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# -cachetools==7.0.5 - # via tox -certifi==2026.2.25 - # via requests -charset-normalizer==3.4.7 - # via requests -colorama==0.4.6 - # via tox -distlib==0.4.0 - # via virtualenv -filelock==3.29.0 - # via - # python-discovery - # tox - # virtualenv -gitdb==4.0.12 - # via gitpython -gitpython==3.1.46 - # via -r ci.in -idna==3.11 - # via requests -packaging==26.1 - # via - # -r ci.in - # pyproject-api - # tox -platformdirs==4.9.6 - # via - # python-discovery - # tox - # virtualenv -pluggy==1.6.0 - # via tox -pyproject-api==1.10.0 - # via tox -python-discovery==1.2.2 - # via - # tox - # virtualenv -requests==2.33.1 - # via -r ci.in -smmap==5.0.3 - # via gitdb -tomli-w==1.2.0 - # via tox -tox==4.53.0 - # via -r ci.in -urllib3==2.6.3 - # via requests -virtualenv==21.2.4 - # via tox diff --git a/packages/essspectroscopy/requirements/dev.in b/packages/essspectroscopy/requirements/dev.in deleted file mode 100644 index 53ddf47ed..000000000 --- a/packages/essspectroscopy/requirements/dev.in +++ /dev/null @@ -1,11 +0,0 @@ --r base.in --r ci.in --r docs.in --r mypy.in --r static.in --r test.in --r wheels.in -copier -jupyterlab -pip-compile-multi -pre-commit diff --git a/packages/essspectroscopy/requirements/dev.txt b/packages/essspectroscopy/requirements/dev.txt deleted file mode 100644 index eb4972c96..000000000 --- a/packages/essspectroscopy/requirements/dev.txt +++ /dev/null @@ -1,127 +0,0 @@ -# SHA1:efd19a3a98c69fc3d6d6233ed855de7e4a208f74 -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# --r base.txt --r ci.txt --r docs.txt --r mypy.txt --r static.txt --r test.txt --r wheels.txt -anyio==4.13.0 - # via - # httpx - # jupyter-server -argon2-cffi==25.1.0 - # via jupyter-server -argon2-cffi-bindings==25.1.0 - # via argon2-cffi -arrow==1.4.0 - # via isoduration -async-lru==2.3.0 - # via jupyterlab -cffi==2.0.0 - # via argon2-cffi-bindings -click==8.3.2 - # via - # pip-compile-multi - # pip-tools -copier==9.14.3 - # via -r dev.in -dunamai==1.26.1 - # via copier -fqdn==1.5.1 - # via jsonschema -funcy==2.0 - # via copier -h11==0.16.0 - # via httpcore -httpcore==1.0.9 - # via httpx -httpx==0.28.1 - # via jupyterlab -isoduration==20.11.0 - # via jsonschema -jinja2-ansible-filters==1.3.2 - # via copier -json5==0.14.0 - # via jupyterlab-server -jsonpointer==3.1.1 - # via jsonschema -jsonschema[format-nongpl]==4.26.0 - # via - # jupyter-events - # jupyterlab-server - # nbformat -jupyter-events==0.12.0 - # via jupyter-server -jupyter-lsp==2.3.1 - # via jupyterlab -jupyter-server==2.17.0 - # via - # jupyter-lsp - # jupyterlab - # jupyterlab-server - # notebook-shim -jupyter-server-terminals==0.5.4 - # via jupyter-server -jupyterlab==4.5.6 - # via -r dev.in -jupyterlab-server==2.28.0 - # via jupyterlab -lark==1.3.1 - # via rfc3987-syntax -notebook-shim==0.2.4 - # via jupyterlab -overrides==7.7.0 - # via jupyter-server -pip-compile-multi==3.3.1 - # via -r dev.in -pip-tools==7.5.3 - # via pip-compile-multi -plumbum==1.10.0 - # via copier -prometheus-client==0.25.0 - # via jupyter-server -pycparser==3.0 - # via cffi -python-json-logger==4.1.0 - # via jupyter-events -questionary==2.1.1 - # via copier -rfc3339-validator==0.1.4 - # via - # jsonschema - # jupyter-events -rfc3986-validator==0.1.1 - # via - # jsonschema - # jupyter-events -rfc3987-syntax==1.1.0 - # via jsonschema -send2trash==2.1.0 - # via jupyter-server -terminado==0.18.1 - # via - # jupyter-server - # jupyter-server-terminals -toposort==1.10 - # via pip-compile-multi -tzdata==2026.1 - # via arrow -uri-template==1.3.0 - # via jsonschema -webcolors==25.10.0 - # via jsonschema -websocket-client==1.9.0 - # via jupyter-server -wheel==0.46.3 - # via pip-tools - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools diff --git a/packages/essspectroscopy/requirements/docs.in b/packages/essspectroscopy/requirements/docs.in deleted file mode 100644 index 1d831a162..000000000 --- a/packages/essspectroscopy/requirements/docs.in +++ /dev/null @@ -1,15 +0,0 @@ --r base.in -autodoc-pydantic -ipykernel -ipympl -ipython!=8.7.0 # Breaks syntax highlighting in Jupyter code cells. -ipywidgets -myst-parser -nbsphinx -pandas -pooch -pydata-sphinx-theme>=0.14 -sphinx -sphinx-autodoc-typehints -sphinx-copybutton -sphinx-design diff --git a/packages/essspectroscopy/requirements/docs.txt b/packages/essspectroscopy/requirements/docs.txt deleted file mode 100644 index 0ceeccc33..000000000 --- a/packages/essspectroscopy/requirements/docs.txt +++ /dev/null @@ -1,233 +0,0 @@ -# SHA1:cd38650dbade5abcec0a82225fc305a00e19732c -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# --r base.txt -accessible-pygments==0.0.5 - # via pydata-sphinx-theme -alabaster==1.0.0 - # via sphinx -asttokens==3.0.1 - # via stack-data -attrs==26.1.0 - # via - # jsonschema - # referencing -autodoc-pydantic==2.2.0 - # via -r docs.in -babel==2.18.0 - # via - # pydata-sphinx-theme - # sphinx -beautifulsoup4==4.14.3 - # via - # nbconvert - # pydata-sphinx-theme -bleach[css]==6.3.0 - # via nbconvert -comm==0.2.3 - # via - # ipykernel - # ipywidgets -debugpy==1.8.20 - # via ipykernel -decorator==5.2.1 - # via ipython -defusedxml==0.7.1 - # via nbconvert -docutils==0.22.4 - # via - # myst-parser - # nbsphinx - # pydata-sphinx-theme - # sphinx -executing==2.2.1 - # via stack-data -fastjsonschema==2.21.2 - # via nbformat -imagesize==2.0.0 - # via sphinx -ipykernel==7.2.0 - # via -r docs.in -ipympl==0.10.0 - # via -r docs.in -ipython==9.10.1 - # via - # -r docs.in - # ipykernel - # ipympl - # ipywidgets -ipython-pygments-lexers==1.1.1 - # via ipython -ipywidgets==8.1.8 - # via - # -r docs.in - # ipympl -jedi==0.19.2 - # via ipython -jinja2==3.1.6 - # via - # myst-parser - # nbconvert - # nbsphinx - # sphinx -jsonschema==4.26.0 - # via nbformat -jsonschema-specifications==2025.9.1 - # via jsonschema -jupyter-client==8.8.0 - # via - # ipykernel - # nbclient -jupyter-core==5.9.1 - # via - # ipykernel - # jupyter-client - # nbclient - # nbconvert - # nbformat -jupyterlab-pygments==0.3.0 - # via nbconvert -jupyterlab-widgets==3.0.16 - # via ipywidgets -markdown-it-py==4.0.0 - # via - # mdit-py-plugins - # myst-parser -markupsafe==3.0.3 - # via - # jinja2 - # nbconvert -matplotlib-inline==0.2.1 - # via - # ipykernel - # ipython -mdit-py-plugins==0.5.0 - # via myst-parser -mdurl==0.1.2 - # via markdown-it-py -mistune==3.2.0 - # via nbconvert -myst-parser==5.0.0 - # via -r docs.in -nbclient==0.10.4 - # via nbconvert -nbconvert==7.17.1 - # via nbsphinx -nbformat==5.10.4 - # via - # nbclient - # nbconvert - # nbsphinx -nbsphinx==0.9.8 - # via -r docs.in -nest-asyncio==1.6.0 - # via ipykernel -pandocfilters==1.5.1 - # via nbconvert -parso==0.8.6 - # via jedi -pexpect==4.9.0 - # via ipython -prompt-toolkit==3.0.52 - # via ipython -psutil==7.2.2 - # via ipykernel -ptyprocess==0.7.0 - # via pexpect -pure-eval==0.2.3 - # via stack-data -pydantic-settings==2.13.1 - # via autodoc-pydantic -pydata-sphinx-theme==0.17.0 - # via -r docs.in -pygments==2.20.0 - # via - # accessible-pygments - # ipython - # ipython-pygments-lexers - # nbconvert - # pydata-sphinx-theme - # sphinx -python-dotenv==1.2.2 - # via pydantic-settings -pyyaml==6.0.3 - # via myst-parser -pyzmq==27.1.0 - # via - # ipykernel - # jupyter-client -referencing==0.37.0 - # via - # jsonschema - # jsonschema-specifications -roman-numerals==4.1.0 - # via sphinx -rpds-py==0.30.0 - # via - # jsonschema - # referencing -snowballstemmer==3.0.1 - # via sphinx -soupsieve==2.8.3 - # via beautifulsoup4 -sphinx==9.0.4 - # via - # -r docs.in - # autodoc-pydantic - # myst-parser - # nbsphinx - # pydata-sphinx-theme - # sphinx-autodoc-typehints - # sphinx-copybutton - # sphinx-design -sphinx-autodoc-typehints==3.6.1 - # via -r docs.in -sphinx-copybutton==0.5.2 - # via -r docs.in -sphinx-design==0.7.0 - # via -r docs.in -sphinxcontrib-applehelp==2.0.0 - # via sphinx -sphinxcontrib-devhelp==2.0.0 - # via sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -stack-data==0.6.3 - # via ipython -tinycss2==1.4.0 - # via bleach -tornado==6.5.5 - # via - # ipykernel - # jupyter-client -traitlets==5.14.3 - # via - # ipykernel - # ipympl - # ipython - # ipywidgets - # jupyter-client - # jupyter-core - # matplotlib-inline - # nbclient - # nbconvert - # nbformat - # nbsphinx -wcwidth==0.6.0 - # via prompt-toolkit -webencodings==0.5.1 - # via - # bleach - # tinycss2 -widgetsnbextension==4.0.15 - # via ipywidgets diff --git a/packages/essspectroscopy/requirements/make_base.py b/packages/essspectroscopy/requirements/make_base.py deleted file mode 100644 index 2cda547f5..000000000 --- a/packages/essspectroscopy/requirements/make_base.py +++ /dev/null @@ -1,78 +0,0 @@ -from argparse import ArgumentParser -from pathlib import Path - -import tomli - -parser = ArgumentParser() -parser.add_argument( - "--nightly", - default="", - help="List of dependencies to install from main branch for nightly tests, " - "separated by commas.", -) -args = parser.parse_args() - -CUSTOM_AUTO_SEPARATOR = """ -# --- END OF CUSTOM SECTION --- -# The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -""" - - -def write_dependencies(dependency_name: str, dependencies: list[str]) -> None: - path = Path(f"{dependency_name}.in") - if path.exists(): - sections = path.read_text().split(CUSTOM_AUTO_SEPARATOR) - if len(sections) > 1: - custom = sections[0] - else: - custom = "" - else: - custom = "" - with path.open("w") as f: - f.write(custom) - f.write(CUSTOM_AUTO_SEPARATOR) - f.write("\n".join(dependencies)) - f.write("\n") - - -with open("../pyproject.toml", "rb") as toml_file: - pyproject = tomli.load(toml_file) - dependencies = pyproject["project"].get("dependencies") - if dependencies is None: - raise RuntimeError("No dependencies found in pyproject.toml") - dependencies = [dep.strip().strip('"') for dep in dependencies] - test_dependencies = ( - pyproject["project"].get("optional-dependencies", {}).get("test", []) - ) - test_dependencies = [dep.strip().strip('"') for dep in test_dependencies] - - -write_dependencies("base", dependencies) -write_dependencies("basetest", test_dependencies) - - -def as_nightly(repo: str) -> str: - if "/" in repo: - org, repo = repo.split("/") - else: - org = "scipp" - if repo == "scipp": - # With the standard pip resolver index-url takes precedence over - # extra-index-url but with uv it's reversed, so if we move to tox-uv - # this needs to be reversed. - return ( - "scipp\n" - "--index-url=https://pypi.anaconda.org/scipp-nightly-wheels/simple/\n" - "--extra-index-url=https://pypi.org/simple\n" - "--pre" - ) - return f"{repo} @ git+https://github.com/{org}/{repo}@main" - - -nightly = tuple(args.nightly.split(",") if args.nightly else []) -nightly_dependencies = [ - dep for dep in dependencies + test_dependencies if not dep.startswith(nightly) -] -nightly_dependencies += [as_nightly(arg) for arg in nightly] - -write_dependencies("nightly", nightly_dependencies) diff --git a/packages/essspectroscopy/requirements/mypy.in b/packages/essspectroscopy/requirements/mypy.in deleted file mode 100644 index 5027d8c3f..000000000 --- a/packages/essspectroscopy/requirements/mypy.in +++ /dev/null @@ -1,2 +0,0 @@ --r test.in -mypy diff --git a/packages/essspectroscopy/requirements/mypy.txt b/packages/essspectroscopy/requirements/mypy.txt deleted file mode 100644 index 725c54653..000000000 --- a/packages/essspectroscopy/requirements/mypy.txt +++ /dev/null @@ -1,16 +0,0 @@ -# SHA1:859ef9c15e5e57c6c91510133c01f5751feee941 -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# --r test.txt -librt==0.9.0 - # via mypy -mypy==1.20.1 - # via -r mypy.in -mypy-extensions==1.1.0 - # via mypy -pathspec==1.0.4 - # via mypy diff --git a/packages/essspectroscopy/requirements/nightly.in b/packages/essspectroscopy/requirements/nightly.in deleted file mode 100644 index 119483576..000000000 --- a/packages/essspectroscopy/requirements/nightly.in +++ /dev/null @@ -1,17 +0,0 @@ - -# --- END OF CUSTOM SECTION --- -# The following was generated by 'tox -e deps', DO NOT EDIT MANUALLY! -graphviz>=0.20 -pandas>=2.1.2 -tof>=25.11.0 -pooch>=1.5 -pytest>=7.0 -scipp ---index-url=https://pypi.anaconda.org/scipp-nightly-wheels/simple/ ---extra-index-url=https://pypi.org/simple ---pre -scippneutron @ git+https://github.com/scipp/scippneutron@main -sciline @ git+https://github.com/scipp/sciline@main -plopp @ git+https://github.com/scipp/plopp@main -scippnexus @ git+https://github.com/scipp/scippnexus@main -essreduce @ git+https://github.com/scipp/essreduce@main diff --git a/packages/essspectroscopy/requirements/nightly.txt b/packages/essspectroscopy/requirements/nightly.txt deleted file mode 100644 index e6115d56c..000000000 --- a/packages/essspectroscopy/requirements/nightly.txt +++ /dev/null @@ -1,143 +0,0 @@ -# SHA1:9b1692fb41c64dc77e48768f164de76a70e84da6 -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# ---index-url https://pypi.anaconda.org/scipp-nightly-wheels/simple/ ---extra-index-url https://pypi.org/simple - -annotated-types==0.7.0 - # via pydantic -certifi==2026.2.25 - # via requests -charset-normalizer==3.4.7 - # via requests -contourpy==1.3.3 - # via matplotlib -cyclebane==24.10.0 - # via sciline -cycler==0.12.1 - # via matplotlib -dnspython==2.8.0 - # via email-validator -email-validator==2.3.0 - # via scippneutron -essreduce @ git+https://github.com/scipp/essreduce@main - # via -r nightly.in -fonttools==4.62.1 - # via matplotlib -graphviz==0.21 - # via -r nightly.in -h5py==3.16.0 - # via - # scippneutron - # scippnexus -idna==3.11 - # via - # email-validator - # requests -iniconfig==2.3.0 - # via pytest -kiwisolver==1.5.0 - # via matplotlib -lazy-loader==0.5 - # via - # plopp - # scippneutron - # tof -matplotlib==3.10.8 - # via - # mpltoolbox - # plopp -mpltoolbox==26.2.0 - # via scippneutron -networkx==3.6.1 - # via cyclebane -numpy==2.4.4 - # via - # contourpy - # h5py - # matplotlib - # pandas - # scipp - # scippneutron - # scipy -packaging==26.1 - # via - # lazy-loader - # matplotlib - # pooch - # pytest -pandas==3.0.2 - # via -r nightly.in -pillow==12.2.0 - # via matplotlib -platformdirs==4.9.6 - # via pooch -plopp @ git+https://github.com/scipp/plopp@main - # via - # -r nightly.in - # scippneutron - # tof -pluggy==1.6.0 - # via pytest -pooch==1.9.0 - # via - # -r nightly.in - # tof -pydantic==2.13.2 - # via scippneutron -pydantic-core==2.46.2 - # via pydantic -pygments==2.20.0 - # via pytest -pyparsing==3.3.2 - # via matplotlib -pytest==9.0.3 - # via -r nightly.in -python-dateutil==2.9.0.post0 - # via - # matplotlib - # pandas - # scippneutron -requests==2.33.1 - # via pooch -sciline @ git+https://github.com/scipp/sciline@main - # via - # -r nightly.in - # essreduce -scipp==100.0.0.dev0 - # via - # -r nightly.in - # essreduce - # scippneutron - # scippnexus - # tof -scippneutron @ git+https://github.com/scipp/scippneutron@main - # via - # -r nightly.in - # essreduce -scippnexus @ git+https://github.com/scipp/scippnexus@main - # via - # -r nightly.in - # essreduce - # scippneutron -scipy==1.17.1 - # via - # scippneutron - # scippnexus -six==1.17.0 - # via python-dateutil -tof==26.3.0 - # via -r nightly.in -typing-extensions==4.15.0 - # via - # pydantic - # pydantic-core - # typing-inspection -typing-inspection==0.4.2 - # via pydantic -urllib3==2.6.3 - # via requests diff --git a/packages/essspectroscopy/requirements/static.in b/packages/essspectroscopy/requirements/static.in deleted file mode 100644 index 416634f52..000000000 --- a/packages/essspectroscopy/requirements/static.in +++ /dev/null @@ -1 +0,0 @@ -pre-commit diff --git a/packages/essspectroscopy/requirements/static.txt b/packages/essspectroscopy/requirements/static.txt deleted file mode 100644 index ee4589653..000000000 --- a/packages/essspectroscopy/requirements/static.txt +++ /dev/null @@ -1,31 +0,0 @@ -# SHA1:5a0b1bb22ae805d8aebba0f3bf05ab91aceae0d8 -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# -cfgv==3.5.0 - # via pre-commit -distlib==0.4.0 - # via virtualenv -filelock==3.29.0 - # via - # python-discovery - # virtualenv -identify==2.6.19 - # via pre-commit -nodeenv==1.10.0 - # via pre-commit -platformdirs==4.9.6 - # via - # python-discovery - # virtualenv -pre-commit==4.5.1 - # via -r static.in -python-discovery==1.2.2 - # via virtualenv -pyyaml==6.0.3 - # via pre-commit -virtualenv==21.2.4 - # via pre-commit diff --git a/packages/essspectroscopy/requirements/test.in b/packages/essspectroscopy/requirements/test.in deleted file mode 100644 index 7b4097920..000000000 --- a/packages/essspectroscopy/requirements/test.in +++ /dev/null @@ -1,4 +0,0 @@ -# Add test dependencies in basetest.in - --r base.in --r basetest.in diff --git a/packages/essspectroscopy/requirements/test.txt b/packages/essspectroscopy/requirements/test.txt deleted file mode 100644 index 6817392ee..000000000 --- a/packages/essspectroscopy/requirements/test.txt +++ /dev/null @@ -1,9 +0,0 @@ -# SHA1:ef2ee9576d8a9e65b44e2865a26887eed3fc49d1 -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# --r base.txt --r basetest.txt diff --git a/packages/essspectroscopy/requirements/wheels.in b/packages/essspectroscopy/requirements/wheels.in deleted file mode 100644 index 378eac25d..000000000 --- a/packages/essspectroscopy/requirements/wheels.in +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/packages/essspectroscopy/requirements/wheels.txt b/packages/essspectroscopy/requirements/wheels.txt deleted file mode 100644 index 0a50fd041..000000000 --- a/packages/essspectroscopy/requirements/wheels.txt +++ /dev/null @@ -1,13 +0,0 @@ -# SHA1:80754af91bfb6d1073585b046fe0a474ce868509 -# -# This file was generated by pip-compile-multi. -# To update, run: -# -# requirements upgrade -# -build==1.4.3 - # via -r wheels.in -packaging==26.1 - # via build -pyproject-hooks==1.2.0 - # via build diff --git a/packages/essspectroscopy/tox.ini b/packages/essspectroscopy/tox.ini deleted file mode 100644 index 505daf703..000000000 --- a/packages/essspectroscopy/tox.ini +++ /dev/null @@ -1,72 +0,0 @@ -[tox] -envlist = py311 -isolated_build = true - -[testenv] -deps = -r requirements/test.txt -setenv = - JUPYTER_PLATFORM_DIRS = 1 -commands = pytest {posargs} - -[testenv:nightly] -deps = -r requirements/nightly.txt -setenv = - PIP_INDEX_URL = https://pypi.anaconda.org/scipp-nightly-wheels/simple - PIP_EXTRA_INDEX_URL = https://pypi.org/simple -commands = pytest {posargs} - -[testenv:unpinned] -description = Test with unpinned dependencies, as a user would install now. -deps = - -r requirements/basetest.txt - essspectroscopy -commands = pytest {posargs} - -[testenv:docs] -description = invoke sphinx-build to build the HTML docs -deps = -r requirements/docs.txt -allowlist_externals=find -commands = python -m sphinx -j2 -v -b html -d {toxworkdir}/docs_doctrees docs html - python -m sphinx -j2 -v -b doctest -d {toxworkdir}/docs_doctrees docs html - find html -type f -name "*.ipynb" -not -path "html/_sources/*" -delete - -[testenv:releasedocs] -description = invoke sphinx-build to build the HTML docs from a released version -skip_install = true -deps = - essspectroscopy=={posargs} - {[testenv:docs]deps} -allowlist_externals={[testenv:docs]allowlist_externals} -commands = {[testenv:docs]commands} - -[testenv:linkcheck] -description = Run Sphinx linkcheck -deps = -r requirements/docs.txt -commands = python -m sphinx -j2 -v -b linkcheck -d {toxworkdir}/docs_doctrees docs html - -[testenv:static] -description = Code formatting and static analysis -skip_install = true -deps = -r requirements/static.txt -allowlist_externals = sh -# The first run of pre-commit may reformat files. If this happens, it returns 1 but this -# should not fail the job. So just run again if it fails. A second failure means that -# either the different formatters can't agree on a format or that static analysis failed. -commands = sh -c 'pre-commit run -a || (echo "" && pre-commit run -a)' - -[testenv:mypy] -description = Type checking (mypy) -deps = -r requirements/mypy.txt -commands = python -m mypy . - -[testenv:deps] -description = Update dependencies by running pip-compile-multi -deps = - pip-compile-multi - tomli - # Avoid https://github.com/jazzband/pip-tools/issues/2131 - pip==24.2 -skip_install = true -changedir = requirements -commands = python ./make_base.py --nightly scipp,scippneutron,sciline,plopp,scippnexus,essreduce - pip-compile-multi -d . --backtracking --annotate-index diff --git a/pixi.lock b/pixi.lock index 0064d48b6..4ba92200d 100644 --- a/pixi.lock +++ b/pixi.lock @@ -22,13 +22,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -41,41 +41,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -104,7 +104,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -113,92 +113,85 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/71/3b54e97c28cdf4993c8317d62ac1be655667455f129cf6162591d56aed89/ncrystal_core-4.3.4-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/55/41/591cd1e94254c20f00bb1f32c0b1a6de68c03d54e6daf78dd7b146d0b3fc/spglib-2.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl @@ -206,11 +199,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/25/58893afd4ef45f79e3d4db82742fa4ff874b936d67a83c92939053920ccd/cython-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl @@ -218,64 +211,72 @@ environments: - pypi: https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b2/69/0c95cfa1f331c6196b7bc7746188ba929a963d33ce333824a4c86dcf0880/bitshuffle-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/1b/dad6fdcc658ed7af26fdf3841e7394072c9549a8b896c381ab49dd11e2d9/jupyterlab-4.5.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/2c/3850985d4c64048dec7b826f8a803e135b52b11b4c81c9cd4326b1ca15ab/ncrystal_core-4.4.2-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essdiffraction - pypi: packages/essimaging - pypi: packages/essnmx - pypi: packages/essreduce - pypi: packages/essreflectometry - pypi: packages/esssans + - pypi: packages/essspectroscopy osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -290,37 +291,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda @@ -328,16 +329,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl @@ -345,59 +345,54 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/97/b11543f7ab0a02f15e233a7eb25b27dcefdfe06e942154e5207de01eabe2/ncrystal_core-4.3.4-py3-none-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/44/30888e2a5b2fa2e6df18606b442cb8b126b0bea5a2f1ec4a2a82538ffecf/spglib-2.6.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl @@ -405,6 +400,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl @@ -413,13 +409,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl @@ -430,45 +426,49 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d6/91/0cdf9e33be15c4437d2e5e00c43ec357deaab5bde911c3120927119aaac1/ncrystal_core-4.4.2-py3-none-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/1b/dad6fdcc658ed7af26fdf3841e7394072c9549a8b896c381ab49dd11e2d9/jupyterlab-4.5.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl @@ -476,22 +476,24 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essdiffraction - pypi: packages/essimaging - pypi: packages/essnmx - pypi: packages/essreduce - pypi: packages/essreflectometry - pypi: packages/esssans + - pypi: packages/essspectroscopy osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -506,37 +508,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda @@ -544,79 +546,74 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl @@ -626,87 +623,93 @@ environments: - pypi: https://files.pythonhosted.org/packages/85/cc/8f06145ec3efa121c8b1b67f06a640386ddacd77ee3e574da582a21b14ee/cython-3.2.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/0d/df49ae8af94215db241701f692786a2e85c3ac4557aafd829270c54fb1fa/ncrystal_core-4.3.4-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c7/ea/7988934c8e3e3418aa043f70421817df28d06aef50bfd85f5ad3ec6e70f1/ncrystal_core-4.4.2-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/1b/dad6fdcc658ed7af26fdf3841e7394072c9549a8b896c381ab49dd11e2d9/jupyterlab-4.5.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/ca/270d463f6c34f539bb55acdab14099c092d3be28c8af64d61399aa07610c/spglib-2.6.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essdiffraction - pypi: packages/essimaging - pypi: packages/essnmx - pypi: packages/essreduce - pypi: packages/essreflectometry - pypi: packages/esssans + - pypi: packages/essspectroscopy win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -724,30 +727,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda @@ -764,167 +767,168 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/25/a8/d89e1bde525baba10eb8d0be79a5bbaf56c59a47b32bb954866d96a228e3/spglib-2.6.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/c3/3e75075c7f71735f22b66fab0481f2c98e3a4d58cba55cb50ba29114bcf6/pywinpty-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ab/14/d708fb7c6bf7e7be586c625840cc078a45e64dd6bffe8d60a7b17a22b24e/ncrystal_core-4.3.4-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/6b/6c02f55c2ce2f137ccca0986be7dd89bea31d5bee4346b4377fa3b8586df/ncrystal_core-4.4.2-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/1b/dad6fdcc658ed7af26fdf3841e7394072c9549a8b896c381ab49dd11e2d9/jupyterlab-4.5.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essdiffraction - pypi: packages/essimaging - pypi: packages/essnmx - pypi: packages/essreduce - pypi: packages/essreflectometry - pypi: packages/esssans + - pypi: packages/essspectroscopy docs-essdiffraction: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -942,13 +946,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -961,41 +965,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -1025,7 +1029,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -1034,83 +1038,78 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0b/62/96459ef5b67957eac38a90f541d1c28833d1b367f014a482cb63f3b7cd2d/pyarrow-23.0.1-cp311-cp311-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/71/3b54e97c28cdf4993c8317d62ac1be655667455f129cf6162591d56aed89/ncrystal_core-4.3.4-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/55/41/591cd1e94254c20f00bb1f32c0b1a6de68c03d54e6daf78dd7b146d0b3fc/spglib-2.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -1118,73 +1117,78 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/2c/3850985d4c64048dec7b826f8a803e135b52b11b4c81c9cd4326b1ca15ab/ncrystal_core-4.4.2-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f3/27/99c42abe8e21b44f4917f62631f3aa31404882a2c41d8a4cd5c110e13d52/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essdiffraction - pypi: packages/essreduce osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -1199,37 +1203,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda @@ -1238,81 +1242,77 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/97/b11543f7ab0a02f15e233a7eb25b27dcefdfe06e942154e5207de01eabe2/ncrystal_core-4.3.4-py3-none-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/44/30888e2a5b2fa2e6df18606b442cb8b126b0bea5a2f1ec4a2a82538ffecf/spglib-2.6.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl @@ -1325,12 +1325,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl @@ -1338,58 +1336,64 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/bf/4a/1472c00392f521fea03ae93408bf445cc7bfa1ab81683faf9bc188e36629/pyarrow-23.0.1-cp311-cp311-macosx_12_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/bc/8db86617a9a58008acf8913d6fed68ea2a46acb6de928db28d724c891a68/pyarrow-24.0.0-cp311-cp311-macosx_12_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d6/91/0cdf9e33be15c4437d2e5e00c43ec357deaab5bde911c3120927119aaac1/ncrystal_core-4.4.2-py3-none-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essdiffraction - pypi: packages/essreduce osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -1404,37 +1408,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -1443,157 +1447,157 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/c9/a47ab7ece0d86cbe6678418a0fbd1ac4bb493b9184a3891dfa0e7f287ae0/pyarrow-24.0.0-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/0d/df49ae8af94215db241701f692786a2e85c3ac4557aafd829270c54fb1fa/ncrystal_core-4.3.4-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b0/41/8e6b6ef7e225d4ceead8459427a52afdc23379768f54dd3566014d7618c1/pyarrow-23.0.1-cp311-cp311-macosx_12_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c7/ea/7988934c8e3e3418aa043f70421817df28d06aef50bfd85f5ad3ec6e70f1/ncrystal_core-4.4.2-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/ca/270d463f6c34f539bb55acdab14099c092d3be28c8af64d61399aa07610c/spglib-2.6.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essdiffraction - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -1611,30 +1615,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda @@ -1652,81 +1656,74 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/ca/db94101c187f3df742133ac837e93b1f269ebdac49427f8310ee40b6a58f/pyarrow-23.0.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/25/a8/d89e1bde525baba10eb8d0be79a5bbaf56c59a47b32bb954866d96a228e3/spglib-2.6.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl @@ -1736,57 +1733,62 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ab/14/d708fb7c6bf7e7be586c625840cc078a45e64dd6bffe8d60a7b17a22b24e/ncrystal_core-4.3.4-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/6b/6c02f55c2ce2f137ccca0986be7dd89bea31d5bee4346b4377fa3b8586df/ncrystal_core-4.4.2-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl @@ -1794,13 +1796,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f8/d2/4d1bbba65320b21a49678d6fbdc6ff7c649251359fdcfc03568c4136231d/pyarrow-24.0.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essdiffraction - pypi: packages/essreduce docs-essimaging: @@ -1820,13 +1824,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -1839,41 +1843,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -1903,7 +1907,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -1912,76 +1916,74 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -1989,72 +1991,74 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essimaging - pypi: packages/essreduce osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -2069,37 +2073,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda @@ -2108,76 +2112,74 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl @@ -2189,10 +2191,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl @@ -2202,56 +2203,59 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essimaging - pypi: packages/essreduce osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -2266,37 +2270,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -2305,93 +2309,89 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl @@ -2400,54 +2400,58 @@ environments: - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essimaging - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -2465,30 +2469,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda @@ -2506,76 +2510,71 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl @@ -2585,54 +2584,59 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl @@ -2640,13 +2644,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essimaging - pypi: packages/essreduce docs-essnmx: @@ -2666,13 +2670,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -2685,41 +2689,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -2749,7 +2753,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -2758,45 +2762,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl @@ -2804,28 +2804,30 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -2833,75 +2835,77 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/25/58893afd4ef45f79e3d4db82742fa4ff874b936d67a83c92939053920ccd/cython-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b2/69/0c95cfa1f331c6196b7bc7746188ba929a963d33ce333824a4c86dcf0880/bitshuffle-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essnmx - pypi: packages/essreduce osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -2916,37 +2920,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda @@ -2955,76 +2959,74 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl @@ -3037,10 +3039,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl @@ -3050,56 +3051,59 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essnmx - pypi: packages/essreduce osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -3114,37 +3118,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -3153,75 +3157,72 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl @@ -3230,17 +3231,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/85/cc/8f06145ec3efa121c8b1b67f06a640386ddacd77ee3e574da582a21b14ee/cython-3.2.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl @@ -3249,54 +3249,58 @@ environments: - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essnmx - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -3314,30 +3318,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda @@ -3355,74 +3359,69 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl @@ -3432,54 +3431,59 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl @@ -3487,13 +3491,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essnmx - pypi: packages/essreduce docs-essreduce: @@ -3513,13 +3517,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -3532,41 +3536,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -3596,7 +3600,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -3605,141 +3609,141 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -3754,37 +3758,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda @@ -3793,73 +3797,71 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl @@ -3870,10 +3872,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl @@ -3882,53 +3883,56 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -3943,37 +3947,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -3982,89 +3986,85 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl @@ -4072,51 +4072,55 @@ environments: - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -4134,30 +4138,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda @@ -4175,73 +4179,68 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl @@ -4250,65 +4249,70 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce docs-essreflectometry: channels: @@ -4327,13 +4331,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -4346,41 +4350,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -4410,7 +4414,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -4419,155 +4423,156 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/28/19843833ad088cd433350ecce75e1c98bb283e8d52d52a472946bcca6719/bqscales-0.3.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/7a/7e3b845352b3db21d2ad8cd8685fc98b29721d185a1e392baede38f9b6a5/bqplot-0.12.30-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/33/f1c6a276de27b7d7339a34749cc33fa87f077f921969c47185d34a887ae2/gast-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/9e/bb60e40f1414884cf0408c975f75cf81935c00f52f0156e039ccd4b69ee3/py2vega-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/b1/e00f9b7367f7966457a2c3405263cbf0178a0fd217b9c75dc26cd9d92ad5/py2vega-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/21/8b81f5368120ff44b11dcdf2517fc0c2cbefda61893c4f9049c2ee838c98/ipydatagrid-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/48/583c032b79ae5b3daa02225a675aeb673e58d2cb698e78510feceb11958c/gast-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/7e/7a5ffa173dd1cffde4f6f41a7dcc8ef4cefdd3bb9cc6cab8341a4802b686/bqplot-0.13.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/03/35cf1742598d784e96153175233318a2332f71863e55ad1007c9264c1a7a/ipytree-0.2.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - pypi: packages/essreflectometry osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -4582,37 +4587,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda @@ -4621,83 +4626,82 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/28/19843833ad088cd433350ecce75e1c98bb283e8d52d52a472946bcca6719/bqscales-0.3.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/7a/7e3b845352b3db21d2ad8cd8685fc98b29721d185a1e392baede38f9b6a5/bqplot-0.12.30-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/33/f1c6a276de27b7d7339a34749cc33fa87f077f921969c47185d34a887ae2/gast-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/9e/bb60e40f1414884cf0408c975f75cf81935c00f52f0156e039ccd4b69ee3/py2vega-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl @@ -4705,12 +4709,11 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/b1/e00f9b7367f7966457a2c3405263cbf0178a0fd217b9c75dc26cd9d92ad5/py2vega-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl @@ -4719,58 +4722,61 @@ environments: - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/21/8b81f5368120ff44b11dcdf2517fc0c2cbefda61893c4f9049c2ee838c98/ipydatagrid-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/48/583c032b79ae5b3daa02225a675aeb673e58d2cb698e78510feceb11958c/gast-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/7e/7a5ffa173dd1cffde4f6f41a7dcc8ef4cefdd3bb9cc6cab8341a4802b686/bqplot-0.13.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/03/35cf1742598d784e96153175233318a2332f71863e55ad1007c9264c1a7a/ipytree-0.2.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - pypi: packages/essreflectometry osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -4785,37 +4791,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -4824,98 +4830,95 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/28/19843833ad088cd433350ecce75e1c98bb283e8d52d52a472946bcca6719/bqscales-0.3.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/7a/7e3b845352b3db21d2ad8cd8685fc98b29721d185a1e392baede38f9b6a5/bqplot-0.12.30-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/33/f1c6a276de27b7d7339a34749cc33fa87f077f921969c47185d34a887ae2/gast-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/9e/bb60e40f1414884cf0408c975f75cf81935c00f52f0156e039ccd4b69ee3/py2vega-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/b1/e00f9b7367f7966457a2c3405263cbf0178a0fd217b9c75dc26cd9d92ad5/py2vega-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl @@ -4923,56 +4926,60 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/21/8b81f5368120ff44b11dcdf2517fc0c2cbefda61893c4f9049c2ee838c98/ipydatagrid-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/48/583c032b79ae5b3daa02225a675aeb673e58d2cb698e78510feceb11958c/gast-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/7e/7a5ffa173dd1cffde4f6f41a7dcc8ef4cefdd3bb9cc6cab8341a4802b686/bqplot-0.13.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/03/35cf1742598d784e96153175233318a2332f71863e55ad1007c9264c1a7a/ipytree-0.2.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - pypi: packages/essreflectometry win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -4990,30 +4997,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda @@ -5031,153 +5038,154 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/11/28/19843833ad088cd433350ecce75e1c98bb283e8d52d52a472946bcca6719/bqscales-0.3.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/20/7a/7e3b845352b3db21d2ad8cd8685fc98b29721d185a1e392baede38f9b6a5/bqplot-0.12.30-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/33/f1c6a276de27b7d7339a34749cc33fa87f077f921969c47185d34a887ae2/gast-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/9e/bb60e40f1414884cf0408c975f75cf81935c00f52f0156e039ccd4b69ee3/py2vega-0.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/b1/e00f9b7367f7966457a2c3405263cbf0178a0fd217b9c75dc26cd9d92ad5/py2vega-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/21/8b81f5368120ff44b11dcdf2517fc0c2cbefda61893c4f9049c2ee838c98/ipydatagrid-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/48/583c032b79ae5b3daa02225a675aeb673e58d2cb698e78510feceb11958c/gast-0.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/7e/7a5ffa173dd1cffde4f6f41a7dcc8ef4cefdd3bb9cc6cab8341a4802b686/bqplot-0.13.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/03/35cf1742598d784e96153175233318a2332f71863e55ad1007c9264c1a7a/ipytree-0.2.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - pypi: packages/essreflectometry docs-esssans: @@ -5197,13 +5205,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -5216,41 +5224,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -5280,7 +5288,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -5289,74 +5297,72 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -5364,71 +5370,73 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - pypi: packages/esssans osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -5443,37 +5451,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda @@ -5482,74 +5490,72 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl @@ -5561,10 +5567,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl @@ -5573,56 +5578,59 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - pypi: packages/esssans osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -5637,37 +5645,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -5676,91 +5684,87 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl @@ -5768,54 +5772,58 @@ environments: - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - pypi: packages/esssans win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -5833,30 +5841,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda @@ -5874,74 +5882,69 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl @@ -5951,53 +5954,58 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl @@ -6005,16 +6013,16 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - pypi: packages/esssans - essdiffraction: + docs-essspectroscopy: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -6031,13 +6039,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -6050,41 +6058,42 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -6113,7 +6122,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -6122,93 +6131,143 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/71/3b54e97c28cdf4993c8317d62ac1be655667455f129cf6162591d56aed89/ncrystal_core-4.3.4-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/41/591cd1e94254c20f00bb1f32c0b1a6de68c03d54e6daf78dd7b146d0b3fc/spglib-2.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essdiffraction + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/essspectroscopy osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -6223,37 +6282,38 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda @@ -6261,93 +6321,144 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/97/b11543f7ab0a02f15e233a7eb25b27dcefdfe06e942154e5207de01eabe2/ncrystal_core-4.3.4-py3-none-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/44/30888e2a5b2fa2e6df18606b442cb8b126b0bea5a2f1ec4a2a82538ffecf/spglib-2.6.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: packages/essdiffraction + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/essspectroscopy osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -6362,37 +6473,38 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda @@ -6400,92 +6512,143 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/0d/df49ae8af94215db241701f692786a2e85c3ac4557aafd829270c54fb1fa/ncrystal_core-4.3.4-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f6/ca/270d463f6c34f539bb55acdab14099c092d3be28c8af64d61399aa07610c/spglib-2.6.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl - - pypi: packages/essdiffraction + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/essspectroscopy win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -6503,30 +6666,31 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda @@ -6543,94 +6707,144 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/25/a8/d89e1bde525baba10eb8d0be79a5bbaf56c59a47b32bb954866d96a228e3/spglib-2.6.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ab/14/d708fb7c6bf7e7be586c625840cc078a45e64dd6bffe8d60a7b17a22b24e/ncrystal_core-4.3.4-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essdiffraction + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - essimaging: + - pypi: packages/essspectroscopy + essdiffraction: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -6647,13 +6861,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -6666,41 +6880,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -6729,7 +6943,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -6738,95 +6952,94 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/41/591cd1e94254c20f00bb1f32c0b1a6de68c03d54e6daf78dd7b146d0b3fc/spglib-2.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/2c/3850985d4c64048dec7b826f8a803e135b52b11b4c81c9cd4326b1ca15ab/ncrystal_core-4.4.2-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essimaging + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essdiffraction - pypi: packages/essreduce osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -6841,37 +7054,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda @@ -6879,48 +7092,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/44/30888e2a5b2fa2e6df18606b442cb8b126b0bea5a2f1ec4a2a82538ffecf/spglib-2.6.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -6928,46 +7134,52 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d6/91/0cdf9e33be15c4437d2e5e00c43ec357deaab5bde911c3120927119aaac1/ncrystal_core-4.4.2-py3-none-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: packages/essimaging + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essdiffraction - pypi: packages/essreduce osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -6982,37 +7194,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda @@ -7020,94 +7232,93 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c7/ea/7988934c8e3e3418aa043f70421817df28d06aef50bfd85f5ad3ec6e70f1/ncrystal_core-4.4.2-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/ca/270d463f6c34f539bb55acdab14099c092d3be28c8af64d61399aa07610c/spglib-2.6.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl - - pypi: packages/essimaging + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essdiffraction - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -7125,30 +7336,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda @@ -7165,48 +7376,38 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/25/a8/d89e1bde525baba10eb8d0be79a5bbaf56c59a47b32bb954866d96a228e3/spglib-2.6.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl @@ -7214,47 +7415,56 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/6b/6c02f55c2ce2f137ccca0986be7dd89bea31d5bee4346b4377fa3b8586df/ncrystal_core-4.4.2-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essimaging + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essdiffraction - pypi: packages/essreduce - essnmx: + essimaging: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -7271,13 +7481,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -7290,41 +7500,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -7353,7 +7563,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -7362,90 +7572,96 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ac/25/58893afd4ef45f79e3d4db82742fa4ff874b936d67a83c92939053920ccd/cython-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/69/0c95cfa1f331c6196b7bc7746188ba929a963d33ce333824a4c86dcf0880/bitshuffle-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essnmx + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essimaging - pypi: packages/essreduce osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -7460,37 +7676,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda @@ -7498,90 +7714,96 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: packages/essnmx + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essimaging - pypi: packages/essreduce osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -7596,37 +7818,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda @@ -7634,89 +7856,95 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/cc/8f06145ec3efa121c8b1b67f06a640386ddacd77ee3e574da582a21b14ee/cython-3.2.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl - - pypi: packages/essnmx + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essimaging - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -7734,30 +7962,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda @@ -7774,88 +8002,97 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essnmx + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essimaging - pypi: packages/essreduce - essreduce: + essnmx: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -7872,13 +8109,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -7891,41 +8128,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -7954,7 +8191,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -7963,83 +8200,91 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ac/25/58893afd4ef45f79e3d4db82742fa4ff874b936d67a83c92939053920ccd/cython-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/69/0c95cfa1f331c6196b7bc7746188ba929a963d33ce333824a4c86dcf0880/bitshuffle-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essnmx - pypi: packages/essreduce osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -8054,37 +8299,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda @@ -8092,83 +8337,91 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essnmx - pypi: packages/essreduce osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -8183,37 +8436,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda @@ -8221,82 +8474,90 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/cc/8f06145ec3efa121c8b1b67f06a640386ddacd77ee3e574da582a21b14ee/cython-3.2.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essnmx - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -8314,30 +8575,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda @@ -8354,84 +8615,89 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essnmx - pypi: packages/essreduce - essreflectometry: + essreduce: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -8448,13 +8714,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -8467,41 +8733,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -8530,7 +8796,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -8539,86 +8805,84 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/essreflectometry osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -8633,37 +8897,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda @@ -8671,86 +8935,84 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/essreflectometry osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -8765,37 +9027,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda @@ -8803,85 +9065,83 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/essreflectometry win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -8899,30 +9159,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda @@ -8939,87 +9199,85 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/essreflectometry - esssans: + essreflectometry: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -9036,13 +9294,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -9055,41 +9313,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -9118,7 +9376,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -9127,88 +9385,87 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/esssans + - pypi: packages/essreflectometry osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -9223,37 +9480,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda @@ -9261,88 +9518,87 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/esssans + - pypi: packages/essreflectometry osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -9357,37 +9613,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda @@ -9395,87 +9651,86 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/esssans + - pypi: packages/essreflectometry win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -9493,30 +9748,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda @@ -9533,89 +9788,88 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/esssans - lb-essdiffraction: + - pypi: packages/essreflectometry + esssans: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -9623,169 +9877,274 @@ environments: packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0b/71/3b54e97c28cdf4993c8317d62ac1be655667455f129cf6162591d56aed89/ncrystal_core-4.3.4-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/41/591cd1e94254c20f00bb1f32c0b1a6de68c03d54e6daf78dd7b146d0b3fc/spglib-2.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essdiffraction + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/esssans osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h4bec284_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cairo-1.18.4-h7656bdc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/97/b11543f7ab0a02f15e233a7eb25b27dcefdfe06e942154e5207de01eabe2/ncrystal_core-4.3.4-py3-none-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/44/30888e2a5b2fa2e6df18606b442cb8b126b0bea5a2f1ec4a2a82538ffecf/spglib-2.6.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -9793,245 +10152,324 @@ environments: - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: packages/essdiffraction + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/esssans osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/0d/df49ae8af94215db241701f692786a2e85c3ac4557aafd829270c54fb1fa/ncrystal_core-4.3.4-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f6/ca/270d463f6c34f539bb55acdab14099c092d3be28c8af64d61399aa07610c/spglib-2.6.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl - - pypi: packages/essdiffraction + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/esssans win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.2-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.6-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.13-hfa52320_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/25/a8/d89e1bde525baba10eb8d0be79a5bbaf56c59a47b32bb954866d96a228e3/spglib-2.6.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ab/14/d708fb7c6bf7e7be586c625840cc078a45e64dd6bffe8d60a7b17a22b24e/ncrystal_core-4.3.4-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essdiffraction + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - lb-essimaging: + - pypi: packages/esssans + essspectroscopy: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -10039,423 +10477,583 @@ environments: packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essimaging + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/essspectroscopy osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h4bec284_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cairo-1.18.4-h7656bdc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/epoxy-1.5.10-h8616949_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.17.1-h7a4440b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.16-h8616949_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-14.1.2-h44fc223_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk3-3.24.52-hf2d442a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-hb2c11ec_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.4-hf280016_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.46.4-ha059160_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: packages/essimaging + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/essspectroscopy osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl - - pypi: packages/essimaging + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce + - pypi: packages/essspectroscopy win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.2-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.6-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.13-hfa52320_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essimaging + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - lb-essnmx: + - pypi: packages/essspectroscopy + lb-essdiffraction: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -10464,399 +11062,416 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/41/591cd1e94254c20f00bb1f32c0b1a6de68c03d54e6daf78dd7b146d0b3fc/spglib-2.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ac/25/58893afd4ef45f79e3d4db82742fa4ff874b936d67a83c92939053920ccd/cython-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/69/0c95cfa1f331c6196b7bc7746188ba929a963d33ce333824a4c86dcf0880/bitshuffle-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/2c/3850985d4c64048dec7b826f8a803e135b52b11b4c81c9cd4326b1ca15ab/ncrystal_core-4.4.2-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essnmx + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essdiffraction - pypi: packages/essreduce osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/44/30888e2a5b2fa2e6df18606b442cb8b126b0bea5a2f1ec4a2a82538ffecf/spglib-2.6.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d6/91/0cdf9e33be15c4437d2e5e00c43ec357deaab5bde911c3120927119aaac1/ncrystal_core-4.4.2-py3-none-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: packages/essnmx + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essdiffraction - pypi: packages/essreduce osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/cc/8f06145ec3efa121c8b1b67f06a640386ddacd77ee3e574da582a21b14ee/cython-3.2.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c7/ea/7988934c8e3e3418aa043f70421817df28d06aef50bfd85f5ad3ec6e70f1/ncrystal_core-4.4.2-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/ca/270d463f6c34f539bb55acdab14099c092d3be28c8af64d61399aa07610c/spglib-2.6.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl - - pypi: packages/essnmx + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essdiffraction - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/25/a8/d89e1bde525baba10eb8d0be79a5bbaf56c59a47b32bb954866d96a228e3/spglib-2.6.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/25/4f103d1bedb3593718713b3f743df7b3ff3fc68d36d6666c30265ef59c8a/ase-3.28.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/6b/6c02f55c2ce2f137ccca0986be7dd89bea31d5bee4346b4377fa3b8586df/ncrystal_core-4.4.2-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: packages/essnmx + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essdiffraction - pypi: packages/essreduce - lb-essreduce: + lb-essimaging: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -10865,374 +11480,424 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essimaging - pypi: packages/essreduce osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essimaging - pypi: packages/essreduce osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essimaging - pypi: packages/essreduce win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essimaging - pypi: packages/essreduce - lb-essreflectometry: + lb-essnmx: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -11241,156 +11906,161 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ac/25/58893afd4ef45f79e3d4db82742fa4ff874b936d67a83c92939053920ccd/cython-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/69/0c95cfa1f331c6196b7bc7746188ba929a963d33ce333824a4c86dcf0880/bitshuffle-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essnmx - pypi: packages/essreduce - - pypi: packages/essreflectometry osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl @@ -11398,184 +12068,187 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essnmx - pypi: packages/essreduce - - pypi: packages/essreflectometry osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/cc/8f06145ec3efa121c8b1b67f06a640386ddacd77ee3e574da582a21b14ee/cython-3.2.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essnmx - pypi: packages/essreduce - - pypi: packages/essreflectometry win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl @@ -11583,44 +12256,51 @@ environments: - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essnmx - pypi: packages/essreduce - - pypi: packages/essreflectometry - lb-esssans: + lb-essreduce: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -11629,394 +12309,376 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/esssans osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/esssans osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/esssans win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl - pypi: packages/essreduce - - pypi: packages/esssans - lint: + lb-essreflectometry: channels: - url: https://conda.anaconda.org/conda-forge/ indexes: @@ -12025,137 +12687,1305 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c2/3c/2005227cb951df502412de2fa781f800663cccbef8d90ec6f1b371ac2c0d/python_discovery-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/essreflectometry osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/3c/2005227cb951df502412de2fa781f800663cccbef8d90ec6f1b371ac2c0d/python_discovery-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/essreflectometry osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c2/3c/2005227cb951df502412de2fa781f800663cccbef8d90ec6f1b371ac2c0d/python_discovery-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/essreflectometry win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - pypi: https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/3c/2005227cb951df502412de2fa781f800663cccbef8d90ec6f1b371ac2c0d/python_discovery-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - build_number: 20 - sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 - md5: a9f577daf3de00bca7c3c76c0ecbd1de - depends: - - __glibc >=2.17,<3.0.a0 - - libgomp >=7.5.0 - constrains: - - openmp_impl <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 28948 - timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 - sha256: 26ab9386e80bf196e51ebe005da77d57decf6d989b4f34d96130560bc133479c - md5: 6b889f174df1e0f816276ae69281af4d - depends: - - at-spi2-core >=2.40.0,<2.41.0a0 + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/35/8c474ee933bd8c91e21db09a032dba2f54072b6225db0449bf9759789e1c/esspolarization-25.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/essreflectometry + lb-esssans: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/esssans + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/esssans + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/esssans + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/88c0ef22878c86035f058df0ac6c171319ffd0aa52a406455ed3a3847566/ipympl-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/esssans + lb-essspectroscopy: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/essspectroscopy + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + - pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/essspectroscopy + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/essspectroscopy + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: packages/essreduce + - pypi: packages/essspectroscopy + lint: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - pypi: https://files.pythonhosted.org/packages/30/d4/24d543ab8b8158b7f5a97113c831205f5c900c92c8762b1e7f44b7ea0405/python_discovery-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/4f/f71e641e504111a5a74e3a20bc52d01bd86788b22699dd3fee1c63253cf6/virtualenv-21.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.15-ha9537fe_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + - pypi: https://files.pythonhosted.org/packages/30/d4/24d543ab8b8158b7f5a97113c831205f5c900c92c8762b1e7f44b7ea0405/python_discovery-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b1/4f/f71e641e504111a5a74e3a20bc52d01bd86788b22699dd3fee1c63253cf6/virtualenv-21.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.15-h8561d8f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/30/d4/24d543ab8b8158b7f5a97113c831205f5c900c92c8762b1e7f44b7ea0405/python_discovery-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b1/4f/f71e641e504111a5a74e3a20bc52d01bd86788b22699dd3fee1c63253cf6/virtualenv-21.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.15-h0159041_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - pypi: https://files.pythonhosted.org/packages/30/d4/24d543ab8b8158b7f5a97113c831205f5c900c92c8762b1e7f44b7ea0405/python_discovery-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/4f/f71e641e504111a5a74e3a20bc52d01bd86788b22699dd3fee1c63253cf6/virtualenv-21.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 + md5: a9f577daf3de00bca7c3c76c0ecbd1de + depends: + - __glibc >=2.17,<3.0.a0 + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 28948 + timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + sha256: 26ab9386e80bf196e51ebe005da77d57decf6d989b4f34d96130560bc133479c + md5: 6b889f174df1e0f816276ae69281af4d + depends: + - at-spi2-core >=2.40.0,<2.41.0a0 - atk-1.0 >=2.36.0 - dbus >=1.13.6,<2.0a0 - libgcc-ng >=9.3.0 @@ -12295,34 +14125,34 @@ packages: purls: [] size: 61244 timestamp: 1757438574066 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - sha256: b2a6fb56b8f2d576a3ae5e6c57b2dbab91d52d1f1658bf1b258747ae25bb9fde - md5: 7eb4977dd6f60b3aaab0715a0ea76f11 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + sha256: c5594497f0646e9079705b3199dbb2d5b13c48173cf110000fa1c8818e2b3e0c + md5: 7892f39a39ed39591a89a28eba03e987 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - liblzma >=5.8.2,<6.0a0 - - libpng >=1.6.55,<1.7.0a0 + - libpng >=1.6.56,<1.7.0a0 - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 575109 - timestamp: 1771530561157 -- conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda - sha256: 441586fc577c5a3f2ad7bf83578eb135dac94fb0cb75cc4da35f8abb5823b857 - md5: b52b769cd13f7adaa6ccdc68ef801709 + size: 577414 + timestamp: 1774985848058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.1-hcfc306f_1.conda + sha256: 628015696c106665ae0043f7e9f51298ec9e8f11573734ad67a849c8279cbe33 + md5: ff216b19c24f3a46e9d17ebcf2f96390 depends: - - __glibc >=2.17,<3.0.a0 + - libglib ==2.88.1 h0d30a3d_1 - libffi - libgcc >=14 - - libglib 2.86.4 h6548e54_1 + - __glibc >=2.17,<3.0.a0 license: LGPL-2.1-or-later purls: [] - size: 214712 - timestamp: 1771863307416 + size: 237141 + timestamp: 1777904907738 - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c md5: 2cd94587f3a401ae05e03a6caf09539d @@ -12415,17 +14245,17 @@ packages: purls: [] size: 318312 timestamp: 1686545244763 -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda - sha256: 477f2c553f72165020d3c56740ba354be916c2f0b76fd9f535e83d698277d5ec - md5: 14470902326beee192e33719a2e8bb7f +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + sha256: 232c95b56d16d33d8256026a3b1ad34f7f9a75c179d388854be0fd624ddba9e3 + md5: e194f6a2f498f0c7b1e6498bd0b12645 depends: - __glibc >=2.17,<3.0.a0 - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - icu >=78.3,<79.0a0 - - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.2 - - libfreetype6 >=2.14.2 + - libexpat >=2.7.5,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - libstdcxx >=14 @@ -12433,8 +14263,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 2384060 - timestamp: 1774276284520 + size: 2333599 + timestamp: 1776778392713 - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda sha256: 6d7e6e1286cb521059fe69696705100a03b006efb914ffe82a2ae97ecbae66b7 md5: 129e404c5b001f3ef5581316971e3ea0 @@ -12578,19 +14408,19 @@ packages: purls: [] size: 30380 timestamp: 1731331017249 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 - md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12 + md5: a3b390520c563d78cc58974de95a03e5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.7.4.* + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 76798 - timestamp: 1771259418166 + size: 77241 + timestamp: 1777846112704 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -12625,30 +14455,30 @@ packages: purls: [] size: 384575 timestamp: 1774298162622 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 - md5: 0aa00f03f9e39fb9876085dee11a85d4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 + md5: 57736f29cc2b0ec0b6c2952d3f101b6a depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 he0feb66_18 + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 he0feb66_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 1041788 - timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 - md5: d5e96b1ed75ca01906b3d2469b4ce493 + size: 1041084 + timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 + md5: 331ee9b72b9dff570d56b1302c5ab37d depends: - - libgcc 15.2.0 he0feb66_18 + - libgcc 15.2.0 he0feb66_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27526 - timestamp: 1771378224552 + size: 27694 + timestamp: 1778269016987 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda sha256: 245be793e831170504f36213134f4c24eedaf39e634679809fd5391ad214480b md5: 88c1c66987cd52a712eea89c27104be6 @@ -12693,22 +14523,22 @@ packages: purls: [] size: 113911 timestamp: 1731331012126 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce - md5: bb26456332b07f68bf3b7622ed71c0da +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_1.conda + sha256: a0899efbae2a6a9102c796c0b11ac371a3190da5afa28512eeb2879c65d1419c + md5: 6016ea5ee9e986bc683879408cc87529 depends: - __glibc >=2.17,<3.0.a0 - - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.47,<10.48.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - glib 2.86.4 *_1 + - glib >2.66 license: LGPL-2.1-or-later purls: [] - size: 4398701 - timestamp: 1771863239578 + size: 4754370 + timestamp: 1777904907738 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 md5: 434ca7e50e40f4918ab701e3facd59a0 @@ -12741,16 +14571,16 @@ packages: purls: [] size: 26388 timestamp: 1731331003255 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 - md5: 239c5e9546c38a1e884d69effcf4c882 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b + md5: faac990cb7aedc7f3a2224f2c9b0c26c depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 603262 - timestamp: 1771378117851 + size: 603817 + timestamp: 1778268942614 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -12761,9 +14591,9 @@ packages: purls: [] size: 790176 timestamp: 1754908768807 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 - md5: 8397539e3a0bbd1695584fb4f927485a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 + md5: 6178c6f2fb254558238ef4e6c56fb782 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -12771,20 +14601,20 @@ packages: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib purls: [] - size: 633710 - timestamp: 1762094827865 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb - md5: c7c83eecbb72d88b940c249af56c8b17 + size: 633831 + timestamp: 1775962768273 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d + md5: b88d90cad08e6bc8ad540cb310a761fb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD purls: [] - size: 113207 - timestamp: 1768752626120 + size: 113478 + timestamp: 1775825492909 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 md5: d864d34357c3b65a4b731f78c0801dc4 @@ -12807,17 +14637,17 @@ packages: purls: [] size: 28424 timestamp: 1749901812541 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda - sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c - md5: 5f13ffc7d30ffec87864e678df9957b4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 + md5: eba48a68a1a2b9d3c0d9511548db85db depends: - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement purls: [] - size: 317669 - timestamp: 1770691470744 + size: 317729 + timestamp: 1776315175087 - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda sha256: dc4698b32b2ca3fc0715d7d307476a71622bee0f2f708f9dadec8af21e1047c8 md5: a4b87f1fbcdbb8ad32e99c2611120f2e @@ -12838,41 +14668,40 @@ packages: purls: [] size: 3474421 timestamp: 1773814909137 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 - md5: fd893f6a3002a635b5e50ceb9dd2c0f4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d + md5: 7dc38adcbf71e6b38748e919e16e0dce depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing purls: [] - size: 951405 - timestamp: 1772818874251 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e - md5: 1b08cd684f34175e4514474793d44bcb + size: 954962 + timestamp: 1777986471789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc + md5: 5794b3bdc38177caf969dabd3af08549 depends: - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_18 + - libgcc 15.2.0 he0feb66_19 constrains: - - libstdcxx-ng ==15.2.0=*_18 + - libstdcxx-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 5852330 - timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145 - md5: 6235adb93d064ecdf3d44faee6f468de + size: 5852044 + timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + sha256: 0672b6b6e1791c92e8eccad58081a99d614fcf82bca5841f9dfa3c3e658f83b9 + md5: e5ce228e579726c07255dbf90dc62101 depends: - - libstdcxx 15.2.0 h934c35e_18 + - libstdcxx 15.2.0 h934c35e_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27575 - timestamp: 1771378314494 + size: 27776 + timestamp: 1778269074600 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 md5: cd5a90476766d53e901500df9215e927 @@ -12891,17 +14720,17 @@ packages: purls: [] size: 435273 timestamp: 1762022005702 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee - md5: db409b7c1720428638e7c0d509d3e1b5 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 + md5: 38ffe67b78c9d4de527be8315e5ada2c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 40311 - timestamp: 1766271528534 + size: 40297 + timestamp: 1775052476770 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b md5: aea31d2e5b1091feca96fcfe945c3cf9 @@ -12955,39 +14784,39 @@ packages: purls: [] size: 837922 timestamp: 1764794163823 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - sha256: 08d2b34b49bec9613784f868209bb7c3bb8840d6cf835ff692e036b09745188c - md5: f3bc152cb4f86babe30f3a4bf0dbef69 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + sha256: 3d44f737c5ae52d5af32682cc1530df433f401f8e58a7533926536244127572a + md5: e79d2c2f24b027aa8d5ab1b1ba3061e7 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - libxml2 2.15.2 + - libxml2 2.15.3 license: MIT license_family: MIT purls: [] - size: 557492 - timestamp: 1772704601644 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda - sha256: 275c324f87bda1a3b67d2f4fcc3555eeff9e228a37655aa001284a7ceb6b0392 - md5: e49238a1609f9a4a844b09d9926f2c3d + size: 559775 + timestamp: 1776376739004 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + sha256: 3bc5551720c58591f6ea1146f7d1539c734ed1c40e7b9f5cb8cb7e900c509aba + md5: 995d8c8bad2a3cc8db14675a153dec2b depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libxml2-16 2.15.2 hca6bf5a_0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 hca6bf5a_0 + - libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT purls: [] - size: 45968 - timestamp: 1772704614539 + size: 46810 + timestamp: 1776376751152 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 md5: d87ff7921124eccd67248aa483c23fec @@ -13000,19 +14829,19 @@ packages: purls: [] size: 63629 timestamp: 1774072609062 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 - md5: 47e340acb35de30501a76c7c799c41d7 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 + md5: fc21868a1a5aacc937e7a18747acb8a5 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 license: X11 AND BSD-3-Clause purls: [] - size: 891641 - timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c - md5: f61eb8cd60ff9057122a3d338b99c00f + size: 918956 + timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb + md5: da1b85b6a87e141f5140bb9924cecab0 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates @@ -13020,8 +14849,8 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 3164551 - timestamp: 1769555830639 + size: 3167099 + timestamp: 1775587756857 - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda sha256: d46f76ed09396e3bd1dc11030b3d0d222c25ba8d92f3cde08bc6fbd1eec4f9e0 md5: de8ccf9ffba55bd20ee56301cfc7e6db @@ -13405,24 +15234,24 @@ packages: purls: [] size: 631452 timestamp: 1758743294412 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - sha256: 37950019c59b99585cee5d30dbc2cc9696ed4e11f5742606a4db1621ed8f94d6 - md5: f001e6e220355b7f87403a4d0e5bf1ca +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-h4c7d964_0.conda + sha256: 6f4ff81534c19e76acf52fcabf4a258088a932b8f1ac56e9a59e98f6051f8e46 + md5: 56fb2c6c73efc627b40c77d14caecfba depends: - __win license: ISC purls: [] - size: 147734 - timestamp: 1772006322223 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc - md5: 4492fd26db29495f0ba23f146cd5638d + size: 131388 + timestamp: 1776865633471 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d + md5: e18ad67cf881dcadee8b8d9e2f8e5f73 depends: - __unix license: ISC purls: [] - size: 147413 - timestamp: 1772006283803 + size: 131039 + timestamp: 1776865545798 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b md5: 0c96522c6bdaed4b1566d11387caaf45 @@ -13575,34 +15404,34 @@ packages: purls: [] size: 60923 timestamp: 1757438791418 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.5-hae309b2_1.conda - sha256: 594bc16f8e92ca10b106eb80f2b9f5be9b2d86ffef12f2c9b26686bb669626ae - md5: cde2fa97a1a466df37e78d071efb8579 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.44.6-hae309b2_0.conda + sha256: 27a223201fd86f85284c7e218121ac9ecf0be16e0a73eea42776701c8c90c50b + md5: 5f0f81650af65aa247f6fbc25ebcbdd4 depends: - __osx >=11.0 - libglib >=2.86.4,<3.0a0 - libintl >=0.25.1,<1.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - liblzma >=5.8.2,<6.0a0 - - libpng >=1.6.55,<1.7.0a0 + - libpng >=1.6.56,<1.7.0a0 - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 553039 - timestamp: 1771530777722 -- conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.86.4-h8501676_1.conda - sha256: 2ca7c217f15cc06bc17b3dcde7cdaf6450d92695e012b5048386e2b9dd497fa0 - md5: 39bd80ba97914860f3027f2fb2242b0d + size: 552947 + timestamp: 1774986327487 +- conda: https://conda.anaconda.org/conda-forge/osx-64/glib-tools-2.88.1-h6f0a764_1.conda + sha256: 595073bd43f3d86bb0bb2070034441f504879c05f0ab7dfd5cafb751853a2f96 + md5: 494b4fad3f2fd3e1bc709c9a8c70c5ad depends: - - __osx >=11.0 + - libglib ==2.88.1 hf28f236_1 - libffi - - libglib 2.86.4 hec30fc1_1 + - __osx >=11.0 - libintl >=0.25.1,<1.0a0 license: LGPL-2.1-or-later purls: [] - size: 188660 - timestamp: 1771864169877 + size: 216292 + timestamp: 1777905166322 - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.14-h21dd04a_2.conda sha256: c356eb7a42775bd2bae243d9987436cd1a442be214b1580251bb7fdc136d804b md5: ba63822087afc37e01bf44edcc2479f3 @@ -13675,25 +15504,25 @@ packages: purls: [] size: 280972 timestamp: 1686545425074 -- conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-13.2.1-hf0bc557_0.conda - sha256: 72fd48c613da1880f677f36aa46f2cabfb27052ca736fad54e804f9495b604c3 - md5: 3c0e7beb248c312b201dc7c317e2963a +- conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-14.2.0-hf0bc557_0.conda + sha256: ab070b8961569fbdd3e414bee89887f1ca97522c73afb0fa2f055ad775c7dd20 + md5: e7fd9056aa65f6dac6558b39c332c907 depends: - __osx >=11.0 - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - icu >=78.3,<79.0a0 - libcxx >=19 - - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.2 - - libfreetype6 >=2.14.2 + - libexpat >=2.7.5,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - libglib >=2.86.4,<3.0a0 - libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT purls: [] - size: 1728695 - timestamp: 1774277140385 + size: 2148344 + timestamp: 1776778909454 - conda: https://conda.anaconda.org/conda-forge/osx-64/hicolor-icon-theme-0.17-h694c41f_3.conda sha256: 3321e8d2c2198ac796b0ae800473173ade528b49f84b6c6e4e112a9704698b41 md5: 690e5077aaccf8d280a4284d7c9ec6b4 @@ -13723,16 +15552,16 @@ packages: purls: [] size: 215089 timestamp: 1773114468701 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda - sha256: 46561199545890e050a8a90edcfce984e5f881da86b09388926e3a6c6b759dec - md5: ed6f7b7a35f942a0301e581d72616f7d +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda + sha256: 8f3d495df4427d9285ae25a51d32123ca251c32abebcef020fddb8ac1f200894 + md5: 56fa8b3e43d26c97da88aea4e958f616 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 564908 - timestamp: 1774439353713 + size: 567420 + timestamp: 1778192020253 - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda sha256: 025f8b1e85dd8254e0ca65f011919fb1753070eb507f03bca317871a884d24de md5: 31aa65919a729dc48180893f62c25221 @@ -13743,18 +15572,18 @@ packages: purls: [] size: 70840 timestamp: 1761980008502 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda - sha256: 8d9d79b2de7d6f335692391f5281607221bf5d040e6724dad4c4d77cd603ce43 - md5: a684eb8a19b2aa68fde0267df172a1e3 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda + sha256: 5ebcc413d0a75da926a8b9b681d7d12c9562993991ba49c90a9881c4a59bdc11 + md5: d2e01f78c1daaeb4d2aa870125ebcd7e depends: - - __osx >=10.13 + - __osx >=11.0 constrains: - - expat 2.7.4.* + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 74578 - timestamp: 1771260142624 + size: 75242 + timestamp: 1777846416221 - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda sha256: 951958d1792238006fdc6fce7f71f1b559534743b26cc1333497d46e5903a2d6 md5: 66a0dc7464927d0853b590b6f53ba3ea @@ -13809,22 +15638,22 @@ packages: purls: [] size: 163145 timestamp: 1766332198196 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.86.4-hec30fc1_1.conda - sha256: d45fd67e18e793aeb2485a7efe3e882df594601ed6136ed1863c56109e4ad9e3 - md5: b8437d8dc24f46da3565d7f0c5a96d45 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.88.1-hf28f236_1.conda + sha256: 69bc67e46021aa7a7689f37203e2666458ec31a9b536aa407a4b4ed3dce8e6f4 + md5: a9927a4d55ca09343d372a98ddcd8745 depends: - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - libiconv >=1.18,<2.0a0 - - libintl >=0.25.1,<1.0a0 - - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.47,<10.48.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + - libiconv >=1.18,<2.0a0 + - libffi >=3.5.2,<3.6.0a0 constrains: - - glib 2.86.4 *_1 + - glib >2.66 license: LGPL-2.1-or-later purls: [] - size: 4186085 - timestamp: 1771863964173 + size: 4519643 + timestamp: 1777905166322 - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 md5: 210a85a1119f97ea7887188d176db135 @@ -13844,38 +15673,38 @@ packages: purls: [] size: 96909 timestamp: 1753343977382 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - sha256: ebe2877abc046688d6ea299e80d8322d10c69763f13a102010f90f7168cc5f54 - md5: 48dda187f169f5a8f1e5e07701d5cdd9 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda + sha256: 6b809d8acb6b97bbb1a858eb4ba7b7163c67257b6c3f199dd9d1e0751f4c5b18 + md5: 57cc1464d457d01ac78f5860b9ca1714 depends: - - __osx >=10.13 + - __osx >=11.0 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib purls: [] - size: 586189 - timestamp: 1762095332781 -- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - sha256: 7ab3c98abd3b5d5ec72faa8d9f5d4b50dcee4970ed05339bc381861199dabb41 - md5: 688a0c3d57fa118b9c97bf7e471ab46c + size: 587997 + timestamp: 1775963139212 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + sha256: d9e2006051529aec5578c6efeb13bb6a7200a014b2d5a77a579e83a8049d5f3c + md5: becdfbfe7049fa248e52aa37a9df09e2 depends: - - __osx >=10.13 + - __osx >=11.0 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD purls: [] - size: 105482 - timestamp: 1768753411348 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.55-h07817ec_0.conda - sha256: 75755fa305f7c944d911bf00593e283ebb83dac1e9c54dc1e016cf591e57d808 - md5: 4fc7ed44d55aaf1d72b8fbc18774b90c + size: 105724 + timestamp: 1775826029494 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda + sha256: a669b22978e546484d18d99a210801b1823360a266d7035c713d8d1facd035f7 + md5: 9744d43d5200f284260637304a069ddd depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement purls: [] - size: 298943 - timestamp: 1770691469850 + size: 299206 + timestamp: 1776315286816 - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.62.1-h7321050_0.conda sha256: ef63983208a0037d5eef331ea157bf892c73e0a73e41692fd02471fb48a7f920 md5: 471e8234c120e51c76dada4f86fc8ed5 @@ -13895,16 +15724,17 @@ packages: purls: [] size: 2517667 timestamp: 1773816126648 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda - sha256: f500d1cd50cfcd288d02b8fc3c3b7ecf8de6fec7b86e57ea058def02908e4231 - md5: d553eb96758e038b04027b30fe314b2d +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda + sha256: 5e964e07a14180ce20decfd4897e8f81d48ec78c1cbf4af85c5520f535d9510c + md5: 9273c877f78b7486b0dfdd9268327a79 depends: - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 + - icu >=78.3,<79.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing purls: [] - size: 996526 - timestamp: 1772819669038 + size: 1007171 + timestamp: 1777987093870 - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda sha256: e53424c34147301beae2cd9223ebf593720d94c038b3f03cacd0535e12c9668e md5: 9d4344f94de4ab1330cdc41c40152ea6 @@ -13934,22 +15764,22 @@ packages: purls: [] size: 365086 timestamp: 1752159528504 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - sha256: f67e4b7d7f97e57ecd611a42e42d5f6c047fd3d1eb8270813b888924440c8a59 - md5: 0c8bdbfd118f5963ab343846094932a3 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + sha256: 437f003e299d77403db42d17e532d686236f357ac5c3d6bf466558c697902597 + md5: c74ae93cd7876e3a9c4b5569d5e29e34 depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - libxml2 2.15.2 + - libxml2 2.15.3 license: MIT license_family: MIT purls: [] - size: 495922 - timestamp: 1772705426323 + size: 496338 + timestamp: 1776377250079 - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda sha256: 4c6da089952b2d70150c74234679d6f7ac04f4a98f9432dec724968f912691e7 md5: 30439ff30578e504ee5e0b390afc8c65 @@ -13962,26 +15792,26 @@ packages: purls: [] size: 59000 timestamp: 1774073052242 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 - md5: ced34dd9929f491ca6dab6a2927aff25 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + sha256: f5f7e006ff4271305ab4cc08eedd855c67a571793c3d18aff73f645f088a8cae + md5: 31b8740cf1b2588d4e61c81191004061 depends: - - __osx >=10.13 + - __osx >=11.0 license: X11 AND BSD-3-Clause purls: [] - size: 822259 - timestamp: 1738196181298 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - sha256: e02e5639b0e4d6d4fcf0f3b082642844fb5a37316f5b0a1126c6271347462e90 - md5: 30bb8d08b99b9a7600d39efb3559fff0 + size: 831711 + timestamp: 1777423052277 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + sha256: 334fd49ea31b99114f5afb1ec44555dc8c90640648302a4f8f838ee345d1ec50 + md5: 5cf0ece4375c73d7a5765e83565a69c7 depends: - - __osx >=10.13 + - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache purls: [] - size: 2777136 - timestamp: 1769557662405 + size: 2776564 + timestamp: 1775589970694 - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda sha256: b60882fbaee1a7dd4458253d9c335f9dc285bc4c672c9da28b80636736eda891 md5: 4be84ca4d00187c49a3010ca30a34847 @@ -14166,34 +15996,34 @@ packages: purls: [] size: 59391 timestamp: 1757438897523 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.5-h4e57454_1.conda - sha256: ed637a29deb9afb77c51a0e8b3961eb725fcbf7d6d84dadb0983a457f24dba24 - md5: 444c1d08dc4c0303ae08fa7cd14497a4 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.6-h4e57454_0.conda + sha256: 07cbba4e12430de35ea608eb3006cf1f7f63832c4f89a081cd6f3872944c1aa6 + md5: e67ebd2f639f46e52af8531622fa6051 depends: - __osx >=11.0 - libglib >=2.86.4,<3.0a0 - libintl >=0.25.1,<1.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - liblzma >=5.8.2,<6.0a0 - - libpng >=1.6.55,<1.7.0a0 + - libpng >=1.6.56,<1.7.0a0 - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 549384 - timestamp: 1771530540200 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.4-h60c1bae_1.conda - sha256: 339adcf9170d1c6eaf125a309debd541d20cb72964bff8edd51197ed1154e13b - md5: 2e1684508bcd4b343b34c27731fa5bbe + size: 548309 + timestamp: 1774986047281 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.1-h357b478_1.conda + sha256: f00315c79a956ed4a8bdf2681f19f116061e33bed918b71ad41fb798facd35d8 + md5: 91ea0d13e8ba62a5aa46443081abf635 depends: - - __osx >=11.0 + - libglib ==2.88.1 ha08bb59_1 - libffi - - libglib 2.86.4 he378b5c_1 + - __osx >=11.0 - libintl >=0.25.1,<1.0a0 license: LGPL-2.1-or-later purls: [] - size: 183089 - timestamp: 1771864291777 + size: 204878 + timestamp: 1777905039771 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda sha256: c507ae9989dbea7024aa6feaebb16cbf271faac67ac3f0342ef1ab747c20475d md5: 0fc46fee39e88bbcf5835f71a9d9a209 @@ -14266,25 +16096,25 @@ packages: purls: [] size: 304331 timestamp: 1686545503242 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-13.2.1-h3103d1b_0.conda - sha256: 7bfb3037cc73dabf755b4308eb4ac885e40806df824838928904758ef1bc92c9 - md5: 07313476933d7bf01bfe9a0ae9a5ca4d +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.0-h3103d1b_0.conda + sha256: 40ccd6a589c60a4cedb2f9921dfa60ea5845b5ce323477b042b6f90218b239f6 + md5: ea75b03886981362d93bb4708ee14811 depends: - __osx >=11.0 - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - icu >=78.3,<79.0a0 - libcxx >=19 - - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.2 - - libfreetype6 >=2.14.2 + - libexpat >=2.7.5,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - libglib >=2.86.4,<3.0a0 - libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT purls: [] - size: 1649886 - timestamp: 1774277167588 + size: 2023669 + timestamp: 1776779039314 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda sha256: 46a4958f2f916c5938f2a6dc0709f78b175ece42f601d79a04e0276d55d25d07 md5: cfb39109ac5fa8601eb595d66d5bf156 @@ -14314,16 +16144,16 @@ packages: purls: [] size: 164222 timestamp: 1773114244984 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda - sha256: d1402087c8792461bfc081629e8aa97e6e577a31ae0b84e6b9cc144a18f48067 - md5: 4280e0a7fd613b271e022e60dea0138c +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + sha256: dddd01bd6b338221342a89530a1caffe6051a70cc8f8b1d8bb591d5447a3c603 + md5: ff484b683fecf1e875dfc7aa01d19796 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 568094 - timestamp: 1774439202359 + size: 569359 + timestamp: 1778191546305 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c md5: a6130c709305cd9828b4e1bd9ba0000c @@ -14334,18 +16164,18 @@ packages: purls: [] size: 55420 timestamp: 1761980066242 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda - sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf - md5: a92e310ae8dfc206ff449f362fc4217f +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + sha256: f4b1cafc59afaede8fa0a2d9cf376840f1c553001acd72f6ead18bbc8ac8c49c + md5: 65466e82c09e888ca7560c11a97d5450 depends: - __osx >=11.0 constrains: - - expat 2.7.4.* + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 68199 - timestamp: 1771260020767 + size: 68789 + timestamp: 1777846180142 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 md5: 43c04d9cb46ef176bb2a4c77e324d599 @@ -14400,22 +16230,22 @@ packages: purls: [] size: 159247 timestamp: 1766331953491 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda - sha256: a4254a241a96198e019ced2e0d2967e4c0ef64fac32077a45c065b32dc2b15d2 - md5: 673069f6725ed7b1073f9b96094294d1 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_1.conda + sha256: 0a55d29313baf76e46443c4b1ca4fa28b845df67e02b1f40f9847519d16c42fd + md5: ed49aeb876b26dbd9d20c2bb3bad1080 depends: - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 + - pcre2 >=10.47,<10.48.0a0 - libiconv >=1.18,<2.0a0 - libintl >=0.25.1,<1.0a0 - - libzlib >=1.3.1,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - glib 2.86.4 *_1 + - glib >2.66 license: LGPL-2.1-or-later purls: [] - size: 4108927 - timestamp: 1771864169970 + size: 4439433 + timestamp: 1777905039771 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 md5: 4d5a7445f0b25b6a3ddbb56e790f5251 @@ -14435,38 +16265,38 @@ packages: purls: [] size: 90957 timestamp: 1751558394144 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - sha256: 6c061c56058bb10374daaef50e81b39cf43e8aee21f0037022c0c39c4f31872f - md5: f0695fbecf1006f27f4395d64bd0c4b8 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + sha256: 17e035ae6a520ff6a6bb5dd93a4a7c3895891f4f9743bcb8c6ef607445a31cd0 + md5: b8a7544c83a67258b0e8592ec6a5d322 depends: - __osx >=11.0 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib purls: [] - size: 551197 - timestamp: 1762095054358 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e - md5: 009f0d956d7bfb00de86901d16e486c7 + size: 555681 + timestamp: 1775962975624 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e + md5: b1fd823b5ae54fbec272cea0811bd8a9 depends: - __osx >=11.0 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD purls: [] - size: 92242 - timestamp: 1768752982486 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda - sha256: 7a4fd29a6ee2d7f7a6e610754dfdf7410ed08f40d8d8b488a27bc0f9981d5abb - md5: 871dc88b0192ac49b6a5509932c31377 + size: 92472 + timestamp: 1775825802659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + sha256: 66eae34546df1f098a67064970c92aa14ae7a7505091889e00468294d2882c36 + md5: 2259ae0949dbe20c0665850365109b27 depends: - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement purls: [] - size: 288950 - timestamp: 1770691485950 + size: 289546 + timestamp: 1776315246750 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.1-he8aa2a2_0.conda sha256: 4d28ad0213fca6f93624c27f13493b986ce63e05386d2ff7a2ad723c4e7c7cec md5: 4766fd69e64e477b500eb901dbe7bb6b @@ -14486,17 +16316,16 @@ packages: purls: [] size: 2402915 timestamp: 1773816188394 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda - sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c - md5: f6233a3fddc35a2ec9f617f79d6f3d71 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + sha256: 49daec7c83e70d4efc17b813547824bc2bcf2f7256d84061d24fbfe537da9f74 + md5: 6681822ea9d362953206352371b6a904 depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing purls: [] - size: 918420 - timestamp: 1772819478684 + size: 920047 + timestamp: 1777987051643 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda sha256: e9248077b3fa63db94caca42c8dbc6949c6f32f94d1cafad127f9005d9b1507f md5: e2a72ab2fa54ecb6abab2b26cde93500 @@ -14526,22 +16355,22 @@ packages: purls: [] size: 294974 timestamp: 1752159906788 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - sha256: 6432259204e78c8a8a815afae987fbf60bd722605fe2c4b022e65196b17d4537 - md5: b284e2b02d53ef7981613839fb86beee +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda + sha256: ff75b84cdb9e8d123db2fa694a8ac2c2059516b6cbc98ac21fb68e235d0fd354 + md5: 19edaa53885fc8205614b03da2482282 depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - libxml2 2.15.2 + - libxml2 2.15.3 license: MIT license_family: MIT purls: [] - size: 466220 - timestamp: 1772704950232 + size: 466360 + timestamp: 1776377102261 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 md5: bc5a5721b6439f2f62a84f2548136082 @@ -14554,26 +16383,26 @@ packages: purls: [] size: 47759 timestamp: 1774072956767 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 - md5: 068d497125e4bf8a66bf707254fff5ae +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d + md5: 343d10ed5b44030a2f67193905aea159 depends: - __osx >=11.0 license: X11 AND BSD-3-Clause purls: [] - size: 797030 - timestamp: 1738196177597 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 - md5: f4f6ad63f98f64191c3e77c5f5f29d76 + size: 805509 + timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + sha256: c91bf510c130a1ea1b6ff023e28bac0ccaef869446acd805e2016f69ebdc49ea + md5: 25dcccd4f80f1638428613e0d7c9b4e1 depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache purls: [] - size: 3104268 - timestamp: 1769556384749 + size: 3106008 + timestamp: 1775587972483 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda sha256: 2074598145bf286490d232c6f0a3d301403305d56f5c45a0170f44bc00fde8e5 md5: 81203e2c973f049afba930cf6f79c695 @@ -14817,16 +16646,16 @@ packages: purls: [] size: 188688 timestamp: 1686545648050 -- conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.2.1-h5a1b470_0.conda - sha256: 530f69ed9165a88eadf6d3165e7fc0098ed602812ba1527ebd92f78e0d0a2158 - md5: f6414f2f905326bcf0e7c87a04d175a2 +- conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.0-h5a1b470_0.conda + sha256: 82abc468768c5130b45e4025fe289e0c84ea015d7fa23059503da212c89097cb + md5: b8862b83b5c899f5b65bcba0298b8478 depends: - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - icu >=78.3,<79.0a0 - - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.2 - - libfreetype6 >=2.14.2 + - libexpat >=2.7.5,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - libglib >=2.86.4,<3.0a0 - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 @@ -14835,8 +16664,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 1288878 - timestamp: 1774276695458 + size: 1322557 + timestamp: 1776778816190 - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda sha256: 1bda728d70a619731b278c859eda364146cb5b4b8c739a64da8128353d81d1c4 md5: 0097b24800cb696915c3dbd1f5335d3f @@ -14873,20 +16702,20 @@ packages: purls: [] size: 156818 timestamp: 1761979842440 -- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda - sha256: b31f6fb629c4e17885aaf2082fb30384156d16b48b264e454de4a06a313b533d - md5: 1c1ced969021592407f16ada4573586d +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.0-hac47afa_0.conda + sha256: 2d81d647c1f01108803457cac999b947456f44dd0a3c2325395677feacaeca67 + md5: 264e350e035092b5135a2147c238aec4 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - expat 2.7.4.* + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 70323 - timestamp: 1771259521393 + size: 71094 + timestamp: 1777846223617 - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190 md5: 720b39f5ec0610457b725eb3f396219a @@ -14923,21 +16752,21 @@ packages: purls: [] size: 340180 timestamp: 1774300467879 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda - sha256: da2c96563c76b8c601746f03e03ac75d2b4640fa2ee017cb23d6c9fc31f1b2c6 - md5: b085746891cca3bd2704a450a7b4b5ce +- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda + sha256: 80e80ef5e31b00b12539db3c5aaecde60dab91381abfc1060e323d5c3b016dce + md5: cc5d690fc1c629038f13c68e88e65f44 depends: - _openmp_mutex >=4.5 - libwinpthread >=12.0.0.r4.gg4f2fc60ca constrains: - - libgcc-ng ==15.2.0=*_18 - msys2-conda-epoch <0.0a0 - - libgomp 15.2.0 h8ee18e1_18 + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 h8ee18e1_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 820022 - timestamp: 1771382190160 + size: 821854 + timestamp: 1778273037795 - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda sha256: 9ab562c718bd3fcef5f6189c8e2730c3d9321e05f13749a611630475d41207fc md5: 3a5b40267fcd31f1ba3a24014fe92044 @@ -14962,27 +16791,27 @@ packages: purls: [] size: 166711 timestamp: 1766331770351 -- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - sha256: f035fb25f8858f201e0055c719ef91022e9465cd51fe803304b781863286fb10 - md5: 0329a7e92c8c8b61fcaaf7ad44642a96 +- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_1.conda + sha256: f05f64b735dec24297d120d5e7b6b7299dda0df50bc2ae309808c4aa345c06ba + md5: 574ba3f468b639cfaf65c0f2b04d8e9d depends: - - libffi >=3.5.2,<3.6.0a0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.2,<2.0a0 - libiconv >=1.18,<2.0a0 - libintl >=0.22.5,<1.0a0 - - libzlib >=1.3.1,<2.0a0 + - libffi >=3.5.2,<3.6.0a0 - pcre2 >=10.47,<10.48.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 constrains: - - glib 2.86.4 *_1 + - glib >2.66 license: LGPL-2.1-or-later purls: [] - size: 4095369 - timestamp: 1771863229701 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda - sha256: 94981bc2e42374c737750895c6fdcfc43b7126c4fc788cad0ecc7281745931da - md5: 939fb173e2a4d4e980ef689e99b35223 + size: 4522879 + timestamp: 1777904959903 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda + sha256: 4dc958ced2fc7f42bc675b07e2c9abe3e150875ffdf62ca551d94fc6facf1fd7 + md5: f1147651e3fdd585e2f442c0c2fc8f2d depends: - libwinpthread >=12.0.0.r4.gg4f2fc60ca constrains: @@ -14990,8 +16819,8 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 663864 - timestamp: 1771382118742 + size: 664640 + timestamp: 1778272979661 - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 md5: 64571d1dd6cdcfa25d0664a5950fdaa2 @@ -15012,9 +16841,9 @@ packages: purls: [] size: 95568 timestamp: 1723629479451 -- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - sha256: 795e2d4feb2f7fc4a2c6e921871575feb32b8082b5760726791f080d1e2c2597 - md5: 56a686f92ac0273c0f6af58858a3f013 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda + sha256: 698d57b5b90120270eaa401298319fcb25ea186ae95b340c2f4813ed9171083d + md5: 25a127bad5470852b30b239f030ec95b depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -15023,44 +16852,44 @@ packages: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib purls: [] - size: 841783 - timestamp: 1762094814336 -- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c - md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3 + size: 842806 + timestamp: 1775962811457 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + sha256: d636d1a25234063642f9c531a7bb58d84c1c496411280a36ea000bd122f078f1 + md5: 8f83619ab1588b98dd99c90b0bfc5c6d depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD purls: [] - size: 106169 - timestamp: 1768752763559 -- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda - sha256: db23f281fa80597a0dc0445b18318346862602d7081ed76244df8cc4418d6d68 - md5: 43f47a9151b9b8fc100aeefcf350d1a0 + size: 106486 + timestamp: 1775825663227 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + sha256: 218913aeee391460bd0e341b834dbd9c6fa6ae0a4276c0c300266cc99a816a28 + md5: 52f1280563f3b48b5f75414cd2d15dd1 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement purls: [] - size: 383155 - timestamp: 1770691504832 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda - sha256: 5fccf1e4e4062f8b9a554abf4f9735a98e70f82e2865d0bfdb47b9de94887583 - md5: 8830689d537fda55f990620680934bb1 + size: 385227 + timestamp: 1776315248638 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.1-hf5d6505_0.conda + sha256: e70562450332ca8954bc16f3455468cca5ef3695c7d7187ecc87f8fc3c70e9eb + md5: 7fea434a17c323256acc510a041b80d7 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing purls: [] - size: 1297302 - timestamp: 1772818899033 + size: 1304178 + timestamp: 1777986510497 - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda sha256: f1b8cccaaeea38a28b9cd496694b2e3d372bb5be0e9377c9e3d14b330d1cba8a md5: 549845d5133100142452812feb9ba2e8 @@ -15133,9 +16962,9 @@ packages: purls: [] size: 58347 timestamp: 1774072851498 -- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6 - md5: eb585509b815415bc964b2c7e11c7eb3 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + sha256: feb5815125c60f2be4a411e532db1ed1cd2d7261a6a43c54cb6ae90724e2e154 + md5: 05c7d624cff49dbd8db1ad5ba537a8a3 depends: - ca-certificates - ucrt >=10.0.20348.0 @@ -15144,8 +16973,8 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 9343023 - timestamp: 1769557547888 + size: 9410183 + timestamp: 1775589779763 - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda sha256: e7e19b88040df48b172eef8270e6ca55d93243635fb447527831974a0714b761 md5: 1844e86a2fffbd77a99d03af217d9dfa @@ -15374,21 +17203,21 @@ packages: purls: [] size: 286083 timestamp: 1769445495320 -- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.18-hba3369d_0.conda - sha256: 2004ebe53ce5e7288f148f2d92dd52526fd6ee0f5435bf95cf48de808028cd68 - md5: 52105b90eaf5b859cb383348e99cbac2 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda + sha256: 1d3907533a6e26bb62f109a33107064e2140503a8076de5b28b384ef3e473d27 + md5: 39d8a6b9a87047c817e5881fc0706684 depends: - libgcc >=14 - libwinpthread >=12.0.0.r4.gg4f2fc60ca - ucrt >=10.0.20348.0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 - xorg-libxt >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 237697 - timestamp: 1769445545101 + size: 237565 + timestamp: 1776790287445 - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda sha256: c940a6b71a1e59450b01ebfb3e21f3bbf0a8e611e5fbfc7982145736b0f20133 md5: 31baf0ce8ef19f5617be73aee0527618 @@ -15417,55 +17246,10 @@ packages: purls: [] size: 388453 timestamp: 1764777142545 -- pypi: https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl - name: pydantic-settings - version: 2.13.1 - sha256: d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237 - requires_dist: - - pydantic>=2.7.0 - - python-dotenv>=0.21.0 - - typing-inspection>=0.4.0 - - boto3-stubs[secretsmanager] ; extra == 'aws-secrets-manager' - - boto3>=1.35.0 ; extra == 'aws-secrets-manager' - - azure-identity>=1.16.0 ; extra == 'azure-key-vault' - - azure-keyvault-secrets>=4.8.0 ; extra == 'azure-key-vault' - - google-cloud-secret-manager>=2.23.1 ; extra == 'gcp-secret-manager' - - tomli>=2.0.1 ; extra == 'toml' - - pyyaml>=6.0.1 ; extra == 'yaml' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - name: traitlets - version: 5.14.3 - sha256: b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f - requires_dist: - - myst-parser ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - sphinx ; extra == 'docs' - - argcomplete>=3.0.3 ; extra == 'test' - - mypy>=1.7.0 ; extra == 'test' - - pre-commit ; extra == 'test' - - pytest-mock ; extra == 'test' - - pytest-mypy-testing ; extra == 'test' - - pytest>=7.0,<8.2 ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/00/ca/db94101c187f3df742133ac837e93b1f269ebdac49427f8310ee40b6a58f/pyarrow-23.0.1-cp311-cp311-win_amd64.whl - name: pyarrow - version: 23.0.1 - sha256: f00f993a8179e0e1c9713bcc0baf6d6c01326a406a9c23495ec1ba9c9ebf2919 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl - name: sphinxcontrib-mermaid - version: 2.0.1 - sha256: 9dca7fbe827bad5e7e2b97c4047682cfd26e3e07398cfdc96c7a8842ae7f06e7 - requires_dist: - - jinja2 - - sphinx - - pyyaml - - defusedxml ; extra == 'test' - - myst-parser ; extra == 'test' - - pytest ; extra == 'test' - - ruff ; extra == 'test' - - sphinx ; extra == 'test' +- pypi: https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz + name: llvmlite + version: 0.47.0 + sha256: 62031ce968ec74e95092184d4b0e857e444f8fdff0b8f9213707699570c33ccc requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl name: nbsphinx @@ -15517,6 +17301,30 @@ packages: version: 0.7.1 sha256: a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' +- pypi: https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl + name: zipp + version: 3.23.1 + sha256: 0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc + requires_dist: + - pytest>=6,!=8.1.* ; extra == 'test' + - jaraco-itertools ; extra == 'test' + - jaraco-functools ; extra == 'test' + - more-itertools ; extra == 'test' + - big-o ; extra == 'test' + - pytest-ignore-flaky ; extra == 'test' + - jaraco-test ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest-mypy ; extra == 'type' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl name: markupsafe version: 3.0.3 @@ -15604,16 +17412,6 @@ packages: version: 1.5.0 sha256: 0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/0b/62/96459ef5b67957eac38a90f541d1c28833d1b367f014a482cb63f3b7cd2d/pyarrow-23.0.1-cp311-cp311-manylinux_2_28_x86_64.whl - name: pyarrow - version: 23.0.1 - sha256: 26d50dee49d741ac0e82185033488d28d35be4d763ae6f321f97d1140eb7a0e9 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/0b/71/3b54e97c28cdf4993c8317d62ac1be655667455f129cf6162591d56aed89/ncrystal_core-4.3.4-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: ncrystal-core - version: 4.3.4 - sha256: d3b94528c5d237d43c64c18a2347b967445c43c31ade5c64716e171838b53f9e - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl name: python-dotenv version: 1.2.2 @@ -15651,67 +17449,6 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl - name: nbconvert - version: 7.17.0 - sha256: 4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518 - requires_dist: - - beautifulsoup4 - - bleach[css]!=5.0.0 - - defusedxml - - importlib-metadata>=3.6 ; python_full_version < '3.10' - - jinja2>=3.0 - - jupyter-core>=4.7 - - jupyterlab-pygments - - markupsafe>=2.0 - - mistune>=2.0.3,<4 - - nbclient>=0.5.0 - - nbformat>=5.7 - - packaging - - pandocfilters>=1.4.1 - - pygments>=2.4.1 - - traitlets>=5.1 - - flaky ; extra == 'all' - - intersphinx-registry ; extra == 'all' - - ipykernel ; extra == 'all' - - ipython ; extra == 'all' - - ipywidgets>=7.5 ; extra == 'all' - - myst-parser ; extra == 'all' - - nbsphinx>=0.2.12 ; extra == 'all' - - playwright ; extra == 'all' - - pydata-sphinx-theme ; extra == 'all' - - pyqtwebengine>=5.15 ; extra == 'all' - - pytest>=7 ; extra == 'all' - - sphinx>=5.0.2 ; extra == 'all' - - sphinxcontrib-spelling ; extra == 'all' - - tornado>=6.1 ; extra == 'all' - - intersphinx-registry ; extra == 'docs' - - ipykernel ; extra == 'docs' - - ipython ; extra == 'docs' - - myst-parser ; extra == 'docs' - - nbsphinx>=0.2.12 ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - sphinx>=5.0.2 ; extra == 'docs' - - sphinxcontrib-spelling ; extra == 'docs' - - pyqtwebengine>=5.15 ; extra == 'qtpdf' - - pyqtwebengine>=5.15 ; extra == 'qtpng' - - tornado>=6.1 ; extra == 'serve' - - flaky ; extra == 'test' - - ipykernel ; extra == 'test' - - ipywidgets>=7.5 ; extra == 'test' - - pytest>=7 ; extra == 'test' - - playwright ; extra == 'webpdf' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - name: idna - version: '3.11' - sha256: 771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea - requires_dist: - - ruff>=0.6.2 ; extra == 'all' - - mypy>=1.11.2 ; extra == 'all' - - pytest>=8.3.2 ; extra == 'all' - - flake8>=7.1.1 ; extra == 'all' - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl name: pyparsing version: 3.3.2 @@ -15720,18 +17457,21 @@ packages: - railroad-diagrams ; extra == 'diagrams' - jinja2 ; extra == 'diagrams' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/11/28/19843833ad088cd433350ecce75e1c98bb283e8d52d52a472946bcca6719/bqscales-0.3.7-py3-none-any.whl + name: bqscales + version: 0.3.7 + sha256: f38625bfbc502aa010f2b87a5f7dddecfb439c4ca4ce2ec3a4db6e26c99b58db + requires_dist: + - ipywidgets>=8.0.1,<9 + - numpy>=1.10.4 + - traitlets>=4.3.0 + - traittypes>=0.0.6 + requires_python: '>=3.6' - pypi: https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl name: kiwisolver version: 1.5.0 sha256: 3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl - name: pydantic-core - version: 2.41.5 - sha256: 76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe - requires_dist: - - typing-extensions>=4.14.1 - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl name: pybtex-docutils version: 1.0.3 @@ -15740,13 +17480,6 @@ packages: - docutils>=0.14 - pybtex>=0.16 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl - name: pydantic-core - version: 2.41.5 - sha256: 7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b - requires_dist: - - typing-extensions>=4.14.1 - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl name: cffi version: 2.0.0 @@ -15784,16 +17517,25 @@ packages: - nbval>=0.11.0 ; extra == 'test' - pytest>=9.0.2 ; extra == 'test' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: llvmlite - version: 0.46.0 - sha256: a3df43900119803bbc52720e758c76f316a9a0f34612a886862dfe0a5591a17e - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl name: pyyaml version: 6.0.3 sha256: 652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/16/8d/93be7e0f7fa915a576859b3bfac7a7baa3303181c44d7db7eefbd3e8a69f/sphinxcontrib_mermaid-2.0.2-py3-none-any.whl + name: sphinxcontrib-mermaid + version: 2.0.2 + sha256: d862e514991279fb4816302c5cfe167d2557bf3ce7125ae0cb47dac80a0f46ce + requires_dist: + - jinja2 + - pyyaml + - sphinx + - defusedxml ; extra == 'test' + - myst-parser ; extra == 'test' + - pytest ; extra == 'test' + - ruff ; extra == 'test' + - sphinx ; extra == 'test' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl name: tqdm version: 4.67.3 @@ -15804,84 +17546,31 @@ packages: - pytest>=6 ; extra == 'dev' - pytest-cov ; extra == 'dev' - pytest-timeout ; extra == 'dev' - - pytest-asyncio>=0.24 ; extra == 'dev' - - nbval ; extra == 'dev' - - requests ; extra == 'discord' - - slack-sdk ; extra == 'slack' - - requests ; extra == 'telegram' - - ipywidgets>=6 ; extra == 'notebook' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - name: typing-extensions - version: 4.15.0 - sha256: f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl - name: llvmlite - version: 0.46.0 - sha256: e8b10bc585c58bdffec9e0c309bb7d51be1f2f15e169a4b4d42f2389e431eb93 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: numba - version: 0.64.0 - sha256: d17071b4ffc9d39b75d8e6c101a36f0c81b646123859898c9799cb31807c8f78 - requires_dist: - - llvmlite>=0.46.0.dev0,<0.47 - - numpy>=1.22,<2.5 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - name: beautifulsoup4 - version: 4.14.3 - sha256: 0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb - requires_dist: - - soupsieve>=1.6.1 - - typing-extensions>=4.0.0 - - cchardet ; extra == 'cchardet' - - chardet ; extra == 'chardet' - - charset-normalizer ; extra == 'charset-normalizer' - - html5lib ; extra == 'html5lib' - - lxml ; extra == 'lxml' - requires_python: '>=3.7.0' -- pypi: https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl - name: jupyter-lsp - version: 2.3.0 - sha256: e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f - requires_dist: - - jupyter-server>=1.1.2 - - importlib-metadata>=4.8.3 ; python_full_version < '3.10' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/1a/66/8ce2af42feeba7a85b573e615a360ca1e204c75f6c8d4c5641140b1bfd17/ncrystal-4.3.4-py3-none-any.whl - name: ncrystal - version: 4.3.4 - sha256: 87ea53b4e6937e4df9b2e0c71dfd88ff77de6fe8c8b4d204405d24d12143aba0 - requires_dist: - - ncrystal-core==4.3.4 - - ncrystal-python==4.3.4 - - spglib>=2.1.0 ; extra == 'composer' - - ase>=3.23.0 ; extra == 'cif' - - gemmi>=0.6.1 ; extra == 'cif' - - spglib>=2.1.0 ; extra == 'cif' - - endf-parserpy>=0.14.3 ; extra == 'endf' - - matplotlib>=3.6.0 ; extra == 'plot' - - ase>=3.23.0 ; extra == 'all' - - endf-parserpy>=0.14.3 ; extra == 'all' - - gemmi>=0.6.1 ; extra == 'all' - - matplotlib>=3.6.0 ; extra == 'all' - - spglib>=2.1.0 ; extra == 'all' - - pyyaml>=6.0.0 ; extra == 'devel' - - ase>=3.23.0 ; extra == 'devel' - - cppcheck ; extra == 'devel' - - endf-parserpy>=0.14.3 ; extra == 'devel' - - gemmi>=0.6.1 ; extra == 'devel' - - matplotlib>=3.6.0 ; extra == 'devel' - - mpmath>=1.3.0 ; extra == 'devel' - - numpy>=1.22 ; extra == 'devel' - - pybind11>=2.11.0 ; extra == 'devel' - - ruff>=0.8.1 ; extra == 'devel' - - simple-build-system>=1.6.0 ; extra == 'devel' - - spglib>=2.1.0 ; extra == 'devel' - - tomli>=2.0.0 ; python_full_version < '3.11' and extra == 'devel' - requires_python: '>=3.8' + - pytest-asyncio>=0.24 ; extra == 'dev' + - nbval ; extra == 'dev' + - requests ; extra == 'discord' + - slack-sdk ; extra == 'slack' + - requests ; extra == 'telegram' + - ipywidgets>=6 ; extra == 'notebook' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + name: typing-extensions + version: 4.15.0 + sha256: f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + name: beautifulsoup4 + version: 4.14.3 + sha256: 0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb + requires_dist: + - soupsieve>=1.6.1 + - typing-extensions>=4.0.0 + - cchardet ; extra == 'cchardet' + - chardet ; extra == 'chardet' + - charset-normalizer ; extra == 'charset-normalizer' + - html5lib ; extra == 'html5lib' + - lxml ; extra == 'lxml' + requires_python: '>=3.7.0' - pypi: https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl name: tifffile version: 2026.3.3 @@ -15929,10 +17618,15 @@ packages: - pywin32>=305 ; sys_platform == 'win32' and extra == 'nativelib' - pyobjc>=9.0 ; sys_platform == 'darwin' and extra == 'nativelib' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/1d/33/f1c6a276de27b7d7339a34749cc33fa87f077f921969c47185d34a887ae2/gast-0.7.0-py3-none-any.whl + name: gast + version: 0.7.0 + sha256: 99cbf1365633a74099f69c59bd650476b96baa5ef196fec88032b00b31ba36f7 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- pypi: https://files.pythonhosted.org/packages/20/17/ec40d981705654853726e7ac9aea9ddbb4a5d9cf54d8472222f4f3de06c2/pandas-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pandas - version: 3.0.1 - sha256: 84f0904a69e7365f79a0c77d3cdfccbfb05bf87847e3a51a41e1426b0edb9c79 + version: 3.0.2 + sha256: 61c2fd96d72b983a9891b2598f286befd4ad262161a609c92dc1652544b46b76 requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -16019,17 +17713,16 @@ packages: - xlsxwriter>=3.2.0 ; extra == 'all' - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/20/7a/7e3b845352b3db21d2ad8cd8685fc98b29721d185a1e392baede38f9b6a5/bqplot-0.12.30-py2.py3-none-any.whl - name: bqplot - version: 0.12.30 - sha256: d7bf546654676a995180b0fc30631b4a60e38472f0aa5809ac775b445048f9f5 - requires_dist: - - ipywidgets>=7.5.0 - - traitlets>=4.3.0 - - traittypes>=0.0.6 - - numpy>=1.10.4 - - pandas - requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl + name: charset-normalizer + version: 3.4.7 + sha256: 8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + name: certifi + version: 2026.4.22 + sha256: 3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl name: ptyprocess version: 0.7.0 @@ -16041,14 +17734,14 @@ packages: requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - name: numba - version: 0.64.0 - sha256: 95e7300af648baa3308127b1955b52ce6d11889d16e8cfe637b4f85d2fca52b1 +- pypi: https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl + name: jupyter-lsp + version: 2.3.1 + sha256: 71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81 requires_dist: - - llvmlite>=0.46.0.dev0,<0.47 - - numpy>=1.22,<2.5 - requires_python: '>=3.10' + - jupyter-server>=1.1.2 + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl name: fonttools version: 4.62.1 @@ -16128,6 +17821,35 @@ packages: - pytest ; extra == 'test' - defusedxml>=0.7.1 ; extra == 'test' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl + name: python-json-logger + version: 4.1.0 + sha256: 132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2 + requires_dist: + - orjson ; implementation_name != 'pypy' and extra == 'dev' + - msgspec ; implementation_name != 'pypy' and extra == 'dev' + - validate-pyproject[all] ; extra == 'dev' + - black ; extra == 'dev' + - pylint ; extra == 'dev' + - mypy ; extra == 'dev' + - pytest ; extra == 'dev' + - freezegun ; extra == 'dev' + - tzdata ; extra == 'dev' + - build ; extra == 'dev' + - mkdocs ; extra == 'dev' + - mkdocs-material>=8.5 ; extra == 'dev' + - mkdocs-awesome-pages-plugin ; extra == 'dev' + - mdx-truly-sane-lists ; extra == 'dev' + - mkdocstrings[python] ; extra == 'dev' + - mkdocs-gen-files ; extra == 'dev' + - mkdocs-literate-nav ; extra == 'dev' + - mike ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl + name: numpy + version: 2.4.4 + sha256: ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40 + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl name: pooch version: 1.9.0 @@ -16165,48 +17887,13 @@ packages: version: 1.1.2 sha256: d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl - name: numpy - version: 2.4.3 - sha256: 23b46bb6d8ecb68b58c09944483c135ae5f0e9b8d8858ece5e4ead783771d2a9 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - name: pillow - version: 12.1.1 - sha256: e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32 +- pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + name: mistune + version: 3.2.1 + sha256: 78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048 requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=8.2 ; extra == 'docs' - - sphinx-autobuild ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - arro3-compute ; extra == 'test-arrow' - - arro3-core ; extra == 'test-arrow' - - nanoarrow ; extra == 'test-arrow' - - pyarrow ; extra == 'test-arrow' - - check-manifest ; extra == 'tests' - - coverage>=7.4.2 ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma>=5 ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - - trove-classifiers>=2024.10.12 ; extra == 'tests' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl - name: ruff - version: 0.15.7 - sha256: 4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1 - requires_python: '>=3.7' + - typing-extensions ; python_full_version < '3.11' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl name: tornado version: 6.5.5 @@ -16263,120 +17950,6 @@ packages: - pytest-jupyter[client]>=0.6.2 ; extra == 'test' - pytest-timeout ; extra == 'test' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - name: zipp - version: 3.23.0 - sha256: 071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e - requires_dist: - - pytest>=6,!=8.1.* ; extra == 'test' - - jaraco-itertools ; extra == 'test' - - jaraco-functools ; extra == 'test' - - more-itertools ; extra == 'test' - - big-o ; extra == 'test' - - pytest-ignore-flaky ; extra == 'test' - - jaraco-test ; extra == 'test' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pytest-checkdocs>=2.4 ; extra == 'check' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - - pytest-cov ; extra == 'cover' - - pytest-enabler>=2.2 ; extra == 'enabler' - - pytest-mypy ; extra == 'type' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: pandas - version: 3.0.1 - sha256: 830994d7e1f31dd7e790045235605ab61cff6c94defc774547e8b7fdfbff3dc7 - requires_dist: - - numpy>=1.26.0 ; python_full_version < '3.14' - - numpy>=2.3.3 ; python_full_version >= '3.14' - - python-dateutil>=2.8.2 - - tzdata ; sys_platform == 'win32' - - tzdata ; sys_platform == 'emscripten' - - hypothesis>=6.116.0 ; extra == 'test' - - pytest>=8.3.4 ; extra == 'test' - - pytest-xdist>=3.6.1 ; extra == 'test' - - pyarrow>=13.0.0 ; extra == 'pyarrow' - - bottleneck>=1.4.2 ; extra == 'performance' - - numba>=0.60.0 ; extra == 'performance' - - numexpr>=2.10.2 ; extra == 'performance' - - scipy>=1.14.1 ; extra == 'computation' - - xarray>=2024.10.0 ; extra == 'computation' - - fsspec>=2024.10.0 ; extra == 'fss' - - s3fs>=2024.10.0 ; extra == 'aws' - - gcsfs>=2024.10.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.5 ; extra == 'excel' - - python-calamine>=0.3.0 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.2.0 ; extra == 'excel' - - pyarrow>=13.0.0 ; extra == 'parquet' - - pyarrow>=13.0.0 ; extra == 'feather' - - pyiceberg>=0.8.1 ; extra == 'iceberg' - - tables>=3.10.1 ; extra == 'hdf5' - - pyreadstat>=1.2.8 ; extra == 'spss' - - sqlalchemy>=2.0.36 ; extra == 'postgresql' - - psycopg2>=2.9.10 ; extra == 'postgresql' - - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.36 ; extra == 'mysql' - - pymysql>=1.1.1 ; extra == 'mysql' - - sqlalchemy>=2.0.36 ; extra == 'sql-other' - - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' - - beautifulsoup4>=4.12.3 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=5.3.0 ; extra == 'html' - - lxml>=5.3.0 ; extra == 'xml' - - matplotlib>=3.9.3 ; extra == 'plot' - - jinja2>=3.1.5 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.4.2 ; extra == 'clipboard' - - zstandard>=0.23.0 ; extra == 'compression' - - pytz>=2024.2 ; extra == 'timezone' - - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - - beautifulsoup4>=4.12.3 ; extra == 'all' - - bottleneck>=1.4.2 ; extra == 'all' - - fastparquet>=2024.11.0 ; extra == 'all' - - fsspec>=2024.10.0 ; extra == 'all' - - gcsfs>=2024.10.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.116.0 ; extra == 'all' - - jinja2>=3.1.5 ; extra == 'all' - - lxml>=5.3.0 ; extra == 'all' - - matplotlib>=3.9.3 ; extra == 'all' - - numba>=0.60.0 ; extra == 'all' - - numexpr>=2.10.2 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.5 ; extra == 'all' - - psycopg2>=2.9.10 ; extra == 'all' - - pyarrow>=13.0.0 ; extra == 'all' - - pyiceberg>=0.8.1 ; extra == 'all' - - pymysql>=1.1.1 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.8 ; extra == 'all' - - pytest>=8.3.4 ; extra == 'all' - - pytest-xdist>=3.6.1 ; extra == 'all' - - python-calamine>=0.3.0 ; extra == 'all' - - pytz>=2024.2 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.4.2 ; extra == 'all' - - scipy>=1.14.1 ; extra == 'all' - - s3fs>=2024.10.0 ; extra == 'all' - - sqlalchemy>=2.0.36 ; extra == 'all' - - tables>=3.10.1 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2024.10.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.2.0 ; extra == 'all' - - zstandard>=0.23.0 ; extra == 'all' - requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: markupsafe version: 3.0.3 @@ -16405,46 +17978,23 @@ packages: - sphinx-rtd-theme~=2.0 ; extra == 'theme-rtd' - sphinx-book-theme~=1.1 ; extra == 'theme-sbt' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - name: pillow - version: 12.1.1 - sha256: fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563 - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=8.2 ; extra == 'docs' - - sphinx-autobuild ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - arro3-compute ; extra == 'test-arrow' - - arro3-core ; extra == 'test-arrow' - - nanoarrow ; extra == 'test-arrow' - - pyarrow ; extra == 'test-arrow' - - check-manifest ; extra == 'tests' - - coverage>=7.4.2 ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma>=5 ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - - trove-classifiers>=2024.10.12 ; extra == 'tests' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl - name: numba - version: 0.64.0 - sha256: f2b1fd93e7aaac07d6fbaed059c00679f591f2423885c206d8c1b55d65ca3f2d +- pypi: https://files.pythonhosted.org/packages/30/d4/24d543ab8b8158b7f5a97113c831205f5c900c92c8762b1e7f44b7ea0405/python_discovery-1.3.0-py3-none-any.whl + name: python-discovery + version: 1.3.0 + sha256: 441d9ced3dfce36e113beb35ca302c71c7ef06f3c0f9c227a0b9bb3bd49b9e9f requires_dist: - - llvmlite>=0.46.0.dev0,<0.47 - - numpy>=1.22,<2.5 - requires_python: '>=3.10' + - filelock>=3.15.4 + - platformdirs>=4.3.6,<5 + - furo>=2025.12.19 ; extra == 'docs' + - sphinx-autodoc-typehints>=3.6.3 ; extra == 'docs' + - sphinx>=9.1 ; extra == 'docs' + - sphinxcontrib-mermaid>=2 ; extra == 'docs' + - covdefaults>=2.3 ; extra == 'testing' + - coverage>=7.5.4 ; extra == 'testing' + - pytest-mock>=3.14 ; extra == 'testing' + - pytest>=8.3.5 ; extra == 'testing' + - setuptools>=75.1 ; extra == 'testing' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl name: sphinx version: 8.2.3 @@ -16489,41 +18039,20 @@ packages: - setuptools>=70.0 ; extra == 'test' - typing-extensions>=4.9 ; extra == 'test' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl - name: plopp - version: 26.3.1 - sha256: 56531f2f71fa4f7f33c172312d2423d969deb9b9dd29b2524ad3ed7e33d220eb - requires_dist: - - lazy-loader>=0.4 - - matplotlib>=3.8 - - scipp>=25.5.0 ; extra == 'scipp' - - scipp>=25.5.0 ; extra == 'all' - - ipympl>0.8.4 ; extra == 'all' - - pythreejs>=2.4.1 ; extra == 'all' - - mpltoolbox>=24.6.0 ; extra == 'all' - - ipywidgets>=8.1.0 ; extra == 'all' - - graphviz>=0.20.3 ; extra == 'all' - - graphviz>=0.20.3 ; extra == 'test' - - h5py>=3.12 ; extra == 'test' - - ipympl>=0.8.4 ; extra == 'test' - - ipywidgets>=8.1.0 ; extra == 'test' - - ipykernel>=6.26,<7 ; extra == 'test' - - mpltoolbox>=24.6.0 ; extra == 'test' - - pandas>=2.2.2 ; extra == 'test' - - plotly>=5.15.0 ; extra == 'test' - - pooch>=1.5 ; extra == 'test' - - pyarrow>=13.0.0 ; extra == 'test' - - pytest>=8.0 ; extra == 'test' - - pythreejs>=2.4.1 ; extra == 'test' - - scipp>=25.5.0 ; extra == 'test' - - scipy>=1.10.0 ; extra == 'test' - - xarray>=2024.5.0 ; extra == 'test' - - anywidget>=0.9.0 ; extra == 'test' - requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl name: distlib version: 0.4.0 sha256: 9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16 +- pypi: https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl + name: ruff + version: 0.15.12 + sha256: c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl + name: llvmlite + version: 0.47.0 + sha256: 74090f0dcfd6f24ebbef3f21f11e38111c4d7e6919b54c4416e1e357c3446b07 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/34/d3/539ae1f2c7404e5396f90a9b4cca2e0d83ed1a9c8e598f94efe88130094a/bitshuffle-0.5.2.tar.gz name: bitshuffle version: 0.5.2 @@ -16581,120 +18110,221 @@ packages: - pytest-enabler>=3.4 ; extra == 'enabler' - pytest-mypy>=1.0.1 ; platform_python_implementation != 'PyPy' and extra == 'type' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - name: urllib3 - version: 2.6.3 - sha256: bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 +- pypi: https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl + name: jupyterlab + version: 4.5.7 + sha256: fba4cb0e2c44a52859669d8c98b45de029d5e515f8407bf8534d2a8fc5f0964d requires_dist: - - brotli>=1.2.0 ; platform_python_implementation == 'CPython' and extra == 'brotli' - - brotlicffi>=1.2.0.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' - - h2>=4,<5 ; extra == 'h2' - - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' - - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zstd' + - async-lru>=1.0.0 + - httpx>=0.25.0,<1 + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' + - ipykernel>=6.5.0,!=6.30.0 + - jinja2>=3.0.3 + - jupyter-core + - jupyter-lsp>=2.0.0 + - jupyter-server>=2.4.0,<3 + - jupyterlab-server>=2.28.0,<3 + - notebook-shim>=0.2 + - packaging + - setuptools>=41.1.0 + - tomli>=1.2.2 ; python_full_version < '3.11' + - tornado>=6.2.0 + - traitlets + - build ; extra == 'dev' + - bump2version ; extra == 'dev' + - coverage ; extra == 'dev' + - hatch ; extra == 'dev' + - pre-commit ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - ruff==0.11.12 ; extra == 'dev' + - jsx-lexer ; extra == 'docs' + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme>=0.13.0 ; extra == 'docs' + - pytest ; extra == 'docs' + - pytest-check-links ; extra == 'docs' + - pytest-jupyter ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx>=1.8,<8.2.0 ; extra == 'docs' + - altair==6.0.0 ; extra == 'docs-screenshots' + - ipython==8.16.1 ; extra == 'docs-screenshots' + - ipywidgets==8.1.5 ; extra == 'docs-screenshots' + - jupyterlab-geojson==3.4.0 ; extra == 'docs-screenshots' + - jupyterlab-language-pack-zh-cn==4.3.post1 ; extra == 'docs-screenshots' + - matplotlib==3.10.0 ; extra == 'docs-screenshots' + - nbconvert>=7.0.0 ; extra == 'docs-screenshots' + - pandas==2.2.3 ; extra == 'docs-screenshots' + - scipy==1.15.1 ; extra == 'docs-screenshots' + - coverage ; extra == 'test' + - pytest-check-links>=0.7 ; extra == 'test' + - pytest-console-scripts ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-jupyter>=0.5.3 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-tornasync ; extra == 'test' + - pytest>=7.0 ; extra == 'test' + - requests ; extra == 'test' + - requests-cache ; extra == 'test' + - virtualenv ; extra == 'test' + - copier>=9,<10 ; extra == 'upgrade-extension' + - jinja2-time<0.3 ; extra == 'upgrade-extension' + - pydantic<3.0 ; extra == 'upgrade-extension' + - pyyaml-include<3.0 ; extra == 'upgrade-extension' + - tomli-w<2.0 ; extra == 'upgrade-extension' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl - name: pytest - version: 9.0.2 - sha256: 711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b +- pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + name: widgetsnbextension + version: 4.0.15 + sha256: 8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl + name: matplotlib-inline + version: 0.2.2 + sha256: 3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6 requires_dist: - - colorama>=0.4 ; sys_platform == 'win32' - - exceptiongroup>=1 ; python_full_version < '3.11' - - iniconfig>=1.0.1 - - packaging>=22 - - pluggy>=1.5,<2 - - pygments>=2.7.2 - - tomli>=1 ; python_full_version < '3.11' - - argcomplete ; extra == 'dev' - - attrs>=19.2 ; extra == 'dev' - - hypothesis>=3.56 ; extra == 'dev' - - mock ; extra == 'dev' - - requests ; extra == 'dev' - - setuptools ; extra == 'dev' - - xmlschema ; extra == 'dev' + - traitlets + - flake8 ; extra == 'test' + - nbdime ; extra == 'test' + - nbval ; extra == 'test' + - notebook ; extra == 'test' + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + name: jsonschema-specifications + version: 2025.9.1 + sha256: 98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe + requires_dist: + - referencing>=0.31.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl + name: wcwidth + version: 0.7.0 + sha256: 5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl + name: gemmi + version: 0.7.5 + sha256: 4db34eaa3d3fc102afea7a156330862cbeb82f557444c079403d4412e326c527 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl + name: cyclebane + version: 24.10.0 + sha256: 902dd318667e4a222afc270cc5bc72c67d5d6047d2e0e1c36018885fb80f5e5d + requires_dist: + - networkx requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - name: ipython - version: 9.10.0 - sha256: c6ab68cc23bba8c7e18e9b932797014cc61ea7fd6f19de180ab9ba73e65ee58d +- pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + name: mpmath + version: 1.3.0 + sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c requires_dist: - - colorama>=0.4.4 ; sys_platform == 'win32' - - decorator>=4.3.2 - - ipython-pygments-lexers>=1.0.0 - - jedi>=0.18.1 - - matplotlib-inline>=0.1.5 - - pexpect>4.3 ; sys_platform != 'emscripten' and sys_platform != 'win32' - - prompt-toolkit>=3.0.41,<3.1.0 - - pygments>=2.11.0 - - stack-data>=0.6.0 - - traitlets>=5.13.0 - - typing-extensions>=4.6 ; python_full_version < '3.12' - - black ; extra == 'black' - - docrepr ; extra == 'doc' - - exceptiongroup ; extra == 'doc' - - intersphinx-registry ; extra == 'doc' - - ipykernel ; extra == 'doc' - - ipython[matplotlib,test] ; extra == 'doc' - - setuptools>=70.0 ; extra == 'doc' - - sphinx-toml==0.0.4 ; extra == 'doc' - - sphinx-rtd-theme>=0.1.8 ; extra == 'doc' - - sphinx>=8.0 ; extra == 'doc' - - typing-extensions ; extra == 'doc' - - pytest>=7.0.0 ; extra == 'test' - - pytest-asyncio>=1.0.0 ; extra == 'test' - - testpath>=0.2 ; extra == 'test' - - packaging>=20.1.0 ; extra == 'test' - - setuptools>=61.2 ; extra == 'test' - - ipython[test] ; extra == 'test-extra' - - curio ; extra == 'test-extra' - - jupyter-ai ; extra == 'test-extra' - - ipython[matplotlib] ; extra == 'test-extra' - - nbformat ; extra == 'test-extra' - - nbclient ; extra == 'test-extra' - - ipykernel>6.30 ; extra == 'test-extra' - - numpy>=1.27 ; extra == 'test-extra' - - pandas>2.1 ; extra == 'test-extra' - - trio>=0.1.0 ; extra == 'test-extra' - - matplotlib>3.9 ; extra == 'matplotlib' - - ipython[doc,matplotlib,terminal,test,test-extra] ; extra == 'all' - - argcomplete>=3.0 ; extra == 'all' + - pytest>=4.6 ; extra == 'develop' + - pycodestyle ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - codecov ; extra == 'develop' + - wheel ; extra == 'develop' + - sphinx ; extra == 'docs' + - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' + - pytest>=4.6 ; extra == 'tests' +- pypi: https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: numba + version: 0.65.1 + sha256: f80ed83774b5173abd6581cd8d2165d1d38e13d2e5c8155c0c0b421784745420 + requires_dist: + - llvmlite>=0.47.0.dev0,<0.48 + - numpy>=1.22 + - numpy>=1.22,<2.5 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/44/a0/97a6339859d4acb2536efb24feb6708e82f7d33b2ed7e036f2983fcced82/pandas-3.0.2-cp311-cp311-win_amd64.whl + name: pandas + version: 3.0.2 + sha256: ed72cb3f45190874eb579c64fa92d9df74e98fd63e2be7f62bce5ace0ade61df + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl - name: widgetsnbextension - version: 4.0.15 - sha256: 8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - name: jsonschema-specifications - version: 2025.9.1 - sha256: 98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe - requires_dist: - - referencing>=0.31.0 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/42/15/26cac702cdf6281ddeb185d5912ce14e555e277c6e4caeb1d36966e43822/gemmi-0.7.5-cp311-cp311-macosx_11_0_arm64.whl - name: gemmi - version: 0.7.5 - sha256: 4db34eaa3d3fc102afea7a156330862cbeb82f557444c079403d4412e326c527 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.0-py3-none-any.whl - name: cyclebane - version: 24.10.0 - sha256: 902dd318667e4a222afc270cc5bc72c67d5d6047d2e0e1c36018885fb80f5e5d - requires_dist: - - networkx - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - name: mpmath - version: 1.3.0 - sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c - requires_dist: - - pytest>=4.6 ; extra == 'develop' - - pycodestyle ; extra == 'develop' - - pytest-cov ; extra == 'develop' - - codecov ; extra == 'develop' - - wheel ; extra == 'develop' - - sphinx ; extra == 'docs' - - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' - - pytest>=4.6 ; extra == 'tests' - pypi: https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl name: pybtex version: 0.26.1 @@ -16704,17 +18334,47 @@ packages: - latexcodec>=1.0.4 - pyyaml>=3.1 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: llvmlite + version: 0.47.0 + sha256: ca14f02e29134e837982497959a8e2193d6035235de1cb41a9cb2bd6da4eedbb + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl name: soupsieve version: 2.8.3 sha256: ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl - name: identify - version: 2.6.18 - sha256: 8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737 +- pypi: https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl + name: pillow + version: 12.2.0 + sha256: 71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65 requires_dist: - - ukkonen ; extra == 'license' + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/48/eb/46e443fc70b4aabe6e775521ff476aefb051db9acabb16a5cb51f04e3e2b/gemmi-0.7.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl name: gemmi @@ -16753,6 +18413,25 @@ packages: - pytest-xdist ; extra == 'test' - pre-commit ; extra == 'test' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl + name: matplotlib + version: 3.10.9 + sha256: 68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7,<10 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl name: rpds-py version: 0.30.0 @@ -16777,32 +18456,25 @@ packages: requires_dist: - argon2-cffi-bindings requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl - name: python-json-logger - version: 4.0.0 - sha256: af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2 +- pypi: https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl + name: matplotlib + version: 3.10.9 + sha256: dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb requires_dist: - - typing-extensions ; python_full_version < '3.10' - - orjson ; implementation_name != 'pypy' and extra == 'dev' - - msgspec ; implementation_name != 'pypy' and extra == 'dev' - - validate-pyproject[all] ; extra == 'dev' - - black ; extra == 'dev' - - pylint ; extra == 'dev' - - mypy ; extra == 'dev' - - pytest ; extra == 'dev' - - freezegun ; extra == 'dev' - - backports-zoneinfo ; python_full_version < '3.9' and extra == 'dev' - - tzdata ; extra == 'dev' - - build ; extra == 'dev' - - mkdocs ; extra == 'dev' - - mkdocs-material>=8.5 ; extra == 'dev' - - mkdocs-awesome-pages-plugin ; extra == 'dev' - - mdx-truly-sane-lists ; extra == 'dev' - - mkdocstrings[python] ; extra == 'dev' - - mkdocs-gen-files ; extra == 'dev' - - mkdocs-literate-nav ; extra == 'dev' - - mike ; extra == 'dev' - requires_python: '>=3.8' + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7,<10 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl name: h5py version: 3.16.0 @@ -16821,6 +18493,19 @@ packages: - sphinx>=5 ; extra == 'standalone' - pytest ; extra == 'test' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl + name: sphinxcontrib-bibtex + version: 2.7.0 + sha256: 28cf0ec7a957d1c7548d5749317ed472ce877e1b629f430f88e3789aa51f87b1 + requires_dist: + - sphinx>=7.4 + - docutils>=0.20 + - pybtex>=0.25 + - pybtex-docutils>=1.0.2 + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - sphinx-autoapi ; extra == 'test' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl name: pluggy version: 1.6.0 @@ -16858,24 +18543,6 @@ packages: - spglib[docs] ; extra == 'doc' - spglib[test] ; extra == 'testing' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl - name: requests - version: 2.33.0 - sha256: 3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b - requires_dist: - - charset-normalizer>=2,<4 - - idna>=2.5,<4 - - urllib3>=1.26,<3 - - certifi>=2023.5.7 - - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' - - chardet>=3.0.2,<8 ; extra == 'use-chardet-on-py3' - - pytest-httpbin==2.1.0 ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-mock ; extra == 'test' - - pytest-xdist ; extra == 'test' - - pysocks>=1.5.6,!=1.5.7 ; extra == 'test' - - pytest>=3 ; extra == 'test' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl name: ipywidgets version: 8.1.8 @@ -16897,18 +18564,6 @@ packages: version: 6.5.5 sha256: 487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - name: pydantic - version: 2.12.5 - sha256: e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d - requires_dist: - - annotated-types>=0.6.0 - - pydantic-core==2.41.5 - - typing-extensions>=4.14.1 - - typing-inspection>=0.4.2 - - email-validator>=2.0.0 ; extra == 'email' - - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/5c/01/6cb4d63c6b6933be4b7945b2f64638336420f04ea71ca5b9a7539c008bc5/scippnexus-26.1.1-py3-none-any.whl name: scippnexus version: 26.1.1 @@ -16919,17 +18574,13 @@ packages: - h5py>=3.12 - pytest>=7.0 ; extra == 'test' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl - name: pre-commit - version: 4.5.1 - sha256: 3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77 +- pypi: https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl + name: pydantic-core + version: 2.46.4 + sha256: 0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594 requires_dist: - - cfgv>=2.0.0 - - identify>=1.0.0 - - nodeenv>=0.11.1 - - pyyaml>=5.1 - - virtualenv>=20.10.0 - requires_python: '>=3.10' + - typing-extensions>=4.14.1 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl name: sphinxcontrib-applehelp version: 2.0.0 @@ -17002,46 +18653,170 @@ packages: version: 0.2.3 sha256: c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417 requires_dist: - - pytest ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/60/97/b11543f7ab0a02f15e233a7eb25b27dcefdfe06e942154e5207de01eabe2/ncrystal_core-4.3.4-py3-none-macosx_10_9_x86_64.whl - name: ncrystal-core - version: 4.3.4 - sha256: 50a89c29c5dc4ccf7e0dfeb83c07732a90efd2910705474c8f22d1247373968f - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: charset-normalizer - version: 3.4.6 - sha256: 9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl - name: charset-normalizer - version: 3.4.6 - sha256: 82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - name: jinja2 - version: 3.1.6 - sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + - pytest ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + name: jinja2 + version: 3.1.6 + sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/62/c9/a47ab7ece0d86cbe6678418a0fbd1ac4bb493b9184a3891dfa0e7f287ae0/pyarrow-24.0.0-cp311-cp311-macosx_12_0_arm64.whl + name: pyarrow + version: 24.0.0 + sha256: b0e131f880cda8d04e076cee175a46fc0e8bc8b65c99c6c09dff6669335fde74 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/63/9f/724f66a48309dd97a2ff58f491d6ffd925f35d1278a5e55dc9a5ac6a156b/scippneutron-26.5.0-py3-none-any.whl + name: scippneutron + version: 26.5.0 + sha256: e9cfad09b974867c6dc2a175cd2e575e06eaa951b2409e9ef863db237853bf99 + requires_dist: + - python-dateutil>=2.8 + - email-validator>=2 + - h5py>=3.12 + - lazy-loader>=0.4 + - mpltoolbox>=24.6.0 + - numpy>=1.20 + - plopp>=26.4.1 + - pydantic>=2 + - scipp>=25.8.0 + - scippnexus>=23.11.0 + - scipy>=1.7.0 + - scipp[all]>=25.8.0 ; extra == 'all' + - pooch>=1.5 ; extra == 'all' + - hypothesis>=6.100 ; extra == 'test' + - ipympl>0.9.0 ; extra == 'test' + - ipykernel>6.30 ; extra == 'test' + - pace-neutrons>=0.3 ; extra == 'test' + - pooch>=1.5 ; extra == 'test' + - psutil>=5.0 ; extra == 'test' + - pytest>=7.0 ; extra == 'test' + - pytest-xdist>=3.0 ; extra == 'test' + - pythreejs>=2.4.1 ; extra == 'test' + - sciline>=25.1.0 ; extra == 'test' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + name: attrs + version: 26.1.0 + sha256: c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl + name: nbconvert + version: 7.17.1 + sha256: aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8 + requires_dist: + - beautifulsoup4 + - bleach[css]!=5.0.0 + - defusedxml + - importlib-metadata>=3.6 ; python_full_version < '3.10' + - jinja2>=3.0 + - jupyter-core>=4.7 + - jupyterlab-pygments + - markupsafe>=2.0 + - mistune>=2.0.3,<4 + - nbclient>=0.5.0 + - nbformat>=5.7 + - packaging + - pandocfilters>=1.4.1 + - pygments>=2.4.1 + - traitlets>=5.1 + - flaky ; extra == 'all' + - intersphinx-registry ; extra == 'all' + - ipykernel ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets>=7.5 ; extra == 'all' + - myst-parser ; extra == 'all' + - nbsphinx>=0.2.12 ; extra == 'all' + - playwright ; extra == 'all' + - pydata-sphinx-theme ; extra == 'all' + - pyqtwebengine>=5.15 ; extra == 'all' + - pytest>=7 ; extra == 'all' + - sphinx>=5.0.2 ; extra == 'all' + - sphinxcontrib-spelling ; extra == 'all' + - tornado>=6.1 ; extra == 'all' + - intersphinx-registry ; extra == 'docs' + - ipykernel ; extra == 'docs' + - ipython ; extra == 'docs' + - myst-parser ; extra == 'docs' + - nbsphinx>=0.2.12 ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx>=5.0.2 ; extra == 'docs' + - sphinxcontrib-spelling ; extra == 'docs' + - pyqtwebengine>=5.15 ; extra == 'qtpdf' + - pyqtwebengine>=5.15 ; extra == 'qtpng' + - tornado>=6.1 ; extra == 'serve' + - flaky ; extra == 'test' + - ipykernel ; extra == 'test' + - ipywidgets>=7.5 ; extra == 'test' + - pytest>=7 ; extra == 'test' + - playwright ; extra == 'webpdf' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl + name: pillow + version: 12.2.0 + sha256: 8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl + name: pillow + version: 12.2.0 + sha256: 6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60 requires_dist: - - markupsafe>=2.0 - - babel>=2.7 ; extra == 'i18n' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - name: platformdirs - version: 4.9.4 - sha256: 68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868 + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - name: attrs - version: 26.1.0 - sha256: c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - name: wcwidth - version: 0.6.0 - sha256: 1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl name: jsonschema version: 4.26.0 @@ -17107,6 +18882,15 @@ packages: - types-docutils ; extra == 'lint' - types-pymysql ; extra == 'lint' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/6c/3c/3f62dee257eb3d6b2c1ef2a09d36d9793c7111156a73b5654d2c2305e5ce/idna-3.14-py3-none-any.whl + name: idna + version: '3.14' + sha256: e677eaf072e290f7b725f9acf0b3a2bd55f9fd6f7c70abe5f0e34823d0accf69 + requires_dist: + - ruff>=0.6.2 ; extra == 'all' + - mypy>=1.11.2 ; extra == 'all' + - pytest>=8.3.2 ; extra == 'all' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/6c/44/30888e2a5b2fa2e6df18606b442cb8b126b0bea5a2f1ec4a2a82538ffecf/spglib-2.6.0-cp311-cp311-macosx_10_9_x86_64.whl name: spglib version: 2.6.0 @@ -17182,30 +18966,26 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl - name: matplotlib - version: 3.10.8 - sha256: 18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=3 - - python-dateutil>=2.7 - - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' - - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: pyyaml version: 6.0.3 sha256: b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl + name: mdit-py-plugins + version: 0.6.0 + sha256: f7e7a25d8b616fee99cb1e330da73451d11a8061baf39bb9663ab9ce0e005b90 + requires_dist: + - markdown-it-py>=2.0.0,<5.0.0 + - pre-commit ; extra == 'code-style' + - myst-parser ; extra == 'rtd' + - sphinx-book-theme ; extra == 'rtd' + - coverage ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + - pytest-timeout ; extra == 'testing' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl name: partd version: 1.4.2 @@ -17218,32 +18998,11 @@ packages: - pyzmq ; extra == 'complete' - blosc ; extra == 'complete' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/74/10/6434f57fa65651672534ce34a1f40ddbc7b880658ce50a8f9d7ab0830719/ncrystal_python-4.3.4-py3-none-any.whl - name: ncrystal-python - version: 4.3.4 - sha256: f7075904fa40c6a85ac9d792255ae0751b0d7059dd5297d54b1d7208e17be66e - requires_dist: - - numpy>=1.22 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl - name: prometheus-client - version: 0.24.1 - sha256: 150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055 - requires_dist: - - twisted ; extra == 'twisted' - - aiohttp ; extra == 'aiohttp' - - django ; extra == 'django' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz - name: llvmlite - version: 0.46.0 - sha256: 227c9fd6d09dce2783c18b754b7cd9d9b3b3515210c46acc2d3c5badd9870ceb +- pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + name: platformdirs + version: 4.9.6 + sha256: e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl - name: numpy - version: 2.4.3 - sha256: 77e76d932c49a75617c6d13464e41203cd410956614d0a0e999b25e9e8d27eec - requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl name: babel version: 2.18.0 @@ -17274,43 +19033,6 @@ packages: - pandas>=2.1.2 ; extra == 'test' - pooch>=1.5 ; extra == 'test' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: numpy - version: 2.4.3 - sha256: 715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - name: pillow - version: 12.1.1 - sha256: 365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38 - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=8.2 ; extra == 'docs' - - sphinx-autobuild ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - arro3-compute ; extra == 'test-arrow' - - arro3-core ; extra == 'test-arrow' - - nanoarrow ; extra == 'test-arrow' - - pyarrow ; extra == 'test-arrow' - - check-manifest ; extra == 'tests' - - coverage>=7.4.2 ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma>=5 ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - - trove-classifiers>=2024.10.12 ; extra == 'tests' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl name: annotated-types version: 0.7.0 @@ -17323,10 +19045,24 @@ packages: version: 3.0.3 sha256: dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl - name: llvmlite - version: 0.46.0 - sha256: 82f3d39b16f19aa1a56d5fe625883a6ab600d5cc9ea8906cca70ce94cabba067 +- pypi: https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: matplotlib + version: 3.10.9 + sha256: 8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7,<10 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl name: rfc3339-validator @@ -17367,6 +19103,25 @@ packages: - types-docutils>=0.20,<0.21 ; extra == 'type-checking' - typing-extensions>=4.11,<5.0 ; python_full_version < '3.10' and extra == 'type-checking' requires_python: '>=3.8.1,<4.0.0' +- pypi: https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl + name: matplotlib + version: 3.10.9 + sha256: d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.23 + - packaging>=20.0 + - pillow>=8 + - pyparsing>=3 + - python-dateutil>=2.7 + - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' + - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' + - setuptools-scm>=7,<10 ; extra == 'dev' + - setuptools>=64 ; extra == 'dev' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl name: rfc3987-syntax version: 1.1.0 @@ -17392,6 +19147,17 @@ packages: - socksio==1.* ; extra == 'socks' - trio>=0.22.0,<1.0 ; extra == 'trio' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + name: urllib3 + version: 2.7.0 + sha256: 9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 + requires_dist: + - brotli>=1.2.0 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=1.2.0.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - h2>=4,<5 ; extra == 'h2' + - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' + - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zstd' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/7f/79/b13830a65bf9fc85474a984604f094cc18817dc93a784f4c567a2dc05169/gemmi-0.7.5-cp311-cp311-macosx_10_14_x86_64.whl name: gemmi version: 0.7.5 @@ -17402,6 +19168,24 @@ packages: version: 1.5.0 sha256: 2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27 requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pydantic-core + version: 2.46.4 + sha256: f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl + name: pre-commit + version: 4.6.0 + sha256: e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b + requires_dist: + - cfgv>=2.0.0 + - identify>=1.0.0 + - nodeenv>=0.11.1 + - pyyaml>=5.1 + - virtualenv>=20.10.0 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl name: psutil version: 7.2.2 @@ -17477,6 +19261,11 @@ packages: version: 0.1.4 sha256: 502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl + name: filelock + version: 3.29.0 + sha256: 96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl name: lark version: 1.3.1 @@ -17547,15 +19336,6 @@ packages: version: 3.2.4 sha256: ff9af2134c05e3734064808db95b4dd7341a39af06e8945d05ea358e1741aaed requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/87/9e/bb60e40f1414884cf0408c975f75cf81935c00f52f0156e039ccd4b69ee3/py2vega-0.6.1-py3-none-any.whl - name: py2vega - version: 0.6.1 - sha256: 40438c8bf880fa107be9699759859eb79e2b3fdbf0b79423125783c02cff0827 - requires_dist: - - gast>=0.4.0,<0.5 - - pytest ; extra == 'testing' - - flake8 ; extra == 'testing' - requires_python: '>=3.6' - pypi: https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl name: fonttools version: 4.62.1 @@ -17600,14 +19380,6 @@ packages: version: 1.10.0 sha256: 5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' -- pypi: https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - name: numba - version: 0.64.0 - sha256: 766156ee4b8afeeb2b2e23c81307c5d19031f18d5ce76ae2c5fb1429e72fa92b - requires_dist: - - llvmlite>=0.46.0.dev0,<0.47 - - numpy>=1.22,<2.5 - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl name: lazy-loader version: '0.5' @@ -17621,6 +19393,11 @@ packages: - changelist==0.5 ; extra == 'dev' - spin==0.15 ; extra == 'dev' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl + name: numpy + version: 2.4.4 + sha256: 86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015 + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl name: accessible-pygments version: 0.0.5 @@ -17636,6 +19413,15 @@ packages: - hypothesis ; extra == 'tests' - pytest ; extra == 'tests' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl + name: prometheus-client + version: 0.25.0 + sha256: d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1 + requires_dist: + - twisted ; extra == 'twisted' + - aiohttp ; extra == 'aiohttp' + - django ; extra == 'django' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/8d/c0/fdf9d3ee103ce66a55f0532835ad5e154226c5222423c6636ba049dc42fc/traittypes-0.2.3-py2.py3-none-any.whl name: traittypes version: 0.2.3 @@ -17652,25 +19438,6 @@ packages: sha256: 1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 requires_dist: - pytest ; extra == 'tests' -- pypi: https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: matplotlib - version: 3.10.8 - sha256: efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=3 - - python-dateutil>=2.7 - - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' - - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl name: docutils version: 0.21.2 @@ -17701,11 +19468,6 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl - name: ruff - version: 0.15.7 - sha256: 722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477 - requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl name: graphviz version: '0.21' @@ -17726,86 +19488,21 @@ packages: - sphinx-autodoc-typehints ; extra == 'docs' - sphinx-rtd-theme>=0.2.5 ; extra == 'docs' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl - name: jupyter-server - version: 2.17.0 - sha256: e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f - requires_dist: - - anyio>=3.1.0 - - argon2-cffi>=21.1 - - jinja2>=3.0.3 - - jupyter-client>=7.4.4 - - jupyter-core>=4.12,!=5.0.* - - jupyter-events>=0.11.0 - - jupyter-server-terminals>=0.4.4 - - nbconvert>=6.4.4 - - nbformat>=5.3.0 - - overrides>=5.0 ; python_full_version < '3.12' - - packaging>=22.0 - - prometheus-client>=0.9 - - pywinpty>=2.0.1 ; os_name == 'nt' - - pyzmq>=24 - - send2trash>=1.8.2 - - terminado>=0.8.3 - - tornado>=6.2.0 - - traitlets>=5.6.0 - - websocket-client>=1.7 - - ipykernel ; extra == 'docs' - - jinja2 ; extra == 'docs' - - jupyter-client ; extra == 'docs' - - myst-parser ; extra == 'docs' - - nbformat ; extra == 'docs' - - prometheus-client ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - send2trash ; extra == 'docs' - - sphinx-autodoc-typehints ; extra == 'docs' - - sphinxcontrib-github-alt ; extra == 'docs' - - sphinxcontrib-openapi>=0.8.0 ; extra == 'docs' - - sphinxcontrib-spelling ; extra == 'docs' - - sphinxemoji ; extra == 'docs' - - tornado ; extra == 'docs' - - typing-extensions ; extra == 'docs' - - flaky ; extra == 'test' - - ipykernel ; extra == 'test' - - pre-commit ; extra == 'test' - - pytest-console-scripts ; extra == 'test' - - pytest-jupyter[server]>=0.7 ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest>=7.0,<9 ; extra == 'test' - - requests ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - name: markdown-it-py - version: 4.0.0 - sha256: 87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147 +- pypi: https://files.pythonhosted.org/packages/92/b1/e00f9b7367f7966457a2c3405263cbf0178a0fd217b9c75dc26cd9d92ad5/py2vega-0.7.0-py3-none-any.whl + name: py2vega + version: 0.7.0 + sha256: d643216b140df925b2336bac26834388f5ffce397a040fe4f38ad684232d60c7 requires_dist: - - mdurl~=0.1 - - psutil ; extra == 'benchmarking' - - pytest ; extra == 'benchmarking' - - pytest-benchmark ; extra == 'benchmarking' - - commonmark~=0.9 ; extra == 'compare' - - markdown~=3.4 ; extra == 'compare' - - mistletoe~=1.0 ; extra == 'compare' - - mistune~=3.0 ; extra == 'compare' - - panflute~=2.3 ; extra == 'compare' - - markdown-it-pyrs ; extra == 'compare' - - linkify-it-py>=1,<3 ; extra == 'linkify' - - mdit-py-plugins>=0.5.0 ; extra == 'plugins' - - gprof2dot ; extra == 'profiling' - - mdit-py-plugins>=0.5.0 ; extra == 'rtd' - - myst-parser ; extra == 'rtd' - - pyyaml ; extra == 'rtd' - - sphinx ; extra == 'rtd' - - sphinx-copybutton ; extra == 'rtd' - - sphinx-design ; extra == 'rtd' - - sphinx-book-theme~=1.0 ; extra == 'rtd' - - jupyter-sphinx ; extra == 'rtd' - - ipykernel ; extra == 'rtd' - - coverage ; extra == 'testing' + - gast>=0.7.0,<0.8 - pytest ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-regressions ; extra == 'testing' - - requests ; extra == 'testing' + - flake8 ; extra == 'testing' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl + name: identify + version: 2.6.19 + sha256: 20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a + requires_dist: + - ukkonen ; extra == 'license' requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl name: rpds-py @@ -17856,6 +19553,105 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl + name: numba + version: 0.65.1 + sha256: 7020d74b19cdb8cff16506542fdd510756e28c5e7f3bd0b7f574f0f42272fcd9 + requires_dist: + - llvmlite>=0.47.0.dev0,<0.48 + - numpy>=1.22 + - numpy>=1.22,<2.5 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/97/35/6411db530c618e0e0005187e35aa02ce60ae4c4c4d206964a2f978217c27/pandas-3.0.2-cp311-cp311-macosx_10_9_x86_64.whl + name: pandas + version: 3.0.2 + sha256: a727a73cbdba2f7458dc82449e2315899d5140b449015d822f515749a46cbbe0 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2024.2 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl name: contourpy version: 1.3.3 @@ -17881,25 +19677,60 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - name: click - version: 8.3.1 - sha256: 981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 +- pypi: https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl + name: parso + version: 0.8.7 + sha256: a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c requires_dist: - - colorama ; sys_platform == 'win32' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - name: certifi - version: 2026.2.25 - sha256: 027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl - name: mistune - version: 3.2.0 - sha256: febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1 + - flake8==5.0.4 ; extra == 'qa' + - types-setuptools==67.2.0.1 ; extra == 'qa' + - zuban==0.5.1 ; extra == 'qa' + - docopt ; extra == 'testing' + - pytest ; extra == 'testing' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl + name: jedi + version: 0.20.0 + sha256: 7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67 requires_dist: - - typing-extensions ; python_full_version < '3.11' - requires_python: '>=3.8' + - parso>=0.8.6,<0.9.0 + - django ; extra == 'dev' + - attrs ; extra == 'dev' + - colorama ; extra == 'dev' + - docopt ; extra == 'dev' + - flake8==7.1.2 ; extra == 'dev' + - pytest<9.0.0 ; extra == 'dev' + - types-setuptools==80.9.0.20250529 ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - zuban==0.7.0 ; extra == 'dev' + - jinja2==3.1.6 ; extra == 'docs' + - markupsafe==3.0.3 ; extra == 'docs' + - pygments==2.20.0 ; extra == 'docs' + - sphinx==9.1.0 ; extra == 'docs' + - alabaster==1.0.0 ; extra == 'docs' + - babel==2.18.0 ; extra == 'docs' + - certifi==2026.4.22 ; extra == 'docs' + - charset-normalizer==3.4.7 ; extra == 'docs' + - docutils==0.22.4 ; extra == 'docs' + - idna==3.13 ; extra == 'docs' + - imagesize==2.0.0 ; extra == 'docs' + - iniconfig==2.3.0 ; extra == 'docs' + - packaging==26.2 ; extra == 'docs' + - pluggy==1.6.0 ; extra == 'docs' + - pytest==9.0.3 ; extra == 'docs' + - requests==2.33.1 ; extra == 'docs' + - roman-numerals==4.1.0 ; extra == 'docs' + - snowballstemmer==3.0.1 ; extra == 'docs' + - sphinx-rtd-theme==3.1.0 ; extra == 'docs' + - sphinxcontrib-applehelp==2.0.0 ; extra == 'docs' + - sphinxcontrib-devhelp==2.0.0 ; extra == 'docs' + - sphinxcontrib-htmlhelp==2.1.0 ; extra == 'docs' + - sphinxcontrib-jquery==4.1 ; extra == 'docs' + - sphinxcontrib-jsmath==1.0.1 ; extra == 'docs' + - sphinxcontrib-qthelp==2.0.0 ; extra == 'docs' + - sphinxcontrib-serializinghtml==2.0.0 ; extra == 'docs' + - urllib3==2.6.3 ; extra == 'docs' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl name: setuptools version: 82.0.1 @@ -17979,20 +19810,6 @@ packages: version: 3.1.1 sha256: 8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl - name: sphinxcontrib-bibtex - version: 2.6.5 - sha256: 455ea4509642ea0b28ede3721550273626f85af65af01f161bfd8e19dc1edd7d - requires_dist: - - sphinx>=3.5 - - docutils>=0.8,!=0.18.*,!=0.19.* - - pybtex>=0.25 - - pybtex-docutils>=1.0.0 - - importlib-metadata>=3.6 ; python_full_version < '3.10' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - sphinx-autoapi ; extra == 'test' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl name: pexpect version: 4.9.0 @@ -18041,74 +19858,42 @@ packages: - pytest-xdist>=3.0 ; extra == 'test' - pytest-mpl ; extra == 'test-extras' - pytest-randomly ; extra == 'test-extras' - requires_python: '>=3.11,!=3.14.1' -- pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl - name: scitiff - version: 26.1.0 - sha256: 816ec1d90feeacc5e4ebba136c4d42833e3566a480c4d6087944381139c0cbb1 - requires_dist: - - scipp>=24.11.0 - - tifffile>=2024.7.2 - - jsonschema>=4.23.0 - - pydantic>=2.11 - - pytest>=8.0 ; extra == 'test' - - textual ; extra == 'gui' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/a0/0d/df49ae8af94215db241701f692786a2e85c3ac4557aafd829270c54fb1fa/ncrystal_core-4.3.4-py3-none-macosx_11_0_arm64.whl - name: ncrystal-core - version: 4.3.4 - sha256: 47e4441b65170f63acc6c25ea02c7827dbf76a5813f4bf01f9404a060bee6063 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - name: nest-asyncio - version: 1.6.0 - sha256: 87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - name: sympy - version: 1.14.0 - sha256: e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 - requires_dist: - - mpmath>=1.1.0,<1.4 - - pytest>=7.1.0 ; extra == 'dev' - - hypothesis>=6.70.0 ; extra == 'dev' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: pillow - version: 12.1.1 - sha256: 597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=8.2 ; extra == 'docs' - - sphinx-autobuild ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - arro3-compute ; extra == 'test-arrow' - - arro3-core ; extra == 'test-arrow' - - nanoarrow ; extra == 'test-arrow' - - pyarrow ; extra == 'test-arrow' - - check-manifest ; extra == 'tests' - - coverage>=7.4.2 ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma>=5 ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - - trove-classifiers>=2024.10.12 ; extra == 'tests' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl - name: filelock - version: 3.25.2 - sha256: ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70 + requires_python: '>=3.11,!=3.14.1' +- pypi: https://files.pythonhosted.org/packages/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-py3-none-any.whl + name: scitiff + version: 26.1.0 + sha256: 816ec1d90feeacc5e4ebba136c4d42833e3566a480c4d6087944381139c0cbb1 + requires_dist: + - scipp>=24.11.0 + - tifffile>=2024.7.2 + - jsonschema>=4.23.0 + - pydantic>=2.11 + - pytest>=8.0 ; extra == 'test' + - textual ; extra == 'gui' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl + name: nest-asyncio + version: 1.6.0 + sha256: 87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: charset-normalizer + version: 3.4.7 + sha256: 2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl + name: sympy + version: 1.14.0 + sha256: e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 + requires_dist: + - mpmath>=1.1.0,<1.4 + - pytest>=7.1.0 ; extra == 'dev' + - hypothesis>=6.70.0 ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl + name: llvmlite + version: 0.47.0 + sha256: c37d6eb7aaabfa83ab9c2ff5b5cdb95a5e6830403937b2c588b7490724e05327 requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl name: nbformat @@ -18129,16 +19914,18 @@ packages: - pytest ; extra == 'test' - testpath ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl name: ruff - version: 0.15.7 - sha256: 7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e + version: 0.15.12 + sha256: fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/ab/14/d708fb7c6bf7e7be586c625840cc078a45e64dd6bffe8d60a7b17a22b24e/ncrystal_core-4.3.4-py3-none-win_amd64.whl - name: ncrystal-core - version: 4.3.4 - sha256: 50642b491f1a9bbd4d37909dc11ef45ecf14c6272511ec5a1e1117ef7e51aa66 - requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl + name: pydantic-core + version: 2.46.4 + sha256: 6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl name: tornado version: 6.5.5 @@ -18167,6 +19954,41 @@ packages: version: 3.2.4 sha256: b362819d155fff1482575e804e43e3a8825332d32baa15245f4642022664a3f4 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl + name: ruff + version: 0.15.12 + sha256: e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + name: click + version: 8.3.3 + sha256: a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613 + requires_dist: + - colorama ; sys_platform == 'win32' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl + name: pydantic-core + version: 2.46.4 + sha256: e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl + name: pydantic-settings + version: 2.14.1 + sha256: 6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de + requires_dist: + - pydantic>=2.7.0 + - python-dotenv>=0.21.0 + - typing-inspection>=0.4.0 + - boto3>=1.35.0 ; extra == 'aws-secrets-manager' + - types-boto3[secretsmanager] ; extra == 'aws-secrets-manager' + - azure-identity>=1.16.0 ; extra == 'azure-key-vault' + - azure-keyvault-secrets>=4.8.0 ; extra == 'azure-key-vault' + - google-cloud-secret-manager>=2.23.1 ; extra == 'gcp-secret-manager' + - tomli>=2.0.1 ; extra == 'toml' + - pyyaml>=6.0.1 ; extra == 'yaml' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl name: cffi version: 2.0.0 @@ -18174,18 +19996,6 @@ packages: requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - name: matplotlib-inline - version: 0.2.1 - sha256: d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76 - requires_dist: - - traitlets - - flake8 ; extra == 'test' - - nbdime ; extra == 'test' - - nbval ; extra == 'test' - - notebook ; extra == 'test' - - pytest ; extra == 'test' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl name: sciline version: 25.11.1 @@ -18210,16 +20020,19 @@ packages: requires_dist: - pyyaml>=5.4.1 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b0/41/8e6b6ef7e225d4ceead8459427a52afdc23379768f54dd3566014d7618c1/pyarrow-23.0.1-cp311-cp311-macosx_12_0_arm64.whl - name: pyarrow - version: 23.0.1 - sha256: 6f0147ee9e0386f519c952cc670eb4a8b05caa594eeffe01af0e25f699e4e9bb - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: ruff - version: 0.15.7 - sha256: dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5 - requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/b1/4f/f71e641e504111a5a74e3a20bc52d01bd86788b22699dd3fee1c63253cf6/virtualenv-21.3.1-py3-none-any.whl + name: virtualenv + version: 21.3.1 + sha256: d1a71cf58f2f9228fff23a1f6ec15d39785c6b32e03658d104974247145edd35 + requires_dist: + - distlib>=0.3.7,<1 + - filelock>=3.24.2,<4 ; python_full_version >= '3.10' + - filelock>=3.16.1,<=3.19.1 ; python_full_version < '3.10' + - importlib-metadata>=6.6 ; python_full_version < '3.8' + - platformdirs>=3.9.1,<5 + - python-discovery>=1.2.2 + - typing-extensions>=4.13.2 ; python_full_version < '3.11' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl name: pyzmq version: 27.1.0 @@ -18252,6 +20065,40 @@ packages: version: 0.1.2 sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + name: markdown-it-py + version: 4.2.0 + sha256: 9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a + requires_dist: + - mdurl~=0.1 + - psutil ; extra == 'benchmarking' + - pytest ; extra == 'benchmarking' + - pytest-benchmark ; extra == 'benchmarking' + - commonmark~=0.9 ; extra == 'compare' + - markdown~=3.4 ; extra == 'compare' + - mistletoe~=1.0 ; extra == 'compare' + - mistune~=3.0 ; extra == 'compare' + - panflute~=2.3 ; extra == 'compare' + - markdown-it-pyrs ; extra == 'compare' + - linkify-it-py>=1,<3 ; extra == 'linkify' + - mdit-py-plugins>=0.5.0 ; extra == 'plugins' + - gprof2dot ; extra == 'profiling' + - mdit-py-plugins>=0.5.0 ; extra == 'rtd' + - myst-parser ; extra == 'rtd' + - pyyaml ; extra == 'rtd' + - sphinx ; extra == 'rtd' + - sphinx-copybutton ; extra == 'rtd' + - sphinx-design ; extra == 'rtd' + - sphinx-book-theme~=1.0 ; extra == 'rtd' + - jupyter-sphinx ; extra == 'rtd' + - ipykernel ; extra == 'rtd' + - coverage ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + - pytest-timeout ; extra == 'testing' + - requests ; extra == 'testing' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl name: psutil version: 7.2.2 @@ -18353,37 +20200,69 @@ packages: - cffi>=1.0.1 ; python_full_version < '3.14' - cffi>=2.0.0b1 ; python_full_version >= '3.14' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b6/48/583c032b79ae5b3daa02225a675aeb673e58d2cb698e78510feceb11958c/gast-0.4.0-py3-none-any.whl - name: gast - version: 0.4.0 - sha256: b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4 - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' -- pypi: https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl - name: parso - version: 0.8.6 - sha256: 2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff - requires_dist: - - pytest ; extra == 'testing' - - docopt ; extra == 'testing' - - flake8==5.0.4 ; extra == 'qa' - - zuban==0.5.1 ; extra == 'qa' - - types-setuptools==67.2.0.1 ; extra == 'qa' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - name: packaging - version: '26.0' - sha256: b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529 - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl name: six version: 1.17.0 sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl + name: json5 + version: 0.14.0 + sha256: 56cf861bab076b1178eb8c92e1311d273a9b9acea2ccc82c276abf839ebaef3a + requires_python: '>=3.8.0' - pypi: https://files.pythonhosted.org/packages/b9/5e/62402bf021183bc6122cb01b8f1be17cac67545713fb30f888f59357a782/gemmi-0.7.5-cp311-cp311-win_amd64.whl name: gemmi version: 0.7.5 sha256: 06cb44f4e3657b7e3a2b23cd40b67a8e7b5d00bfb92ea94cb4060bd47ba50df6 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl + name: ipython + version: 9.13.0 + sha256: 57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201 + requires_dist: + - colorama>=0.4.4 ; sys_platform == 'win32' + - decorator>=5.1.0 + - ipython-pygments-lexers>=1.0.0 + - jedi>=0.18.2 + - matplotlib-inline>=0.1.6 + - pexpect>4.6 ; sys_platform != 'emscripten' and sys_platform != 'win32' + - prompt-toolkit>=3.0.41,<3.1.0 + - psutil>=7 + - pygments>=2.14.0 + - stack-data>=0.6.0 + - traitlets>=5.13.0 + - typing-extensions>=4.6 ; python_full_version < '3.12' + - black ; extra == 'black' + - docrepr ; extra == 'doc' + - exceptiongroup ; extra == 'doc' + - intersphinx-registry ; extra == 'doc' + - ipykernel ; extra == 'doc' + - ipython[matplotlib,test] ; extra == 'doc' + - setuptools>=80.0 ; extra == 'doc' + - sphinx-toml==0.0.4 ; extra == 'doc' + - sphinx-rtd-theme>=0.1.8 ; extra == 'doc' + - sphinx>=8.0 ; extra == 'doc' + - typing-extensions ; extra == 'doc' + - pytest>=7.0.0 ; extra == 'test' + - pytest-asyncio>=1.0.0 ; extra == 'test' + - testpath>=0.2 ; extra == 'test' + - packaging>=23.0.0 ; extra == 'test' + - setuptools>=80.0 ; extra == 'test' + - ipython[test] ; extra == 'test-extra' + - curio ; extra == 'test-extra' + - jupyter-ai ; extra == 'test-extra' + - ipython[matplotlib] ; extra == 'test-extra' + - nbformat ; extra == 'test-extra' + - nbclient ; extra == 'test-extra' + - ipykernel>6.30 ; extra == 'test-extra' + - numpy>=2.0 ; extra == 'test-extra' + - pandas>2.1 ; extra == 'test-extra' + - trio>=0.22.0 ; extra == 'test-extra' + - matplotlib>3.9 ; extra == 'matplotlib' + - ipython[doc,matplotlib,terminal,test,test-extra] ; extra == 'all' + - argcomplete>=3.0 ; extra == 'all' + - types-decorator ; extra == 'all' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl name: dnspython version: 2.8.0 @@ -18418,6 +20297,20 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl + name: numpy + version: 2.4.4 + sha256: 6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl + name: numba + version: 0.65.1 + sha256: df40a5028a975b9ea66f6a2a3f7abbdbd541a863070e34ed367aff21141248e4 + requires_dist: + - llvmlite>=0.47.0.dev0,<0.48 + - numpy>=1.22 + - numpy>=1.22,<2.5 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl name: kiwisolver version: 1.5.0 @@ -18430,55 +20323,37 @@ packages: requires_dist: - numpy>=1.21.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/bf/4a/1472c00392f521fea03ae93408bf445cc7bfa1ab81683faf9bc188e36629/pyarrow-23.0.1-cp311-cp311-macosx_12_0_x86_64.whl - name: pyarrow - version: 23.0.1 - sha256: 0ae6e17c828455b6265d590100c295193f93cc5675eb0af59e49dbd00d2de350 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl - name: jedi - version: 0.19.2 - sha256: a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9 +- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl + name: executing + version: 2.2.1 + sha256: 760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017 requires_dist: - - parso>=0.8.4,<0.9.0 - - jinja2==2.11.3 ; extra == 'docs' - - markupsafe==1.1.1 ; extra == 'docs' - - pygments==2.8.1 ; extra == 'docs' - - alabaster==0.7.12 ; extra == 'docs' - - babel==2.9.1 ; extra == 'docs' - - chardet==4.0.0 ; extra == 'docs' - - commonmark==0.8.1 ; extra == 'docs' - - docutils==0.17.1 ; extra == 'docs' - - future==0.18.2 ; extra == 'docs' - - idna==2.10 ; extra == 'docs' - - imagesize==1.2.0 ; extra == 'docs' - - mock==1.0.1 ; extra == 'docs' - - packaging==20.9 ; extra == 'docs' - - pyparsing==2.4.7 ; extra == 'docs' - - pytz==2021.1 ; extra == 'docs' - - readthedocs-sphinx-ext==2.1.4 ; extra == 'docs' - - recommonmark==0.5.0 ; extra == 'docs' - - requests==2.25.1 ; extra == 'docs' - - six==1.15.0 ; extra == 'docs' - - snowballstemmer==2.1.0 ; extra == 'docs' - - sphinx-rtd-theme==0.4.3 ; extra == 'docs' - - sphinx==1.8.5 ; extra == 'docs' - - sphinxcontrib-serializinghtml==1.1.4 ; extra == 'docs' - - sphinxcontrib-websupport==1.2.4 ; extra == 'docs' - - urllib3==1.26.4 ; extra == 'docs' - - flake8==5.0.4 ; extra == 'qa' - - mypy==0.971 ; extra == 'qa' - - types-setuptools==67.2.0.1 ; extra == 'qa' - - django ; extra == 'testing' - - attrs ; extra == 'testing' - - colorama ; extra == 'testing' - - docopt ; extra == 'testing' - - pytest<9.0.0 ; extra == 'testing' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl + - asttokens>=2.1.0 ; extra == 'tests' + - ipython ; extra == 'tests' + - pytest ; extra == 'tests' + - coverage ; extra == 'tests' + - coverage-enable-subprocess ; extra == 'tests' + - littleutils ; extra == 'tests' + - rich ; python_full_version >= '3.11' and extra == 'tests' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + name: sphinxcontrib-jsmath + version: 1.0.1 + sha256: 2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 + requires_dist: + - pytest ; extra == 'test' + - flake8 ; extra == 'test' + - mypy ; extra == 'test' + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl + name: charset-normalizer + version: 3.4.7 + sha256: 7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/c4/d3/b7da1d5d7dbdc5ef52ed7debd2b484313b832982266905315dad5a0bf0b1/pandas-3.0.2-cp311-cp311-macosx_11_0_arm64.whl name: pandas - version: 3.0.1 - sha256: 24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796 + version: 3.0.2 + sha256: dbbd4aa20ca51e63b53bbde6a0fa4254b1aaabb74d2f542df7a7959feb1d760c requires_dist: - numpy>=1.26.0 ; python_full_version < '3.14' - numpy>=2.3.3 ; python_full_version >= '3.14' @@ -18549,103 +20424,37 @@ packages: - pymysql>=1.1.1 ; extra == 'all' - pyqt5>=5.15.9 ; extra == 'all' - pyreadstat>=1.2.8 ; extra == 'all' - - pytest>=8.3.4 ; extra == 'all' - - pytest-xdist>=3.6.1 ; extra == 'all' - - python-calamine>=0.3.0 ; extra == 'all' - - pytz>=2024.2 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.4.2 ; extra == 'all' - - scipy>=1.14.1 ; extra == 'all' - - s3fs>=2024.10.0 ; extra == 'all' - - sqlalchemy>=2.0.36 ; extra == 'all' - - tables>=3.10.1 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2024.10.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.2.0 ; extra == 'all' - - zstandard>=0.23.0 ; extra == 'all' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - name: executing - version: 2.2.1 - sha256: 760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017 - requires_dist: - - asttokens>=2.1.0 ; extra == 'tests' - - ipython ; extra == 'tests' - - pytest ; extra == 'tests' - - coverage ; extra == 'tests' - - coverage-enable-subprocess ; extra == 'tests' - - littleutils ; extra == 'tests' - - rich ; python_full_version >= '3.11' and extra == 'tests' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/c2/3c/2005227cb951df502412de2fa781f800663cccbef8d90ec6f1b371ac2c0d/python_discovery-1.2.0-py3-none-any.whl - name: python-discovery - version: 1.2.0 - sha256: 1e108f1bbe2ed0ef089823d28805d5ad32be8e734b86a5f212bf89b71c266e4a - requires_dist: - - filelock>=3.15.4 - - platformdirs>=4.3.6,<5 - - furo>=2025.12.19 ; extra == 'docs' - - sphinx-autodoc-typehints>=3.6.3 ; extra == 'docs' - - sphinx>=9.1 ; extra == 'docs' - - sphinxcontrib-mermaid>=2 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'testing' - - coverage>=7.5.4 ; extra == 'testing' - - pytest-mock>=3.14 ; extra == 'testing' - - pytest>=8.3.5 ; extra == 'testing' - - setuptools>=75.1 ; extra == 'testing' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - name: sphinxcontrib-jsmath - version: 1.0.1 - sha256: 2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 - requires_dist: - - pytest ; extra == 'test' - - flake8 ; extra == 'test' - - mypy ; extra == 'test' - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl - name: virtualenv - version: 21.2.0 - sha256: 1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f - requires_dist: - - distlib>=0.3.7,<1 - - filelock>=3.24.2,<4 ; python_full_version >= '3.10' - - filelock>=3.16.1,<=3.19.1 ; python_full_version < '3.10' - - importlib-metadata>=6.6 ; python_full_version < '3.8' - - platformdirs>=3.9.1,<5 - - python-discovery>=1 - - typing-extensions>=4.13.2 ; python_full_version < '3.11' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2024.2 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/c7/6b/6c02f55c2ce2f137ccca0986be7dd89bea31d5bee4346b4377fa3b8586df/ncrystal_core-4.4.2-py3-none-win_amd64.whl + name: ncrystal-core + version: 4.4.2 + sha256: 9b28a90b63849e6a3a807a0a59f7c2ee57e4c64f5643b2dcb6a798ac8ccf666a requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl - name: charset-normalizer - version: 3.4.6 - sha256: a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - name: pygments - version: 2.19.2 - sha256: 86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b - requires_dist: - - colorama>=0.4.6 ; extra == 'windows-terminal' +- pypi: https://files.pythonhosted.org/packages/c7/ea/7988934c8e3e3418aa043f70421817df28d06aef50bfd85f5ad3ec6e70f1/ncrystal_core-4.4.2-py3-none-macosx_11_0_arm64.whl + name: ncrystal-core + version: 4.4.2 + sha256: b7e6101a6850aa18cf441825214381614db444ffcba648de8266fe1c4d1024ce requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - name: tzdata - version: '2025.3' - sha256: 06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 - requires_python: '>=2' - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl name: snowballstemmer version: 3.0.1 sha256: 6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064 requires_python: '!=3.0.*,!=3.1.*,!=3.2.*' -- pypi: https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: pydantic-core - version: 2.41.5 - sha256: f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b - requires_dist: - - typing-extensions>=4.14.1 - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl name: fastjsonschema version: 2.21.2 @@ -18706,6 +20515,23 @@ packages: - webencodings - tinycss2>=1.1.0,<1.5 ; extra == 'css' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/cd/7e/7a5ffa173dd1cffde4f6f41a7dcc8ef4cefdd3bb9cc6cab8341a4802b686/bqplot-0.13.1-py2.py3-none-any.whl + name: bqplot + version: 0.13.1 + sha256: ae6a3bc687c400451524c56e7a05a0f943a0bb38d4e8b065d129a2bcbbd08ddc + requires_dist: + - ipywidgets>=7.5.0,<9 + - traitlets>=4.3.0 + - traittypes>=0.0.6 + - numpy>=1.10.4 + - pandas>=1.0.0 + - bqscales>=0.3.3,<0.4 + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl + name: tzdata + version: '2026.2' + sha256: bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7 + requires_python: '>=2' - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl name: fqdn version: 1.5.1 @@ -18713,6 +20539,11 @@ packages: requires_dist: - cached-property>=1.3.0 ; python_full_version < '3.8' requires_python: '>=2.7,!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,<4' +- pypi: https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: numpy + version: 2.4.4 + sha256: df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502 + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl name: jupyter-server-terminals version: 0.5.4 @@ -18737,6 +20568,11 @@ packages: - pytest-timeout ; extra == 'test' - pytest>=7.0 ; extra == 'test' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d1/bc/8db86617a9a58008acf8913d6fed68ea2a46acb6de928db28d724c891a68/pyarrow-24.0.0-cp311-cp311-macosx_12_0_x86_64.whl + name: pyarrow + version: 24.0.0 + sha256: 1b2fe7f9a5566401a0ef2571f197eb92358925c1f0c8dba305d6e43ea0871bb3 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl name: colorama version: 0.4.6 @@ -18850,11 +20686,156 @@ packages: - nodejs ; extra == 'all' - pythreejs ; extra == 'all' requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl + name: pytest + version: 9.0.3 + sha256: 2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9 + requires_dist: + - colorama>=0.4 ; sys_platform == 'win32' + - exceptiongroup>=1 ; python_full_version < '3.11' + - iniconfig>=1.0.1 + - packaging>=22 + - pluggy>=1.5,<2 + - pygments>=2.7.2 + - tomli>=1 ; python_full_version < '3.11' + - argcomplete ; extra == 'dev' + - attrs>=19.2 ; extra == 'dev' + - hypothesis>=3.56 ; extra == 'dev' + - mock ; extra == 'dev' + - requests ; extra == 'dev' + - setuptools ; extra == 'dev' + - xmlschema ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl + name: fsspec + version: 2026.4.0 + sha256: 11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2 + requires_dist: + - adlfs ; extra == 'abfs' + - adlfs ; extra == 'adl' + - pyarrow>=1 ; extra == 'arrow' + - dask ; extra == 'dask' + - distributed ; extra == 'dask' + - pre-commit ; extra == 'dev' + - ruff>=0.5 ; extra == 'dev' + - numpydoc ; extra == 'doc' + - sphinx ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - yarl ; extra == 'doc' + - dropbox ; extra == 'dropbox' + - dropboxdrivefs ; extra == 'dropbox' + - requests ; extra == 'dropbox' + - adlfs ; extra == 'full' + - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'full' + - dask ; extra == 'full' + - distributed ; extra == 'full' + - dropbox ; extra == 'full' + - dropboxdrivefs ; extra == 'full' + - fusepy ; extra == 'full' + - gcsfs>2024.2.0 ; extra == 'full' + - libarchive-c ; extra == 'full' + - ocifs ; extra == 'full' + - panel ; extra == 'full' + - paramiko ; extra == 'full' + - pyarrow>=1 ; extra == 'full' + - pygit2 ; extra == 'full' + - requests ; extra == 'full' + - s3fs>2024.2.0 ; extra == 'full' + - smbprotocol ; extra == 'full' + - tqdm ; extra == 'full' + - fusepy ; extra == 'fuse' + - gcsfs>2024.2.0 ; extra == 'gcs' + - pygit2 ; extra == 'git' + - requests ; extra == 'github' + - gcsfs ; extra == 'gs' + - panel ; extra == 'gui' + - pyarrow>=1 ; extra == 'hdfs' + - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'http' + - libarchive-c ; extra == 'libarchive' + - ocifs ; extra == 'oci' + - s3fs>2024.2.0 ; extra == 's3' + - paramiko ; extra == 'sftp' + - smbprotocol ; extra == 'smb' + - paramiko ; extra == 'ssh' + - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test' + - numpy ; extra == 'test' + - pytest ; extra == 'test' + - pytest-asyncio!=0.22.0 ; extra == 'test' + - pytest-benchmark ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-recording ; extra == 'test' + - pytest-rerunfailures ; extra == 'test' + - requests ; extra == 'test' + - aiobotocore>=2.5.4,<3.0.0 ; extra == 'test-downstream' + - dask[dataframe,test] ; extra == 'test-downstream' + - moto[server]>4,<5 ; extra == 'test-downstream' + - pytest-timeout ; extra == 'test-downstream' + - xarray ; extra == 'test-downstream' + - adlfs ; extra == 'test-full' + - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test-full' + - backports-zstd ; python_full_version < '3.14' and extra == 'test-full' + - cloudpickle ; extra == 'test-full' + - dask ; extra == 'test-full' + - distributed ; extra == 'test-full' + - dropbox ; extra == 'test-full' + - dropboxdrivefs ; extra == 'test-full' + - fastparquet ; extra == 'test-full' + - fusepy ; extra == 'test-full' + - gcsfs ; extra == 'test-full' + - jinja2 ; extra == 'test-full' + - kerchunk ; extra == 'test-full' + - libarchive-c ; extra == 'test-full' + - lz4 ; extra == 'test-full' + - notebook ; extra == 'test-full' + - numpy ; extra == 'test-full' + - ocifs ; extra == 'test-full' + - pandas<3.0.0 ; extra == 'test-full' + - panel ; extra == 'test-full' + - paramiko ; extra == 'test-full' + - pyarrow ; extra == 'test-full' + - pyarrow>=1 ; extra == 'test-full' + - pyftpdlib ; extra == 'test-full' + - pygit2 ; extra == 'test-full' + - pytest ; extra == 'test-full' + - pytest-asyncio!=0.22.0 ; extra == 'test-full' + - pytest-benchmark ; extra == 'test-full' + - pytest-cov ; extra == 'test-full' + - pytest-mock ; extra == 'test-full' + - pytest-recording ; extra == 'test-full' + - pytest-rerunfailures ; extra == 'test-full' + - python-snappy ; extra == 'test-full' + - requests ; extra == 'test-full' + - smbprotocol ; extra == 'test-full' + - tqdm ; extra == 'test-full' + - urllib3 ; extra == 'test-full' + - zarr ; extra == 'test-full' + - zstandard ; python_full_version < '3.14' and extra == 'test-full' + - tqdm ; extra == 'tqdm' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl name: debugpy version: 1.8.20 sha256: 1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d6/91/0cdf9e33be15c4437d2e5e00c43ec357deaab5bde911c3120927119aaac1/ncrystal_core-4.4.2-py3-none-macosx_10_9_x86_64.whl + name: ncrystal-core + version: 4.4.2 + sha256: 648d1f7227fbd5a0e2b8b82695a23b243ed63b25ed2d6f3061e4c4e84186f21f + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + name: requests + version: 2.33.1 + sha256: 4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a + requires_dist: + - charset-normalizer>=2,<4 + - idna>=2.5,<4 + - urllib3>=1.26,<3 + - certifi>=2023.5.7 + - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' + - chardet>=3.0.2,<8 ; extra == 'use-chardet-on-py3' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: cffi version: 2.0.0 @@ -18862,11 +20843,6 @@ packages: requires_dist: - pycparser ; implementation_name != 'PyPy' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl - name: json5 - version: 0.13.0 - sha256: 9a08e1dd65f6a4d4c6fa82d216cf2477349ec2346a38fd70cc11d2557499fbcc - requires_python: '>=3.8.0' - pypi: https://files.pythonhosted.org/packages/d8/8b/e2bbeb42068f0c48899e8eddd34902afc0f7429d4d2a152d2dc2670dc661/pythreejs-2.4.2-py3-none-any.whl name: pythreejs version: 2.4.2 @@ -18905,6 +20881,22 @@ packages: - typing-extensions>=4.5 ; python_full_version < '3.13' - trio>=0.32.0 ; extra == 'trio' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + name: traitlets + version: 5.15.0 + sha256: fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40 + requires_dist: + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx ; extra == 'docs' + - argcomplete>=3.0.3 ; extra == 'test' + - mypy>=1.7.0,<1.19 ; platform_python_implementation == 'PyPy' and extra == 'test' + - mypy>=1.7.0 ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-mypy-testing ; extra == 'test' + - pytest>=7.0,<8.2 ; extra == 'test' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: msgpack version: 1.1.2 @@ -18932,6 +20924,13 @@ packages: requires_dist: - typing-extensions>=4.12.0 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/dc/b7/901d837999a9350a7773289f7760cb473d4ba01fdc6ebae0ff2553d269ac/ncrystal_python-4.4.2-py3-none-any.whl + name: ncrystal-python + version: 4.4.2 + sha256: f419318d088fade6bcff1e39e15baf6fe69fcf5306dd681fca1106d1f63a89ce + requires_dist: + - numpy>=1.22 + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl name: email-validator version: 2.3.0 @@ -18940,6 +20939,11 @@ packages: - dnspython>=2.0.0 - idna>=2.0.0 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + name: packaging + version: '26.2' + sha256: 5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl name: jupyterlab-server version: 2.28.0 @@ -18980,93 +20984,82 @@ packages: requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl name: debugpy - version: 1.8.20 - sha256: 5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e1/1b/dad6fdcc658ed7af26fdf3841e7394072c9549a8b896c381ab49dd11e2d9/jupyterlab-4.5.6-py3-none-any.whl - name: jupyterlab - version: 4.5.6 - sha256: d6b3dac883aa4d9993348e0f8e95b24624f75099aed64eab6a4351a9cdd1e580 - requires_dist: - - async-lru>=1.0.0 - - httpx>=0.25.0,<1 - - importlib-metadata>=4.8.3 ; python_full_version < '3.10' - - ipykernel>=6.5.0,!=6.30.0 - - jinja2>=3.0.3 - - jupyter-core - - jupyter-lsp>=2.0.0 - - jupyter-server>=2.4.0,<3 - - jupyterlab-server>=2.28.0,<3 - - notebook-shim>=0.2 - - packaging - - setuptools>=41.1.0 - - tomli>=1.2.2 ; python_full_version < '3.11' - - tornado>=6.2.0 - - traitlets - - build ; extra == 'dev' - - bump2version ; extra == 'dev' - - coverage ; extra == 'dev' - - hatch ; extra == 'dev' - - pre-commit ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - ruff==0.11.12 ; extra == 'dev' - - jsx-lexer ; extra == 'docs' - - myst-parser ; extra == 'docs' - - pydata-sphinx-theme>=0.13.0 ; extra == 'docs' - - pytest ; extra == 'docs' - - pytest-check-links ; extra == 'docs' - - pytest-jupyter ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx>=1.8,<8.2.0 ; extra == 'docs' - - altair==6.0.0 ; extra == 'docs-screenshots' - - ipython==8.16.1 ; extra == 'docs-screenshots' - - ipywidgets==8.1.5 ; extra == 'docs-screenshots' - - jupyterlab-geojson==3.4.0 ; extra == 'docs-screenshots' - - jupyterlab-language-pack-zh-cn==4.3.post1 ; extra == 'docs-screenshots' - - matplotlib==3.10.0 ; extra == 'docs-screenshots' - - nbconvert>=7.0.0 ; extra == 'docs-screenshots' - - pandas==2.2.3 ; extra == 'docs-screenshots' - - scipy==1.15.1 ; extra == 'docs-screenshots' - - coverage ; extra == 'test' - - pytest-check-links>=0.7 ; extra == 'test' - - pytest-console-scripts ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-jupyter>=0.5.3 ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest-tornasync ; extra == 'test' - - pytest>=7.0 ; extra == 'test' - - requests ; extra == 'test' - - requests-cache ; extra == 'test' - - virtualenv ; extra == 'test' - - copier>=9,<10 ; extra == 'upgrade-extension' - - jinja2-time<0.3 ; extra == 'upgrade-extension' - - pydantic<3.0 ; extra == 'upgrade-extension' - - pyyaml-include<3.0 ; extra == 'upgrade-extension' - - tomli-w<2.0 ; extra == 'upgrade-extension' - requires_python: '>=3.9' + version: 1.8.20 + sha256: 5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7 + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl name: markupsafe version: 3.0.3 sha256: 4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl + name: jupyter-server + version: 2.18.2 + sha256: fa5e46539ded65791838035a2b6001f13e54d5f64b8b3752eb1e91fdd641a5b8 + requires_dist: + - anyio>=3.1.0 + - argon2-cffi>=21.1 + - jinja2>=3.0.3 + - jupyter-client>=7.4.4 + - jupyter-core>=4.12,!=5.0.* + - jupyter-events>=0.11.0 + - jupyter-server-terminals>=0.4.4 + - nbconvert>=6.4.4 + - nbformat>=5.3.0 + - overrides>=5.0 ; python_full_version < '3.12' + - packaging>=22.0 + - prometheus-client>=0.9 + - pywinpty>=2.0.1 ; os_name == 'nt' + - pyzmq>=24 + - send2trash>=1.8.2 + - terminado>=0.8.3 + - tornado>=6.2.0 + - traitlets>=5.6.0 + - websocket-client>=1.7 + - ipykernel ; extra == 'docs' + - jinja2 ; extra == 'docs' + - jupyter-client ; extra == 'docs' + - myst-parser ; extra == 'docs' + - nbformat ; extra == 'docs' + - prometheus-client ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - send2trash ; extra == 'docs' + - sphinx-autodoc-typehints ; extra == 'docs' + - sphinx<9.0 ; extra == 'docs' + - sphinxcontrib-github-alt ; extra == 'docs' + - sphinxcontrib-openapi>=0.8.0 ; extra == 'docs' + - sphinxcontrib-spelling ; extra == 'docs' + - sphinxemoji ; extra == 'docs' + - tornado ; extra == 'docs' + - typing-extensions ; extra == 'docs' + - flaky ; extra == 'test' + - ipykernel ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest-console-scripts ; extra == 'test' + - pytest-jupyter[server]>=0.7 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest>=7.0,<9 ; extra == 'test' + - requests ; extra == 'test' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/e2/bc/2cb8c78300ce1ace4eeac3b3522218cea2c2053bfa6b4e32cc972a477f9a/pydata_sphinx_theme-0.17.1-py3-none-any.whl name: pydata-sphinx-theme - version: 0.16.1 - sha256: 225331e8ac4b32682c18fcac5a57a6f717c4e632cea5dd0e247b55155faeccde + version: 0.17.1 + sha256: 320b022d7808bdf5920d9a28e573f27aace9b23e1af6ca103eecc752411df492 requires_dist: - - sphinx>=6.1 + - sphinx>=7.0,<10 - beautifulsoup4 - docutils!=0.17.0 - babel - pygments>=2.7 - accessible-pygments - typing-extensions + - astroid>=3,!=4.0.3 ; extra == 'doc' - numpydoc ; extra == 'doc' - linkify-it-py ; extra == 'doc' - rich ; extra == 'doc' - sphinxext-rediraffe ; extra == 'doc' - - sphinx-sitemap ; extra == 'doc' - - sphinx-autoapi>=3.0.0 ; extra == 'doc' + - sphinx-sitemap<2.7.0 ; extra == 'doc' + - sphinx-autoapi==3.6.1 ; extra == 'doc' - myst-parser ; extra == 'doc' - ablog>=0.11.8 ; extra == 'doc' - jupyter-sphinx ; extra == 'doc' @@ -19079,6 +21072,7 @@ packages: - sphinx-design ; extra == 'doc' - sphinx-togglebutton ; extra == 'doc' - jupyterlite-sphinx ; extra == 'doc' + - sphinxcontrib-mermaid ; extra == 'doc' - sphinxcontrib-youtube>=1.4.1 ; extra == 'doc' - sphinx-favicon>=1.0.1 ; extra == 'doc' - ipykernel ; extra == 'doc' @@ -19087,47 +21081,21 @@ packages: - colorama ; extra == 'doc' - ipywidgets ; extra == 'doc' - graphviz ; extra == 'doc' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-regressions ; extra == 'test' - - sphinx[test] ; extra == 'test' - pyyaml ; extra == 'dev' - pre-commit ; extra == 'dev' - pydata-sphinx-theme[doc,test] ; extra == 'dev' - tox ; extra == 'dev' - pandoc ; extra == 'dev' - sphinx-theme-builder[cli] ; extra == 'dev' - - pytest-playwright ; extra == 'a11y' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-regressions ; extra == 'test' + - sphinx[test] ; extra == 'test' + - pytest-playwright ; extra == 'test' + - pydata-sphinx-theme[test] ; extra == 'a11y' - babel ; extra == 'i18n' - jinja2 ; extra == 'i18n' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl - name: jupyter-events - version: 0.12.0 - sha256: 6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb - requires_dist: - - jsonschema[format-nongpl]>=4.18.0 - - packaging - - python-json-logger>=2.0.4 - - pyyaml>=5.3 - - referencing - - rfc3339-validator - - rfc3986-validator>=0.1.1 - - traitlets>=5.3 - - click ; extra == 'cli' - - rich ; extra == 'cli' - - jupyterlite-sphinx ; extra == 'docs' - - myst-parser ; extra == 'docs' - - pydata-sphinx-theme>=0.16 ; extra == 'docs' - - sphinx>=8 ; extra == 'docs' - - sphinxcontrib-spelling ; extra == 'docs' - - click ; extra == 'test' - - pre-commit ; extra == 'test' - - pytest-asyncio>=0.19.0 ; extra == 'test' - - pytest-console-scripts ; extra == 'test' - - pytest>=7.0 ; extra == 'test' - - rich ; extra == 'test' - requires_python: '>=3.9' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl name: argon2-cffi-bindings version: 25.1.0 @@ -19147,6 +21115,37 @@ packages: sha256: 744dc1a02c3ec26df8a5ecd87d085a67dc8232a1def6048834403ddcf3b64143 requires_dist: - ipywidgets>=7.5.0,<9 +- pypi: https://files.pythonhosted.org/packages/e4/bc/daa30c02069eeac5b9198985ba42f5d65ca71bed6705b18329e51d352b7c/plopp-26.4.2-py3-none-any.whl + name: plopp + version: 26.4.2 + sha256: 5cab99bb0905ce08a1d1d7d82f0f64cee7d594269ec1bd01a8a361bd14ab7bff + requires_dist: + - lazy-loader>=0.4 + - matplotlib>=3.8 + - scipp>=25.8.0 ; extra == 'scipp' + - plopp[scipp] ; extra == 'all' + - ipympl>0.8.4 ; extra == 'all' + - pythreejs>=2.4.1 ; extra == 'all' + - mpltoolbox>=24.6.0 ; extra == 'all' + - ipywidgets>=8.1.0 ; extra == 'all' + - graphviz>=0.20.3 ; extra == 'all' + - plopp[scipp] ; extra == 'test' + - graphviz>=0.20.3 ; extra == 'test' + - h5py>=3.12 ; extra == 'test' + - ipympl>=0.8.4 ; extra == 'test' + - ipywidgets>=8.1.0 ; extra == 'test' + - ipykernel>=6.26,<7 ; extra == 'test' + - mpltoolbox>=24.6.0 ; extra == 'test' + - pandas>=2.2.2 ; extra == 'test' + - plotly>=5.15.0 ; extra == 'test' + - pooch>=1.5 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'test' + - pytest>=8.0 ; extra == 'test' + - pythreejs>=2.4.1 ; extra == 'test' + - scipy>=1.10.0 ; extra == 'test' + - xarray>=2024.5.0 ; extra == 'test' + - anywidget>=0.9.0 ; extra == 'test' + requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl name: async-lru version: 2.3.0 @@ -19191,114 +21190,6 @@ packages: - pytest ; extra == 'test' - ruff ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl - name: fsspec - version: 2026.2.0 - sha256: 98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437 - requires_dist: - - adlfs ; extra == 'abfs' - - adlfs ; extra == 'adl' - - pyarrow>=1 ; extra == 'arrow' - - dask ; extra == 'dask' - - distributed ; extra == 'dask' - - pre-commit ; extra == 'dev' - - ruff>=0.5 ; extra == 'dev' - - numpydoc ; extra == 'doc' - - sphinx ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinx-rtd-theme ; extra == 'doc' - - yarl ; extra == 'doc' - - dropbox ; extra == 'dropbox' - - dropboxdrivefs ; extra == 'dropbox' - - requests ; extra == 'dropbox' - - adlfs ; extra == 'full' - - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'full' - - dask ; extra == 'full' - - distributed ; extra == 'full' - - dropbox ; extra == 'full' - - dropboxdrivefs ; extra == 'full' - - fusepy ; extra == 'full' - - gcsfs>2024.2.0 ; extra == 'full' - - libarchive-c ; extra == 'full' - - ocifs ; extra == 'full' - - panel ; extra == 'full' - - paramiko ; extra == 'full' - - pyarrow>=1 ; extra == 'full' - - pygit2 ; extra == 'full' - - requests ; extra == 'full' - - s3fs>2024.2.0 ; extra == 'full' - - smbprotocol ; extra == 'full' - - tqdm ; extra == 'full' - - fusepy ; extra == 'fuse' - - gcsfs>2024.2.0 ; extra == 'gcs' - - pygit2 ; extra == 'git' - - requests ; extra == 'github' - - gcsfs ; extra == 'gs' - - panel ; extra == 'gui' - - pyarrow>=1 ; extra == 'hdfs' - - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'http' - - libarchive-c ; extra == 'libarchive' - - ocifs ; extra == 'oci' - - s3fs>2024.2.0 ; extra == 's3' - - paramiko ; extra == 'sftp' - - smbprotocol ; extra == 'smb' - - paramiko ; extra == 'ssh' - - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test' - - numpy ; extra == 'test' - - pytest ; extra == 'test' - - pytest-asyncio!=0.22.0 ; extra == 'test' - - pytest-benchmark ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-mock ; extra == 'test' - - pytest-recording ; extra == 'test' - - pytest-rerunfailures ; extra == 'test' - - requests ; extra == 'test' - - aiobotocore>=2.5.4,<3.0.0 ; extra == 'test-downstream' - - dask[dataframe,test] ; extra == 'test-downstream' - - moto[server]>4,<5 ; extra == 'test-downstream' - - pytest-timeout ; extra == 'test-downstream' - - xarray ; extra == 'test-downstream' - - adlfs ; extra == 'test-full' - - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test-full' - - backports-zstd ; python_full_version < '3.14' and extra == 'test-full' - - cloudpickle ; extra == 'test-full' - - dask ; extra == 'test-full' - - distributed ; extra == 'test-full' - - dropbox ; extra == 'test-full' - - dropboxdrivefs ; extra == 'test-full' - - fastparquet ; extra == 'test-full' - - fusepy ; extra == 'test-full' - - gcsfs ; extra == 'test-full' - - jinja2 ; extra == 'test-full' - - kerchunk ; extra == 'test-full' - - libarchive-c ; extra == 'test-full' - - lz4 ; extra == 'test-full' - - notebook ; extra == 'test-full' - - numpy ; extra == 'test-full' - - ocifs ; extra == 'test-full' - - pandas<3.0.0 ; extra == 'test-full' - - panel ; extra == 'test-full' - - paramiko ; extra == 'test-full' - - pyarrow ; extra == 'test-full' - - pyarrow>=1 ; extra == 'test-full' - - pyftpdlib ; extra == 'test-full' - - pygit2 ; extra == 'test-full' - - pytest ; extra == 'test-full' - - pytest-asyncio!=0.22.0 ; extra == 'test-full' - - pytest-benchmark ; extra == 'test-full' - - pytest-cov ; extra == 'test-full' - - pytest-mock ; extra == 'test-full' - - pytest-recording ; extra == 'test-full' - - pytest-rerunfailures ; extra == 'test-full' - - python-snappy ; extra == 'test-full' - - requests ; extra == 'test-full' - - smbprotocol ; extra == 'test-full' - - tqdm ; extra == 'test-full' - - urllib3 ; extra == 'test-full' - - zarr ; extra == 'test-full' - - zstandard ; python_full_version < '3.14' and extra == 'test-full' - - tqdm ; extra == 'tqdm' - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl name: uri-template version: 1.3.0 @@ -19387,26 +21278,83 @@ packages: version: 5.9.1 sha256: ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407 requires_dist: - - platformdirs>=2.5 + - platformdirs>=2.5 + - traitlets>=5.3 + - intersphinx-registry ; extra == 'docs' + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx-autodoc-typehints ; extra == 'docs' + - sphinxcontrib-spelling ; extra == 'docs' + - traitlets ; extra == 'docs' + - ipykernel ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest<9 ; extra == 'test' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: ruff + version: 0.15.12 + sha256: 83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: pillow + version: 12.2.0 + sha256: e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl + name: jupyter-events + version: 0.12.1 + sha256: c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf + requires_dist: + - jsonschema[format-nongpl]>=4.18.0 + - packaging + - python-json-logger>=2.0.4 + - pyyaml>=5.3 + - referencing + - rfc3339-validator + - rfc3986-validator>=0.1.1 - traitlets>=5.3 - - intersphinx-registry ; extra == 'docs' + - click ; extra == 'cli' + - rich ; extra == 'cli' + - jupyterlite-sphinx ; extra == 'docs' - myst-parser ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - sphinx-autodoc-typehints ; extra == 'docs' + - pydata-sphinx-theme>=0.16 ; extra == 'docs' + - sphinx>=8 ; extra == 'docs' - sphinxcontrib-spelling ; extra == 'docs' - - traitlets ; extra == 'docs' - - ipykernel ; extra == 'test' + - click ; extra == 'test' - pre-commit ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest<9 ; extra == 'test' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl - name: pydantic-core - version: 2.41.5 - sha256: a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6 - requires_dist: - - typing-extensions>=4.14.1 + - pytest-asyncio>=0.19.0 ; extra == 'test' + - pytest-console-scripts ; extra == 'test' + - pytest>=7.0 ; extra == 'test' + - rich ; extra == 'test' requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl name: python-dateutil @@ -19480,16 +21428,16 @@ packages: - pytz==2025.2 ; extra == 'test' - simplejson==3.* ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl - name: numpy - version: 2.4.3 - sha256: a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920 - requires_python: '>=3.11' - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl name: pandocfilters version: 1.5.1 sha256: 93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- pypi: https://files.pythonhosted.org/packages/f1/2c/3850985d4c64048dec7b826f8a803e135b52b11b4c81c9cd4326b1ca15ab/ncrystal_core-4.4.2-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: ncrystal-core + version: 4.4.2 + sha256: d0d9c47cd017b7cefc52dde50546d7c151bfdd75d345e42e2b3e74ab5fe83c62 + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/f1/5b/e63c877c4c94382b66de5045e08ec8cd960e8a4d22f0d62a4dfb1f9e5ac6/ipydatawidgets-4.3.5-py2.py3-none-any.whl name: ipydatawidgets version: 4.3.5 @@ -19518,10 +21466,22 @@ packages: - pygments ; extra == 'tests' - littleutils ; extra == 'tests' - cython ; extra == 'tests' +- pypi: https://files.pythonhosted.org/packages/f3/27/99c42abe8e21b44f4917f62631f3aa31404882a2c41d8a4cd5c110e13d52/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + name: pyarrow + version: 24.0.0 + sha256: 14e31a3c9e35f1ab6356c6378f6f72830e6d2d5f1791df3774a7b097d18a6a1e + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl name: webencodings version: 0.5.1 sha256: a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 +- pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + name: pygments + version: 2.20.0 + sha256: 81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176 + requires_dist: + - colorama>=0.4.6 ; extra == 'windows-terminal' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl name: tof version: 26.3.0 @@ -19534,6 +21494,15 @@ packages: - pytest>=8.0 ; extra == 'test' - scippneutron>=24.12.0 ; extra == 'test' requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz + name: numba + version: 0.65.1 + sha256: 19357146c32fe9ed25059ab915e8465fb13951cf6b0aace3826b76886373ab23 + requires_dist: + - llvmlite>=0.47.0.dev0,<0.48 + - numpy>=1.22 + - numpy>=1.22,<2.5 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/f6/ca/270d463f6c34f539bb55acdab14099c092d3be28c8af64d61399aa07610c/spglib-2.6.0-cp311-cp311-macosx_11_0_arm64.whl name: spglib version: 2.6.0 @@ -19600,6 +21569,38 @@ packages: - pytest-timeout ; extra == 'test' - pytest>=7.0,<9 ; extra == 'test' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f7/00/bbca25f8a2372465cdf93138c1e1e38dff045fb0afef1488f395d0afcb3b/ncrystal-4.4.2-py3-none-any.whl + name: ncrystal + version: 4.4.2 + sha256: e02fa7d743addc3fbea23287737a88b8d01192450fdca51554d3f9032fe4617c + requires_dist: + - ncrystal-core==4.4.2 + - ncrystal-python==4.4.2 + - spglib>=2.1.0 ; extra == 'composer' + - ase>=3.23.0 ; extra == 'cif' + - gemmi>=0.6.1 ; extra == 'cif' + - spglib>=2.1.0 ; extra == 'cif' + - endf-parserpy>=0.14.3 ; extra == 'endf' + - matplotlib>=3.6.0 ; extra == 'plot' + - ase>=3.23.0 ; extra == 'all' + - endf-parserpy>=0.14.3 ; extra == 'all' + - gemmi>=0.6.1 ; extra == 'all' + - matplotlib>=3.6.0 ; extra == 'all' + - spglib>=2.1.0 ; extra == 'all' + - pyyaml>=6.0.0 ; extra == 'devel' + - ase>=3.23.0 ; extra == 'devel' + - cppcheck ; extra == 'devel' + - endf-parserpy>=0.14.3 ; extra == 'devel' + - gemmi>=0.6.1 ; extra == 'devel' + - matplotlib>=3.6.0 ; extra == 'devel' + - mpmath>=1.3.0 ; extra == 'devel' + - numpy>=1.22 ; extra == 'devel' + - pybind11>=2.11.0 ; extra == 'devel' + - ruff>=0.8.1 ; extra == 'devel' + - simple-build-system>=1.6.0 ; extra == 'devel' + - spglib>=2.1.0 ; extra == 'devel' + - tomli>=2.0.0 ; python_full_version < '3.11' and extra == 'devel' + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl name: h5py version: 3.16.0 @@ -19612,24 +21613,10 @@ packages: version: 0.30.0 sha256: 33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl - name: matplotlib - version: 3.10.8 - sha256: 6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=3 - - python-dateutil>=2.7 - - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' - - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' +- pypi: https://files.pythonhosted.org/packages/f8/d2/4d1bbba65320b21a49678d6fbdc6ff7c649251359fdcfc03568c4136231d/pyarrow-24.0.0-cp311-cp311-win_amd64.whl + name: pyarrow + version: 24.0.0 + sha256: 35405aecb474e683fb36af650618fd5340ee5471fc65a21b36076a18bbc6c981 requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl name: notebook-shim @@ -19652,158 +21639,18 @@ packages: version: 1.1.0 sha256: 15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-py3-none-any.whl - name: scippneutron - version: 26.3.0 - sha256: 6bc9e36f68059bb792460cc897e6247236289f170134a953ed9fee8578872dd7 - requires_dist: - - python-dateutil>=2.8 - - email-validator>=2 - - h5py>=3.12 - - lazy-loader>=0.4 - - mpltoolbox>=24.6.0 - - numpy>=1.20 - - plopp>=24.9.1 - - pydantic>=2 - - scipp>=24.7.0 - - scippnexus>=23.11.0 - - scipy>=1.7.0 - - scipp[all]>=23.7.0 ; extra == 'all' - - pooch>=1.5 ; extra == 'all' - - hypothesis>=6.100 ; extra == 'test' - - ipympl>0.9.0 ; extra == 'test' - - ipykernel>6.30 ; extra == 'test' - - pace-neutrons>=0.3 ; extra == 'test' - - pooch>=1.5 ; extra == 'test' - - psutil>=5.0 ; extra == 'test' - - pytest>=7.0 ; extra == 'test' - - pytest-xdist>=3.0 ; extra == 'test' - - pythreejs>=2.4.1 ; extra == 'test' - - sciline>=25.1.0 ; extra == 'test' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl - name: mdit-py-plugins - version: 0.5.0 - sha256: 07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f - requires_dist: - - markdown-it-py>=2.0.0,<5.0.0 - - pre-commit ; extra == 'code-style' - - myst-parser ; extra == 'rtd' - - sphinx-book-theme ; extra == 'rtd' - - coverage ; extra == 'testing' - - pytest ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-regressions ; extra == 'testing' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl - name: matplotlib - version: 3.10.8 - sha256: a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.3.1 - - numpy>=1.23 - - packaging>=20.0 - - pillow>=8 - - pyparsing>=3 - - python-dateutil>=2.7 - - meson-python>=0.13.1,<0.17.0 ; extra == 'dev' - - pybind11>=2.13.2,!=2.13.3 ; extra == 'dev' - - setuptools-scm>=7 ; extra == 'dev' - - setuptools>=64 ; extra == 'dev' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl - name: pandas - version: 3.0.1 - sha256: de09668c1bf3b925c07e5762291602f0d789eca1b3a781f99c1c78f6cac0e7ea +- pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + name: pydantic + version: 2.13.4 + sha256: 45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba requires_dist: - - numpy>=1.26.0 ; python_full_version < '3.14' - - numpy>=2.3.3 ; python_full_version >= '3.14' - - python-dateutil>=2.8.2 - - tzdata ; sys_platform == 'win32' - - tzdata ; sys_platform == 'emscripten' - - hypothesis>=6.116.0 ; extra == 'test' - - pytest>=8.3.4 ; extra == 'test' - - pytest-xdist>=3.6.1 ; extra == 'test' - - pyarrow>=13.0.0 ; extra == 'pyarrow' - - bottleneck>=1.4.2 ; extra == 'performance' - - numba>=0.60.0 ; extra == 'performance' - - numexpr>=2.10.2 ; extra == 'performance' - - scipy>=1.14.1 ; extra == 'computation' - - xarray>=2024.10.0 ; extra == 'computation' - - fsspec>=2024.10.0 ; extra == 'fss' - - s3fs>=2024.10.0 ; extra == 'aws' - - gcsfs>=2024.10.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.5 ; extra == 'excel' - - python-calamine>=0.3.0 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.2.0 ; extra == 'excel' - - pyarrow>=13.0.0 ; extra == 'parquet' - - pyarrow>=13.0.0 ; extra == 'feather' - - pyiceberg>=0.8.1 ; extra == 'iceberg' - - tables>=3.10.1 ; extra == 'hdf5' - - pyreadstat>=1.2.8 ; extra == 'spss' - - sqlalchemy>=2.0.36 ; extra == 'postgresql' - - psycopg2>=2.9.10 ; extra == 'postgresql' - - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.36 ; extra == 'mysql' - - pymysql>=1.1.1 ; extra == 'mysql' - - sqlalchemy>=2.0.36 ; extra == 'sql-other' - - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' - - beautifulsoup4>=4.12.3 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=5.3.0 ; extra == 'html' - - lxml>=5.3.0 ; extra == 'xml' - - matplotlib>=3.9.3 ; extra == 'plot' - - jinja2>=3.1.5 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.4.2 ; extra == 'clipboard' - - zstandard>=0.23.0 ; extra == 'compression' - - pytz>=2024.2 ; extra == 'timezone' - - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - - beautifulsoup4>=4.12.3 ; extra == 'all' - - bottleneck>=1.4.2 ; extra == 'all' - - fastparquet>=2024.11.0 ; extra == 'all' - - fsspec>=2024.10.0 ; extra == 'all' - - gcsfs>=2024.10.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.116.0 ; extra == 'all' - - jinja2>=3.1.5 ; extra == 'all' - - lxml>=5.3.0 ; extra == 'all' - - matplotlib>=3.9.3 ; extra == 'all' - - numba>=0.60.0 ; extra == 'all' - - numexpr>=2.10.2 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.5 ; extra == 'all' - - psycopg2>=2.9.10 ; extra == 'all' - - pyarrow>=13.0.0 ; extra == 'all' - - pyiceberg>=0.8.1 ; extra == 'all' - - pymysql>=1.1.1 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.8 ; extra == 'all' - - pytest>=8.3.4 ; extra == 'all' - - pytest-xdist>=3.6.1 ; extra == 'all' - - python-calamine>=0.3.0 ; extra == 'all' - - pytz>=2024.2 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.4.2 ; extra == 'all' - - scipy>=1.14.1 ; extra == 'all' - - s3fs>=2024.10.0 ; extra == 'all' - - sqlalchemy>=2.0.36 ; extra == 'all' - - tables>=3.10.1 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2024.10.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.2.0 ; extra == 'all' - - zstandard>=0.23.0 ; extra == 'all' - requires_python: '>=3.11' + - annotated-types>=0.6.0 + - pydantic-core==2.46.4 + - typing-extensions>=4.14.1 + - typing-inspection>=0.4.2 + - email-validator>=2.0.0 ; extra == 'email' + - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone' + requires_python: '>=3.9' - pypi: packages/essdiffraction name: essdiffraction requires_dist: @@ -20010,3 +21857,31 @@ packages: - sphinx-design ; extra == 'docs' - tof ; extra == 'docs' requires_python: '>=3.11' +- pypi: packages/essspectroscopy + name: essspectroscopy + requires_dist: + - essreduce>=26.4.1 + - graphviz>=0.20 + - pandas>=2.1.2 + - sciline>=25.4.1 + - scipp>=26.1.0 + - scippneutron>=25.11.2 + - scippnexus>=24.9.0 + - tof>=25.11.0 + - pooch>=1.5 ; extra == 'test' + - pytest>=7.0 ; extra == 'test' + - autodoc-pydantic ; extra == 'docs' + - ipykernel ; extra == 'docs' + - ipympl ; extra == 'docs' + - ipython!=8.7.0 ; extra == 'docs' + - ipywidgets ; extra == 'docs' + - myst-parser ; extra == 'docs' + - nbsphinx ; extra == 'docs' + - pandas ; extra == 'docs' + - pooch ; extra == 'docs' + - pydata-sphinx-theme>=0.14 ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-autodoc-typehints ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-design ; extra == 'docs' + requires_python: '>=3.11' diff --git a/pixi.toml b/pixi.toml index db6eed47c..d96e2daf3 100644 --- a/pixi.toml +++ b/pixi.toml @@ -43,6 +43,10 @@ essdiffraction = { path = "packages/essdiffraction", editable = true, extras = [ [feature.esssans.pypi-dependencies] esssans = { path = "packages/esssans", editable = true, extras = ["test"] } +# essspectroscopy (depends on essreduce) +[feature.essspectroscopy.pypi-dependencies] +essspectroscopy = { path = "packages/essspectroscopy", editable = true, extras = ["test"] } + # ==================== Dev feature ==================== [feature.dev.pypi-dependencies] @@ -105,11 +109,17 @@ esssans = { path = "packages/esssans", editable = true, extras = ["test", "docs" [feature.docs-esssans.tasks.docs-esssans] cmd = "python -m sphinx -v -b html -d packages/esssans/.docs_doctrees packages/esssans/docs packages/esssans/html" +[feature.docs-essspectroscopy.pypi-dependencies] +essspectroscopy = { path = "packages/essspectroscopy", editable = true, extras = ["test", "docs"] } + +[feature.docs-essspectroscopy.tasks.docs-essspectroscopy] +cmd = "python -m sphinx -v -b html -d packages/essspectroscopy/.docs_doctrees packages/essspectroscopy/docs packages/essspectroscopy/html" + # ==================== Environments ==================== [environments] # Default: all packages (for full dev setup) -default = { features = ["dev", "essreduce", "essimaging", "essnmx", "essreflectometry", "essdiffraction", "esssans"], solve-group = "default" } +default = { features = ["dev", "essreduce", "essimaging", "essnmx", "essreflectometry", "essdiffraction", "esssans", "essspectroscopy"], solve-group = "default" } # Per-package test environments (include workspace dep features) essreduce = { features = ["essreduce"], solve-group = "default" } @@ -118,6 +128,7 @@ essnmx = { features = ["essnmx", "essreduce"], solve-group = "default" } essreflectometry = { features = ["essreflectometry", "essreduce"], solve-group = "default" } essdiffraction = { features = ["essdiffraction", "essreduce"], solve-group = "default" } esssans = { features = ["esssans", "essreduce"], solve-group = "default" } +essspectroscopy = { features = ["essspectroscopy", "essreduce"], solve-group = "default" } # Lower-bound test environments (separate resolution) lb-essreduce = { features = ["essreduce"], solve-group = "lower-bound" } @@ -126,6 +137,7 @@ lb-essnmx = { features = ["essnmx", "essreduce"], solve-group = "lower-bound" } lb-essreflectometry = { features = ["essreflectometry", "essreduce"], solve-group = "lower-bound" } lb-essdiffraction = { features = ["essdiffraction", "essreduce"], solve-group = "lower-bound" } lb-esssans = { features = ["esssans", "essreduce"], solve-group = "lower-bound" } +lb-essspectroscopy = { features = ["essspectroscopy", "essreduce"], solve-group = "lower-bound" } # Docs environments (package with docs extra + pandoc) docs-essreduce = { features = ["docs-essreduce", "docs"], solve-group = "default" } @@ -134,6 +146,7 @@ docs-essnmx = { features = ["docs-essnmx", "docs-essreduce", "docs"], solve-grou docs-essreflectometry = { features = ["docs-essreflectometry", "docs-essreduce", "docs"], solve-group = "default" } docs-essdiffraction = { features = ["docs-essdiffraction", "docs-essreduce", "docs"], solve-group = "default" } docs-esssans = { features = ["docs-esssans", "docs-essreduce", "docs"], solve-group = "default" } +docs-essspectroscopy = { features = ["docs-essspectroscopy", "docs-essreduce", "docs"], solve-group = "default" } # Lint environment (standalone, no package deps) lint = { features = ["lint"], solve-group = "lint" } From 57c4a3a4ad7d15da9f302dd952bab1057b812746 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 11 May 2026 14:46:25 +0200 Subject: [PATCH 329/330] Update conda badge --- packages/essspectroscopy/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/essspectroscopy/README.md b/packages/essspectroscopy/README.md index 2ac510a13..31b2cf263 100644 --- a/packages/essspectroscopy/README.md +++ b/packages/essspectroscopy/README.md @@ -1,6 +1,6 @@ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) [![PyPI badge](http://img.shields.io/pypi/v/essspectroscopy.svg)](https://pypi.python.org/pypi/essspectroscopy) -[![Anaconda-Server Badge](https://anaconda.org/conda-forge/essspectroscopy/badges/version.svg)](https://anaconda.org/conda-forge/essspectroscopy) +[![Conda Badge](https://img.shields.io/conda/v/conda-forge/essspectroscopy)](https://anaconda.org/conda-forge/essspectroscopy) [![License: BSD 3-Clause](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](LICENSE) # ESSspectroscopy From cc1da04673f259f9d31fa4fea650183b24331b9c Mon Sep 17 00:00:00 2001 From: Jan-Lukas Wynen Date: Mon, 11 May 2026 14:55:28 +0200 Subject: [PATCH 330/330] Make ruff happy --- packages/essspectroscopy/src/ess/bifrost/__init__.py | 1 - packages/essspectroscopy/src/ess/bifrost/cutting.py | 1 - packages/essspectroscopy/src/ess/bifrost/detector.py | 4 ++-- packages/essspectroscopy/src/ess/bifrost/io/mcstas.py | 1 - packages/essspectroscopy/src/ess/bifrost/io/nexus.py | 8 ++++---- packages/essspectroscopy/src/ess/bifrost/io/sqw.py | 5 ++--- packages/essspectroscopy/src/ess/bifrost/live.py | 1 - packages/essspectroscopy/src/ess/bifrost/normalization.py | 4 ++-- .../src/ess/bifrost/single_crystal/conversion.py | 5 ++--- .../src/ess/bifrost/single_crystal/detector.py | 1 - .../src/ess/bifrost/single_crystal/q_map.py | 3 +-- .../src/ess/bifrost/single_crystal/time_of_flight.py | 6 +++--- .../src/ess/bifrost/single_crystal/types.py | 1 - .../src/ess/bifrost/single_crystal/workflow.py | 4 ++-- packages/essspectroscopy/src/ess/bifrost/types.py | 1 - packages/essspectroscopy/src/ess/bifrost/workflow.py | 3 +-- packages/essspectroscopy/src/ess/spectroscopy/__init__.py | 2 +- .../essspectroscopy/src/ess/spectroscopy/indirect/kf.py | 7 +++---- .../essspectroscopy/src/ess/spectroscopy/indirect/ki.py | 1 - packages/essspectroscopy/tests/bifrost/cutting_test.py | 1 - packages/essspectroscopy/tests/bifrost/io/sqw_test.py | 3 +-- packages/essspectroscopy/tests/bifrost/live_test.py | 1 - packages/essspectroscopy/tests/bifrost/workflow_test.py | 1 - .../tests/spectroscopy/indirect/indirect_test.py | 3 +-- 24 files changed, 25 insertions(+), 43 deletions(-) diff --git a/packages/essspectroscopy/src/ess/bifrost/__init__.py b/packages/essspectroscopy/src/ess/bifrost/__init__.py index 01feac9f7..83f165e08 100644 --- a/packages/essspectroscopy/src/ess/bifrost/__init__.py +++ b/packages/essspectroscopy/src/ess/bifrost/__init__.py @@ -1,6 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2024 Scipp contributors (https://github.com/scipp) -# ruff: noqa: E402, F401 """BIFROST data reduction.""" diff --git a/packages/essspectroscopy/src/ess/bifrost/cutting.py b/packages/essspectroscopy/src/ess/bifrost/cutting.py index 52d4b29b5..0312ff7ff 100644 --- a/packages/essspectroscopy/src/ess/bifrost/cutting.py +++ b/packages/essspectroscopy/src/ess/bifrost/cutting.py @@ -6,7 +6,6 @@ from collections.abc import Callable import scipp as sc - from ess.spectroscopy.types import ( DataGroupedByRotation, InstrumentAngle, diff --git a/packages/essspectroscopy/src/ess/bifrost/detector.py b/packages/essspectroscopy/src/ess/bifrost/detector.py index 9b250557d..a82be0546 100644 --- a/packages/essspectroscopy/src/ess/bifrost/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/detector.py @@ -7,8 +7,6 @@ import scipp as sc import scippnexus as snx - -from ess.reduce.nexus.types import Position from ess.spectroscopy.indirect.conversion import add_spectrometer_coords from ess.spectroscopy.types import ( Analyzer, @@ -21,6 +19,8 @@ SecondarySpecCoordTransformGraph, ) +from ess.reduce.nexus.types import Position + from .types import ArcNumber diff --git a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py index 778b79580..2cd56d9e1 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/mcstas.py @@ -5,7 +5,6 @@ import scipp as sc import scippnexus as snx - from ess.spectroscopy.types import ( EmptyDetector, NeXusData, diff --git a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py index 1a7ccbc90..c7827b940 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/nexus.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/nexus.py @@ -8,9 +8,6 @@ import numpy as np import scipp as sc import scippnexus as snx - -from ess.reduce.nexus import open_component_group -from ess.reduce.nexus.types import NeXusLocationSpec, TransformationTimeFilter from ess.spectroscopy.types import ( Analyzer, DynamicPosition, @@ -24,6 +21,9 @@ SampleAngle, ) +from ess.reduce.nexus import open_component_group +from ess.reduce.nexus.types import NeXusLocationSpec, TransformationTimeFilter + # See https://github.com/scipp/essreduce/issues/98 def moderator_class_for_source() -> NeXusClass[snx.NXsource]: @@ -103,7 +103,7 @@ def _find_class_in_inputs( for name in _get_inputs(element): try: pending.append(group[name]) - except KeyError: + except KeyError: # noqa: PERF203 warnings.warn(f"No '{name}' in NeXus group {group.name}", stacklevel=2) continue raise ValueError(f"No {target} found in the inputs of {start.name}") diff --git a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py index 9528354cb..69f9becd3 100644 --- a/packages/essspectroscopy/src/ess/bifrost/io/sqw.py +++ b/packages/essspectroscopy/src/ess/bifrost/io/sqw.py @@ -8,9 +8,6 @@ import numpy as np import numpy.typing as npt import scipp as sc -from scippneutron.io import sqw -from scippneutron.metadata import ESS_SOURCE - from ess.spectroscopy.types import ( Beamline, EnergyBins, @@ -22,6 +19,8 @@ SampleRun, SQWBinSizes, ) +from scippneutron.io import sqw +from scippneutron.metadata import ESS_SOURCE # Projection axes # For now, we always project onto the cartesian axes for simplicity. diff --git a/packages/essspectroscopy/src/ess/bifrost/live.py b/packages/essspectroscopy/src/ess/bifrost/live.py index a28695374..7f8394016 100644 --- a/packages/essspectroscopy/src/ess/bifrost/live.py +++ b/packages/essspectroscopy/src/ess/bifrost/live.py @@ -9,7 +9,6 @@ import sciline import scipp as sc - from ess.spectroscopy.types import ( EnergyQDetector, NeXusDetectorName, diff --git a/packages/essspectroscopy/src/ess/bifrost/normalization.py b/packages/essspectroscopy/src/ess/bifrost/normalization.py index 41bfa232c..b105c9f50 100644 --- a/packages/essspectroscopy/src/ess/bifrost/normalization.py +++ b/packages/essspectroscopy/src/ess/bifrost/normalization.py @@ -4,8 +4,6 @@ """Normalization routines.""" import scipp as sc - -from ess.reduce.uncertainty import broadcast_uncertainties from ess.spectroscopy.types import ( IncidentEnergyDetector, NormalizationMonitor, @@ -16,6 +14,8 @@ WavelengthMonitor, ) +from ess.reduce.uncertainty import broadcast_uncertainties + def normalize_by_monitor_and_proton_charge( detector: IncidentEnergyDetector[RunType], diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py index eacd7c8fd..386834c3d 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/conversion.py @@ -4,9 +4,6 @@ """Coordinate conversions for single crystal diffraction with BIFROST.""" import scippnexus as snx -from scippneutron.conversion.graph import beamline as beamline_graphs -from scippneutron.conversion.graph import tof as tof_graphs - from ess.spectroscopy.indirect.conversion import ( rotate_to_sample_table_momentum_transfer, ) @@ -18,6 +15,8 @@ RunType, WavelengthDetector, ) +from scippneutron.conversion.graph import beamline as beamline_graphs +from scippneutron.conversion.graph import tof as tof_graphs def single_crystal_coordinate_transformation_graph( diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/detector.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/detector.py index 320b9a601..4ee7b71bc 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/detector.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/detector.py @@ -4,7 +4,6 @@ """Bragg peak detector handling for BIFROST.""" import scippnexus as snx - from ess.spectroscopy.types import ( Analyzer, DetectorPositionOffset, diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py index 9914fc5b1..6d73488e6 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/q_map.py @@ -10,9 +10,8 @@ import numpy.typing as npt import plopp as pp import scipp as sc -from matplotlib.axes import Axes - from ess.spectroscopy.types import QDetector, RunType +from matplotlib.axes import Axes from .types import ( CountsWithQMapCoords, diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py index 493be5979..43b900e34 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/time_of_flight.py @@ -4,9 +4,6 @@ """Utilities for computing real neutron time-of-flight.""" import scippnexus as snx - -from ess.reduce import unwrap as reduce_unwrap -from ess.reduce.unwrap.types import DetectorLtotal from ess.spectroscopy.types import ( DataGroupedByRotation, ErrorLimitedLookupTable, @@ -16,6 +13,9 @@ WavelengthDetector, ) +from ess.reduce import unwrap as reduce_unwrap +from ess.reduce.unwrap.types import DetectorLtotal + def detector_wavelength_data( sample_data: DataGroupedByRotation[RunType], diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py index 2f155edf2..72edfeeb4 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/types.py @@ -8,7 +8,6 @@ import sciline import scipp as sc - from ess.spectroscopy.types import RunType diff --git a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py index ac4bb98a9..71bca0b8b 100644 --- a/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/single_crystal/workflow.py @@ -3,8 +3,6 @@ """BIFROST Bragg peak monitor workflows.""" import sciline - -from ess.reduce import unwrap as reduce_unwrap from ess.spectroscopy.indirect.time_of_flight import TofWorkflow from ess.spectroscopy.types import ( ElasticMonitor, @@ -12,6 +10,8 @@ SampleRun, ) +from ess.reduce import unwrap as reduce_unwrap + from ..cutting import group_by_rotation from ..io import nexus from ..io.mcstas import convert_simulated_time_to_event_time_offset diff --git a/packages/essspectroscopy/src/ess/bifrost/types.py b/packages/essspectroscopy/src/ess/bifrost/types.py index 46a0018c5..775fdaa69 100644 --- a/packages/essspectroscopy/src/ess/bifrost/types.py +++ b/packages/essspectroscopy/src/ess/bifrost/types.py @@ -10,7 +10,6 @@ import sciline import scipp as sc - from ess.spectroscopy.types import RunType diff --git a/packages/essspectroscopy/src/ess/bifrost/workflow.py b/packages/essspectroscopy/src/ess/bifrost/workflow.py index 4b1b796c0..eafd2aa69 100644 --- a/packages/essspectroscopy/src/ess/bifrost/workflow.py +++ b/packages/essspectroscopy/src/ess/bifrost/workflow.py @@ -7,8 +7,6 @@ import sciline import scipp as sc -from scippnexus import NXdetector - from ess.spectroscopy.indirect.conversion import providers as conversion_providers from ess.spectroscopy.indirect.kf import providers as kf_providers from ess.spectroscopy.indirect.ki import providers as ki_providers @@ -28,6 +26,7 @@ SampleRun, UncertaintyBroadcastMode, ) +from scippnexus import NXdetector from .cutting import providers as cutting_providers from .detector import merge_triplets diff --git a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py index 958646415..59722cd66 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/__init__.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/__init__.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) -# ruff: noqa: E402, F401, I +# ruff: noqa: I """Data reduction for ESS spectroscopy experiments. diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py index a191992e5..4a076557d 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/kf.py @@ -5,10 +5,6 @@ import numpy as np import scipp as sc -from scippneutron.conversion.beamline import ( - BeamAlignedUnitVectors, -) - from ess.spectroscopy.types import ( DataAtSample, DataGroupedByRotation, @@ -16,6 +12,9 @@ RunType, SecondarySpecCoordTransformGraph, ) +from scippneutron.conversion.beamline import ( + BeamAlignedUnitVectors, +) def sample_analyzer_vector( diff --git a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py index 0b8c2901c..7d458dc18 100644 --- a/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py +++ b/packages/essspectroscopy/src/ess/spectroscopy/indirect/ki.py @@ -6,7 +6,6 @@ from __future__ import annotations import scippnexus as snx - from ess.spectroscopy.types import ( GravityVector, Position, diff --git a/packages/essspectroscopy/tests/bifrost/cutting_test.py b/packages/essspectroscopy/tests/bifrost/cutting_test.py index d49fe1dcc..52ef276f2 100644 --- a/packages/essspectroscopy/tests/bifrost/cutting_test.py +++ b/packages/essspectroscopy/tests/bifrost/cutting_test.py @@ -5,7 +5,6 @@ import scipp as sc import scipp.testing import scippnexus as snx - from ess import bifrost from ess.bifrost.data import ( lookup_table_simulation, diff --git a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py index 6bd5d4dc9..2cc900684 100644 --- a/packages/essspectroscopy/tests/bifrost/io/sqw_test.py +++ b/packages/essspectroscopy/tests/bifrost/io/sqw_test.py @@ -18,8 +18,6 @@ import scipp as sc import scipp.testing import scippnexus as snx -from scippneutron.io import sqw - from ess import bifrost from ess.bifrost.data import ( lookup_table_simulation, @@ -37,6 +35,7 @@ SQWBinSizes, UncertaintyBroadcastMode, ) +from scippneutron.io import sqw N_DETECTORS = 3 N_ANGLES = 178 diff --git a/packages/essspectroscopy/tests/bifrost/live_test.py b/packages/essspectroscopy/tests/bifrost/live_test.py index ada00c1a7..dc2b22c52 100644 --- a/packages/essspectroscopy/tests/bifrost/live_test.py +++ b/packages/essspectroscopy/tests/bifrost/live_test.py @@ -6,7 +6,6 @@ import scipp as sc import scipp.testing import scippnexus as snx - from ess.bifrost.data import ( lookup_table_simulation, simulated_elastic_incoherent_with_phonon, diff --git a/packages/essspectroscopy/tests/bifrost/workflow_test.py b/packages/essspectroscopy/tests/bifrost/workflow_test.py index b5abc00d3..e3b42fca8 100644 --- a/packages/essspectroscopy/tests/bifrost/workflow_test.py +++ b/packages/essspectroscopy/tests/bifrost/workflow_test.py @@ -6,7 +6,6 @@ import scipp as sc import scipp.testing import scippnexus as snx - from ess import bifrost from ess.bifrost.data import ( computed_energy_data_simulated_5x2, diff --git a/packages/essspectroscopy/tests/spectroscopy/indirect/indirect_test.py b/packages/essspectroscopy/tests/spectroscopy/indirect/indirect_test.py index d42aed25b..0dd9e4f24 100644 --- a/packages/essspectroscopy/tests/spectroscopy/indirect/indirect_test.py +++ b/packages/essspectroscopy/tests/spectroscopy/indirect/indirect_test.py @@ -2,11 +2,10 @@ # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) import scipp as sc +from ess.spectroscopy.indirect import kf as secondary from scipp import array, scalar, sqrt, vector from scipp.spatial import rotations_from_rotvecs -from ess.spectroscopy.indirect import kf as secondary - def vectors_close(a, b, tol=None): from scipp import scalar