diff --git a/packages/essreduce/docs/api-reference/index.md b/packages/essreduce/docs/api-reference/index.md index 596505824..a5d5e1eb9 100644 --- a/packages/essreduce/docs/api-reference/index.md +++ b/packages/essreduce/docs/api-reference/index.md @@ -31,6 +31,7 @@ logging nexus normalization + polarization streaming time_of_flight ui diff --git a/packages/essreduce/docs/user-guide/index.md b/packages/essreduce/docs/user-guide/index.md index 1c91655cb..de84fc162 100644 --- a/packages/essreduce/docs/user-guide/index.md +++ b/packages/essreduce/docs/user-guide/index.md @@ -6,6 +6,7 @@ maxdepth: 2 --- installation +polarization/index unwrap/index widget reduction-workflow-guidelines diff --git a/packages/essreduce/docs/user-guide/polarization/index.md b/packages/essreduce/docs/user-guide/polarization/index.md new file mode 100644 index 000000000..3217f304b --- /dev/null +++ b/packages/essreduce/docs/user-guide/polarization/index.md @@ -0,0 +1,37 @@ +# User Guide + +## Overview + +```{mermaid} +graph TD + A[Sample Run] --> B([SANS Workflow]) + B --> C["I(Qx, Qy) in event mode"] + D[Runs with He3 cell at a few time points] --> E([SANS Workflow]) + E --> F[wavelength-dependent He3 cell transmission fraction at a few time points] + F --> G([He3 Cell Workflow]) + G --> H[time- and wavelength-dependent transmission function] + C --> I([Polarization Correction]) + H --> I + I --> J["Corrected I(Qx, Qy) in 4 spin channels"] + + style B fill:green + style D fill:green + style E fill:green + style F fill:green + style G fill:yellowgreen + style H fill:yellowgreen +``` + +## Content + +```{toctree} +--- +maxdepth: 1 +--- + +workflow +sans-polarization-analysis-methodology +inverse_of_polarization_matrices +zoom +installation +``` diff --git a/packages/essreduce/docs/user-guide/polarization/installation.md b/packages/essreduce/docs/user-guide/polarization/installation.md new file mode 100644 index 000000000..5e0a822a9 --- /dev/null +++ b/packages/essreduce/docs/user-guide/polarization/installation.md @@ -0,0 +1,16 @@ +# Installation + +To install ESSpolarization and all of its dependencies, use + +`````{tab-set} +````{tab-item} pip +```sh +pip install esspolarization +``` +```` +````{tab-item} conda +```sh +conda install -c conda-forge esspolarization +``` +```` +````` diff --git a/packages/essreduce/docs/user-guide/polarization/inverse_of_polarization_matrices.ipynb b/packages/essreduce/docs/user-guide/polarization/inverse_of_polarization_matrices.ipynb new file mode 100644 index 000000000..45cd1620c --- /dev/null +++ b/packages/essreduce/docs/user-guide/polarization/inverse_of_polarization_matrices.ipynb @@ -0,0 +1,535 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "import sympy as sp\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "Tp = sp.symbols('T^p_+, T^p_-', positive=True)\n", + "Ta = sp.symbols('T^a_+, T^a_-', positive=True)\n", + "I = sp.symbols('Ipp, Ipm, Imp, Imm', positive=True) # noqa: E741\n" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "# Polarization matrices for He3 cells and supermirror\n", + "\n", + "From https://www.epj-conferences.org/articles/epjconf/abs/2023/12/epjconf_ecns2023_03004/epjconf_ecns2023_03004.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "I = sp.ImmutableDenseMatrix([[I[0]], [I[1]], [I[2]], [I[3]]]) # noqa: E741\n", + "I" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "TP = sp.ImmutableDenseMatrix(\n", + " [\n", + " [Tp[0], 0, Tp[1], 0],\n", + " [0, Tp[0], 0, Tp[1]],\n", + " [Tp[1], 0, Tp[0], 0],\n", + " [0, Tp[1], 0, Tp[0]],\n", + " ]\n", + ")\n", + "TP" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "TP.inv()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "TA = sp.ImmutableDenseMatrix(\n", + " [\n", + " [Ta[0], Ta[1], 0, 0],\n", + " [Ta[1], Ta[0], 0, 0],\n", + " [0, 0, Ta[0], Ta[1]],\n", + " [0, 0, Ta[1], Ta[0]],\n", + " ]\n", + ")\n", + "TA" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "TA.inv()" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "## Helium cell case" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "(TA @ TP).inv().factor()" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "Same denominator in all entries, maybe easier to evaluate this way:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "d = (Ta[0] ** 2 - Ta[1] ** 2) * (Tp[0] ** 2 - Tp[1] ** 2)\n", + "d" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "(d * (TA @ TP).inv()).simplify()" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "## Supermirror case" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "f1, f2 = sp.symbols('f_1:3')\n", + "F1_parallel = sp.ImmutableDenseMatrix(\n", + " [\n", + " [1, 0, 0, 0],\n", + " [0, 1, 0, 0],\n", + " [1 - f1, 0, f1, 0],\n", + " [0, 1 - f1, 0, f1],\n", + " ]\n", + ")\n", + "F1_parallel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "F1_parallel.inv()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "(F1_parallel.inv() @ F1_parallel).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "F2_parallel = sp.ImmutableDenseMatrix(\n", + " [\n", + " [1, 0, 0, 0],\n", + " [1 - f2, f2, 0, 0],\n", + " [0, 0, 1, 0],\n", + " [0, 0, 1 - f2, f2],\n", + " ]\n", + ")\n", + "F2_parallel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "F1_antiparallel = sp.ImmutableDenseMatrix(\n", + " [\n", + " [f1, 0, 1 - f1, 0],\n", + " [0, f1, 0, 1 - f1],\n", + " [0, 0, 1, 0],\n", + " [0, 0, 0, 1],\n", + " ]\n", + ")\n", + "F1_antiparallel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "F2_antiparallel = sp.ImmutableDenseMatrix(\n", + " [\n", + " [1, 1 - f2, 0, 0],\n", + " [0, f2, 0, 0],\n", + " [0, 0, 1, 1 - f2],\n", + " [0, 0, 0, f2],\n", + " ]\n", + ")\n", + "F2_antiparallel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "(F1_antiparallel @ F1_antiparallel.inv()).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "(F2_antiparallel @ F2_antiparallel.inv()).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "(TP.inv() @ F1_parallel.inv()).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "(TP.inv() @ F1_antiparallel.inv()).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "(F2_parallel.inv() @ TA.inv()).simplify()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "(F2_antiparallel.inv() @ TA.inv()).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "(((F2_parallel.inv() @ TA.inv()) @ I) * (Ta[0] ** 2 - Ta[1] ** 2)).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "(((TP.inv() @ F1_parallel.inv()) @ I) * (Tp[0] ** 2 - Tp[1] ** 2)).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "(TP.inv() @ F1_parallel.inv() @ F2_parallel.inv() @ TA.inv()).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "(TP.inv() @ F1_antiparallel.inv() @ F2_antiparallel.inv() @ TA.inv()).simplify()" + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": {}, + "source": [ + "Now we will test if the flipper matrices together with the polarizer/analyzer matrices yield physically useful results for the examples:
\n", + "(i) collinear magnetic moments & no chiral terms, i.e., P=F=1 & S+-=S-+
\n", + "(ii) chiral magnetic moments with S++=S--=0 & S+- \\neq S-+" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "S_test_i = sp.symbols('Spp, Spm, Smp, Smm', positive=True)\n", + "S_test_i = sp.ImmutableDenseMatrix([[0], [S_test_i[1]], [S_test_i[2]], [0]])\n", + "S_test_i" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32", + "metadata": {}, + "outputs": [], + "source": [ + "((TA @ F2_parallel @ F1_parallel @ TP) @ S_test_i).simplify()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "S_test_ii = sp.symbols('Spp, Spm, Smp, Smm', positive=True)\n", + "S_test_ii = sp.ImmutableDenseMatrix(\n", + " [[S_test_ii[0]], [S_test_ii[1]], [S_test_ii[1]], [S_test_ii[3]]]\n", + ")\n", + "S_test_ii" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34", + "metadata": {}, + "outputs": [], + "source": [ + "((TA @ F2_antiparallel) @ S_test_ii).simplify()" + ] + }, + { + "cell_type": "markdown", + "id": "35", + "metadata": {}, + "source": [ + "Now trying the same with the to 2-dim converted matrices" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36", + "metadata": {}, + "outputs": [], + "source": [ + "S_test_iii = [[0], [4], [5], [0]]\n", + "f1_test = 0.9\n", + "f2_test = 0.9\n", + "F1_parallel_test = np.array(\n", + " [\n", + " [1, 0, 0, 0],\n", + " [0, 1, 0, 0],\n", + " [1 - 0.9, 0, 0.9, 0],\n", + " [0, 1 - 0.9, 0, 0.9],\n", + " ]\n", + ")\n", + "F2_parallel_test = np.array(\n", + " [\n", + " [1, 0, 0, 0],\n", + " [1 - 0.9, 0.9, 0, 0],\n", + " [0, 0, 1, 0],\n", + " [0, 0, 1 - 0.9, 0.9],\n", + " ]\n", + ")\n", + "Tp_test = np.array([0.8, 0.2])\n", + "TP_test = np.array(\n", + " [\n", + " [Tp_test[0], 0, Tp_test[1], 0],\n", + " [0, Tp_test[0], 0, Tp_test[1]],\n", + " [Tp_test[1], 0, Tp_test[0], 0],\n", + " [0, Tp_test[1], 0, Tp_test[0]],\n", + " ]\n", + ")\n", + "Ta_test = np.array([0.8, 0.2])\n", + "TA_test = np.array(\n", + " [\n", + " [Ta_test[0], Ta_test[1], 0, 0],\n", + " [Ta_test[1], Ta_test[0], 0, 0],\n", + " [0, 0, Ta_test[0], Ta_test[1]],\n", + " [0, 0, Ta_test[1], Ta_test[0]],\n", + " ]\n", + ")\n", + "TA_test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", + "metadata": {}, + "outputs": [], + "source": [ + "(TP_test @ TA_test) @ S_test_iii" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38", + "metadata": {}, + "outputs": [], + "source": [ + "ground_truth = np.array([0, 4, 5, 0])\n", + "analyzer = np.array([[0.8, 0.2], [0.2, 0.8]])\n", + "polarizer = np.array([[0.8, 0.2], [0.2, 0.8]])\n", + "identity = np.array([[1.0, 0.0], [0.0, 1.0]])\n", + "intensity = np.kron(identity, analyzer) @ np.kron(polarizer, identity) @ ground_truth\n", + "intensity\n" + ] + }, + { + "cell_type": "markdown", + "id": "39", + "metadata": {}, + "source": [ + "## Latex formatting\n", + "(For convenience)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40", + "metadata": {}, + "outputs": [], + "source": [ + "# Latex formatted for copying to other docs\n", + "for s in (\n", + " r'\\hat{T}_P^{-1} = ' + sp.latex(TP.inv().simplify()),\n", + " r'\\hat{T}_A^{-1} = ' + sp.latex(TA.inv().simplify()),\n", + " r'\\hat{F}_1^{-1} = ' + sp.latex(F1_parallel.inv().simplify()),\n", + " r'\\hat{F}_2^{-1} = ' + sp.latex(F2_parallel.inv().simplify()),\n", + "):\n", + " print(s, end='\\n\\n')" + ] + } + ], + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/essreduce/docs/user-guide/polarization/sans-polarization-analysis-methodology.ipynb b/packages/essreduce/docs/user-guide/polarization/sans-polarization-analysis-methodology.ipynb new file mode 100644 index 000000000..b0f272a1d --- /dev/null +++ b/packages/essreduce/docs/user-guide/polarization/sans-polarization-analysis-methodology.ipynb @@ -0,0 +1,313 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# SANS Polarization Analysis Methodology\n", + "\n", + "## Notation\n", + "\n", + "Note on notation:\n", + "\n", + "- subscripts = discretization variable from measurement\n", + "- superscripts = Names\n", + "- () = continuous function of....\n", + "\n", + "| Value | Meaning | shape | How acquired? | \n", + "|:--------:|:--------:|:--------:|:--------:|\n", + "| $I^{\\pm\\pm}_{t,\\lambda}$ | uncorrected sample data of ++/+-/-+/-- channels | data arrays with columns for $I$, $\\lambda$, $t$ | neutron data |\n", + "| $S^{\\pm\\pm}_{t,\\lambda}$ | corrected sample data of ++/+-/-+/-- channels | data arrays with columns for $I$, $\\lambda$, $t$ | by pol-correction |\n", + "| $p^{cell}$ | pressure of 3He-polarizer/analyzer | scalar, 1-dim | from metadata |\n", + "| $l^{cell}$ | length of 3He-polarizer/analyzer | scalar, 1-dim | from metadata |\n", + "| $T^{\\textup{g}, cell}(\\lambda)$ | transmission of empty glass of polarizer/analyzer | scalar, 1-dim | from metadata |\n", + "| $O^{cell}(\\lambda)=O^{0, cell}\\cdot\\lambda$ | wavelength-dependent opacity of 3He-polarizer/analyzer | continuous function of $\\lambda$ | $O^{0, cell}$ fit to data |\n", + "| $O^{0, cell}$ | wavelength-independent pre-factor of opacity of 3He-polarizer/analyzer | scalar, 1-dim | fit to data |\n", + "| $P^{^3\\textup{He}, cell}(t) = C^{cell}e^{-t/T^{1, cell}}$ | time-dependent nuclear polarization of 3He-polarizer/analyzer | continuous function of $t$ | $C^{cell}, T^{1, cell}$ fit to data |\n", + "| $C^{cell}$ | Pre-factor of nuclear polarization exponential decay of 3He-polarizer/analyzer | scalar, 1-dim | fit to data | \n", + "| $T^{1, cell}$ | Decay constant of nuclear polarization exponential decay of 3He-polarizer/analyzer | scalar, 1-dim | fit to data |\n", + "| $I^{\\textup{DB},unpol-in,cell}_{\\lambda, t}$ | Intensity of direct-beam of an unpolarized-incoming beam to the polarized 3He-polarizer/analyzer | data array with columns for $I$, $\\lambda$, $t$ | neutron data |\n", + "| $I^{\\textup{DB},{\\textup{depol}},cell}_{\\lambda}$ | Intensity of direct-beam of an unpolarized-incoming beam to the depolarized 3He-polarizer/analyzer | data array with columns for $I$, $\\lambda$ | neutron data |\n", + "| $I^{\\textup{DB}, no-cell}_{\\lambda}$ | Intensity of direct-beam of an unpolarized-incoming beam to detector without passing cells or sample | data array with columns for $I$, $\\lambda$ | neutron data |\n", + "| $\\hat{T}^{\\pm, cell}(t,\\lambda)$ | Transmission-function of a in-coming polarized neutron beam into 3He-polarizer/analyzer | Row 1 | by inserting $P^{^3\\textup{He}, cell}(t)$, $O^{cell}(\\lambda)$ |\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Overview and general workflow\n", + "\n", + "Different to unpolarized SANS, the spin-dependent cross section $\\vec{S}$ after sample-scattering are correlated and cannot be corrected individually [Ref 1, 2, 3]. Instead, a beamline-component dependent correction Matrix $\\hat{M}$ has to be applied to all spin-dependent measurements simultaneously to retrieve $\\vec{S}$ from the measured intensities $\\vec{I}$:\n", + "\n", + "$$\n", + "\\begin{pmatrix} I^{++}_{t,\\lambda} \\\\ I^{+-}_{t,\\lambda} \\\\ I^{-+}_{t,\\lambda} \\\\ I^{--}_{t,\\lambda}\\end{pmatrix} = \\hat{M}(t,\\lambda)\n", + "\\cdot\n", + "\\begin{pmatrix} S^{++}_{t,\\lambda} \\\\ S^{+-}_{t,\\lambda} \\\\ S^{-+}_{t,\\lambda} \\\\ S^{--}_{t,\\lambda}\\end{pmatrix}\n", + "$$\n", + "\n", + "Here, we describe the correction of TOF-SANS data with polarization analysis of the `esspolarization` package using two time-dependent 3He-polarized cells. Hence, the polarization-related beamline components in $\\hat{M}$ are the time- and spin-dependent transmission matrices of the 3He-polarizer $\\hat{T^p}$ and 3He-analyzer $\\hat{T^a}$: \n", + "\n", + "$$\n", + "\\begin{pmatrix} I^{++}_{t,\\lambda} \\\\ I^{+-}_{t,\\lambda} \\\\ I^{-+}_{t,\\lambda} \\\\ I^{--}_{t,\\lambda}\\end{pmatrix} = \\hat{T}^{\\textup{a}}(t,\\lambda)\\cdot\\hat{T}^{\\textup{p}}(t,\\lambda)\n", + "\\cdot\n", + "\\begin{pmatrix} S^{++}_{t,\\lambda} \\\\ S^{+-}_{t,\\lambda} \\\\ S^{-+}_{t,\\lambda} \\\\ S^{--}_{t,\\lambda}\\end{pmatrix}\n", + "$$\n", + "\n", + "Both $\\hat{T^{\\textup{p}}}$ and $\\hat{T^{\\textup{a}}}$ can be derived from their cell parameters (the transmission of the empty cell $T^{\\textup{g}}$, and the cell opacity $O$), and the time-dependent nuclear polarization of the cell $P^{^3\\textup{He}}(t)$.
\n", + "This general method for time-dependent 3He-cells can be adapted for other use-cases such as using supermirrors or in-situ polarized 3He-cells, see \"Note\" at the end of the page. \n", + "\n", + "First, the created test-data needs to be readout and grouped by purpose, e.g., if it describes a sample-run, a direct-beam-run, or a background measurement without cells and sample. All data will be reduced using the normalization term described in https://scipp.github.io/ess/techniques/sans/sans-beam-center-finder.html. Second, for the calculation of time-dependent $P^{^3\\textup{He}}(t)$, the ROI's of the direct-beam region and background region have to be defined (USING BEAMCENTER FINDER OPTION OF SANS2D?). Third, we will describe the data correction workflow with a calculation of $O$, $P^{^3\\textup{He}}(t)$, and $T^{\\pm}$ of the polarizer and analyzer, and the application on the sample-data.\n", + "\n", + "To facilitate an in-situ data correction during the experiments, we have implemented two different approaches:\n", + "\n", + "1. A rough data-correction based on a 3He-cell opacity calculated by its cell parameters and filling pressure (see [Workflow 1](#workflow-1)) which can be used in-situ during the experiment.\n", + "2. precise calculation based on the calculation of opacity by a direct-beam measurement on the depolarized cell at its end of lifetime (i.e., end of cell-usage for this experiment) (see [Workflow 2](#workflow-2))." + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## Data correction" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "### Calculation of 3He opacity \n", + "\n", + "The 3He opacity is a cell-specific parameter and can vary after each filling process. Hence, for precise data correction, it must be measured for each newly filled cell. It linearly depends on the neutron wavelength as follows:\n", + "\n", + "$$\n", + "O(\\lambda)=n\\cdot \\sigma_0\\cdot l \\cdot\\lambda\n", + "$$\n", + "\n", + "with n being the number density of 3He gas in the cell, $\\sigma_0$ the absorption cross section of $1~Å$ neutrons by 3He ($\\sigma_0 = (2966\\pm 1) \\cdot 10^{−24} cm^2$ [Ref. 4]), and the path length through the cell $l$ [Ref. 1]. Note that $(2966\\pm 1) \\cdot 10^{−24} cm^2$ at 1 $1~Å$ is the unpolarised neutron cross-section. For polarised neutrons, it is a polarization dependent value with $(5933\\pm 1) \\cdot 10^{−24} cm^2$ at 1 $1~Å$ for neutrons with spin anti-parallel to the 3He and 0 for neutrons with spin parallel to the 3He. As 3He can be considered to follow the ideal gas law, $n$ can be replaced via $p=n\\cdot k_{\\textup{B}}\\cdot T$:\n", + "\n", + "$$\n", + "O(\\lambda)=\\frac{\\sigma_0}{k_{\\textup{B}}\\cdot T}\\cdot p\\cdot l \\cdot\\lambda\n", + "$$\n", + "\n", + "For this workflow, we will calculate the wavelength independent part $O^{0, cell}$ of the opacity for each cell in the beamline, and multiply by the neutron wavelength:\n", + "\n", + "$$\n", + "O^{cell}(\\lambda)=O^{0, cell}\\cdot\\lambda\n", + "$$\n", + "\n", + "In the following, two different approaches are presented to measure $O^{0, cell}$." + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### Workflow 1\n", + "\n", + "For an in-situ quick data correction, a measure of the cell pressure $p$ (typically taken at 20°C) during filling the cell can be used to calculate $O^{0, cell}$ by following relation (Ref 1):\n", + "\n", + "$$\n", + "O^{0, cell}= \\frac{\\sigma_0}{k_{\\textup{B}}\\cdot T}\\cdot p\\cdot l\n", + "$$\n", + "\n", + "However, a measurement of the opacity by neutron transmission in a depolarized cell condition yields more precise values and can be performed at the end of the cell-lifetime during the user's neutron experiments, i.e., leading to [Workflow 2](#workflow-2). \n", + "\n", + "- Note: $l$ is assumed constant over the area of the 3He-cell. In case of too large cell volumes, only the fraction with constant $l$ & constant $O$ will be used for the neutron measurements. The same assumption holds for both SANS-cells as well as wide-angle cells\n", + "- Note: until now, we have treated $T^{\\textup{g}, cell}$ as constant parameter and ignored its wavelength-dependence, as its variation with wavelength is small enough to not impact the correction procedure. However, to keep it generic and enable to insert a wavelength-dependent $T^{\\textup{g}, cell}(\\lambda)$, the dependence on wavelength will be pre-characterized (during fabrication of the cell) and inserted as function into this workflow instead of a scalar." + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "### Workflow 2\n", + "\n", + "A more precise data correction is based on a direct-beam measurement through the depolarized cell (i.e., $P_{^3\\textup{He}}(t) \\rightarrow 0$)(Ref. 2). For such a depolarized cell and an unpolarized incident beam (i.e., $\\hat{T}^\\textup{depol} = (\\hat{T}^++\\hat{T}^-)/2$), the neutron transmission becomes:\n", + "\n", + "$$\n", + "T^{\\textup{depol}, cell}(\\lambda)=T^{\\textup{g}, cell}(\\lambda)e^{-O^{0, cell}\\cdot\\lambda}\n", + "$$\n", + "\n", + "This leads to following direct beam intensity $I^{\\textup{DB},\\textup{depol},cell}_{\\lambda}$ measured on a depolarized cell:\n", + "\n", + "$$\n", + "\\frac{I^{\\textup{DB},\\textup{depol},cell}_{\\lambda}}{I^{\\textup{DB,no-cell}}_{\\lambda}}=T^{\\textup{g}, cell}(\\lambda)e^{-O^{0, cell}\\cdot\\lambda}\n", + "$$\n", + "\n", + "where $I^{\\textup{DB,no-cell}}_{\\lambda}$ is the intensity of a direct beam through an open neutron path (without cell and sample) and acts as a background measurement. For a measurement of $I^{\\textup{DB},\\textup{depol},cell}_{\\lambda}$, the 3He cell needs to be depolarized at the end of its lifetime and $I^{\\textup{DB},\\textup{depol},cell}_{\\lambda}$ has to be acquired for each cell (having the other cell and the sample out of beam). The wavelength-independent opacity can be acquired by a fit of above equation to the ratio $\\frac{I^{\\textup{DB},\\textup{depol},cell}_{\\lambda}}{I^{\\textup{DB,no-cell}}_{\\lambda}}$. As this procedure results in a more precise value of $O^{0, cell}$ than using workflow 1, we will use these two workflows in following way:\n", + "\n", + "1) During the user experiment, $O^{0, cell}$ will be calculated by its cell parameters via workflow 1 and inserted to the 3He nuclear polarization and cell transmission functions (described in the following) for a first in-situ data correction. \n", + "2) At the end of its lifetime of each employed 3He-cell, the cell will be depolarized. After a measurement of $I^{DB,\\textup{depol},cell}$, workflow 2 can be used for a precise evaluation of $O^{0, cell}$, and the user may overwrite the data correction results from workflow 1 with results from workflow 2 for post-experiment analysis.\n", + "\n", + "- Note: Different to the sample data, $I^{\\textup{DB},\\textup{depol},cell}$ and $I^{DB,no-cell}$ are not time-dependent\n", + "- Note: It is important to fit $I_{\\textup{depol}}/I^{\\textup{DB, no-cell}}_{\\lambda}$ instead of $I_\\textup{depol}$, such that all the parameters in the fit-functions are scalars.\n" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "### Calculation of time-dependent 3He-polarization\n", + " \n", + "Now $O^{cell}(\\lambda)=O^{0, cell}\\cdot\\lambda$ is known.
\n", + "The next step for getting the transmission functions $\\hat{T}^{\\pm}$ is to calculate the nuclear polarization of the 3He-cell, which decays exponentially with a decay-time $T^{1, cell}$ and is given by:\n", + "\n", + "$$\n", + "P^{^3\\textup{He}, cell}(t) = C^{cell}e^{-t/T^{1, cell}}\n", + "$$.\n", + "\n", + "From the neutron measurement, this again can be retrieved by measuring the transmission through each cell (i.e., for an unpolarized incoming beam into the polarized cell):\n", + "\n", + "$$\n", + "\\hat{T}^{\\textup{unpol-in}}(\\lambda, t) = T^{\\textup{g}, cell}(\\lambda)e^{-O^{0, cell}\\cdot\\lambda}\\cosh({P_{^3\\textup{He}}(t)\\cdot O^{0, cell}\\cdot\\lambda})\n", + "$$
\n", + "$$\n", + "\\frac{I^{\\textup{DB,unpol-in},cell}_{\\lambda, t}}{I^{\\textup{DB, no-cell}}_{\\lambda}} = T^{\\textup{g}, cell}(\\lambda)e^{-O^{0, cell}\\cdot\\lambda}\\cosh({P^{^3\\textup{He}, cell}(t)\\cdot O^{0, cell}\\cdot\\lambda})\n", + "$$\n", + "\n", + "Fitting this equation to the direct-beam data will yield $C^{cell}$ and $T^{1, cell}$, which then can be used to calculate $P^{^3\\textup{He}, cell}(t)$, which shall be the output of the procedure. \n", + "\n", + "- Note: Some instruments cannot move the polarizer, and in those cases the incoming beam on the analyzer would be polarized. In such cases, another workflow has to be used.\n", + "- Note: The readout of which spin-channel to use for $I^{\\textup{DB,unpol-in},cell}_{\\lambda, t}$ is irrelevant, as they are the same." + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "### Spin-dependent transmission values\n", + "\n", + "Now both $O^{cell}(\\lambda)=O^{0, cell}\\cdot\\lambda$ and $P^{^3\\textup{He}, cell}(t)$ are known.
\n", + "Following Refs (1, 3), the polarization-dependent transmission matrices of a polarized neutron beam through the ^3\\textup{He} cells can be computed by inserting \n", + "\n", + "$$\n", + "\\hat{T}^{\\pm, cell}(t,\\lambda) = T^\\textup{g}\\cdot \\exp\\left(-O^{0, cell}\\cdot\\lambda\\left(1\\mp P^{^3\\textup{He}, cell}(t)\\right)\\right)\n", + "$$\n", + "\n", + "into:\n", + "\n", + "$$\n", + "\\hat{T}^{\\textup{p}}=\n", + "\\begin{pmatrix} \n", + "T^\\textup{p,+}(t,\\lambda) & 0 & T^\\textup{p,-}(t,\\lambda) & 0 \\\\ 0 & T^\\textup{p,+}(t,\\lambda) & 0 & T^\\textup{p,-}(t,\\lambda) \\\\ T^\\textup{p,-}(t,\\lambda) & 0 & T^\\textup{p,+}(t,\\lambda) & 0 \\\\ 0 & T^\\textup{p,-}(t,\\lambda) & 0 & T^\\textup{p,+}(t,\\lambda) \n", + "\\end{pmatrix}\n", + "$$\n", + "\n", + "\n", + "$$\n", + "\\hat{T}^{\\textup{a}}=\n", + "\\begin{pmatrix} \n", + "T^\\textup{a,+}(t,\\lambda) & T^\\textup{a,-}(t,\\lambda) & 0 &0\\\\ T^\\textup{a,-}(t,\\lambda) & T^\\textup{a,+}(t,\\lambda) & 0 & 0\\\\ 0&0& T^\\textup{a,+}(t,\\lambda) & T^\\textup{a,-}(t,\\lambda) \\\\ 0&0& T^\\textup{a,-}(t,\\lambda) & T^\\textup{a,+}(t,\\lambda)\n", + "\\end{pmatrix}\n", + "$$\n", + "\n", + "- Note: same function for both cells, but with different input parameters\n", + "- Note: in principle the incoming beam to the polarizer is unpolarized, so $\\hat{T}^{\\textup{unpol-in}}(\\lambda, t)$ instead of $\\hat{T}^{\\pm, cell}(t,\\lambda)$ could be used. However, the results will be the same in this case without the need to differ between the cases." + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "### Sample data correction\n", + "\n", + "For polarizing 3He-cells without neutron flippers in the beamline, the correction matrix $\\hat{M}$ becomes $\\hat{M} = \\hat{T}^{\\textup{a}}\\hat{T}^{\\textup{p}}$. To correct the measured data I, we need to apply the inverse matrix to the data $(\\hat{M})^{-1}$:\n", + "\n", + "$$\n", + "\\begin{pmatrix} I^{++}_{t,\\lambda} \\\\ I^{+-}_{t,\\lambda} \\\\ I^{-+}_{t,\\lambda} \\\\ I^{--}_{t,\\lambda}\\end{pmatrix} = \\hat{T}^{\\textup{a}}(t,\\lambda)\\cdot\\hat{T}^{\\textup{p}}(t,\\lambda) \n", + "\\begin{pmatrix} S^{++}_{t,\\lambda} \\\\ S^{+-}_{t,\\lambda} \\\\ S^{-+}_{t,\\lambda} \\\\ S^{--}_{t,\\lambda}\\end{pmatrix}\n", + "$$\n", + "\n", + "$$\n", + "\\left(\\hat{T}^{\\textup{a}}(t,\\lambda)\\cdot\\hat{T}^\\textup{p}t,\\lambda)\\right)^{-1} \\begin{pmatrix} I^{++}_{t,\\lambda} \\\\ I^{+-}_{t,\\lambda} \\\\ I^{-+}_{t,\\lambda} \\\\ I^{--}_{t,\\lambda}\\end{pmatrix} = \n", + "\\begin{pmatrix} S^{++}_{t,\\lambda} \\\\ S^{+-}_{t,\\lambda} \\\\ S^{-+}_{t,\\lambda} \\\\ S^{--}_{t,\\lambda}\\end{pmatrix}\n", + "$$\n", + "\n", + "- Note: probably easier to first put functions into the matrix product $T^\\textup{a}$ $\\cdot$ $T^\\textup{p}$, then analytically get the inverse of that matrix product.\n", + "- Note: we need to perform computation of matrix on channels all together, so we always need all four sets of T+-, a,p together" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "## Literature\n", + "\n", + "1) W. T. Lee et al., Polarisation Development at the European Spallation Source\n", + "2) K. Krycka et al., Polarization-analyzed small-angle neutron scattering. I. Polarized data reduction using Pol-Corr\n", + "3) A. Wildes, The polarizer-analyzer correction problem in neutron polarization analysis experiments\n", + "4) V. McLane et al., \"Neutron Cross. Sections, Vol. 2, Neutron Cross Section Curves\", Academic. Press Inc., New York (1988)\n", + "5) T. Gentile et al., Optically polarized 3He\n", + "\n", + "Note 1:
\n", + "This workflow can be applied on polarization analyzed sample-data using two time-dependent ex-situ polarized 3He-based spin filters as both polarizer and analyzer. To be used for the instruments SKADI and DREAM, following adaptations have to be made:\n", + "\n", + "1: DREAM-SANS:
\n", + "operated with a movable in-situ SEOP 3He-polarizer and a movable ex-situ SEOP small-angle 3He-analyzer (nm-SANS-option):
\n", + "--> the polarizer is continuously pumped and considered as time-independent. Values like the opacity, nuclear polarization, and transmission will be pre-characterized and inserted to the workflow as constant parameters.\n", + "\n", + "2: DREAM-Diffraction:
\n", + "operated with a movable in-situ SEOP 3He-polarizer and a NOT-movable ex-situ MEOP wide-angle 3He-analyzer
\n", + "--> for the polarizer, the same treatment as stated in 1. will be applied. For the analyzer a new workflow considering that the analyzer cannot be moved out of the beam has to be written.\n", + "\n", + "3: SKADI:
\n", + "operated with a movable supermirror V-cavity polarizer, a spin flipper, and a movable ex-situ SEOP/MEOP 3He-analyzer:
\n", + "--> The supermirror polarizer (time-independent and wavelength-dependent) and spin flipper transmission values can be pre-characterized and inserted to the workflow as constant parameters. For the analyzer, the current workflow can be adapted.\n" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "## Open questions regarding DREAM\n", + "\n", + "- Should the incident beam monitor be moved behind the polarizer?\n", + "- --> we would need a monitor after polarizer if analyzer cannot be moved and polarizer also needs to be characterized\n", + "- --> current decision: moving monitor to after polarizer (but on another stage, so moves of polarizer do not move monitor\n", + "- --> The \"unpolarized SANS\" data correction then will be taken on the monitor AFTER polarizer. But as it is an in-situ polarizer with constant polarization, this just leads to a constant offset which will be corrected for using this workflow. If sudden fluctuations in intensity are observed, the polarizer has to be moved out to characterize the neutron beam from the target.\n", + "- How to treat an in-situ polarizer?\n", + "- --> instead of exponential decay use a step-function, something like: \"if C changes, then shift P\" - basically constant in time, but with adaptable C (piecewise constant function)\n", + "- How to adapt workflow for the non-movable wide-angle analyzer?\n", + "- --> needs to be changed as following: instead of moving analyzer out during measuring P, measure with different monitor for P, and just move out polarizer for measuring analyzer\n", + "- How to treat the \"SANS-window\" of the high-angle analyzer?\n", + "- --> characterizing the wide-angle would be done outside user experiments, just measured sometimes in between by beamline scientists - here then parameters are treated constant for both parts (big part and SANS-window-part)" + ] + } + ], + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/essreduce/docs/user-guide/polarization/workflow.ipynb b/packages/essreduce/docs/user-guide/polarization/workflow.ipynb new file mode 100644 index 000000000..d38fbb7ac --- /dev/null +++ b/packages/essreduce/docs/user-guide/polarization/workflow.ipynb @@ -0,0 +1,268 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Workflows\n", + "\n", + "## He3 Cell Workflow\n", + "\n", + "The `he3` submodule provides a helper `He3CellWorkflow`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from ess import polarization as pol\n", + "\n", + "print(pol.he3.He3CellWorkflow.__doc__)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Opacity\n", + "\n", + "There are two ways of computing the opacity, from cell parameters and from direct-beam measurements." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workflow = pol.he3.He3CellWorkflow(in_situ=True) # True is the default\n", + "workflow.visualize(pol.He3OpacityFunction[pol.Polarizer])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workflow = pol.he3.He3CellWorkflow(in_situ=False)\n", + "workflow.visualize(pol.He3OpacityFunction[pol.Polarizer])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Transmission function\n", + "\n", + "The opacity can be used to obtain the transmission function of the cells.\n", + "We show the in-situ case, but it works equivalently for the more precise definition of opacity:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "workflow = pol.he3.He3CellWorkflow(in_situ=True, incoming_polarized=False)\n", + "workflow.visualize(\n", + " pol.TransmissionFunction[pol.Polarizer], graph_attr={\"rankdir\": \"LR\"}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is a variant of the workflow using an incoming polarized beam for computing the transmission function of the analyzer. \n", + "Note that the incoming polarized case only applies to the analyzer, since for the polarizer the incoming neutron beam will always be unpolarized:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workflow = pol.he3.He3CellWorkflow(in_situ=True, incoming_polarized=True)\n", + "workflow.visualize(\n", + " (pol.TransmissionFunction[pol.Polarizer], pol.TransmissionFunction[pol.Analyzer]),\n", + " graph_attr={\"rankdir\": \"LR\"},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Supermirror Workflow\n", + "\n", + "The `supermirror` submodule provides a helper `SupermirrorWorkflow`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from ess import polarization as pol\n", + "\n", + "workflow = pol.supermirror.SupermirrorWorkflow()\n", + "print(workflow.__doc__)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workflow.visualize(pol.TransmissionFunction[pol.Polarizer])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Full pipeline\n", + "\n", + "### On-the-fly reduction: opacity from cell parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In total, we can choose to use either He3-cells or supermirrors for both the polarizer and analyzer.\n", + "Following cell shows an example of using a polarizer supermirror and analyzer He3-cell with an incoming polarized beam and an in-situ opacity calculation:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "he3_workflow = pol.He3CellWorkflow(in_situ=True, incoming_polarized=True)\n", + "sm_workflow = pol.supermirror.SupermirrorWorkflow()\n", + "\n", + "workflow = pol.PolarizationAnalysisWorkflow(\n", + " analyzer_workflow=he3_workflow, polarizer_workflow=sm_workflow\n", + ")\n", + "results = (\n", + " pol.PolarizationCorrectedData[pol.Up, pol.Up],\n", + " pol.PolarizationCorrectedData[pol.Up, pol.Down],\n", + " pol.PolarizationCorrectedData[pol.Down, pol.Up],\n", + " pol.PolarizationCorrectedData[pol.Down, pol.Down],\n", + ")\n", + "workflow.visualize(results, graph_attr={\"rankdir\": \"LR\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Precise reduction: opacity from direct-beam measurements of unpolarized cells" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, an example is presented using the opacity calculation from direct-beam measurements (ex-situ case) for having 2x He3-cells as analyzer and polarizer. Note that the incoming-polarized beam only applies to the analyzer, since the polarizer will always use an incoming-unpolarized beam. Hence, one could alternatively use the same command is described under [Transmission function](#Transmission-function) for 2x He3-cells.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "he3_polarizer_workflow = pol.He3CellWorkflow(in_situ=False, incoming_polarized=False)\n", + "he3_analyzer_workflow = pol.He3CellWorkflow(in_situ=False, incoming_polarized=True)\n", + "\n", + "workflow = pol.PolarizationAnalysisWorkflow(\n", + " analyzer_workflow=he3_analyzer_workflow, polarizer_workflow=he3_polarizer_workflow\n", + ")\n", + "workflow.visualize(results, graph_attr={\"rankdir\": \"LR\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Correction workflow\n", + "\n", + "The correction worklow on its own looks as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from ess.polarization.correction import CorrectionWorkflow\n", + "\n", + "workflow = CorrectionWorkflow()\n", + "workflow.visualize(results, graph_attr={\"rankdir\": \"LR\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also a half-polarized version of the workflow, in case only a polarizer is used:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from ess.polarization.correction import CorrectionWorkflow\n", + "\n", + "results = (\n", + " pol.HalfPolarizedCorrectedData[pol.Up],\n", + " pol.HalfPolarizedCorrectedData[pol.Down],\n", + ")\n", + "workflow = CorrectionWorkflow(half_polarized=True)\n", + "workflow.visualize(results, graph_attr={\"rankdir\": \"LR\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that in parts of the workflow `Up` is used as a dummy value for the spin of the analyzer that is not present." + ] + } + ], + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/packages/essreduce/docs/user-guide/polarization/zoom.ipynb b/packages/essreduce/docs/user-guide/polarization/zoom.ipynb new file mode 100644 index 000000000..7a89e4202 --- /dev/null +++ b/packages/essreduce/docs/user-guide/polarization/zoom.ipynb @@ -0,0 +1,735 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Zoom Polarization Analysis\n", + "\n", + "## Introduction" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib widget\n", + "import plopp\n", + "import sciline\n", + "import scipp as sc\n", + "from ess import polarization as pol\n", + "from ess import sans\n", + "from ess import isissans as isis\n", + "import ess.isissans.data # noqa: F401\n", + "from ess.sans.types import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "data_folder = Path('zoom-data-2025-07')\n", + "# Runs with analyzer at 4 different times\n", + "cell_runs = [\n", + " str(data_folder / '3He_unpolarized_in' / f'ZOOM00038{run}.nxs')\n", + " for run in [423, 425, 427, 429, 431, 433, 435, 437]\n", + "]\n", + "empty_run = data_folder / 'Background_files' / 'ZOOM00038336.nxs'\n", + "depolarized_run = data_folder / 'Background_files' / 'ZOOM00038470.nxs'\n", + "cell_runs = [*cell_runs, depolarized_run]" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Setup SANS workflow for computing transmission fraction" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "params = {\n", + " WavelengthBins: sc.geomspace(\n", + " 'wavelength', start=1.75, stop=16.5, num=141, unit='Å'\n", + " ),\n", + " isis.mantidio.CalibrationWorkspace: None,\n", + " # Spectrum numbers used for histogram files (Workspace2D)\n", + " isis.MonitorSpectrumNumber[Incident]: isis.MonitorSpectrumNumber[Incident](3),\n", + " isis.MonitorSpectrumNumber[Transmission]: isis.MonitorSpectrumNumber[Transmission](\n", + " 4\n", + " ),\n", + " # Monitor names used for event files (EventWorkspace)\n", + " NeXusMonitorName[Incident]: NeXusMonitorName[Incident](\"monitor3\"),\n", + " NeXusMonitorName[Transmission]: NeXusMonitorName[Transmission](\"monitor4\"),\n", + " UncertaintyBroadcastMode: UncertaintyBroadcastMode.upper_bound,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "from ess.polarization.zoom import ZoomTransmissionFractionWorkflow\n", + "\n", + "sans_workflow = ZoomTransmissionFractionWorkflow(cell_runs)\n", + "for key, value in params.items():\n", + " sans_workflow[key] = value\n", + "sans_workflow[isis.mantidio.Period] = 0\n", + "sans_workflow[Filename[EmptyBeamRun]] = str(empty_run)" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "## Inspect data for one of the runs with analyzer cell" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "loaded = sciline.get_mapped_node_names(\n", + " sans_workflow, isis.mantidio.LoadedFileContents[TransmissionRun[SampleRun]]\n", + ")\n", + "# Load only first run\n", + "first_run = sans_workflow.compute(loaded[0])\n", + "sc.DataGroup(sc.collapse(first_run['data'], keep='tof')).plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "first_run" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "We can load the combined time-dependent incident and transmission monitors.\n", + "Note that the last run is the depolarized run:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "mons = sans_workflow.compute(\n", + " (\n", + " NeXusComponent[Incident, TransmissionRun[SampleRun]],\n", + " NeXusComponent[Transmission, TransmissionRun[SampleRun]],\n", + " )\n", + ")\n", + "mons = sc.DataGroup(\n", + " incident=mons[NeXusComponent[Incident, TransmissionRun[SampleRun]]]['data'],\n", + " transmission=mons[NeXusComponent[Transmission, TransmissionRun[SampleRun]]]['data'],\n", + ")\n", + "display(sc.DataGroup(sc.collapse(mons['incident'], keep='tof')).plot())\n", + "display(sc.DataGroup(sc.collapse(mons['transmission'], keep='tof')).plot())" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "The task graph for computing the transmission fraction is:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "sans_workflow.visualize(\n", + " TransmissionFraction[SampleRun], graph_attr={'rankdir': 'LR'}, compact=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "## Compute transmission fractions\n", + "\n", + "There are multiple files which together define the time-dependence of the analyzer cell transmission.\n", + "Note that as before the final run (time) is the depolarized run:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "raw_transmission = sans_workflow.compute(TransmissionFraction[SampleRun])" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "We can plot the computed transmission fractions:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "transmission_depolarized = raw_transmission['time', -1].copy()\n", + "transmission = raw_transmission['time', :-1].copy()\n", + "trans = sc.DataGroup(\n", + " {f\"{time:c}\": transmission['time', time] for time in transmission.coords['time']}\n", + ")\n", + "trans['depolarized'] = transmission_depolarized\n", + "display(trans.plot())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "# Sanity check: Where can cosh yield values that can be fitted?\n", + "transmission_empty_glass = 0.9 * sc.Unit('dimensionless')\n", + "wavelength = sc.midpoints(transmission.coords['wavelength'])\n", + "opacity0 = 0.8797823016804095 * sc.Unit('1/angstrom')\n", + "(\n", + " sc.acosh(\n", + " sc.values(transmission)\n", + " * sc.exp(opacity0 * wavelength)\n", + " / transmission_empty_glass\n", + " )\n", + " / (opacity0 * wavelength)\n", + ").plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "wav_min = 1.75 * sc.Unit('angstrom')\n", + "wav_max = 16.5 * sc.Unit('angstrom')\n", + "transmission_truncated = raw_transmission['wavelength', wav_min:wav_max]\n", + "transmission_depolarized = transmission_truncated['time', -1].copy()\n", + "transmission = transmission_truncated['time', :-1].copy()" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "We can now setup the polarization analysis workflow.\n", + "The previously computed transmission fractions are used as workflow inputs:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "he3_workflow = pol.he3.He3CellWorkflow(in_situ=False, incoming_polarized=True)\n", + "# TODO Is plus correct here, this is period 0? Do we also have minus data?\n", + "he3_workflow[pol.he3.He3AnalyzerTransmissionFractionParallel] = transmission\n", + "# TODO Fake empty transmission for now, would need to load different period\n", + "he3_workflow[pol.he3.He3AnalyzerTransmissionFractionAntiParallel] = transmission[\n", + " 'time', 0:0\n", + "]\n", + "he3_workflow[\n", + " pol.he3.He3CellTransmissionFractionIncomingUnpolarized[\n", + " pol.Analyzer, pol.Depolarized\n", + " ]\n", + "] = transmission_depolarized\n", + "\n", + "# When in_situ=False, these params are used as starting guess for the fit\n", + "he3_workflow[pol.he3.He3CellLength[pol.Analyzer]] = 0.1 * sc.Unit('m')\n", + "he3_workflow[pol.he3.He3CellPressure[pol.Analyzer]] = 1.0 * sc.Unit('bar')\n", + "he3_workflow[pol.he3.He3CellTemperature[pol.Analyzer]] = 300.0 * sc.Unit('K')\n", + "\n", + "he3_workflow[pol.he3.He3TransmissionEmptyGlass[pol.Analyzer]] = transmission_empty_glass\n", + "he3_workflow.visualize(\n", + " pol.TransmissionFunction[pol.Analyzer], graph_attr={'rankdir': 'LR'}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "The workflow can compute the transmission function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "func = he3_workflow.compute(pol.TransmissionFunction[pol.Analyzer])" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "We can evaluate this transmission function at desired time and wavelength points:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "wavelength = sc.linspace('wavelength', start=2, stop=16.0, num=141, unit='angstrom')\n", + "time = sc.linspace('time', start=0, stop=100000, num=101, unit='s')\n", + "display(func.opacity_function(wavelength=wavelength).plot())\n", + "display(func.polarization_function(time=time).plot())\n", + "display(func(wavelength=wavelength, time=time, plus_minus='plus').plot(norm='log'))\n", + "display(func(wavelength=wavelength, time=time, plus_minus='minus').plot(norm='log'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "trans = sc.DataArray(\n", + " func(wavelength=wavelength, time=time, plus_minus='plus'),\n", + " coords={\n", + " 'wavelength': wavelength,\n", + " 'time': time,\n", + " },\n", + ")\n", + "sc.DataGroup(\n", + " {f\"{time:c}\": trans['time', time] for time in trans.coords['time'][::20]}\n", + ").plot(norm='linear', linestyle='solid', marker=None)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "trans = sc.DataArray(\n", + " func(wavelength=wavelength, time=time, plus_minus='plus'),\n", + " coords={\n", + " 'wavelength': wavelength,\n", + " 'time': time,\n", + " },\n", + ")\n", + "sc.DataGroup(\n", + " {f\"{wav:c}\": trans['wavelength', wav] for wav in trans.coords['wavelength'][::20]}\n", + ").plot(norm='log', linestyle='solid', marker=None)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "func.opacity_function.opacity0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "func.polarization_function.C" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "func.polarization_function.T1" + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": {}, + "source": [ + "## Sample data\n", + "\n", + "We now proceed to process the sample data.\n", + "We use the Zoom workflow from ESSsans, configured as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "def make_sample_workflow() -> sciline.Pipeline:\n", + " wf = isis.zoom.ZoomWorkflow()\n", + " wf.insert(isis.io.transmission_from_background_run)\n", + " wf.insert(isis.io.transmission_from_sample_run)\n", + "\n", + " # TODO Are these masks correct? Provide correct XML files!\n", + " masks = isis.data.zoom_tutorial_mask_filenames()\n", + " wf = sans.with_pixel_mask_filenames(wf, masks)\n", + "\n", + " for key, value in params.items():\n", + " wf[key] = value\n", + " wf[QBins] = sc.geomspace(dim='Q', start=0.004, stop=0.8, num=141, unit='1/angstrom')\n", + " wf[QxBins] = sc.linspace('Qx', start=-0.3, stop=0.3, num=101, unit='1/angstrom')\n", + " wf[QyBins] = sc.linspace('Qy', start=-0.3, stop=0.3, num=101, unit='1/angstrom')\n", + " wf[NonBackgroundWavelengthRange] = sc.array(\n", + " dims=['wavelength'], values=[0.7, 17.1], unit='angstrom'\n", + " )\n", + " wf[CorrectForGravity] = True\n", + " wf[UncertaintyBroadcastMode] = UncertaintyBroadcastMode.upper_bound\n", + " wf[ReturnEvents] = True\n", + "\n", + " # TODO Configure offsets and beam center correctly!\n", + " # sample_workflow[isis.SampleOffset] = sc.vector([0.0, 0.0, 0.11], unit='m')\n", + " # sample_workflow[isis.DetectorBankOffset] = sc.vector([0.0, 0.0, 0.5], unit='m')\n", + " wf[BeamCenter] = sc.vector([0.0, 0.0, 0.0], unit='m')\n", + "\n", + " # TODO Use direct beam!\n", + " # sample_workflow[DirectBeamFilename]\n", + " wf[DirectBeam] = None\n", + "\n", + " return wf" + ] + }, + { + "cell_type": "markdown", + "id": "32", + "metadata": {}, + "source": [ + "The sample runs are event data, so we can simply merge all runs to obtain a single event-mode $I(Q)$.\n", + "We use `sans.with_sample_runs` to obtain a workflow that merges the runs and computes the $I(Q)$:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "water_folder = data_folder / 'Sample_water_cell3'\n", + "sample_runs = [str(water_folder / f'ZOOM00038{run}.nxs') for run in range(439, 466, 2)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34", + "metadata": {}, + "outputs": [], + "source": [ + "sample_workflow = make_sample_workflow()\n", + "sample_workflow[Filename[EmptyBeamRun]] = str(empty_run)\n", + "multi_run_sample_workflow = sans.with_sample_runs(sample_workflow, runs=sample_runs)" + ] + }, + { + "cell_type": "markdown", + "id": "35", + "metadata": {}, + "source": [ + "The sample workflow looks like this:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36", + "metadata": {}, + "outputs": [], + "source": [ + "multi_run_sample_workflow.visualize(\n", + " IofQ[SampleRun], graph_attr={'rankdir': 'LR'}, compact=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "37", + "metadata": {}, + "source": [ + "ESSsans does not support processing multiple periods (and there are no plans for this, as this is ISIS-specific).\n", + "We therefore run the workflow once per period.\n", + "Note that is is inefficient as it loads every file four times." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38", + "metadata": {}, + "outputs": [], + "source": [ + "# WARNING: Running this cell takes a couple of minutes when all sample runs are used.\n", + "\n", + "# TODO Is this correct? We get very large times. Are we using the correct transmission\n", + "# runs above?\n", + "time_base = transmission.coords['datetime'].min()\n", + "\n", + "periods = []\n", + "for period in range(4):\n", + " multi_run_sample_workflow[isis.mantidio.Period] = period\n", + " iofq = multi_run_sample_workflow.compute(IofQxy[SampleRun])\n", + " iofq = iofq.bins.assign_coords(\n", + " time=iofq.bins.coords['pulse_time'].to(unit=time_base.unit) - time_base\n", + " ).drop_coords('wavelength') # Wavelength bounds get in the way\n", + " periods.append(iofq)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "plopp.slicer(\n", + " sc.values(sc.concat(periods, 'period').hist(pulse_time=10)), keep=('Qx', 'Qy')\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "40", + "metadata": {}, + "source": [ + "## Correction workflow\n", + "\n", + "In the previous section we have setup the workflow for the analyzer.\n", + "We also computed the transmission function there, but in production this will be done implicitly by running the entire workflow we will setup here.\n", + "We can combine this with the workflow for the polarizer to obtain the full correction workflow:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41", + "metadata": {}, + "outputs": [], + "source": [ + "supermirror_workflow = pol.SupermirrorWorkflow()\n", + "supermirror_workflow.visualize(pol.TransmissionFunction[pol.Polarizer])" + ] + }, + { + "cell_type": "markdown", + "id": "42", + "metadata": {}, + "source": [ + "We will use a second-order polynomial supermirror efficiency function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43", + "metadata": {}, + "outputs": [], + "source": [ + "from ess.polarization.data import example_polarization_efficiency_table\n", + "\n", + "supermirror_workflow[pol.SupermirrorEfficiencyFunction[pol.Polarizer]] = (\n", + " pol.EfficiencyLookupTable.from_file(\n", + " example_polarization_efficiency_table(),\n", + " wavelength_colname='# X ',\n", + " efficiency_colname=' Y ',\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44", + "metadata": {}, + "outputs": [], + "source": [ + "workflow = pol.PolarizationAnalysisWorkflow(\n", + " polarizer_workflow=supermirror_workflow,\n", + " analyzer_workflow=he3_workflow,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "45", + "metadata": {}, + "source": [ + "For a single channel, the complete workflow looks as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46", + "metadata": {}, + "outputs": [], + "source": [ + "workflow.visualize(\n", + " pol.PolarizationCorrectedData[pol.Up, pol.Up], graph_attr={'rankdir': 'LR'}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "47", + "metadata": {}, + "source": [ + "We can now set the reduced sample data for each measured channel:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48", + "metadata": {}, + "outputs": [], + "source": [ + "workflow[pol.ReducedSampleDataBySpinChannel[pol.Up, pol.Up]] = periods[0]\n", + "workflow[pol.ReducedSampleDataBySpinChannel[pol.Down, pol.Up]] = periods[1]\n", + "workflow[pol.ReducedSampleDataBySpinChannel[pol.Up, pol.Down]] = periods[2]\n", + "workflow[pol.ReducedSampleDataBySpinChannel[pol.Down, pol.Down]] = periods[3]" + ] + }, + { + "cell_type": "markdown", + "id": "49", + "metadata": {}, + "source": [ + "The result for a single input channel (up-up) is:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50", + "metadata": {}, + "outputs": [], + "source": [ + "channels = workflow.compute(pol.PolarizationCorrectedData[pol.Up, pol.Up])\n", + "tiled = plopp.tiled(2, 2)\n", + "tiled[0, 0] = channels.upup.nanhist().plot()\n", + "tiled[0, 1] = channels.updown.nanhist().plot()\n", + "tiled[1, 0] = channels.downup.nanhist().plot()\n", + "tiled[1, 1] = channels.downdown.nanhist().plot()\n", + "tiled" + ] + }, + { + "cell_type": "markdown", + "id": "51", + "metadata": {}, + "source": [ + "The combination of all four channels is:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52", + "metadata": {}, + "outputs": [], + "source": [ + "channels = workflow.compute(pol.TotalPolarizationCorrectedData)\n", + "tiled = plopp.tiled(2, 2)\n", + "tiled[0, 0] = channels.upup.nanhist().plot()\n", + "tiled[0, 1] = channels.updown.nanhist().plot()\n", + "tiled[1, 0] = channels.downup.nanhist().plot()\n", + "tiled[1, 1] = channels.downdown.nanhist().plot()\n", + "tiled" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "dev311", + "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.13" + }, + "nbsphinx": { + "execute": "never" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/essreduce/pyproject.toml b/packages/essreduce/pyproject.toml index 487f37dd3..f2049f957 100644 --- a/packages/essreduce/pyproject.toml +++ b/packages/essreduce/pyproject.toml @@ -30,10 +30,12 @@ requires-python = ">=3.11" dynamic = ["version"] dependencies = [ + "dask>=2022.1.0", "sciline>=25.11.0", "scipp>=26.3.0", "scippneutron>=25.11.1", "scippnexus>=25.06.0", + "scipy>=1.14", ] [project.optional-dependencies] @@ -46,6 +48,7 @@ test = [ "pytest>=7.0", "scipy>=1.14", "tof>=25.12.0", + "pandas>=2.1.2", ] docs = [ "autodoc-pydantic", diff --git a/packages/essreduce/src/ess/reduce/__init__.py b/packages/essreduce/src/ess/reduce/__init__.py index 1ce5144fa..873581316 100644 --- a/packages/essreduce/src/ess/reduce/__init__.py +++ b/packages/essreduce/src/ess/reduce/__init__.py @@ -3,7 +3,7 @@ import importlib.metadata -from . import nexus, normalization, uncertainty, unwrap +from . import nexus, normalization, polarization, uncertainty, unwrap try: __version__ = importlib.metadata.version("essreduce") @@ -12,4 +12,4 @@ del importlib -__all__ = ["nexus", "normalization", "uncertainty", "unwrap"] +__all__ = ["nexus", "normalization", "polarization", "uncertainty", "unwrap"] diff --git a/packages/essreduce/src/ess/reduce/polarization/__init__.py b/packages/essreduce/src/ess/reduce/polarization/__init__.py new file mode 100644 index 000000000..caa09f18f --- /dev/null +++ b/packages/essreduce/src/ess/reduce/polarization/__init__.py @@ -0,0 +1,85 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) + + +""" +Utilities for processing polarized neutron data. +""" + +from .correction import ( + CorrectionWorkflow, + HalfPolarizedWorkflow, + PolarizationAnalysisWorkflow, +) +from .he3 import ( + Depolarized, + DirectBeamBackgroundQRange, + DirectBeamNoCell, + DirectBeamQRange, + He3CellLength, + He3CellPressure, + He3CellWorkflow, + He3DirectBeam, + He3FillingTime, + He3Opacity0, + He3OpacityFunction, + He3PolarizationFunction, + He3TransmissionEmptyGlass, + He3TransmissionFunction, + Polarized, +) +from .supermirror import ( + EfficiencyLookupTable, + SecondDegreePolynomialEfficiency, + SupermirrorEfficiencyFunction, + SupermirrorWorkflow, +) +from .types import ( + Analyzer, + Down, + HalfPolarizedCorrectedData, + NoAnalyzer, + PolarizationCorrectedData, + Polarizer, + PolarizingElement, + ReducedSampleDataBySpinChannel, + TotalPolarizationCorrectedData, + TransmissionFunction, + Up, +) + +__all__ = [ + "Analyzer", + "CorrectionWorkflow", + "Depolarized", + "DirectBeamBackgroundQRange", + "DirectBeamNoCell", + "DirectBeamQRange", + "Down", + "EfficiencyLookupTable", + "HalfPolarizedCorrectedData", + "HalfPolarizedWorkflow", + "He3CellLength", + "He3CellPressure", + "He3CellWorkflow", + "He3DirectBeam", + "He3FillingTime", + "He3Opacity0", + "He3OpacityFunction", + "He3PolarizationFunction", + "He3TransmissionEmptyGlass", + "He3TransmissionFunction", + "NoAnalyzer", + "PolarizationAnalysisWorkflow", + "PolarizationCorrectedData", + "Polarized", + "Polarizer", + "PolarizingElement", + "ReducedSampleDataBySpinChannel", + "SecondDegreePolynomialEfficiency", + "SupermirrorEfficiencyFunction", + "SupermirrorWorkflow", + "TotalPolarizationCorrectedData", + "TransmissionFunction", + "Up", +] diff --git a/packages/essreduce/src/ess/reduce/polarization/base.py b/packages/essreduce/src/ess/reduce/polarization/base.py new file mode 100644 index 000000000..0390bbf97 --- /dev/null +++ b/packages/essreduce/src/ess/reduce/polarization/base.py @@ -0,0 +1,228 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) +from collections.abc import Mapping +from typing import NewType + +import numpy as np +import sciline as sl +import scipp as sc + +from .he3 import Polarized, ReducedDirectBeamData, ReducedDirectBeamDataNoCell +from .types import ( + Analyzer, + Down, + Polarizer, + PolarizingElement, + ReducedSampleDataBySpinChannel, + Up, +) + +spin_up = sc.scalar(1, dtype='int64', unit=None) +spin_down = sc.scalar(-1, dtype='int64', unit=None) + +WavelengthBins = NewType('WavelengthBins', sc.Variable) + + +SampleInBeamLog = NewType('SampleInBeamLog', sc.DataArray) +"""Whether the sample is in the beam as a time series.""" + + +class CellInBeamLog(sl.Scope[PolarizingElement, sc.DataArray], sc.DataArray): + """Whether a given cell is in the beam as a time series.""" + + +class CellSpinLog(sl.Scope[PolarizingElement, sc.DataArray], sc.DataArray): + """Spin state of a given cell, as a time series.""" + + +RunSectionLog = NewType('RunSectionLog', sc.Dataset) +""" +Run section as a time series. + +Derived from several time-series logs in the NeXus file, e.g., +whether the sample and cells are in the beam or not. +""" + + +def determine_run_section( + sample_in_beam: SampleInBeamLog, + polarizer_in_beam: CellInBeamLog[Polarizer], + analyzer_in_beam: CellInBeamLog[Analyzer], + polarizer_spin: CellSpinLog[Polarizer], + analyzer_spin: CellSpinLog[Analyzer], +) -> RunSectionLog: + from scipp.scipy.interpolate import interp1d + + logs = { + 'sample_in_beam': sample_in_beam, + 'polarizer_in_beam': polarizer_in_beam, + 'analyzer_in_beam': analyzer_in_beam, + 'polarizer_spin': polarizer_spin, + 'analyzer_spin': analyzer_spin, + } + # TODO Change this to datetime64 + times = [ + log.coords['time'].to(unit='s', dtype='float64', copy=False) + for log in logs.values() + ] + times = sc.concat(times, 'time') + times = sc.array(dims=times.dims, unit=times.unit, values=np.unique(times.values)) + logs = { + name: interp1d(log, 'time', kind='previous', fill_value='extrapolate')(times) + for name, log in logs.items() + } + return RunSectionLog(sc.Dataset(logs)) + + +ReducedDataByRunSectionAndWavelength = NewType( + 'ReducedDataByRunSectionAndWavelength', sc.DataArray +) + + +def dummy_reduction( + time_bands: sc.Variable, + wavelength_bands: sc.Variable, +) -> sc.DataArray: + """This is a placeholder returning meaningless data with correct shape.""" + data = time_bands[:-1] * wavelength_bands[:-1] + data = data / data.sum() + return sc.DataArray( + data, coords={'time': time_bands, 'wavelength': wavelength_bands} + ) + + +def run_reduction_workflow( + run_section: RunSectionLog, + wavelength_bands: WavelengthBins, +) -> ReducedDataByRunSectionAndWavelength: + """ + Run the reduction workflow. + + Note that is it currently not clear if we will wrap the workflow in a function, + or assemble a common workflow. The structural details may thus be subject to + change. + + The reduction workflow must return normalized event data, binned into time and + wavelength bins. The time bands define intervals of different meaning, such as + sample runs, direct beam runs, and spin states. + """ + # TODO + # Subdivide sample section into smaller intervals, or return numerator/denominator + # separately? The latter would complicate things when supporting different + # kinds of workflows, performing different kinds of normalizations. + # We need to be careful when subdividing and (1) exactly preserve existing bounds + # and (2) introduce new bounds using some heuristics that yield approximately + # equal time intervals (for the sample runs). + data = dummy_reduction( + time_bands=run_section.coords['time'], + wavelength_bands=wavelength_bands, + ) + for name, log in run_section.items(): + data.coords[name] = log.data + return ReducedDataByRunSectionAndWavelength(data) + + +def extract_direct_beam( + data: ReducedDataByRunSectionAndWavelength, +) -> ReducedDirectBeamDataNoCell: + """Extract direct beam without any cells from direct beam data.""" + is_direct_beam = ~( + data.coords['sample_in_beam'] + | data.coords['polarizer_in_beam'] + | data.coords['analyzer_in_beam'] + ) + # We select all bins that correspond to direct-beam run sections. This preserves + # the separation into distinct direct beam runs, which is required later for + # fitting a time-decay function. + return ReducedDirectBeamDataNoCell(data[is_direct_beam]) + + +def extract_polarizer_direct_beam_polarized( + data: ReducedDataByRunSectionAndWavelength, +) -> ReducedDirectBeamData[Polarizer, Polarized]: + """Extract run sections with polarized polarizer from direct beam data.""" + # TODO We need all "polarized" runs, can we assume that + # ReducedDataByRunSectionAndWavelength does not contain any depolarized data? + select = ( + data.coords['polarizer_in_beam'] + & ~data.coords['sample_in_beam'] + & ~data.coords['analyzer_in_beam'] + ) + return ReducedDirectBeamData[Polarizer, Polarized](data[select]) + + +def extract_analyzer_direct_beam_polarized( + data: ReducedDataByRunSectionAndWavelength, +) -> ReducedDirectBeamData[Analyzer, Polarized]: + """Extract run sections with polarized analyzer from direct beam data.""" + # TODO We need all "polarized" runs, can we assume that + # ReducedDataByRunSectionAndWavelength does not contain any depolarized data? + select = ( + data.coords['analyzer_in_beam'] + & ~data.coords['sample_in_beam'] + & ~data.coords['polarizer_in_beam'] + ) + return ReducedDirectBeamData[Analyzer, Polarized](data[select]) + + +def is_sample_channel( + coords: Mapping[str, sc.Variable], + polarizer_spin: sc.Variable, + analyzer_spin: sc.Variable, +) -> sc.Variable: + return ( + coords['sample_in_beam'] + & coords['polarizer_in_beam'] + & coords['analyzer_in_beam'] + & (coords['polarizer_spin'] == polarizer_spin) + & (coords['analyzer_spin'] == analyzer_spin) + ) + + +def extract_sample_data_up_up( + data: ReducedDataByRunSectionAndWavelength, +) -> ReducedSampleDataBySpinChannel[Up, Up]: + """Extract sample data for spin channel up-up.""" + return ReducedSampleDataBySpinChannel[Up, Up]( + is_sample_channel(data, spin_up, spin_up) + ) + + +def extract_sample_data_up_down( + data: ReducedDataByRunSectionAndWavelength, +) -> ReducedSampleDataBySpinChannel[Up, Down]: + """Extract sample data for spin channel up-down.""" + return ReducedSampleDataBySpinChannel[Up, Down]( + is_sample_channel(data, spin_up, spin_down) + ) + + +def extract_sample_data_down_up( + data: ReducedDataByRunSectionAndWavelength, +) -> ReducedSampleDataBySpinChannel[Down, Up]: + """Extract sample data for spin channel down-up.""" + return ReducedSampleDataBySpinChannel[Down, Up]( + is_sample_channel(data, spin_down, spin_up) + ) + + +def extract_sample_data_down_down( + data: ReducedDataByRunSectionAndWavelength, +) -> ReducedSampleDataBySpinChannel[Down, Down]: + """Extract sample data for spin channel down-down.""" + return ReducedSampleDataBySpinChannel[Down, Down]( + is_sample_channel(data, spin_down, spin_down) + ) + + +providers = ( + determine_run_section, + run_reduction_workflow, + extract_direct_beam, + extract_polarizer_direct_beam_polarized, + extract_analyzer_direct_beam_polarized, + extract_sample_data_down_down, + extract_sample_data_down_up, + extract_sample_data_up_down, + extract_sample_data_up_up, +) diff --git a/packages/essreduce/src/ess/reduce/polarization/correction.py b/packages/essreduce/src/ess/reduce/polarization/correction.py new file mode 100644 index 000000000..3c1c5fdd8 --- /dev/null +++ b/packages/essreduce/src/ess/reduce/polarization/correction.py @@ -0,0 +1,323 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) +from dataclasses import dataclass +from typing import Generic + +import sciline +import scipp as sc + +from .types import ( + Analyzer, + AnalyzerSpin, + Down, + FlipperEfficiency, + HalfPolarizedCorrectedData, + HalfPolarizedCorrection, + NoAnalyzer, + PolarizationCorrectedData, + PolarizationCorrection, + Polarizer, + PolarizerSpin, + PolarizingElement, + PolarizingElementCorrection, + ReducedSampleDataBySpinChannel, + TotalPolarizationCorrectedData, + TransmissionFunction, + Up, +) + + +@dataclass +class InverseFlipperMatrix(Generic[PolarizerSpin, PolarizingElement]): + """Flipper matrix, combined with component flip for down component""" + + efficiency: FlipperEfficiency[PolarizingElement] + swap: bool + + def from_left( + self, up: sc.Variable, down: sc.Variable + ) -> tuple[sc.Variable, sc.Variable]: + """Apply inverse flipper matrix from the left (for analyzer)""" + if self.swap: + up, down = down, up + f = 1 / self.efficiency.value + if f == 1: + return up, down + return up, (1 - f) * up + f * down + + def from_right( + self, up: sc.Variable, down: sc.Variable + ) -> tuple[sc.Variable, sc.Variable]: + """Apply inverse flipper matrix from the right (for polarizer)""" + f = 1 / self.efficiency.value + if f == 1: + return (down, up) if self.swap else (up, down) + if self.swap: + return f * down, f * up + else: + return up + (1 - f) * down, down + (1 - f) * up + + +def make_spin_flipping_matrix_up( + efficiency: FlipperEfficiency[PolarizingElement], +) -> InverseFlipperMatrix[Up, PolarizingElement]: + return InverseFlipperMatrix[Up, PolarizingElement]( + efficiency=efficiency, swap=False + ) + + +def make_spin_flipping_matrix_down( + efficiency: FlipperEfficiency[PolarizingElement], +) -> InverseFlipperMatrix[Down, PolarizingElement]: + return InverseFlipperMatrix[Down, PolarizingElement]( + efficiency=efficiency, swap=True + ) + + +def compute_polarizing_element_correction( + channel: ReducedSampleDataBySpinChannel[PolarizerSpin, AnalyzerSpin], + transmission: TransmissionFunction[PolarizingElement], +) -> PolarizingElementCorrection[PolarizerSpin, AnalyzerSpin, PolarizingElement]: + """ + Compute matrix coefficients for the correction of a polarizing element. + + The coefficients stem from the inverse of a symmetric matrix of the form + [[Tplus, Tminus], [Tminus, Tplus]]. The inverse is given by a matrix + mat = 1/denom * [[Tplus, -Tminus], [-Tminus, Tplus]], + with + denom = Tplus**2 - Tminus**2. + As there are only two unique elements in the matrix, we return them as a dataclass + with diagonal and off-diagonal elements. + + Parameters + ---------- + channel : + Data including wavelength (and time) for a given spin channel. Note that the + values are not actually used here, but the data's coordinates are required for + evaluating the transmission function. + transmission : + Transmission function for the polarizing element. + + Returns + ------- + : + Correction matrix coefficients. + """ + if isinstance(channel, sc.Variable | sc.DataArray) and channel.bins is not None: + channel = channel.bins + + t_plus = transmission.apply(channel, 'plus') + t_minus = transmission.apply(channel, 'minus') + t_minus *= -1 + denom = t_plus**2 - t_minus**2 + sc.reciprocal(denom, out=denom) + t_plus *= denom + t_minus *= denom + return PolarizingElementCorrection[PolarizerSpin, AnalyzerSpin, PolarizingElement]( + diag=t_plus, off_diag=t_minus + ) + + +def compute_polarization_correction( + *, + analyzer: PolarizingElementCorrection[PolarizerSpin, AnalyzerSpin, Analyzer], + polarizer: PolarizingElementCorrection[PolarizerSpin, AnalyzerSpin, Polarizer], + analyzer_flipper: InverseFlipperMatrix[AnalyzerSpin, Analyzer], + polarizer_flipper: InverseFlipperMatrix[PolarizerSpin, Polarizer], +) -> PolarizationCorrection[PolarizerSpin, AnalyzerSpin]: + """ + Compute columns of combined correction coefficients for polarizer and analyzer. + + This is effectively a column resulting from a sparse matrix-matrix product. + + Parameters + ---------- + analyzer : + Correction coefficients for the analyzer. + polarizer : + Correction coefficients for the polarizer. + analyzer_flipper : + Flipper matrix for the analyzer. + polarizer_flipper : + Flipper matrix for the polarizer. + + Returns + ------- + : + Combined correction coefficients. + """ + a_up, a_down = analyzer_flipper.from_left(analyzer.diag, analyzer.off_diag) + p_up, p_down = polarizer_flipper.from_right(polarizer.diag, polarizer.off_diag) + return PolarizationCorrection[PolarizerSpin, AnalyzerSpin]( + upup=p_up * a_up, + updown=p_up * a_down, + downup=p_down * a_up, + downdown=p_down * a_down, + ) + + +def compute_polarization_corrected_data( + channel: ReducedSampleDataBySpinChannel[PolarizerSpin, AnalyzerSpin], + polarization_correction: PolarizationCorrection[PolarizerSpin, AnalyzerSpin], +) -> PolarizationCorrectedData[PolarizerSpin, AnalyzerSpin]: + # TODO Would like to use inplace ops, but modifying input is dodgy. Maybe combine + # into a single function? + return PolarizationCorrectedData( + upup=channel * polarization_correction.upup, + updown=channel * polarization_correction.updown, + downup=channel * polarization_correction.downup, + downdown=channel * polarization_correction.downdown, + ) + + +def sum_polarization_contributions( + upup: PolarizationCorrectedData[Up, Up], + updown: PolarizationCorrectedData[Up, Down], + downup: PolarizationCorrectedData[Down, Up], + downdown: PolarizationCorrectedData[Down, Down], +) -> TotalPolarizationCorrectedData: + """ + Sums contributions from the flipper state channels to the spin state channels. + + Returns + ------------ + : + The polarization corrected data. + """ + if upup.upup.bins is not None: + return PolarizationCorrectedData( + upup=sc.reduce( + [v.upup for v in (upup, updown, downup, downdown)] + ).bins.concat(), + updown=sc.reduce( + [v.updown for v in (upup, updown, downup, downdown)] + ).bins.concat(), + downup=sc.reduce( + [v.downup for v in (upup, updown, downup, downdown)] + ).bins.concat(), + downdown=sc.reduce( + [v.downdown for v in (upup, updown, downup, downdown)] + ).bins.concat(), + ) + return PolarizationCorrectedData( + upup=sum(v.upup for v in (upup, updown, downup, downdown)), + updown=sum(v.updown for v in (upup, updown, downup, downdown)), + downup=sum(v.downup for v in (upup, updown, downup, downdown)), + downdown=sum(v.downdown for v in (upup, updown, downup, downdown)), + ) + + +def compute_half_polarized_correction( + *, + polarizer: PolarizingElementCorrection[PolarizerSpin, NoAnalyzer, Polarizer], + polarizer_flipper: InverseFlipperMatrix[PolarizerSpin, Polarizer], +) -> HalfPolarizedCorrection[PolarizerSpin]: + p_up, p_down = polarizer_flipper.from_right(polarizer.diag, polarizer.off_diag) + return HalfPolarizedCorrection[PolarizerSpin](up=p_up, down=p_down) + + +def compute_half_polarized_corrected_data( + channel: ReducedSampleDataBySpinChannel[PolarizerSpin, NoAnalyzer], + polarization_correction: HalfPolarizedCorrection[PolarizerSpin], +) -> HalfPolarizedCorrectedData[PolarizerSpin]: + return HalfPolarizedCorrectedData( + up=channel * polarization_correction.up, + down=channel * polarization_correction.down, + ) + + +def CorrectionWorkflow(half_polarized: bool = False) -> sciline.Pipeline: + """ + Create a workflow for polarization correction. + + This is a basic workflow that requires setting the transmission function directly. + See :py:func:`PolarizationAnalysisWorkflow` and :py:func:`HalfPolarizedWorkflow` for + workflows that can compute the transmission function from a polarizer or analyzer. + + Parameters + ---------- + half_polarized : + If True, the workflow is for a half-polarized case (polarizer only). + If False, the workflow is for a full polarization case (polarizer and + analyzer). + + See Also + -------- + PolarizationAnalysisWorkflow + HalfPolarizedWorkflow + """ + workflow = sciline.Pipeline( + ( + make_spin_flipping_matrix_up, + make_spin_flipping_matrix_down, + compute_polarizing_element_correction, + sum_polarization_contributions, + ) + ) + if half_polarized: + workflow.insert(compute_half_polarized_correction) + workflow.insert(compute_half_polarized_corrected_data) + else: + workflow.insert(compute_polarization_correction) + workflow.insert(compute_polarization_corrected_data) + # If there is no flipper, setting an efficiency of 1.0 is equivalent to not using + # a flipper. + workflow[FlipperEfficiency[PolarizingElement]] = FlipperEfficiency[ + PolarizingElement + ](value=1.0) + return workflow + + +def PolarizationAnalysisWorkflow( + *, + polarizer_workflow: sciline.Pipeline, + analyzer_workflow: sciline.Pipeline, +) -> sciline.Pipeline: + """ + Create a polarization analysis workflow. + + Parameters + ---------- + polarizer_workflow : + Workflow for the polarizer, e.g., a He3CellWorkflow or SupermirrorWorkflow. + analyzer_workflow : + Workflow for the analyzer, e.g., a He3CellWorkflow or SupermirrorWorkflow. + + Returns + ------- + : + Full workflow for polarization analysis. + """ + + workflow = CorrectionWorkflow() + workflow[TransmissionFunction[Polarizer]] = polarizer_workflow[ + TransmissionFunction[Polarizer] + ] + workflow[TransmissionFunction[Analyzer]] = analyzer_workflow[ + TransmissionFunction[Analyzer] + ] + return workflow + + +def HalfPolarizedWorkflow( + *, + polarizer_workflow: sciline.Pipeline, +) -> sciline.Pipeline: + """ + Create a half-polarized workflow, i.e, with a polarizer but no analyzer. + + Parameters + ---------- + polarizer_workflow : + Workflow for the polarizer, e.g., a He3CellWorkflow or SupermirrorWorkflow. + + Returns + ------- + : + Half-polarized workflow. + """ + workflow = CorrectionWorkflow(half_polarized=True) + workflow[TransmissionFunction[Polarizer]] = polarizer_workflow[ + TransmissionFunction[Polarizer] + ] + return workflow diff --git a/packages/essreduce/src/ess/reduce/polarization/data.py b/packages/essreduce/src/ess/reduce/polarization/data.py new file mode 100644 index 000000000..6f8abd6b6 --- /dev/null +++ b/packages/essreduce/src/ess/reduce/polarization/data.py @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2025 Scipp contributors (https://github.com/scipp) +_version = "1" + + +def _make_pooch(): + import pooch + + return pooch.create( + path=pooch.os_cache("ess/polarization"), + env="ESS_AMOR_DATA_DIR", + base_url="https://public.esss.dk/groups/scipp/ess/polarization/{version}/", + version=_version, + registry={ + "f_drabkin_reb.csv": "md5:cf20d53ae4af7b337d06fb84ac353994", + }, + ) + + +_pooch = _make_pooch() + + +def example_polarization_efficiency_table() -> str: + return _pooch.fetch("f_drabkin_reb.csv") + + +__all__ = ["example_polarization_efficiency_table"] diff --git a/packages/essreduce/src/ess/reduce/polarization/he3.py b/packages/essreduce/src/ess/reduce/polarization/he3.py new file mode 100644 index 000000000..42483e179 --- /dev/null +++ b/packages/essreduce/src/ess/reduce/polarization/he3.py @@ -0,0 +1,521 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) +from dataclasses import dataclass +from typing import Generic, NewType, TypeVar + +import sciline as sl +import scipp as sc + +from ess.reduce.uncertainty import broadcast_with_upper_bound_variances + +from .types import ( + Analyzer, + AnalyzerSpin, + Down, + PlusMinus, + PolarizerSpin, + PolarizingElement, + TransmissionFunction, + Up, +) + +Depolarized = NewType('Depolarized', int) +Polarized = NewType('Polarized', int) +"""Polarized either up or down, don't care.""" +PolarizationState = TypeVar('PolarizationState', Polarized, Depolarized) + + +DirectBeamNoCell = NewType('DirectBeamNoCell', sc.DataArray) +"""Direct beam without cells and sample as a function of wavelength.""" + + +class He3CellPressure(sl.Scope[PolarizingElement, sc.Variable], sc.Variable): + """Pressure for a given cell.""" + + +class He3CellLength(sl.Scope[PolarizingElement, sc.Variable], sc.Variable): + """Length for a given cell.""" + + +class He3CellTemperature(sl.Scope[PolarizingElement, sc.Variable], sc.Variable): + """Temperature for a given cell.""" + + +class He3FillingTime(sl.Scope[PolarizingElement, sc.Variable], sc.Variable): + """Filling wall-clock time for a given cell.""" + + +class He3CellTransmissionFractionIncomingUnpolarized( + sl.Scope[PolarizingElement, PolarizationState, sc.DataArray], sc.DataArray +): + """Transmission fraction for a given cell""" + + +class He3AnalyzerTransmissionFractionIncomingPolarized( + sl.Scope[PolarizerSpin, AnalyzerSpin, sc.DataArray], sc.DataArray +): + """Transmission fraction of the analyzer with polarized incoming beam""" + + +He3AnalyzerTransmissionFractionParallel = NewType( + 'He3AnalyzerTransmissionFractionParallel', sc.DataArray +) +"""Transmission fraction of analyzer with parallel polarized incoming beam""" + + +He3AnalyzerTransmissionFractionAntiParallel = NewType( + 'He3AnalyzerTransmissionFractionAntiParallel', sc.DataArray +) +"""Transmission fraction of analyzer with anti-parallel polarized incoming beam""" + + +class He3TransmissionEmptyGlass(sl.Scope[PolarizingElement, sc.Variable], sc.Variable): + """Transmission of the empty glass for a given cell.""" + + +class He3DirectBeam( + sl.Scope[PolarizingElement, PolarizationState, sc.DataArray], sc.DataArray +): + """ + Direct beam data for a given cell and spin state as a function of wavelength. + """ + + +class He3Opacity0(sl.Scope[PolarizingElement, sc.Variable], sc.Variable): + """Opacity at 1 Angstrom for a given cell.""" + + +class He3OpacityFunction(Generic[PolarizingElement]): + """Wavelength-dependent opacity function for a given cell.""" + + def __init__(self, opacity0: sc.Variable): + self._opacity0 = opacity0.to(unit='1/Angstrom') + + @property + def opacity0(self) -> sc.Variable: + return self._opacity0 + + def __call__(self, wavelength: sc.Variable) -> sc.Variable: + scale = broadcast_with_upper_bound_variances( + self.opacity0, prototype=wavelength + ) + return (scale * wavelength).to(unit='', copy=False) + + +def he3_opacity_from_cell_params( + pressure: He3CellPressure[PolarizingElement], + length: He3CellLength[PolarizingElement], + temperature: He3CellTemperature[PolarizingElement], +) -> He3Opacity0[PolarizingElement]: + """Opacity 0 for a given cell, estimated from pressure and cell length.""" + from scipp.constants import Boltzmann as k_B + + he3_neutron_absorption_cross_section_at_1_angstrom = 2966.0e-24 * sc.Unit( + 'cm^2/Angstrom' + ) + # Try to convert to Kelvin, since we get a more cryptic error message later if we + # do not, in case the user passes in a temperature in degree Celsius. + temperature = temperature.to(unit='K') + + opacity0 = ( + he3_neutron_absorption_cross_section_at_1_angstrom + / (k_B * temperature) + * pressure + * length + ) + return He3Opacity0[PolarizingElement](opacity0) + + +def he3_opacity_function_from_cell_opacity( + opacity0: He3Opacity0[PolarizingElement], +) -> He3OpacityFunction[PolarizingElement]: + """ + Opacity function for a given cell, based on pressure and cell length. + + Note that this can alternatively be defined via neutron beam data, see + :py:func:`he3_opacity_function_from_beam_data`. + """ + return He3OpacityFunction[PolarizingElement](opacity0) + + +def _with_midpoints(data: sc.DataArray, dim: str) -> sc.DataArray: + if data.coords.is_edges(dim): + return data.assign_coords({dim: sc.midpoints(data.coords[dim])}) + return data + + +def he3_opacity_function_from_beam_data( + transmission_empty_glass: He3TransmissionEmptyGlass[PolarizingElement], + transmission_fraction: He3CellTransmissionFractionIncomingUnpolarized[ + PolarizingElement, Depolarized + ], + opacity0_initial_guess: He3Opacity0[PolarizingElement], +) -> He3OpacityFunction[PolarizingElement]: + """ + Opacity function for a given cell, based on direct beam data. + + Note that this can alternatively be defined via cell parameters, see + :py:func:`he3_opacity_function_from_cell_opacity`. The cell opacity is used as an + initial guess for the fit. + """ + + # TODO Fit the exponent, since too much weight on low wavelengths? + def intensity(wavelength: sc.Variable, opacity0: sc.Variable) -> sc.Variable: + opacity = He3OpacityFunction[PolarizingElement](opacity0) + return transmission_empty_glass * sc.exp(-opacity(wavelength)) + + popt, _ = sc.curve_fit( + ['wavelength'], + intensity, + _with_midpoints(transmission_fraction, 'wavelength'), + p0={'opacity0': opacity0_initial_guess}, + ) + return He3OpacityFunction[PolarizingElement](sc.values(popt['opacity0']).data) + + +class He3PolarizationFunction(Generic[PolarizingElement]): + """Time-dependent polarization function for a given cell.""" + + def __init__(self, C: sc.Variable, T1: sc.Variable): + self._C = C + self._T1 = T1 + + @property + def C(self) -> sc.Variable: + return self._C + + @property + def T1(self) -> sc.Variable: + return self._T1 + + def __call__(self, time: sc.Variable) -> sc.Variable: + return self.C * sc.exp(-time / self.T1) + + +@dataclass +class He3TransmissionFunction(TransmissionFunction[PolarizingElement]): + """Wavelength- and time-dependent transmission for a given cell.""" + + opacity_function: He3OpacityFunction[PolarizingElement] + polarization_function: He3PolarizationFunction[PolarizingElement] + transmission_empty_glass: He3TransmissionEmptyGlass[PolarizingElement] + + def __call__( + self, *, time: sc.Variable, wavelength: sc.Variable, plus_minus: PlusMinus + ) -> sc.Variable: + opacity = self.opacity_function(wavelength) + polarization = self.polarization_function(time) + if plus_minus == 'plus': + polarization *= -1.0 + elif isinstance(plus_minus, sc.Variable): + polarization *= -plus_minus + return self.transmission_empty_glass * sc.exp(-opacity * (1.0 + polarization)) + + def apply(self, data: sc.DataArray, plus_minus: PlusMinus) -> sc.Variable: + return self( + time=data.coords['time'], + wavelength=data.coords['wavelength'], + plus_minus=plus_minus, + ) + + +def transmission_incoming_unpolarized( + *, + transmission_empty_glass: sc.Variable, + opacity: sc.Variable, + polarization: sc.Variable, +) -> sc.Variable: + return transmission_empty_glass * sc.exp(-opacity) * sc.cosh(opacity * polarization) + + +def compute_transmission_fraction_from_direct_beam( + direct_beam_no_cell: DirectBeamNoCell, + direct_beam_polarized: He3DirectBeam[PolarizingElement, PolarizationState], +) -> He3CellTransmissionFractionIncomingUnpolarized[ + PolarizingElement, PolarizationState +]: + """ + Compute the transmission fraction for a given cell and polarization state. + + This is defined as the ratio of the direct beam with the cell to the direct beam + without the cell. The result is a function of wavelength and time. + + Note that this is possible only if the main detector is used to measure direct + beam data. If direct beam is computed from monitors then, e.g., the SANS + transmission fraction (as computed by a regular SANS workflow) should be used + directly. Note that the regular SANS workflow also normalized to an empty beam + run, make sure to not perform the division twice. + """ + return He3CellTransmissionFractionIncomingUnpolarized[ + PolarizingElement, PolarizationState + ](direct_beam_polarized / direct_beam_no_cell) + + +def get_he3_transmission_incoming_unpolarized_from_fit_to_direct_beam( + transmission_fraction: He3CellTransmissionFractionIncomingUnpolarized[ + PolarizingElement, Polarized + ], + opacity_function: He3OpacityFunction[PolarizingElement], + transmission_empty_glass: He3TransmissionEmptyGlass[PolarizingElement], +) -> TransmissionFunction[PolarizingElement]: + """ + Transmission function for a given cell, with unpolarized incoming beam. + + This is composed from the opacity-function and the polarization-function. + The implementation fits a time- and wavelength-dependent equation and returns + the fitted T(t, lambda). + + DB_pol/DB = T_E * cosh(O(lambda)*P(t))*exp(-O(lambda)) + """ + + def expected_transmission( + wavelength: sc.Variable, time: sc.Variable, C: sc.Variable, T1: sc.Variable + ) -> sc.Variable: + polarization_function = He3PolarizationFunction[PolarizingElement](C=C, T1=T1) + opacity = opacity_function(wavelength) + polarization = polarization_function(time) + return transmission_incoming_unpolarized( + transmission_empty_glass=transmission_empty_glass, + opacity=opacity, + polarization=polarization, + ) + + popt, _ = sc.curve_fit( + ['wavelength', 'time'], + expected_transmission, + _with_midpoints(transmission_fraction, 'wavelength'), + p0={'C': sc.scalar(0.8, unit=''), 'T1': sc.scalar(400000.0, unit='s')}, + ) + # TODO Consider including variances from fit + polarization_function = He3PolarizationFunction[PolarizingElement]( + C=sc.values(popt['C']).data, T1=sc.values(popt['T1']).data + ) + return He3TransmissionFunction[PolarizingElement]( + opacity_function=opacity_function, + polarization_function=polarization_function, + transmission_empty_glass=transmission_empty_glass, + ) + + +def transmission_fraction_analyzer_parallel( + upup: He3AnalyzerTransmissionFractionIncomingPolarized[Up, Up], + downdown: He3AnalyzerTransmissionFractionIncomingPolarized[Down, Down], +) -> He3AnalyzerTransmissionFractionParallel: + """ + Analyzer Transmission fraction with polarization parallel to incoming beam. + + It may not always we desirable to use both up-up and down-down transmission, + fractions. If that is the case, set He3AnalyzerTransmissionFractionPlus directly + instead of using this helper. + """ + # The transmission fractions do not share a common time coordinate. Therefore, + # we cannot concat along a third dimension for the fit, but concat along time, + # with an additional coordinate for whether polarizations are parallel or + # antiparallel. + return sc.concat([upup, downdown], 'time').assign_coords(plus_minus=sc.scalar(1)) + + +def transmission_fraction_analyzer_antiparallel( + updown: He3AnalyzerTransmissionFractionIncomingPolarized[Up, Down], + downup: He3AnalyzerTransmissionFractionIncomingPolarized[Down, Up], +) -> He3AnalyzerTransmissionFractionAntiParallel: + """ + Analyzer transmission fraction with polarization anti-parallel to incoming beam. + + It may not always we desirable to use both up-down and down-up transmission, + fractions. If that is the case, set He3AnalyzerTransmissionFractionMinus directly + instead of using this helper. + """ + # The transmission fractions do not share a common time coordinate. Therefore, + # we cannot concat along a third dimension for the fit, but concat along time, + # with an additional coordinate for whether polarizations are parallel or + # antiparallel. + return sc.concat([updown, downup], 'time').assign_coords(plus_minus=sc.scalar(-1)) + + +def get_he3_transmission_incoming_polarized_from_fit_to_direct_beam( + plus: He3AnalyzerTransmissionFractionParallel, + minus: He3AnalyzerTransmissionFractionAntiParallel, + opacity_function: He3OpacityFunction[Analyzer], + transmission_empty_glass: He3TransmissionEmptyGlass[Analyzer], +) -> TransmissionFunction[Analyzer]: + """ + Transmission function for the analyzer, computed with incoming polarized beam. + + This is composed from the opacity-function and the polarization-function. + The implementation fits a time- and wavelength-dependent equation and returns + the fitted T(t, lambda). + """ + if (plus_minus := plus.coords.get('plus_minus')) is not None: + if not sc.all(plus_minus == sc.scalar(1)): + raise ValueError('Expected plus-minus coordinate of plus channel to be +1.') + else: + plus = plus.assign_coords(plus_minus=sc.scalar(1)) + if (plus_minus := minus.coords.get('plus_minus')) is not None: + if not sc.all(plus_minus == sc.scalar(-1)): + raise ValueError( + 'Expected plus-minus coordinate of minus channel to be -1.' + ) + else: + minus = minus.assign_coords(plus_minus=sc.scalar(-1)) + + transmission_fraction = sc.concat([plus, minus], 'time') + + def expected_transmission( + wavelength: sc.Variable, + time: sc.Variable, + plus_minus: sc.Variable, + C: sc.Variable, + T1: sc.Variable, + ) -> sc.Variable: + polarization_function = He3PolarizationFunction[PolarizingElement](C=C, T1=T1) + return He3TransmissionFunction( + opacity_function=opacity_function, + polarization_function=polarization_function, + transmission_empty_glass=transmission_empty_glass, + )(time=time, wavelength=wavelength, plus_minus=plus_minus) + + popt, _ = sc.curve_fit( + ['wavelength', 'time', 'plus_minus'], + expected_transmission, + _with_midpoints(transmission_fraction, 'wavelength'), + p0={'C': sc.scalar(0.8, unit=''), 'T1': sc.scalar(400000.0, unit='s')}, + ) + # TODO Consider including variances from fit + polarization_function = He3PolarizationFunction[PolarizingElement]( + C=sc.values(popt['C']).data, T1=sc.values(popt['T1']).data + ) + return He3TransmissionFunction[PolarizingElement]( + opacity_function=opacity_function, + polarization_function=polarization_function, + transmission_empty_glass=transmission_empty_glass, + ) + + +def compute_direct_beam( + data: sc.DataArray, + q_range: sc.Variable, + background_q_range: sc.Variable, +) -> sc.DataArray: + """ + Compute background-subtracted direct beam function. + + The input must be normalized data, not counts. + """ + if data.bins.unit != '': + raise ValueError(f'Input data must be normalized, got unit {data.unit}.') + if q_range.max() > background_q_range.min(): + raise ValueError('Background range must be after direct beam range.') + if q_range.min() < sc.scalar(0.0, unit='1/angstrom'): + raise ValueError('Q-range must be positive.') + q_range = q_range**2 + background_q_range = background_q_range**2 + start_db = q_range[0] + stop_db = q_range[-1] + start_bg = background_q_range[0] + stop_bg = background_q_range[-1] + # Simple approach for now: Assume we can treat this as rotation invariant + qx = data.bins.coords['Qx'] + qy = data.bins.coords['Qy'] + data.bins.coords['Q_squared'] = qx**2 + qy**2 + # The input is binned in time and wavelength, we simply take the per-bin mean + # without changes. + beam_region = data.bins['Q_squared', start_db:stop_db].bins.mean() + background = data.bins['Q_squared', start_bg:stop_bg].bins.mean() + return beam_region - background + + +DirectBeamQRange = NewType('DirectBeamQRange', sc.Variable) +"""Q-range defining the direct beam region in a direct beam measurement.""" + +DirectBeamBackgroundQRange = NewType('DirectBeamBackgroundQRange', sc.Variable) +"""Q-range defining the direct beam background region in a direct beam measurement.""" + +ReducedDirectBeamDataNoCell = NewType('ReducedDirectBeamDataNoCell', sc.DataArray) + + +class ReducedDirectBeamData( + sl.Scope[PolarizingElement, PolarizationState, sc.DataArray], sc.DataArray +): + """Direct beam data for a given cell, as a function of wavelength and time.""" + + +def direct_beam( + data: ReducedDirectBeamDataNoCell, + q_range: DirectBeamQRange, + background_q_range: DirectBeamBackgroundQRange, +) -> DirectBeamNoCell: + """ + Returns the direct beam function without any cells. + + The result is background-subtracted and returned as function of wavelength. + Other dimensions of the input are preserved. In particular, the time dimension, + corresponding to different direct beam measurements, is preserved. + """ + return DirectBeamNoCell( + compute_direct_beam( + data=data, + q_range=q_range, + background_q_range=background_q_range, + ) + ) + + +def direct_beam_with_cell( + data: ReducedDirectBeamData[PolarizingElement, PolarizationState], + q_range: DirectBeamQRange, + background_q_range: DirectBeamBackgroundQRange, +) -> He3DirectBeam[PolarizingElement, PolarizationState]: + """ + Returns the direct beam function for a given cell. + + The result is background-subtracted and returned as function of wavelength and + wall-clock time. The time dependence is coarse, i.e., due to different time + intervals at which the direct beam is measured. + """ + return He3DirectBeam[PolarizingElement, PolarizationState]( + compute_direct_beam( + data=data, + q_range=q_range, + background_q_range=background_q_range, + ) + ) + + +providers = (he3_opacity_from_cell_params, direct_beam, direct_beam_with_cell) + + +def He3CellWorkflow( + *, in_situ: bool = True, incoming_polarized: bool = False +) -> sl.Pipeline: + """ + Workflow for computing transmission functions for He3 cells. + + This can handle polarizers as well as analyzers. + + Parameters + ---------- + in_situ : + Whether to use an in-situ definition of the cell opacity based on cell + parameters, or an ex-situ definition based on direct beam data. The latter + requires a direct-beam measurement with depolarized cells. + incoming_polarized : + Whether the incoming beam for computing the analyzer transmission is polarized. + This is the case in beamlines with a supermirror polarizer, but also if the + polarizer is not removed from the beam during the analyzer transmission + measurement. + """ + workflow = sl.Pipeline(providers) + if in_situ: + workflow.insert(he3_opacity_function_from_cell_opacity) + else: + workflow.insert(he3_opacity_function_from_beam_data) + # Note that the incoming-unpolarized function is inserted even if + # incoming_polarized=True, since the incoming-unpolarized function is still + # required for computing the *polarizer* transmission calculation. + workflow.insert(get_he3_transmission_incoming_unpolarized_from_fit_to_direct_beam) + if incoming_polarized: + workflow.insert(transmission_fraction_analyzer_parallel) + workflow.insert(transmission_fraction_analyzer_antiparallel) + workflow.insert(get_he3_transmission_incoming_polarized_from_fit_to_direct_beam) + return workflow diff --git a/packages/essreduce/src/ess/reduce/polarization/py.typed b/packages/essreduce/src/ess/reduce/polarization/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/packages/essreduce/src/ess/reduce/polarization/supermirror.py b/packages/essreduce/src/ess/reduce/polarization/supermirror.py new file mode 100644 index 000000000..d027f85b0 --- /dev/null +++ b/packages/essreduce/src/ess/reduce/polarization/supermirror.py @@ -0,0 +1,135 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) + +from abc import ABC, abstractmethod +from dataclasses import dataclass +from io import BytesIO, StringIO +from pathlib import Path +from typing import Any, Generic, Self + +import sciline +import scipp as sc + +from .types import PlusMinus, PolarizingElement, TransmissionFunction + + +class SupermirrorEfficiencyFunction(ABC, Generic[PolarizingElement]): + """Base class for supermirror efficiency functions""" + + @abstractmethod + def __call__(self, *, wavelength: sc.Variable) -> sc.Variable: + """Return the efficiency of a supermirror for a given wavelength""" + + +@dataclass +class SecondDegreePolynomialEfficiency( + SupermirrorEfficiencyFunction[PolarizingElement] +): + """ + Efficiency of a supermirror as a second-degree polynomial + + The efficiency is given by a * wavelength^2 + b * wavelength + c + + Parameters + ---------- + a: + Coefficient of the quadratic term, with unit of 1/angstrom^2 + b: + Coefficient of the linear term, with unit of 1/angstrom + c: + Constant term, dimensionless + """ + + a: sc.Variable + b: sc.Variable + c: sc.Variable + + def __call__(self, *, wavelength: sc.Variable) -> sc.Variable: + """Return the efficiency of a supermirror for a given wavelength""" + return ( + (self.a * wavelength**2).to(unit='', copy=False) + + (self.b * wavelength).to(unit='', copy=False) + + self.c.to(unit='', copy=False) + ) + + +@dataclass +class EfficiencyLookupTable(SupermirrorEfficiencyFunction[PolarizingElement]): + """ + Efficiency of a supermirror as a lookup table. + The names of the columns in the table has to be "wavelength", "efficiency". + + Parameters + ---------- + table: + The lookup table. + """ + + table: sc.DataArray + + def __post_init__(self): + table = self.table if self.table.variances is None else sc.values(self.table) + self._lut = sc.lookup(table, 'wavelength') + + def __call__(self, *, wavelength: sc.Variable) -> sc.Variable: + """Return the efficiency of a supermirror for a given wavelength""" + return self._lut(wavelength) + + @classmethod + def from_file( + cls, + path: str | Path | StringIO | BytesIO, + wavelength_colname: str, + efficiency_colname: str, + wavelength_unit: sc.Unit | str = 'angstrom', + **kwargs: Any, + ) -> Self: + ds = sc.io.load_csv(path, **kwargs) + wavelength = ( + ds[wavelength_colname] + .rename_dims({ds[wavelength_colname].dim: 'wavelength'}) + .data + ) + wavelength.unit = wavelength_unit + efficiency = ( + ds[efficiency_colname] + .rename_dims({ds[efficiency_colname].dim: 'wavelength'}) + .data + ) + return cls(sc.DataArray(efficiency, coords={'wavelength': wavelength})) + + +@dataclass +class SupermirrorTransmissionFunction(TransmissionFunction[PolarizingElement]): + """Wavelength-dependent transmission of a supermirror""" + + efficiency_function: SupermirrorEfficiencyFunction + + def __call__( + self, *, wavelength: sc.Variable, plus_minus: PlusMinus + ) -> sc.Variable: + """Return the transmission fraction for a given wavelength""" + efficiency = self.efficiency_function(wavelength=wavelength) + if plus_minus == 'plus': + return 0.5 * (1 + efficiency) + else: + return 0.5 * (1 - efficiency) + + def apply(self, data: sc.DataArray, plus_minus: PlusMinus) -> sc.Variable: + """Apply the transmission function to a data array""" + return self(wavelength=data.coords['wavelength'], plus_minus=plus_minus) + + +def get_supermirror_transmission_function( + efficiency_function: SupermirrorEfficiencyFunction[PolarizingElement], +) -> TransmissionFunction[PolarizingElement]: + return SupermirrorTransmissionFunction[PolarizingElement]( + efficiency_function=efficiency_function + ) + + +def SupermirrorWorkflow() -> sciline.Pipeline: + """ + Workflow for computing transmission functions for supermirror polarizing elements. + """ + return sciline.Pipeline((get_supermirror_transmission_function,)) diff --git a/packages/essreduce/src/ess/reduce/polarization/types.py b/packages/essreduce/src/ess/reduce/polarization/types.py new file mode 100644 index 000000000..bd101958b --- /dev/null +++ b/packages/essreduce/src/ess/reduce/polarization/types.py @@ -0,0 +1,120 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Generic, Literal, NewType, TypeVar + +import sciline as sl +import scipp as sc + +Up = NewType('Up', int) +Down = NewType('Down', int) +PolarizerSpin = TypeVar('PolarizerSpin', Up, Down) +AnalyzerSpin = TypeVar('AnalyzerSpin', Up, Down) +NoAnalyzer = Up +"""Indicates that element is not in use, e.g., analyzer in half-polarized case.""" + + +class ReducedSampleDataBySpinChannel( + sl.Scope[PolarizerSpin, AnalyzerSpin, sc.DataArray], sc.DataArray +): + """Sample data for a given spin channel.""" + + +Analyzer = NewType('Analyzer', str) +Polarizer = NewType('Polarizer', str) +PolarizingElement = TypeVar('PolarizingElement', Analyzer, Polarizer) + +PlusMinus = Literal['plus', 'minus'] + + +class TransmissionFunction(ABC, Generic[PolarizingElement]): + """Wavelength- and time-dependent transmission for a given cell.""" + + @abstractmethod + def apply(self, data: sc.DataArray, plus_minus: PlusMinus) -> sc.Variable: ... + + +@dataclass +class PolarizingElementCorrection( + Generic[PolarizerSpin, AnalyzerSpin, PolarizingElement] +): + """Correction factors for polarizer or analyzer.""" + + diag: sc.DataArray + off_diag: sc.DataArray + + def get(self, *, up: bool) -> tuple[sc.DataArray, sc.DataArray]: + """Get the correction factors for up or down spin.""" + if up: + return self.diag, self.off_diag + return self.off_diag, self.diag + + +@dataclass +class PolarizationCorrection(Generic[PolarizerSpin, AnalyzerSpin]): + """Combined correction factors for polarizer and analyzer.""" + + upup: sc.DataArray + updown: sc.DataArray + downup: sc.DataArray + downdown: sc.DataArray + + +@dataclass +class HalfPolarizedCorrection(Generic[PolarizerSpin]): + """Combined correction factors for half-polarized case.""" + + up: sc.DataArray + down: sc.DataArray + + +@dataclass +class PolarizationCorrectedData(Generic[PolarizerSpin, AnalyzerSpin]): + """ + Polarization-corrected sample data. + + The PolarizerSpin and AnalyzerSpin type parameters refer to the measurement. The + fields in this class give the resulting data after applying the corrections. For a + given measurement with polarizer spin `PolarizerSpin` and analyzer spin + `AnalyzerSpin`, there will be resulting intensity in all four output fields. + """ + + upup: sc.DataArray + updown: sc.DataArray + downup: sc.DataArray + downdown: sc.DataArray + + def __post_init__(self): + self.upup.name = '(up, up)' + self.updown.name = '(up, down)' + self.downup.name = '(down, up)' + self.downdown.name = '(down, down)' + + +"""The sum of polarization corrected data from all flipper state channels.""" +TotalPolarizationCorrectedData = NewType( + "TotalPolarizationCorrectedData", PolarizationCorrectedData +) + + +@dataclass +class HalfPolarizedCorrectedData(Generic[PolarizerSpin]): + """ + Polarization-corrected sample data for half-polarized case. + + The PolarizerSpin type parameter refers to the measurement. The fields in this class + give the resulting data after applying the corrections. For a given measurement with + polarizer spin `PolarizerSpin`, there will be resulting intensity in both output + fields. + """ + + up: sc.DataArray + down: sc.DataArray + + +@dataclass +class FlipperEfficiency(Generic[PolarizingElement]): + """Efficiency of a flipper""" + + value: float diff --git a/packages/essreduce/src/ess/reduce/polarization/zoom.py b/packages/essreduce/src/ess/reduce/polarization/zoom.py new file mode 100644 index 000000000..4743539d0 --- /dev/null +++ b/packages/essreduce/src/ess/reduce/polarization/zoom.py @@ -0,0 +1,118 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) +from collections.abc import Sequence + +import ess.isissans as isis +import sciline as sl +import scipp as sc +from ess.isissans.io import LoadedFileContents +from ess.sans.types import ( + Filename, + Incident, + MonitorType, + NeXusComponent, + NeXusMonitorName, + RunType, + SampleRun, + Transmission, + TransmissionRun, +) +from scippnexus import NXsource + +from ess.reduce.nexus.types import Position + +# In this case the "sample" is the analyzer cell, of which we want to measure +# the transmission fraction. +sample_run_type = RunType + + +def _get_time(dg: sc.DataGroup) -> sc.Variable: + start = sc.datetime(dg['run_start'].value) + end = sc.datetime(dg['run_end'].value) + delta = end - start + return start + delta // 2 + + +def _get_time_dependent_monitor(*monitor_groups: sc.DataGroup) -> sc.DataGroup: + monitors = [grp['data'] for grp in monitor_groups] + monitor = sc.concat(monitors, 'time') + positions = [grp['position'] for grp in monitor_groups] + position = _get_unique_position(*positions) + datetime = monitor.coords['datetime'] + monitor.coords['time'] = datetime - datetime.min() + del monitor.coords['spectrum'] + del monitor.coords['detector_id'] + return sc.DataGroup(data=monitor, position=position) + + +def _get_unique_position(*positions: sc.DataArray) -> sc.DataArray: + unique = positions[0] + for position in positions[1:]: + if not sc.identical(position, unique): + raise ValueError("Monitors have different source positions") + return unique + + +def get_monitor_data_no_variances( + dg: LoadedFileContents[RunType], + nexus_name: NeXusMonitorName[MonitorType], + spectrum_number: isis.MonitorSpectrumNumber[MonitorType], +) -> NeXusComponent[MonitorType, RunType]: + """ + Same as :py:func:`ess.isissans.get_monitor_data` but dropping variances. + """ + monitor = isis.general.get_monitor_data( + dg, nexus_name=nexus_name, spectrum_number=spectrum_number + ) + monitor['data'] = sc.values(monitor['data']) + return NeXusComponent[MonitorType, RunType](monitor) + + +def get_monitor_data_from_transmission_run( + dg: LoadedFileContents[TransmissionRun[RunType]], + spectrum_number: isis.MonitorSpectrumNumber[MonitorType], +) -> NeXusComponent[MonitorType, TransmissionRun[RunType]]: + """ + Extract incident or transmission monitor from ZOOM direct-beam run + + The files in this case do not contain detector data, only monitor data. Mantid + stores this as a Workspace2D, where each spectrum corresponds to a monitor. + """ + # Note we index with a scipp.Variable, i.e., by the spectrum number used at ISIS + monitor = dg['data']['spectrum', sc.index(spectrum_number.value)].copy() + monitor.coords['datetime'] = _get_time(dg) + return sc.DataGroup(data=monitor, position=monitor.coords['position']) + + +def ZoomTransmissionFractionWorkflow(runs: Sequence[str]) -> sl.Pipeline: + """ + Workflow computing time-dependent SANS transmission fraction from ZOOM data. + + The time-dependence is obtained by using a sequence of runs. + + .. code-block:: python + + workflow = ZoomTransmissionFractionWorkflow(cell_runs) + + Note that in this case the "sample" (of which the transmission is to be computed) + is the He3 analyzer cell. + + Parameters + ---------- + runs: + List of filenames of the runs to use for the transmission fraction. + """ + workflow = isis.zoom.ZoomWorkflow() + workflow.insert(get_monitor_data_no_variances) + workflow.insert(get_monitor_data_from_transmission_run) + + mapped = workflow.map({Filename[TransmissionRun[SampleRun]]: runs}) + for mon_type in (Incident, Transmission): + workflow[NeXusComponent[mon_type, TransmissionRun[SampleRun]]] = mapped[ + NeXusComponent[mon_type, TransmissionRun[SampleRun]] + ].reduce(func=_get_time_dependent_monitor) + workflow[Position[NXsource, TransmissionRun[SampleRun]]] = mapped[ + Position[NXsource, TransmissionRun[SampleRun]] + ].reduce(func=_get_unique_position) + + return workflow diff --git a/packages/essreduce/tests/polarization/correction_test.py b/packages/essreduce/tests/polarization/correction_test.py new file mode 100644 index 000000000..c4d96f44b --- /dev/null +++ b/packages/essreduce/tests/polarization/correction_test.py @@ -0,0 +1,325 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +import numpy as np +import pytest +import sciline +import scipp as sc +from scipp.testing import assert_allclose + +from ess.reduce import polarization as pol +from ess.reduce.polarization import ( + CorrectionWorkflow, + He3CellWorkflow, + PolarizationAnalysisWorkflow, + SupermirrorWorkflow, +) +from ess.reduce.polarization.correction import ( + FlipperEfficiency, + compute_polarizing_element_correction, +) +from ess.reduce.polarization.types import ( + Analyzer, + Down, + HalfPolarizedCorrectedData, + PolarizationCorrectedData, + Polarizer, + ReducedSampleDataBySpinChannel, + TotalPolarizationCorrectedData, + TransmissionFunction, + Up, +) + + +class SimpleTransmissionFunction: + def __call__( + self, time: sc.Variable, wavelength: sc.Variable, plus_minus: str + ) -> sc.Variable: + if plus_minus == 'plus': + return 10 * time * (2 + wavelength) + else: + return 10 * time * (2 - wavelength) + + def apply(self, da: sc.DataArray, plus_minus: str) -> float: + time = da.coords['time'] + wavelength = da.coords['wavelength'] + return self(time, wavelength, plus_minus) + + +def test_compute_polarizing_element_correction() -> None: + time = sc.linspace('event', 1, 10, 10, unit='') + wavelength = sc.linspace('event', 0.1, 1, 10, unit='') + events = sc.DataArray( + sc.arange('event', 10), + coords={'time': time, 'wavelength': wavelength}, + ) + transmission = SimpleTransmissionFunction() + + result = compute_polarizing_element_correction( + channel=events, transmission=transmission + ) + diag = result.diag + off_diag = result.off_diag + assert diag.sizes == {'event': 10} + assert off_diag.sizes == {'event': 10} + transmission_plus = transmission(time, wavelength, 'plus') + transmission_minus = transmission(time, wavelength, 'minus') + denom = transmission_plus**2 - transmission_minus**2 + assert_allclose(diag, transmission_plus / denom) + assert_allclose(off_diag, -transmission_minus / denom) + + +def test_compute_polarizing_element_correction_binned_data() -> None: + time = sc.linspace('event', 1, 10, 10, unit='') + wavelength = sc.linspace('event', 0.1, 1, 10, unit='') + events = sc.DataArray( + sc.arange('event', 10), + coords={'time': time, 'wavelength': wavelength}, + ) + binned = sc.bins( + data=events, dim='event', begin=sc.array(dims=['Q'], values=[0, 3], unit=None) + ) + transmission = SimpleTransmissionFunction() + + result = compute_polarizing_element_correction( + channel=binned, transmission=transmission + ) + diag = result.diag + off_diag = result.off_diag + transmission_plus = transmission(time, wavelength, 'plus') + transmission_minus = transmission(time, wavelength, 'minus') + denom = transmission_plus**2 - transmission_minus**2 + assert_allclose(diag.bins.concat().value, transmission_plus / denom) + assert_allclose(off_diag.bins.concat().value, -transmission_minus / denom) + + +class FakeTransmissionFunction: + def __init__(self, coeffs: np.ndarray) -> None: + self.coeffs = coeffs + + def apply(self, _: sc.DataArray, plus_minus: str) -> float: + if plus_minus == 'plus': + return sc.scalar(self.coeffs[0][0]) + else: + return sc.scalar(self.coeffs[0][1]) + + +def test_correction_workflow_computes_and_applies_matrix_inverse() -> None: + ground_truth = np.array([7.0, 11.0, 13.0, 17.0]) + analyzer = np.array([[1.3, 0.9], [0.9, 1.3]]) + polarizer = np.array([[1.1, 0.7], [0.7, 1.1]]) + identity = np.array([[1.0, 0.0], [0.0, 1.0]]) + intensity = ( + np.kron(identity, analyzer) @ np.kron(polarizer, identity) @ ground_truth + ) + + workflow = CorrectionWorkflow() + workflow[TransmissionFunction[Analyzer]] = FakeTransmissionFunction(analyzer) + workflow[TransmissionFunction[Polarizer]] = FakeTransmissionFunction(polarizer) + workflow[ReducedSampleDataBySpinChannel[Up, Up]] = intensity[0] + workflow[ReducedSampleDataBySpinChannel[Up, Down]] = intensity[1] + workflow[ReducedSampleDataBySpinChannel[Down, Up]] = intensity[2] + workflow[ReducedSampleDataBySpinChannel[Down, Down]] = intensity[3] + + result = np.zeros(4) + for pola in [Up, Down]: + for ana in [Up, Down]: + contrib = workflow.compute(PolarizationCorrectedData[pola, ana]) + contrib = sc.concat( + [contrib.upup, contrib.updown, contrib.downup, contrib.downdown], + 'dummy', + ) + result += contrib.values + np.testing.assert_allclose(result, ground_truth) + + +@pytest.mark.parametrize('f', [0.1, 0.5, 0.9, 0.99, 1.0]) +def test_workflow_with_analyzer_flipper_computes_and_applies_matrix_inverse( + f: float, +) -> None: + ground_truth = np.array([7.0, 11.0, 13.0, 17.0]) + analyzer = np.array([[1.3, 0.9], [0.9, 1.3]]) + polarizer = np.array([[1.1, 0.7], [0.7, 1.1]]) + identity = np.array([[1.0, 0.0], [0.0, 1.0]]) + + flipper = np.array([[1.0, 0.0], [1 - f, f]]) + intensity = ( + np.kron(identity, analyzer @ flipper) + @ np.kron(polarizer, identity) + @ ground_truth + ) + + workflow = CorrectionWorkflow() + workflow[TransmissionFunction[Analyzer]] = FakeTransmissionFunction(analyzer) + workflow[TransmissionFunction[Polarizer]] = FakeTransmissionFunction(polarizer) + workflow[ReducedSampleDataBySpinChannel[Up, Up]] = intensity[0] + workflow[ReducedSampleDataBySpinChannel[Up, Down]] = intensity[1] + workflow[ReducedSampleDataBySpinChannel[Down, Up]] = intensity[2] + workflow[ReducedSampleDataBySpinChannel[Down, Down]] = intensity[3] + workflow[FlipperEfficiency[Analyzer]] = FlipperEfficiency(f) + + result = np.zeros(4) + for pola in [Up, Down]: + for ana in [Up, Down]: + contrib = workflow.compute(PolarizationCorrectedData[pola, ana]) + contrib = sc.concat( + [contrib.upup, contrib.updown, contrib.downup, contrib.downdown], + 'dummy', + ) + result += contrib.values + np.testing.assert_allclose(result, ground_truth) + + +@pytest.mark.parametrize('f', [0.1, 0.5, 0.9, 0.99, 1.0]) +def test_workflow_with_polarizer_flipper_computes_and_applies_matrix_inverse( + f: float, +) -> None: + ground_truth = np.array([7.0, 11.0, 13.0, 17.0]) + analyzer = np.array([[1.3, 0.9], [0.9, 1.3]]) + polarizer = np.array([[1.1, 0.7], [0.7, 1.1]]) + identity = np.array([[1.0, 0.0], [0.0, 1.0]]) + + flipper = np.array([[1.0, 0.0], [1 - f, f]]) + intensity = ( + np.kron(identity, analyzer) + @ np.kron(flipper @ polarizer, identity) + @ ground_truth + ) + + workflow = CorrectionWorkflow() + workflow[TransmissionFunction[Analyzer]] = FakeTransmissionFunction(analyzer) + workflow[TransmissionFunction[Polarizer]] = FakeTransmissionFunction(polarizer) + workflow[ReducedSampleDataBySpinChannel[Up, Up]] = intensity[0] + workflow[ReducedSampleDataBySpinChannel[Up, Down]] = intensity[1] + workflow[ReducedSampleDataBySpinChannel[Down, Up]] = intensity[2] + workflow[ReducedSampleDataBySpinChannel[Down, Down]] = intensity[3] + workflow[FlipperEfficiency[Polarizer]] = FlipperEfficiency(f) + + result = np.zeros(4) + for pola in [Up, Down]: + for ana in [Up, Down]: + contrib = workflow.compute(PolarizationCorrectedData[pola, ana]) + contrib = sc.concat( + [contrib.upup, contrib.updown, contrib.downup, contrib.downdown], + 'dummy', + ) + result += contrib.values + np.testing.assert_allclose(result, ground_truth) + + +@pytest.mark.parametrize('f1', [0.1, 0.5, 0.9, 0.99, 1.0]) +@pytest.mark.parametrize('f2', [0.1, 0.5, 0.9, 0.99, 1.0]) +def test_workflow_with_two_flipper_computes_and_applies_matrix_inverse( + f1: float, f2: float +) -> None: + ground_truth = np.array([7.0, 11.0, 13.0, 17.0]) + analyzer = np.array([[1.3, 0.9], [0.9, 1.3]]) + polarizer = np.array([[1.1, 0.7], [0.7, 1.1]]) + identity = np.array([[1.0, 0.0], [0.0, 1.0]]) + + flipper1 = np.array([[1.0, 0.0], [1 - f1, f1]]) + flipper2 = np.array([[1.0, 0.0], [1 - f2, f2]]) + intensity = ( + np.kron(identity, analyzer @ flipper2) + @ np.kron(flipper1 @ polarizer, identity) + @ ground_truth + ) + + workflow = CorrectionWorkflow() + workflow[TransmissionFunction[Analyzer]] = FakeTransmissionFunction(analyzer) + workflow[TransmissionFunction[Polarizer]] = FakeTransmissionFunction(polarizer) + workflow[ReducedSampleDataBySpinChannel[Up, Up]] = intensity[0] + workflow[ReducedSampleDataBySpinChannel[Up, Down]] = intensity[1] + workflow[ReducedSampleDataBySpinChannel[Down, Up]] = intensity[2] + workflow[ReducedSampleDataBySpinChannel[Down, Down]] = intensity[3] + workflow[FlipperEfficiency[Polarizer]] = FlipperEfficiency(f1) + workflow[FlipperEfficiency[Analyzer]] = FlipperEfficiency(f2) + + result = np.zeros(4) + for pola in [Up, Down]: + for ana in [Up, Down]: + contrib = workflow.compute(PolarizationCorrectedData[pola, ana]) + contrib = sc.concat( + [contrib.upup, contrib.updown, contrib.downup, contrib.downdown], + 'dummy', + ) + result += contrib.values + np.testing.assert_allclose(result, ground_truth) + + +@pytest.mark.parametrize('f1', [0.1, 0.99]) +@pytest.mark.parametrize('f2', [0.1, 0.99]) +def test_sum_contributions_provider(f1: float, f2: float) -> None: + ground_truth = np.array([7.0, 11.0, 13.0, 17.0]) + analyzer = np.array([[1.3, 0.9], [0.9, 1.3]]) + polarizer = np.array([[1.1, 0.7], [0.7, 1.1]]) + identity = np.array([[1.0, 0.0], [0.0, 1.0]]) + + flipper1 = np.array([[1.0, 0.0], [1 - f1, f1]]) + flipper2 = np.array([[1.0, 0.0], [1 - f2, f2]]) + intensity = ( + np.kron(identity, analyzer @ flipper2) + @ np.kron(flipper1 @ polarizer, identity) + @ ground_truth + ) + + workflow = CorrectionWorkflow() + workflow[TransmissionFunction[Analyzer]] = FakeTransmissionFunction(analyzer) + workflow[TransmissionFunction[Polarizer]] = FakeTransmissionFunction(polarizer) + workflow[ReducedSampleDataBySpinChannel[Up, Up]] = intensity[0] + workflow[ReducedSampleDataBySpinChannel[Up, Down]] = intensity[1] + workflow[ReducedSampleDataBySpinChannel[Down, Up]] = intensity[2] + workflow[ReducedSampleDataBySpinChannel[Down, Down]] = intensity[3] + workflow[FlipperEfficiency[Polarizer]] = FlipperEfficiency(f1) + workflow[FlipperEfficiency[Analyzer]] = FlipperEfficiency(f2) + d = workflow.compute(TotalPolarizationCorrectedData) + np.testing.assert_allclose( + np.array([d.upup.value, d.updown.value, d.downup.value, d.downdown.value]), + ground_truth, + ) + + +_he3_workflow = He3CellWorkflow() +_supermirror_workflow = SupermirrorWorkflow() +_polarizing_element_workflows = [_he3_workflow, _supermirror_workflow] + + +@pytest.mark.parametrize("polarizer_workflow", _polarizing_element_workflows) +@pytest.mark.parametrize("analyzer_workflow", _polarizing_element_workflows) +def test_polarization_analysis_workflow_creation( + polarizer_workflow: sciline.Pipeline, analyzer_workflow: sciline.Pipeline +) -> None: + workflow = PolarizationAnalysisWorkflow( + polarizer_workflow=polarizer_workflow, analyzer_workflow=analyzer_workflow + ) + handler = sciline.HandleAsComputeTimeException() + for elem, wf in zip( + (Polarizer, Analyzer), (polarizer_workflow, analyzer_workflow), strict=True + ): + graph = workflow.get(TransmissionFunction[elem], handler=handler) + assert ( + pol.supermirror.SupermirrorEfficiencyFunction[elem] in graph.keys() + ) == (wf is _supermirror_workflow) + assert (pol.he3.He3CellPressure[elem] in graph.keys()) == (wf is _he3_workflow) + + +@pytest.mark.parametrize('f', [0.1, 0.5, 0.9, 0.99, 1.0]) +def test_half_polarized_with_flipper_computes_and_applies_matrix_inverse( + f: float, +) -> None: + ground_truth = np.array([7.0, 11.0]) + polarizer = np.array([[0.96, 0.04], [0.04, 0.96]]) + flipper = np.array([[1.0, 0.0], [1 - f, f]]) + intensity = flipper @ polarizer @ ground_truth + + workflow = CorrectionWorkflow(half_polarized=True) + workflow[TransmissionFunction[Polarizer]] = FakeTransmissionFunction(polarizer) + workflow[ReducedSampleDataBySpinChannel[Up, pol.NoAnalyzer]] = intensity[0] + workflow[ReducedSampleDataBySpinChannel[Down, pol.NoAnalyzer]] = intensity[1] + workflow[FlipperEfficiency[Polarizer]] = FlipperEfficiency(f) + + result = np.zeros(2) + for pola in [Up, Down]: + contrib = workflow.compute(HalfPolarizedCorrectedData[pola]) + contrib = sc.concat([contrib.up, contrib.down], 'dummy') + result += contrib.values + np.testing.assert_allclose(result, ground_truth) diff --git a/packages/essreduce/tests/polarization/direct_beam_test.py b/packages/essreduce/tests/polarization/direct_beam_test.py new file mode 100644 index 000000000..b3f95ed92 --- /dev/null +++ b/packages/essreduce/tests/polarization/direct_beam_test.py @@ -0,0 +1,294 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) +import numpy as np +import pytest +import scipp as sc +from scipp.testing import assert_allclose, assert_identical + +from ess.reduce import polarization as pol +from ess.reduce.polarization import base + +# Setup logs for four sections of length 250: +# - 10 s direct beam no cell (only in beginning) +# - For each section: +# - 25 s direct beam with polarizer +# - 25 s direct beam with analyzer +# - 200 s sample run (4 states) +no_cell_start = sc.scalar(-10.0, unit='s') +section_length = sc.scalar(250.0, unit='s') + + +def _offset_time(da: sc.DataArray, offset: sc.Variable) -> sc.DataArray: + da = da.copy() + da.coords['time'] += offset + return da + + +def dummy_analyzer_spin() -> base.CellSpinLog[pol.Analyzer]: + time = sc.array(dims=['time'], values=[0.0, 150], unit='s') + spin = sc.array(dims=['time'], values=[1, -1], unit=None) + da = sc.DataArray(spin, coords={'time': time}) + da = sc.concat( + [ + _offset_time(da, 0 * section_length), + _offset_time(da, 1 * section_length), + _offset_time(da, 2 * section_length), + _offset_time(da, 3 * section_length), + ], + 'time', + ) + da.coords['time'][0] = no_cell_start + return base.CellSpinLog[pol.Analyzer](da) + + +def dummy_polarizer_spin() -> base.CellSpinLog[pol.Polarizer]: + time = sc.array(dims=['time'], values=[100.0, 200], unit='s') + spin = sc.array(dims=['time'], values=[-1, 1], unit=None) + da = sc.DataArray(spin, coords={'time': time}) + start = da[1].copy() + start.coords['time'] = no_cell_start + da = sc.concat( + [ + start, + _offset_time(da, 0 * section_length), + _offset_time(da, 1 * section_length), + _offset_time(da, 2 * section_length), + _offset_time(da, 3 * section_length), + ], + 'time', + ) + return base.CellSpinLog[pol.Polarizer](da) + + +def dummy_sample_in_beam() -> base.SampleInBeamLog: + time = sc.array( + dims=['time'], + values=[no_cell_start.value, 50, 250, 300, 500, 550, 750, 800], + unit='s', + ) + in_beam = sc.array( + dims=['time'], values=[False, True, False, True, False, True, False, True] + ) + return base.SampleInBeamLog(sc.DataArray(in_beam, coords={'time': time})) + + +def dummy_polarizer_in_beam() -> base.CellInBeamLog[pol.Polarizer]: + time = sc.array(dims=['time'], values=[25.0, 50], unit='s') + time = sc.concat( + [ + no_cell_start, + sc.scalar(0.0, unit='s'), + time + 0 * section_length, + time + 1 * section_length, + time + 2 * section_length, + time + 3 * section_length, + ], + 'time', + ) + in_beam = sc.array(dims=['time'], values=[False, True], unit=None) + in_beam = sc.concat([in_beam] * 5, 'time') + return base.CellInBeamLog[pol.Polarizer]( + sc.DataArray(in_beam, coords={'time': time}) + ) + + +def dummy_analyzer_in_beam() -> base.CellInBeamLog[pol.Analyzer]: + time = sc.array(dims=['time'], values=[0.0, 25], unit='s') + time = sc.concat( + [ + time + 0 * section_length, + time + 1 * section_length, + time + 2 * section_length, + time + 3 * section_length, + ], + 'time', + ) + time[0] = no_cell_start + in_beam = sc.array(dims=['time'], values=[False, True], unit=None) + in_beam = sc.concat([in_beam] * 4, 'time') + return base.CellInBeamLog[pol.Analyzer]( + sc.DataArray(in_beam, coords={'time': time}) + ) + + +def make_events(size: int = 1000) -> sc.DataArray: + rng = np.random.default_rng() + time = sc.array(dims=['event'], values=rng.integers(0, 1000, size), unit='s') + values = sc.array(dims=['event'], values=rng.uniform(0.0, 1.0, size)) + return sc.DataArray(values, coords={'time': time}) + + +def test_determine_run_section() -> None: + analyzer_spin = dummy_analyzer_spin() + polarizer_spin = dummy_polarizer_spin() + sample_in_beam = dummy_sample_in_beam() + analyzer_in_beam = dummy_analyzer_in_beam() + polarizer_in_beam = dummy_polarizer_in_beam() + result = base.determine_run_section( + sample_in_beam=sample_in_beam, + analyzer_in_beam=analyzer_in_beam, + polarizer_in_beam=polarizer_in_beam, + analyzer_spin=analyzer_spin, + polarizer_spin=polarizer_spin, + ) + # 1 no-cell + 4 sections of (2 single-cell direct-beam + 4 sample runs) + assert result.sizes == {'time': 1 + 4 * (2 + 4)} + + # Each section is: DB_pol, DB_ana, ++, -+, --, +- + + section = sc.array( + dims=['time'], values=[0.0, 25.0, 50.0, 100.0, 150.0, 200.0], unit='s' + ) + expected_time = sc.concat( + [ + no_cell_start, + section + 0 * section_length, + section + 1 * section_length, + section + 2 * section_length, + section + 3 * section_length, + ], + 'time', + ) + for value in result.values(): + assert_identical(value.coords['time'], expected_time) + + section = [False, False, True, True, True, True] + expected_sample_in_beam = sc.array(dims=['time'], values=[False] + 4 * section) + assert_identical(result['sample_in_beam'].data, expected_sample_in_beam) + + section = [True, False, True, True, True, True] + expected_polarizer_in_beam = sc.array(dims=['time'], values=[False] + 4 * section) + assert_identical(result['polarizer_in_beam'].data, expected_polarizer_in_beam) + + section = [False, True, True, True, True, True] + expected_analyzer_in_beam = sc.array(dims=['time'], values=[False] + 4 * section) + assert_identical(result['analyzer_in_beam'].data, expected_analyzer_in_beam) + + section = [1, 1, 1, -1, -1, 1] + expected_polarizer_spin = sc.array( + dims=['time'], values=[1] + 4 * section, unit=None + ) + assert_identical(result['polarizer_spin'].data, expected_polarizer_spin) + + section = [1, 1, 1, 1, -1, -1] + expected_analyzer_spin = sc.array( + dims=['time'], values=[1] + 4 * section, unit=None + ) + assert_identical(result['analyzer_spin'].data, expected_analyzer_spin) + + +def make_IofQ(size: int = 1000) -> sc.DataArray: + rng = np.random.default_rng() + wavelength = sc.array( + dims=['event'], values=rng.uniform(0.5, 5.0, size), unit='angstrom' + ) + qx = sc.array( + dims=['event'], values=rng.uniform(-3.1, 3.0, size), unit='1/angstrom' + ) + qy = sc.array( + dims=['event'], values=rng.uniform(-2.6, 2.5, size), unit='1/angstrom' + ) + weights = sc.array(dims=['event'], values=rng.uniform(0.0, 1.0, size)) + # There are different DB runs at different times, we assume in `direct_beam` this + # has been grouped by time already. + time = sc.array(dims=['event'], values=rng.integers(0, 10, size)) + events = sc.DataArray( + weights, + coords={ + 'wavelength': wavelength, + 'Qx': qx, + 'Qy': qy, + 'time': time, + }, + ) + return events.group('time') + + +def test_direct_beam_returns_expected_dims() -> None: + data = make_IofQ() + wavelength = sc.linspace( + dim='wavelength', start=0.5, stop=5.0, num=100, unit='angstrom' + ) + q_range = sc.array(dims=['Q'], values=[0.0, 1.0], unit='1/angstrom') + background_q_range = sc.array(dims=['Q'], values=[1.0, 2.0], unit='1/angstrom') + + db = pol.he3.direct_beam( + data=data.bin(wavelength=wavelength), + q_range=q_range, + background_q_range=background_q_range, + ) + assert db.bins is None + assert db.dims == ('time', 'wavelength') + + +def test_direct_beam_raises_if_q_ranges_overlap() -> None: + data = make_IofQ() + wavelength = sc.linspace( + dim='wavelength', start=0.5, stop=5.0, num=100, unit='angstrom' + ) + q_range = sc.array(dims=['Q'], values=[0.0, 1.0], unit='1/angstrom') + background_q_range = sc.array(dims=['Q'], values=[0.5, 2.0], unit='1/angstrom') + + with pytest.raises( + ValueError, match='Background range must be after direct beam range' + ): + pol.he3.direct_beam( + data=data.bin(wavelength=wavelength), + q_range=q_range, + background_q_range=background_q_range, + ) + + +def test_direct_beam_raises_if_q_range_not_positive() -> None: + data = make_IofQ() + wavelength = sc.linspace( + dim='wavelength', start=0.5, stop=5.0, num=100, unit='angstrom' + ) + q_range = sc.array(dims=['Q'], values=[-2.0, 2.0], unit='1/angstrom') + background_q_range = sc.array(dims=['Q'], values=[3.0, 4.0], unit='1/angstrom') + + with pytest.raises(ValueError, match='Q-range must be positive'): + pol.he3.direct_beam( + data=data.bin(wavelength=wavelength), + q_range=q_range, + background_q_range=background_q_range, + ) + + +def test_direct_beam_operates_on_normalized_data() -> None: + data = make_IofQ(size=int(1e6)) + data2 = data.bins.concatenate(data) + wavelength = sc.linspace( + dim='wavelength', start=0.5, stop=5.0, num=100, unit='angstrom' + ) + q_range = sc.array(dims=['Q'], values=[0.0, 1.0], unit='1/angstrom') + background_q_range = sc.array(dims=['Q'], values=[1.0, 2.0], unit='1/angstrom') + + db = pol.he3.direct_beam( + data=data.bin(wavelength=wavelength), + q_range=q_range, + background_q_range=background_q_range, + ) + db2 = pol.he3.direct_beam( + data=data2.bin(wavelength=wavelength), + q_range=q_range, + background_q_range=background_q_range, + ) + assert_allclose(db, db2) + + +def test_direct_beam_raises_if_input_is_counts() -> None: + data = make_IofQ() + wavelength = sc.linspace( + dim='wavelength', start=0.5, stop=5.0, num=100, unit='angstrom' + ) + q_range = sc.array(dims=['Q'], values=[0.0, 1.0], unit='1/angstrom') + background_q_range = sc.array(dims=['Q'], values=[1.0, 2.0], unit='1/angstrom') + + data.bins.unit = 'counts' + with pytest.raises(ValueError, match='Input data must be normalized'): + pol.he3.direct_beam( + data=data.bin(wavelength=wavelength), + q_range=q_range, + background_q_range=background_q_range, + ) diff --git a/packages/essreduce/tests/polarization/he3/opacity_test.py b/packages/essreduce/tests/polarization/he3/opacity_test.py new file mode 100644 index 000000000..dd8fa09da --- /dev/null +++ b/packages/essreduce/tests/polarization/he3/opacity_test.py @@ -0,0 +1,71 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +import pytest +import scipp as sc +from scipp.testing import assert_identical + +from ess.reduce.polarization import he3 + + +def test_opacity_from_cell_params() -> None: + # In practice, the cell pressure, length, and temperature are constant, this is + # just for testing. + pressure = sc.array(dims=['pressure'], values=[1.0, 2.0], unit='bar') + length = sc.array(dims=['cell_length'], values=[1.0, 2.0], unit='m') + temperature = sc.array(dims=['temperature'], values=[200.0, 400.0], unit='K') + wavelength = sc.array(dims=['wavelength'], values=[1.0, 2.0], unit='nm') + opacity0 = he3.he3_opacity_from_cell_params( + pressure=pressure, length=length, temperature=temperature + ) + opacity_function = he3.he3_opacity_function_from_cell_opacity(opacity0) + opacity = opacity_function(wavelength) + assert_identical(2 * opacity['pressure', 0], opacity['pressure', 1]) + assert_identical(2 * opacity['cell_length', 0], opacity['cell_length', 1]) + assert_identical(2 * opacity['wavelength', 0], opacity['wavelength', 1]) + assert_identical(opacity['temperature', 0], 2 * opacity['temperature', 1]) + assert opacity.unit == '' + + +def test_opacity_from_cell_params_reproduces_literature_value() -> None: + # From Lee, Wai et al. (2023). Polarisation Development at the European Spallation + # Source. EPJ Web of Conferences. 286. 10.1051/epjconf/202328603004. + # At T = 20 deg C, p = 1 bar, lambda = 1 Angstrom, l = 1 cm we should get 0.0733. + pressure = sc.scalar(1.0, unit='bar') + length = sc.scalar(0.01, unit='m') + temperature = sc.scalar(293.15, unit='K') + wavelength = sc.scalar(1.0, unit='angstrom') + opacity0 = he3.he3_opacity_from_cell_params( + pressure=pressure, length=length, temperature=temperature + ) + opacity_function = he3.he3_opacity_function_from_cell_opacity(opacity0) + opacity = opacity_function(wavelength) + assert sc.isclose(opacity, sc.scalar(0.0733, unit=''), rtol=sc.scalar(1e-3)) + + +def test_opacity_from_cell_params_raises_with_temperature_in_degree_celsius() -> None: + pressure = sc.scalar(1.0, unit='bar') + length = sc.scalar(1.0, unit='m') + temperature = sc.scalar(200.0, unit='degC') + with pytest.raises(sc.UnitError): + he3.he3_opacity_from_cell_params( + pressure=pressure, length=length, temperature=temperature + ) + + +def test_opacity_from_beam_data() -> None: + wavelength = sc.array(dims=['wavelength'], values=[1.0, 2.0], unit='nm') + transmission_empty_glass = sc.scalar(0.5) + # Pretend known opacity0 for testing + opacity0 = sc.scalar(0.3, unit='1/nm') + ratio = transmission_empty_glass * sc.exp(-opacity0 * wavelength) + transmission = sc.DataArray(ratio, coords={'wavelength': wavelength}) + opacity_function = he3.he3_opacity_function_from_beam_data( + transmission_empty_glass=transmission_empty_glass, + transmission_fraction=transmission, + opacity0_initial_guess=opacity0 * 1.23, # starting guess imperfect + ) + opacity = opacity_function(wavelength) + assert sc.isclose( + opacity_function.opacity0, opacity0.to(unit=opacity_function.opacity0.unit) + ) + assert_identical(2 * opacity['wavelength', 0], opacity['wavelength', 1]) diff --git a/packages/essreduce/tests/polarization/he3/polarization_test.py b/packages/essreduce/tests/polarization/he3/polarization_test.py new file mode 100644 index 000000000..ef1eecd57 --- /dev/null +++ b/packages/essreduce/tests/polarization/he3/polarization_test.py @@ -0,0 +1,174 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +import numpy as np +import pytest +import scipp as sc + +from ess.reduce.polarization import he3 + + +def test_incoming_unpolarized_reproduces_input_params_within_errors() -> None: + time = sc.linspace('time', 0.0, 1000000.0, num=1000, unit='s') + wavelength = sc.linspace('wavelength', 0.5, 5.0, num=40, unit='angstrom') + C = sc.scalar(1.3) + T1 = sc.scalar(123456.0, unit='s') + opacity0 = sc.scalar(0.88, unit='1/angstrom') + polarization_function = he3.He3PolarizationFunction(C=C, T1=T1) + opacity_function = he3.He3OpacityFunction(opacity0) + transmission_empty_glass = sc.scalar(0.9) + opacity = opacity_function(wavelength) + polarization = polarization_function(time) + transmission = sc.DataArray( + he3.transmission_incoming_unpolarized( + transmission_empty_glass=transmission_empty_glass, + opacity=opacity, + polarization=polarization, + ), + coords={ + 'time': time, + 'wavelength': wavelength, + }, + ) + + result = he3.get_he3_transmission_incoming_unpolarized_from_fit_to_direct_beam( + transmission_fraction=transmission, + opacity_function=opacity_function, + transmission_empty_glass=transmission_empty_glass, + ) + polarization_function = result.polarization_function + assert isinstance(polarization_function, he3.He3PolarizationFunction) + + # No noise, very close or exact match. + assert sc.isclose(polarization_function.C, C) + assert sc.isclose(polarization_function.T1, T1) + + rng = np.random.default_rng(seed=1234) + transmission_noisy = transmission.copy() + transmission_noisy.values += rng.normal(0.0, 0.01, transmission_noisy.shape) + + result = he3.get_he3_transmission_incoming_unpolarized_from_fit_to_direct_beam( + transmission_fraction=transmission_noisy, + opacity_function=opacity_function, + transmission_empty_glass=transmission_empty_glass, + ) + polarization_function = result.polarization_function + + # With noise, within 1% of the input values. + assert sc.isclose(polarization_function.C, C, rtol=sc.scalar(1e-2)) + assert sc.isclose(polarization_function.T1, T1, rtol=sc.scalar(1e-2)) + + +def test_incoming_polarized_reproduces_input_params_within_errors() -> None: + time = sc.linspace('time', 0.0, 1000000.0, num=1000, unit='s') + wavelength = sc.linspace('wavelength', 0.5, 5.0, num=40, unit='angstrom') + C = sc.scalar(1.3) + T1 = sc.scalar(123456.0, unit='s') + opacity0 = sc.scalar(0.88, unit='1/angstrom') + polarization_function = he3.He3PolarizationFunction(C=C, T1=T1) + opacity_function = he3.He3OpacityFunction(opacity0) + transmission_empty_glass = sc.scalar(0.9) + transmission_function = he3.He3TransmissionFunction( + transmission_empty_glass=transmission_empty_glass, + opacity_function=opacity_function, + polarization_function=polarization_function, + ) + # State switch at 456th time point, cut further below into 4 channels total. + plus = sc.DataArray( + transmission_function( + time=time[:456], wavelength=wavelength, plus_minus='plus' + ), + coords={ + 'time': time[:456], + 'wavelength': wavelength, + }, + ) + minus = sc.DataArray( + transmission_function( + time=time[456:], wavelength=wavelength, plus_minus='minus' + ), + coords={ + 'time': time[456:], + 'wavelength': wavelength, + }, + ) + + result = he3.get_he3_transmission_incoming_polarized_from_fit_to_direct_beam( + plus=plus, + minus=minus, + opacity_function=opacity_function, + transmission_empty_glass=transmission_empty_glass, + ) + polarization_function = result.polarization_function + assert isinstance(polarization_function, he3.He3PolarizationFunction) + + # No noise, very close or exact match. + assert sc.isclose(polarization_function.C, C) + assert sc.isclose(polarization_function.T1, T1) + + rng = np.random.default_rng(seed=1234) + plus_noisy = plus.copy() + minus_noisy = minus.copy() + plus_noisy.values += rng.normal(0.0, 0.01, plus_noisy.shape) + minus_noisy.values += rng.normal(0.0, 0.01, minus_noisy.shape) + + result = he3.get_he3_transmission_incoming_polarized_from_fit_to_direct_beam( + plus=plus_noisy, + minus=minus_noisy, + opacity_function=opacity_function, + transmission_empty_glass=transmission_empty_glass, + ) + polarization_function = result.polarization_function + + # With noise, within 1% of the input values. + assert sc.isclose(polarization_function.C, C, rtol=sc.scalar(1e-2)) + assert sc.isclose(polarization_function.T1, T1, rtol=sc.scalar(1e-2)) + + +def test_incoming_polarized_raises_if_plus_minus_coord_is_bad() -> None: + time = sc.linspace('time', 0.0, 1000000.0, num=1000, unit='s') + wavelength = sc.linspace('wavelength', 0.5, 5.0, num=40, unit='angstrom') + C = sc.scalar(1.3) + T1 = sc.scalar(123456.0, unit='s') + opacity0 = sc.scalar(0.88, unit='1/angstrom') + polarization_function = he3.He3PolarizationFunction(C=C, T1=T1) + opacity_function = he3.He3OpacityFunction(opacity0) + transmission_empty_glass = sc.scalar(0.9) + transmission_function = he3.He3TransmissionFunction( + transmission_empty_glass=transmission_empty_glass, + opacity_function=opacity_function, + polarization_function=polarization_function, + ) + # State switch at 456th time point, cut further below into 4 channels total. + plus = sc.DataArray( + transmission_function( + time=time[:456], wavelength=wavelength, plus_minus='plus' + ), + coords={ + 'time': time[:456], + 'wavelength': wavelength, + }, + ) + minus = sc.DataArray( + transmission_function( + time=time[456:], wavelength=wavelength, plus_minus='minus' + ), + coords={ + 'time': time[456:], + 'wavelength': wavelength, + }, + ) + + with pytest.raises(ValueError, match='plus-minus coordinate of plus channel'): + he3.get_he3_transmission_incoming_polarized_from_fit_to_direct_beam( + plus=plus.assign_coords({'plus_minus': sc.scalar(-1)}), + minus=minus, + opacity_function=opacity_function, + transmission_empty_glass=transmission_empty_glass, + ) + with pytest.raises(ValueError, match='plus-minus coordinate of minus channel'): + he3.get_he3_transmission_incoming_polarized_from_fit_to_direct_beam( + plus=plus, + minus=minus.assign_coords({'plus_minus': sc.scalar(1)}), + opacity_function=opacity_function, + transmission_empty_glass=transmission_empty_glass, + ) diff --git a/packages/essreduce/tests/polarization/supermirror_test.py b/packages/essreduce/tests/polarization/supermirror_test.py new file mode 100644 index 000000000..f08bd2b85 --- /dev/null +++ b/packages/essreduce/tests/polarization/supermirror_test.py @@ -0,0 +1,109 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2024 Scipp contributors (https://github.com/scipp) +import io + +import pytest +import scipp as sc +from scipp.testing import assert_allclose + +from ess.reduce import polarization as pol +from ess.reduce.polarization.data import example_polarization_efficiency_table + + +def test_SecondDegreePolynomialEfficiency_raises_if_units_incompatible(): + wav = sc.scalar(1.0, unit='m') + eff = pol.SecondDegreePolynomialEfficiency( + a=sc.scalar(1.0, unit='1/angstrom'), + b=sc.scalar(1.0, unit='1/angstrom'), + c=sc.scalar(1.0), + ) + with pytest.raises(sc.UnitError, match=" to `dimensionless` is not valid"): + eff(wavelength=wav) + + eff = pol.SecondDegreePolynomialEfficiency( + a=sc.scalar(1.0, unit='1/angstrom**2'), + b=sc.scalar(1.0, unit='1/angstrom**2'), + c=sc.scalar(1.0), + ) + with pytest.raises(sc.UnitError, match=" to `dimensionless` is not valid"): + eff(wavelength=wav) + + eff = pol.SecondDegreePolynomialEfficiency( + a=sc.scalar(1.0, unit='1/angstrom**2'), + b=sc.scalar(1.0, unit='1/angstrom'), + c=sc.scalar(1.0, unit='1/angstrom'), + ) + with pytest.raises(sc.UnitError, match=" to `dimensionless` is not valid"): + eff(wavelength=wav) + + eff = pol.SecondDegreePolynomialEfficiency( + a=sc.scalar(1.0, unit='1/angstrom**2'), + b=sc.scalar(1.0, unit='1/angstrom'), + c=sc.scalar(1.0), + ) + with pytest.raises(sc.UnitError, match=" to `dimensionless` is not valid"): + eff(wavelength=wav / sc.scalar(1.0, unit='s')) + + +def test_SecondDegreePolynomialEfficiency_produces_correct_values(): + a = sc.scalar(1.0, unit='1/angstrom**2') + b = sc.scalar(2.0, unit='1/angstrom') + c = sc.scalar(3.0) + f = pol.SecondDegreePolynomialEfficiency(a=a, b=b, c=c) + assert f(wavelength=sc.scalar(0.0, unit='angstrom')) == 3.0 + assert f(wavelength=sc.scalar(1.0, unit='angstrom')) == 6.0 + assert f(wavelength=sc.scalar(2.0, unit='angstrom')) == 11.0 + + +def test_SecondDegreePolynomialEfficiency_converts_units(): + a = sc.scalar(1.0, unit='1/angstrom**2') + b = sc.scalar(20.0, unit='1/nm') + c = sc.scalar(3.0) + f = pol.SecondDegreePolynomialEfficiency(a=a, b=b, c=c) + assert f(wavelength=sc.scalar(0.0, unit='angstrom')) == 3.0 + assert f(wavelength=sc.scalar(1.0, unit='angstrom')) == 6.0 + assert f(wavelength=sc.scalar(2.0, unit='angstrom')) == 11.0 + assert f(wavelength=sc.scalar(0.0, unit='nm')) == 3.0 + assert f(wavelength=sc.scalar(0.1, unit='nm')) == 6.0 + assert f(wavelength=sc.scalar(0.2, unit='nm')) == 11.0 + + +def test_EfficiencyLookupTable_returns_expected_result(): + data = sc.midpoints(sc.linspace('wavelength', 0, 1, 10)) + data.variances = data.values + tab = pol.EfficiencyLookupTable( + sc.DataArray( + data, + coords={'wavelength': sc.linspace('wavelength', 0, 1, 10, unit='angstrom')}, + ) + ) + x = sc.midpoints(sc.linspace('wavelength', 0, 1, 10, unit='angstrom')) + assert_allclose(tab(wavelength=x), sc.values(tab.table.data)) + + +def test_EfficiencyLookupTable_load_from_file(): + fname = io.StringIO('a,b,c\n1.0,2,3\n4,5,6') + elt = pol.EfficiencyLookupTable.from_file( + fname, wavelength_colname='a', efficiency_colname='b' + ) + assert_allclose( + sc.DataArray( + sc.array(dims=('wavelength',), values=[2, 5]), + coords={ + 'wavelength': sc.array( + dims=('wavelength',), values=[1.0, 4], unit='angstrom' + ) + }, + ), + elt.table, + ) + + +def test_EfficiencyLookupTable_load_from_example_file(): + fname = example_polarization_efficiency_table() + elt = pol.EfficiencyLookupTable.from_file( + fname, wavelength_colname='# X ', efficiency_colname=' Y ' + ) + assert elt.table.size == 120 + assert elt.table.coords['wavelength'].min() == sc.scalar(3.05, unit='angstrom') + assert elt.table.coords['wavelength'].max() == sc.scalar(14.95, unit='angstrom') diff --git a/pixi.lock b/pixi.lock index 08b9e410a..a51bbd03f 100644 --- a/pixi.lock +++ b/pixi.lock @@ -402,7 +402,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl @@ -439,10 +439,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.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/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-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/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl @@ -611,7 +611,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-py2.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl @@ -648,10 +648,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.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/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.0-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/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl @@ -1074,6 +1074,7 @@ environments: - 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/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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-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/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -1265,8 +1266,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-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/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -1298,10 +1300,10 @@ environments: - 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/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.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/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl @@ -1458,8 +1460,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-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/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -1491,10 +1494,10 @@ environments: - 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/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.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/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl @@ -1660,6 +1663,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-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/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -1718,6 +1722,7 @@ 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/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-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/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl @@ -2101,7 +2106,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl @@ -2135,10 +2140,10 @@ environments: - 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/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.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/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl @@ -2296,7 +2301,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl @@ -2330,10 +2335,10 @@ environments: - 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/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.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/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl @@ -2684,10 +2689,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-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/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/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.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/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl @@ -2697,9 +2705,11 @@ environments: - 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/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-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/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl @@ -2716,6 +2726,7 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/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/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -2734,8 +2745,10 @@ environments: - 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/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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-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/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.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/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/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -2783,6 +2796,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-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/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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl @@ -2791,6 +2805,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-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/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-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 @@ -2860,10 +2875,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-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/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.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/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl @@ -2873,9 +2891,11 @@ environments: - 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/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-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/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl @@ -2892,6 +2912,7 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl @@ -2908,10 +2929,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-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/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.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/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -2939,10 +2962,10 @@ environments: - 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/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl @@ -2959,6 +2982,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-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/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/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl @@ -2967,6 +2991,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-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/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-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 @@ -3036,10 +3061,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-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/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.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/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl @@ -3049,9 +3077,11 @@ environments: - 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/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-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/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl @@ -3068,6 +3098,7 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl @@ -3084,10 +3115,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-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/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.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/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -3115,10 +3148,10 @@ environments: - 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/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl @@ -3135,6 +3168,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-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/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/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl @@ -3143,6 +3177,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-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/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./packages/essreduce win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda @@ -3218,11 +3253,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-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/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-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/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.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/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl @@ -3232,9 +3270,11 @@ environments: - 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/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-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/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl @@ -3251,6 +3291,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl @@ -3269,8 +3310,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-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/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-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/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl @@ -3316,14 +3359,17 @@ environments: - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-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/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/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.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/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-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/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.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/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./packages/essreduce docs-essreflectometry: channels: @@ -3708,7 +3754,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-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/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl @@ -3745,10 +3791,10 @@ environments: - 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/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl @@ -3908,7 +3954,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-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/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl @@ -3945,10 +3991,10 @@ environments: - 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/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl @@ -4337,6 +4383,7 @@ environments: - 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/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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl @@ -4475,8 +4522,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl @@ -4500,10 +4548,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.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/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.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/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl @@ -4615,8 +4663,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl @@ -4640,10 +4689,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.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/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.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/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl @@ -4765,6 +4814,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl @@ -4800,6 +4850,7 @@ 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/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-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/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl @@ -5092,7 +5143,7 @@ environments: - 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/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl @@ -5115,10 +5166,10 @@ environments: - 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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.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/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl @@ -5228,7 +5279,7 @@ environments: - 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/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl @@ -5251,10 +5302,10 @@ environments: - 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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.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/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl @@ -5523,17 +5574,22 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.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/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/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/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/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-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/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-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/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl @@ -5543,6 +5599,7 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl @@ -5550,7 +5607,9 @@ environments: - 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/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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.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/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -5566,6 +5625,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-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/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -5575,12 +5635,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.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/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-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 @@ -5641,17 +5703,22 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.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/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/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/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-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/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-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/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl @@ -5661,14 +5728,17 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-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/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.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/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -5684,21 +5754,24 @@ environments: - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-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/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.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/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-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 @@ -5759,17 +5832,22 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.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/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/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/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-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/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-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/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl @@ -5779,14 +5857,17 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-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/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.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/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -5802,21 +5883,24 @@ environments: - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-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/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.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/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./packages/essreduce win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda @@ -5884,18 +5968,23 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.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/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-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/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/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/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-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/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.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/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-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/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl @@ -5905,6 +5994,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl @@ -5912,7 +6002,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl @@ -5926,6 +6018,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-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/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl @@ -5935,12 +6028,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.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/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-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/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./packages/essreduce essreflectometry: channels: @@ -6220,7 +6316,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-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/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl @@ -6244,10 +6340,10 @@ environments: - 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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl @@ -6352,7 +6448,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-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/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl @@ -6376,10 +6472,10 @@ environments: - 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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl @@ -6608,6 +6704,7 @@ environments: - 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/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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl @@ -6706,8 +6803,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl @@ -6731,10 +6829,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.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/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.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/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl @@ -6807,8 +6905,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl @@ -6832,10 +6931,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.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/af/46/661159ad844034ba8b3f4e0516215c41e4ee17db4213d13a82227670764f/sciline-25.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/9f/47/72fd8b2e60a957c9dc1c9a6171a9b016a45120e7f258851f16b940c731a5/scitiff-26.1.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/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl @@ -6912,6 +7011,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl @@ -6947,6 +7047,7 @@ 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/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-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/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl @@ -7123,7 +7224,7 @@ environments: - 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/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl @@ -7146,10 +7247,10 @@ environments: - 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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.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/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl @@ -7220,7 +7321,7 @@ environments: - 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/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl @@ -7243,10 +7344,10 @@ environments: - 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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.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/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl @@ -7393,18 +7494,23 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.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/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/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/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/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-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/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-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/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-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/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-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/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl @@ -7414,6 +7520,7 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl @@ -7421,7 +7528,9 @@ environments: - 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/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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.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/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -7437,6 +7546,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-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/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/d4/06/19ff1efd58b85906149ce83dfddce23252cea5bec7e0fa5f834336cfe836/scipp-26.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -7446,12 +7556,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.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/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./packages/essreduce osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda @@ -7471,18 +7583,23 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.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/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/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/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-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/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-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/ba/95/a825894f3e45cbac7554c4e97314ce886b233a20033787eda755ca8fecc7/h5py-3.16.0-cp311-cp311-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/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-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/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl @@ -7492,14 +7609,17 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-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/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.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/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -7515,21 +7635,24 @@ environments: - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-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/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.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/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./packages/essreduce osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda @@ -7550,18 +7673,23 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.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/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/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/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-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/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-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/bf/3b/38ff88b347c3e346cda1d3fc1b65a7aa75d40632228d8b8a5d7b58508c24/h5py-3.16.0-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/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-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/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl @@ -7571,14 +7699,17 @@ environments: - 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/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-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/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-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/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.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/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl @@ -7594,21 +7725,24 @@ environments: - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-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/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-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/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.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/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./packages/essreduce win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda @@ -7630,19 +7764,24 @@ environments: - pypi: https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.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/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-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/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-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/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.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/42/d9/27b13bc9419bf5dae02905b348f16ca827646cd76244ddd326f1a8139a6a/cyclebane-24.10.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/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/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-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/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.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/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-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/f7/20/e6c0ff62ca2ad1a396a34f4380bafccaaf8791ff8fccf3d995a1fc12d417/h5py-3.16.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-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/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-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/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl @@ -7652,6 +7791,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-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/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.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/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-py3-none-any.whl @@ -7659,7 +7799,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.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/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.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/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-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/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/8b/9e8baf7dacac8d0c174925c38ff43c6d94bc9abb35503f67762caccb6869/plopp-26.3.1-py3-none-any.whl @@ -7673,6 +7815,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-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/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/e6/0d/8882a4c7a5ebe59a46b709e82411d9c730d67250d41a2e11bc4bcd4d431d/scipp-26.3.1-cp311-cp311-win_amd64.whl @@ -7682,12 +7825,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/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/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.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/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.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/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-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/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./packages/essreduce lb-essreflectometry: channels: @@ -7851,7 +7997,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-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/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.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/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-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/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl @@ -7875,10 +8021,10 @@ environments: - 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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl @@ -7944,7 +8090,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/12/aa/fb2a0649fdeef5ab7072d221e8f4df164098792c813af6c87e2581cfa860/mpltoolbox-26.2.0-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/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.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/af/78/bc3850efda66712370ebb2a52130111b5cbbdee7a5b9d1672aadfc73234f/orsopy-1.2.3-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/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl @@ -7968,10 +8114,10 @@ environments: - 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/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-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/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz + - 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/fb/46/e50b38629e9e3f4a1dd55fb36d8b8abd1d59768c31151c1c8ed696f7b865/scippneutron-26.3.0-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/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.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/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-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/f5/57/2a154a69d6642860300bf8eb205d13131104991f2b1065bbb9075ac5c32e/tof-26.3.0-py3-none-any.whl @@ -9132,13 +9278,15 @@ packages: requires_python: '>=3.11' - pypi: ./packages/essreduce name: essreduce - version: 26.4.1.dev39+gd06e8dfe.d20260413 - sha256: dbe43892001fb3d0fec3dd5ce1e1903ec0adfac6deff58f7bbf7412d45ee7088 + version: 26.4.1.dev943+g2dfb7f37.d20260417 + sha256: c0635215f38d98e7c447c1c15c13d2b70ecaf201596aee236c9f2de58bfa3cca requires_dist: + - dask>=2022.1.0 - sciline>=25.11.0 - scipp>=26.3.0 - scippneutron>=25.11.1 - scippnexus>=25.6.0 + - scipy>=1.14 - graphviz>=0.20 ; extra == 'test' - ipywidgets>=8.1 ; extra == 'test' - matplotlib>=3.10.7 ; extra == 'test' @@ -9147,6 +9295,7 @@ packages: - pytest>=7.0 ; extra == 'test' - scipy>=1.14 ; extra == 'test' - tof>=25.12.0 ; extra == 'test' + - pandas>=2.1.2 ; extra == 'test' - autodoc-pydantic ; extra == 'docs' - graphviz>=0.20 ; extra == 'docs' - ipykernel ; extra == 'docs' @@ -9165,7 +9314,7 @@ packages: requires_python: '>=3.11' - pypi: ./packages/essreflectometry name: essreflectometry - version: 26.4.1.dev2266+g6a26f24d.d20260414 + version: 26.4.1.dev2276+g2dfb7f37.d20260417 sha256: 1bdaf0414f6474e2d20b379284338a01705165a8ebabc9848312675ca2a89b0e requires_dist: - dask>=2022.1.0 @@ -12735,6 +12884,11 @@ packages: - llvmlite>=0.46.0.dev0,<0.47 - numpy>=1.22,<2.5 requires_python: '>=3.10' +- 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/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl name: numpy version: 2.4.3 @@ -12745,15 +12899,10 @@ packages: version: 2.4.3 sha256: 715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71 requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl - name: numpy - version: 2.4.3 - sha256: 8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl +- 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: 33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb + sha256: a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920 requires_python: '>=3.11' - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c @@ -14409,10 +14558,36 @@ packages: - rich ; extra == 'test' - rich ; extra == 'progress' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/41/b4/72f873074503320e2baf093917892d128f731b92ba9f0983d4418bb24a11/scipp-26.3.1.tar.gz +- pypi: https://files.pythonhosted.org/packages/60/54/5011adb56853caabfd90686c2e543d1e3c76a8ef2755809b7e12e3f3583b/scipp-26.3.1-cp311-cp311-macosx_14_0_arm64.whl name: scipp version: 26.3.1 - sha256: 78b4c9f228e2df5004eebb6085ce879dd3968e096df6c02a38d29f3f3352ea10 + sha256: 67d275fc83b062053df9aa7ce3af4d2205109c2bc3ab22467bcd73ceb0a83df2 + requires_dist: + - numpy>=2 + - pytest ; extra == 'test' + - matplotlib ; extra == 'test' + - beautifulsoup4 ; extra == 'test' + - ipython ; extra == 'test' + - h5py ; extra == 'extra' + - scipy>=1.7.0 ; extra == 'extra' + - graphviz ; extra == 'extra' + - pooch ; extra == 'extra' + - plopp ; extra == 'extra' + - matplotlib ; extra == 'extra' + - scipp[extra] ; extra == 'all' + - ipympl ; extra == 'all' + - ipython ; extra == 'all' + - ipywidgets ; extra == 'all' + - jupyterlab ; extra == 'all' + - jupyterlab-widgets ; extra == 'all' + - jupyter-nbextensions-configurator ; extra == 'all' + - nodejs ; extra == 'all' + - pythreejs ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/81/21/4962b1daddf0422e56c5ed4c41bea1ccb6d2a9ab72b795196835a20969c7/scipp-26.3.1-cp311-cp311-macosx_14_0_x86_64.whl + name: scipp + version: 26.3.1 + sha256: 7c90e78fcba1d272df059fc01350c9e18f017aec26369b03def723a3702d763d requires_dist: - numpy>=2 - pytest ; extra == 'test' @@ -14570,10 +14745,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl name: scipy version: 1.17.1 - sha256: d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff + sha256: a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -14614,10 +14789,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl name: scipy version: 1.17.1 - sha256: 1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec + sha256: d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test' @@ -14658,10 +14833,10 @@ packages: - ruff>=0.12.0 ; extra == 'dev' - cython-lint>=0.12.2 ; extra == 'dev' requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl name: scipy version: 1.17.1 - sha256: e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696 + sha256: 766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd requires_dist: - numpy>=1.26.4,<2.7 - pytest>=8.0.0 ; extra == 'test'