essreduce 25.4.0__py3-none-any.whl → 25.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,108 +8,82 @@ from numba import njit, prange
8
8
  def interpolate(
9
9
  x: np.ndarray,
10
10
  y: np.ndarray,
11
- z: np.ndarray,
12
11
  values: np.ndarray,
13
12
  xp: np.ndarray,
14
13
  yp: np.ndarray,
15
- zp: np.ndarray,
14
+ xoffset: np.ndarray | None,
15
+ deltax: float,
16
16
  fill_value: float,
17
17
  out: np.ndarray,
18
18
  ):
19
19
  """
20
- Linear interpolation of data on a 3D regular grid.
20
+ Linear interpolation of data on a 2D regular grid.
21
21
 
22
22
  Parameters
23
23
  ----------
24
24
  x:
25
- 1D array of grid edges along the x-axis. They must be linspaced.
25
+ 1D array of grid edges along the x-axis (size nx). They must be linspaced.
26
26
  y:
27
- 1D array of grid edges along the y-axis. They must be linspaced.
28
- z:
29
- 1D array of grid edges along the z-axis. They must be linspaced.
27
+ 1D array of grid edges along the y-axis (size ny). They must be linspaced.
30
28
  values:
31
- 3D array of values on the grid. The shape must be (nz, ny, nx).
29
+ 2D array of values on the grid. The shape must be (ny, nx).
32
30
  xp:
33
31
  1D array of x-coordinates where to interpolate (size N).
34
32
  yp:
35
33
  1D array of y-coordinates where to interpolate (size N).
36
- zp:
37
- 1D array of z-coordinates where to interpolate (size N).
34
+ xoffset:
35
+ 1D array of integer offsets to apply to the x-coordinates (size N).
36
+ deltax:
37
+ Multiplier to apply to the integer offsets (i.e. the step size).
38
38
  fill_value:
39
39
  Value to use for points outside of the grid.
40
40
  out:
41
41
  1D array where the interpolated values will be stored (size N).
42
42
  """
43
- if not (len(xp) == len(yp) == len(zp) == len(out)):
43
+ if not (len(xp) == len(yp) == len(out)):
44
44
  raise ValueError("Interpolator: all input arrays must have the same size.")
45
45
 
46
+ nx = len(x)
47
+ ny = len(y)
46
48
  npoints = len(xp)
47
49
  xmin = x[0]
48
- xmax = x[-1]
50
+ xmax = x[nx - 1]
49
51
  ymin = y[0]
50
- ymax = y[-1]
51
- zmin = z[0]
52
- zmax = z[-1]
52
+ ymax = y[ny - 1]
53
53
  dx = x[1] - xmin
54
54
  dy = y[1] - ymin
55
- dz = z[1] - zmin
56
55
 
57
56
  one_over_dx = 1.0 / dx
58
57
  one_over_dy = 1.0 / dy
59
- one_over_dz = 1.0 / dz
60
- norm = one_over_dx * one_over_dy * one_over_dz
58
+ norm = one_over_dx * one_over_dy
61
59
 
62
60
  for i in prange(npoints):
63
- xx = xp[i]
61
+ xx = xp[i] + (xoffset[i] * deltax if xoffset is not None else 0.0)
64
62
  yy = yp[i]
65
- zz = zp[i]
66
-
67
- if (
68
- (xx < xmin)
69
- or (xx > xmax)
70
- or (yy < ymin)
71
- or (yy > ymax)
72
- or (zz < zmin)
73
- or (zz > zmax)
74
- ):
63
+
64
+ if (xx < xmin) or (xx > xmax) or (yy < ymin) or (yy > ymax):
75
65
  out[i] = fill_value
76
66
 
77
67
  else:
78
- ix = int((xx - xmin) * one_over_dx)
79
- iy = int((yy - ymin) * one_over_dy)
80
- iz = int((zz - zmin) * one_over_dz)
68
+ ix = nx - 2 if xx == xmax else int((xx - xmin) * one_over_dx)
69
+ iy = ny - 2 if yy == ymax else int((yy - ymin) * one_over_dy)
81
70
 
82
- y2 = y[iy + 1]
83
- y1 = y[iy]
84
- x2 = x[ix + 1]
85
71
  x1 = x[ix]
86
- z1 = z[iz]
87
- z2 = z[iz + 1]
88
-
89
- a111 = values[iz, iy, ix]
90
- a211 = values[iz, iy, ix + 1]
91
- a121 = values[iz, iy + 1, ix]
92
- a221 = values[iz, iy + 1, ix + 1]
93
- a112 = values[iz + 1, iy, ix]
94
- a212 = values[iz + 1, iy, ix + 1]
95
- a122 = values[iz + 1, iy + 1, ix]
96
- a222 = values[iz + 1, iy + 1, ix + 1]
72
+ x2 = x[ix + 1]
73
+ y1 = y[iy]
74
+ y2 = y[iy + 1]
75
+
76
+ a11 = values[iy, ix]
77
+ a21 = values[iy, ix + 1]
78
+ a12 = values[iy + 1, ix]
79
+ a22 = values[iy + 1, ix + 1]
97
80
 
98
81
  x2mxx = x2 - xx
99
82
  xxmx1 = xx - x1
100
- y2myy = y2 - yy
101
- yymy1 = yy - y1
83
+
102
84
  out[i] = (
103
- (z2 - zz)
104
- * (
105
- y2myy * (x2mxx * a111 + xxmx1 * a211)
106
- + yymy1 * (x2mxx * a121 + xxmx1 * a221)
107
- )
108
- + (zz - z1)
109
- * (
110
- y2myy * (x2mxx * a112 + xxmx1 * a212)
111
- + yymy1 * (x2mxx * a122 + xxmx1 * a222)
112
- )
85
+ (y2 - yy) * (x2mxx * a11 + xxmx1 * a21)
86
+ + (yy - y1) * (x2mxx * a12 + xxmx1 * a22)
113
87
  ) * norm
114
88
 
115
89
 
@@ -118,12 +92,11 @@ class Interpolator:
118
92
  self,
119
93
  time_edges: np.ndarray,
120
94
  distance_edges: np.ndarray,
121
- pulse_edges: np.ndarray,
122
95
  values: np.ndarray,
123
96
  fill_value: float = np.nan,
124
97
  ):
125
98
  """
126
- Interpolator for 3D regular grid data (Numba implementation).
99
+ Interpolator for 2D regular grid data (Numba implementation).
127
100
 
128
101
  Parameters
129
102
  ----------
@@ -131,31 +104,32 @@ class Interpolator:
131
104
  1D array of time edges.
132
105
  distance_edges:
133
106
  1D array of distance edges.
134
- pulse_edges:
135
- 1D array of pulse edges.
136
107
  values:
137
- 3D array of values on the grid. The shape must be (nz, ny, nx).
108
+ 2D array of values on the grid. The shape must be (ny, nx).
138
109
  fill_value:
139
110
  Value to use for points outside of the grid.
140
111
  """
141
112
  self.time_edges = time_edges
142
113
  self.distance_edges = distance_edges
143
- self.pulse_edges = pulse_edges
144
114
  self.values = values
145
115
  self.fill_value = fill_value
146
116
 
147
117
  def __call__(
148
- self, times: np.ndarray, distances: np.ndarray, pulse_indices: np.ndarray
118
+ self,
119
+ times: np.ndarray,
120
+ distances: np.ndarray,
121
+ pulse_period: float = 0.0,
122
+ pulse_index: np.ndarray | None = None,
149
123
  ) -> np.ndarray:
150
124
  out = np.empty_like(times)
151
125
  interpolate(
152
126
  x=self.time_edges,
153
127
  y=self.distance_edges,
154
- z=self.pulse_edges,
155
128
  values=self.values,
156
129
  xp=times,
157
130
  yp=distances,
158
- zp=pulse_indices,
131
+ xoffset=pulse_index,
132
+ deltax=pulse_period,
159
133
  fill_value=self.fill_value,
160
134
  out=out,
161
135
  )
@@ -9,7 +9,6 @@ class Interpolator:
9
9
  self,
10
10
  time_edges: np.ndarray,
11
11
  distance_edges: np.ndarray,
12
- pulse_edges: np.ndarray,
13
12
  values: np.ndarray,
14
13
  method: str = "linear",
15
14
  bounds_error: bool = False,
@@ -17,18 +16,16 @@ class Interpolator:
17
16
  **kwargs,
18
17
  ):
19
18
  """
20
- Interpolator for 3D regular grid data (SciPy implementation).
19
+ Interpolator for 2D regular grid data (SciPy implementation).
21
20
 
22
21
  Parameters
23
22
  ----------
24
23
  time_edges:
25
- 1D array of time edges.
24
+ 1D array of time edges (length N_time).
26
25
  distance_edges:
27
- 1D array of distance edges.
28
- pulse_edges:
29
- 1D array of pulse edges.
26
+ 1D array of distance edges (length N_dist).
30
27
  values:
31
- 3D array of values on the grid. The shape must be (nz, ny, nx).
28
+ 2D array of values on the grid. The shape must be (N_dist, N_time).
32
29
  method:
33
30
  Method of interpolation. Default is "linear".
34
31
  bounds_error:
@@ -42,11 +39,7 @@ class Interpolator:
42
39
  from scipy.interpolate import RegularGridInterpolator
43
40
 
44
41
  self._interp = RegularGridInterpolator(
45
- (
46
- pulse_edges,
47
- distance_edges,
48
- time_edges,
49
- ),
42
+ (distance_edges, time_edges),
50
43
  values,
51
44
  method=method,
52
45
  bounds_error=bounds_error,
@@ -55,6 +48,12 @@ class Interpolator:
55
48
  )
56
49
 
57
50
  def __call__(
58
- self, times: np.ndarray, distances: np.ndarray, pulse_indices: np.ndarray
51
+ self,
52
+ times: np.ndarray,
53
+ distances: np.ndarray,
54
+ pulse_period: float = 0.0,
55
+ pulse_index: np.ndarray | None = None,
59
56
  ) -> np.ndarray:
60
- return self._interp((pulse_indices, distances, times))
57
+ if pulse_index is not None:
58
+ times = times + (pulse_index * pulse_period)
59
+ return self._interp((distances, times))
@@ -4,12 +4,10 @@
4
4
  from dataclasses import dataclass
5
5
  from typing import NewType
6
6
 
7
+ import sciline as sl
7
8
  import scipp as sc
8
9
 
9
- Ltotal = NewType("Ltotal", sc.Variable)
10
- """
11
- Total length of the flight path from the source to the detector.
12
- """
10
+ from ..nexus.types import MonitorType, RunType
13
11
 
14
12
 
15
13
  @dataclass
@@ -107,30 +105,58 @@ When pulse-skipping, the offset of the first pulse in the stride. This is typica
107
105
  zero but can be a small integer < pulse_stride. If None, a guess is made.
108
106
  """
109
107
 
110
- RawData = NewType("RawData", sc.DataArray)
111
- """
112
- Raw detector data loaded from a NeXus file, e.g., NXdetector containing NXevent_data.
113
- """
114
108
 
115
- TofData = NewType("TofData", sc.DataArray)
116
- """
117
- Detector data with time-of-flight coordinate.
118
- """
109
+ class DetectorLtotal(sl.Scope[RunType, sc.Variable], sc.Variable):
110
+ """Total path length of neutrons from source to detector (L1 + L2)."""
119
111
 
120
- ResampledTofData = NewType("ResampledTofData", sc.DataArray)
121
- """
122
- Histogrammed detector data with time-of-flight coordinate, that has been resampled.
123
112
 
124
- Histogrammed data that has been converted to `tof` will typically have
125
- unsorted bin edges (due to either wrapping of `time_of_flight` or wavelength
126
- overlap between subframes).
127
- We thus resample the data to ensure that the bin edges are sorted.
128
- It makes use of the ``to_events`` helper which generates a number of events in each
129
- bin with a uniform distribution. The new events are then histogrammed using a set of
130
- sorted bin edges to yield a new histogram with sorted bin edges.
113
+ class MonitorLtotal(sl.Scope[RunType, MonitorType, sc.Variable], sc.Variable):
114
+ """Total path length of neutrons from source to monitor."""
131
115
 
132
- WARNING:
133
- This function is highly experimental, has limitations and should be used with
134
- caution. It is a workaround to the issue that rebinning data with unsorted bin
135
- edges is not supported in scipp.
136
- """
116
+
117
+ class DetectorTofData(sl.Scope[RunType, sc.DataArray], sc.DataArray):
118
+ """Detector data with time-of-flight coordinate."""
119
+
120
+
121
+ class MonitorTofData(sl.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray):
122
+ """Monitor data with time-of-flight coordinate."""
123
+
124
+
125
+ class ResampledDetectorTofData(sl.Scope[RunType, sc.DataArray], sc.DataArray):
126
+ """
127
+ Histogrammed detector data with time-of-flight coordinate, that has been resampled.
128
+
129
+ Histogrammed data that has been converted to `tof` will typically have
130
+ unsorted bin edges (due to either wrapping of `time_of_flight` or wavelength
131
+ overlap between subframes).
132
+ We thus resample the data to ensure that the bin edges are sorted.
133
+ It makes use of the ``to_events`` helper which generates a number of events in each
134
+ bin with a uniform distribution. The new events are then histogrammed using a set of
135
+ sorted bin edges to yield a new histogram with sorted bin edges.
136
+
137
+ WARNING:
138
+ This function is highly experimental, has limitations and should be used with
139
+ caution. It is a workaround to the issue that rebinning data with unsorted bin
140
+ edges is not supported in scipp.
141
+ """
142
+
143
+
144
+ class ResampledMonitorTofData(
145
+ sl.Scope[RunType, MonitorType, sc.DataArray], sc.DataArray
146
+ ):
147
+ """
148
+ Histogrammed monitor data with time-of-flight coordinate, that has been resampled.
149
+
150
+ Histogrammed data that has been converted to `tof` will typically have
151
+ unsorted bin edges (due to either wrapping of `time_of_flight` or wavelength
152
+ overlap between subframes).
153
+ We thus resample the data to ensure that the bin edges are sorted.
154
+ It makes use of the ``to_events`` helper which generates a number of events in each
155
+ bin with a uniform distribution. The new events are then histogrammed using a set of
156
+ sorted bin edges to yield a new histogram with sorted bin edges.
157
+
158
+ WARNING:
159
+ This function is highly experimental, has limitations and should be used with
160
+ caution. It is a workaround to the issue that rebinning data with unsorted bin
161
+ edges is not supported in scipp.
162
+ """
@@ -0,0 +1,61 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ # Copyright (c) 2025 Scipp contributors (https://github.com/scipp)
3
+ from collections.abc import Iterable
4
+
5
+ import sciline
6
+
7
+ from ..nexus import GenericNeXusWorkflow
8
+ from ..utils import prune_type_vars
9
+ from .eto_to_tof import default_parameters, providers
10
+
11
+
12
+ def GenericTofWorkflow(
13
+ *,
14
+ run_types: Iterable[sciline.typing.Key] | None = None,
15
+ monitor_types: Iterable[sciline.typing.Key] | None = None,
16
+ ) -> sciline.Pipeline:
17
+ """
18
+ Generic workflow for computing the neutron time-of-flight for detector and monitor
19
+ data.
20
+ This workflow builds on the ``GenericNeXusWorkflow`` and computes time-of-flight
21
+ from a lookup table that is created from the chopper settings, detector Ltotal and
22
+ the neutron time-of-arrival.
23
+
24
+ It is possible to limit which run types and monitor types
25
+ are supported by the returned workflow.
26
+ This is useful to reduce the size of the workflow and make it easier to inspect.
27
+ Make sure to add *all* required run types and monitor types when using this feature.
28
+
29
+ Attention
30
+ ---------
31
+ Filtering by run type and monitor type does not work with nested type vars.
32
+ E.g., if you have a type like ``Outer[Inner[RunType]]``, this type and its
33
+ provider will be removed.
34
+
35
+ Parameters
36
+ ----------
37
+ run_types:
38
+ List of run types to include in the workflow. If not provided, all run types
39
+ are included.
40
+ Must be a possible value of :class:`ess.reduce.nexus.types.RunType`.
41
+ monitor_types:
42
+ List of monitor types to include in the workflow. If not provided, all monitor
43
+ types are included.
44
+ Must be a possible value of :class:`ess.reduce.nexus.types.MonitorType`.
45
+
46
+ Returns
47
+ -------
48
+ :
49
+ The workflow.
50
+ """
51
+ wf = GenericNeXusWorkflow(run_types=run_types, monitor_types=monitor_types)
52
+
53
+ for provider in providers():
54
+ wf.insert(provider)
55
+ for key, value in default_parameters().items():
56
+ wf[key] = value
57
+
58
+ if run_types is not None or monitor_types is not None:
59
+ prune_type_vars(wf, run_types=run_types, monitor_types=monitor_types)
60
+
61
+ return wf
ess/reduce/utils.py ADDED
@@ -0,0 +1,36 @@
1
+ # SPDX-License-Identifier: BSD-3-Clause
2
+ # Copyright (c) 2025 Scipp contributors (https://github.com/scipp)
3
+
4
+ from collections.abc import Iterable
5
+ from typing import Any
6
+
7
+ import sciline
8
+
9
+ from .nexus.types import MonitorType, RunType
10
+
11
+
12
+ def prune_type_vars(
13
+ workflow: sciline.Pipeline,
14
+ *,
15
+ run_types: Iterable[sciline.typing.Key] | None,
16
+ monitor_types: Iterable[sciline.typing.Key] | None,
17
+ ) -> None:
18
+ # Remove all nodes that use a run type or monitor types that is
19
+ # not listed in the function arguments.
20
+ excluded_run_types = excluded_type_args(RunType, run_types)
21
+ excluded_monitor_types = excluded_type_args(MonitorType, monitor_types)
22
+ excluded_types = excluded_run_types | excluded_monitor_types
23
+
24
+ graph = workflow.underlying_graph
25
+ to_remove = [
26
+ node for node in graph if excluded_types & set(getattr(node, "__args__", set()))
27
+ ]
28
+ graph.remove_nodes_from(to_remove)
29
+
30
+
31
+ def excluded_type_args(
32
+ type_var: Any, keep: Iterable[sciline.typing.Key] | None
33
+ ) -> set[sciline.typing.Key]:
34
+ if keep is None:
35
+ return set()
36
+ return set(type_var.__constraints__) - set(keep)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: essreduce
3
- Version: 25.4.0
3
+ Version: 25.5.0
4
4
  Summary: Common data reduction tools for the ESS facility
5
5
  Author: Scipp contributors
6
6
  License: BSD 3-Clause License
@@ -51,7 +51,7 @@ Classifier: Typing :: Typed
51
51
  Requires-Python: >=3.10
52
52
  Description-Content-Type: text/markdown
53
53
  License-File: LICENSE
54
- Requires-Dist: sciline>=24.06.2
54
+ Requires-Dist: sciline>=25.04.1
55
55
  Requires-Dist: scipp>=25.01.0
56
56
  Requires-Dist: scippneutron>=25.02.0
57
57
  Requires-Dist: scippnexus>=24.11.0
@@ -61,7 +61,7 @@ Requires-Dist: numba; extra == "test"
61
61
  Requires-Dist: pooch; extra == "test"
62
62
  Requires-Dist: pytest; extra == "test"
63
63
  Requires-Dist: scipy>=1.7.0; extra == "test"
64
- Requires-Dist: tof>=25.01.2; extra == "test"
64
+ Requires-Dist: tof>=25.05.0; extra == "test"
65
65
  Dynamic: license-file
66
66
 
67
67
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
@@ -6,6 +6,7 @@ ess/reduce/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  ess/reduce/streaming.py,sha256=TBttQV5WdSpUKh38J0pdv53seMWtUFswxd6-ltaZb_M,17403
7
7
  ess/reduce/ui.py,sha256=zmorAbDwX1cU3ygDT--OP58o0qU7OBcmJz03jPeYSLA,10884
8
8
  ess/reduce/uncertainty.py,sha256=LR4O6ApB6Z-W9gC_XW0ajupl8yFG-du0eee1AX_R-gk,6990
9
+ ess/reduce/utils.py,sha256=RBAfJRNil6JjVF-jPaxeL0ssEEfPBBQEZ3ObEorpDLo,1132
9
10
  ess/reduce/workflow.py,sha256=sL34T_2Cjl_8iFlegujxI9VyOUwo6erVC8pOXnfWgYw,3060
10
11
  ess/reduce/live/__init__.py,sha256=jPQVhihRVNtEDrE20PoKkclKV2aBF1lS7cCHootgFgI,204
11
12
  ess/reduce/live/raw.py,sha256=66qV0G2rP8gK5tXuk-syTlDLE2jT3ehfmSnET7Xzfd0,24392
@@ -15,17 +16,18 @@ ess/reduce/nexus/__init__.py,sha256=59bxKkNYg8DYcSykNvH6nCa5SYchJC4SbgZEKhkNdYc,
15
16
  ess/reduce/nexus/_nexus_loader.py,sha256=5N48AMJx1AaFZb6WZPPbVKUlXyFMVVtZrn7Bae57O3A,19842
16
17
  ess/reduce/nexus/json_generator.py,sha256=ME2Xn8L7Oi3uHJk9ZZdCRQTRX-OV_wh9-DJn07Alplk,2529
17
18
  ess/reduce/nexus/json_nexus.py,sha256=QrVc0p424nZ5dHX9gebAJppTw6lGZq9404P_OFl1giA,10282
18
- ess/reduce/nexus/types.py,sha256=15XcHbNbOfnAYjWXzzKyYDVNyNixRnP0hJ-Q2duwMWE,9896
19
- ess/reduce/nexus/workflow.py,sha256=EiD6-58eGwoN5fbo47UTZy_oYFitCbwlIH-xqDOSp4c,24326
19
+ ess/reduce/nexus/types.py,sha256=vTQD4oQ5JKBHAYy9LWFICSo-dhVi3wX5IinMgjRDtF8,9806
20
+ ess/reduce/nexus/workflow.py,sha256=zrBQGNLUxmvqXewe9uNUg9aP43_glfFD6nh5VGAtBK4,23456
20
21
  ess/reduce/scripts/grow_nexus.py,sha256=hET3h06M0xlJd62E3palNLFvJMyNax2kK4XyJcOhl-I,3387
21
- ess/reduce/time_of_flight/__init__.py,sha256=TSHfyoROwFhM2k3jHzamw3zeb0OQOaiuvgCgDEPEQ_g,1097
22
- ess/reduce/time_of_flight/eto_to_tof.py,sha256=Nq2gx7aejoZ_ExLTr9I6KZMqDxCKAx1PpGHslpNXkKU,25271
23
- ess/reduce/time_of_flight/fakes.py,sha256=REyHkJsSSq2_l5UOtpsv2aKkhCuro_i3KpVsxxITbW0,4470
24
- ess/reduce/time_of_flight/interpolator_numba.py,sha256=4fZLs5Q4UxXKJREYxRAV5qUWB_uR2PscvMP0vno1A-A,4544
25
- ess/reduce/time_of_flight/interpolator_scipy.py,sha256=sRJj2ncBiUMv6g9h-MJzI9xyY0Ir0degpAv6FIeSMBw,1834
22
+ ess/reduce/time_of_flight/__init__.py,sha256=v86c3zNTMMqZoR9eHaK0Q-JnzsbOI6XsBGI3mgy2CiU,1469
23
+ ess/reduce/time_of_flight/eto_to_tof.py,sha256=ckXoSrltXdciYwipyUkF-DVtbsz2_XSLZvX2qJ_d8Bs,28238
24
+ ess/reduce/time_of_flight/fakes.py,sha256=0gtbSX3ZQilaM4ZP5dMr3fqbnhpyoVsZX2YEb8GgREE,4489
25
+ ess/reduce/time_of_flight/interpolator_numba.py,sha256=wh2YS3j2rOu30v1Ok3xNHcwS7t8eEtZyZvbfXOCtgrQ,3835
26
+ ess/reduce/time_of_flight/interpolator_scipy.py,sha256=_InoAPuMm2qhJKZQBAHOGRFqtvvuQ8TStoN7j_YgS4M,1853
26
27
  ess/reduce/time_of_flight/simulation.py,sha256=cIF_nWkLQlcWUCW2_wvWBU2ocg_8CSfOnfkoqdLdUgs,2923
27
28
  ess/reduce/time_of_flight/to_events.py,sha256=w9mHpnWd3vwN2ouob-GK_1NPrTjCaOzPuC2QuEey-m0,4342
28
- ess/reduce/time_of_flight/types.py,sha256=Iv1XGLbrZ9bD4CPAVhsIPkAaB46YC7l7yf5XweljLqk,5047
29
+ ess/reduce/time_of_flight/types.py,sha256=xhziZQaCB4XAxvVopHHp2DZSBj7PUt-xgPzEDpni05g,6321
30
+ ess/reduce/time_of_flight/workflow.py,sha256=-g9IyAz7sNrgL-5RZLUTlfjTb2YFej1Xig6GiC7c1bI,2156
29
31
  ess/reduce/widgets/__init__.py,sha256=SoSHBv8Dc3QXV9HUvPhjSYWMwKTGYZLpsWwsShIO97Q,5325
30
32
  ess/reduce/widgets/_base.py,sha256=_wN3FOlXgx_u0c-A_3yyoIH-SdUvDENGgquh9S-h5GI,4852
31
33
  ess/reduce/widgets/_binedges_widget.py,sha256=ZCQsGjYHnJr9GFUn7NjoZc1CdsnAzm_fMzyF-fTKKVY,2785
@@ -38,9 +40,9 @@ ess/reduce/widgets/_spinner.py,sha256=2VY4Fhfa7HMXox2O7UbofcdKsYG-AJGrsgGJB85nDX
38
40
  ess/reduce/widgets/_string_widget.py,sha256=iPAdfANyXHf-nkfhgkyH6gQDklia0LebLTmwi3m-iYQ,1482
39
41
  ess/reduce/widgets/_switchable_widget.py,sha256=fjKz99SKLhIF1BLgGVBSKKn3Lu_jYBwDYGeAjbJY3Q8,2390
40
42
  ess/reduce/widgets/_vector_widget.py,sha256=aTaBqCFHZQhrIoX6-sSqFWCPePEW8HQt5kUio8jP1t8,1203
41
- essreduce-25.4.0.dist-info/licenses/LICENSE,sha256=nVEiume4Qj6jMYfSRjHTM2jtJ4FGu0g-5Sdh7osfEYw,1553
42
- essreduce-25.4.0.dist-info/METADATA,sha256=jVwDtqDA6slsUJQYBDTy_teK7EbLjGCfhqoa4YSf1Ac,3768
43
- essreduce-25.4.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
44
- essreduce-25.4.0.dist-info/entry_points.txt,sha256=PMZOIYzCifHMTe4pK3HbhxUwxjFaZizYlLD0td4Isb0,66
45
- essreduce-25.4.0.dist-info/top_level.txt,sha256=0JxTCgMKPLKtp14wb1-RKisQPQWX7i96innZNvHBr-s,4
46
- essreduce-25.4.0.dist-info/RECORD,,
43
+ essreduce-25.5.0.dist-info/licenses/LICENSE,sha256=nVEiume4Qj6jMYfSRjHTM2jtJ4FGu0g-5Sdh7osfEYw,1553
44
+ essreduce-25.5.0.dist-info/METADATA,sha256=yfoZMb19ayIQyCRk5_WPEuvrWGAYApWIs4Wr-69nwO8,3768
45
+ essreduce-25.5.0.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
46
+ essreduce-25.5.0.dist-info/entry_points.txt,sha256=PMZOIYzCifHMTe4pK3HbhxUwxjFaZizYlLD0td4Isb0,66
47
+ essreduce-25.5.0.dist-info/top_level.txt,sha256=0JxTCgMKPLKtp14wb1-RKisQPQWX7i96innZNvHBr-s,4
48
+ essreduce-25.5.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5