Skip to content

Commit b4f248b

Browse files
committed
RollingDetectorView now works with any detector_number
1 parent 5061193 commit b4f248b

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

src/ess/reduce/live/raw.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,8 @@ def __init__(self, detector_number: sc.Variable):
175175
self._start = int(self._flat_detector_number[0].value)
176176
self._stop = int(self._flat_detector_number[-1].value)
177177
self._size = int(self._flat_detector_number.size)
178-
if not sc.issorted(self._flat_detector_number, dim='event_id'):
179-
raise ValueError("Detector numbers must be sorted.")
180-
if self._stop - self._start + 1 != self._size:
181-
raise ValueError("Detector numbers must be consecutive.")
178+
self._sorted = sc.issorted(self._flat_detector_number, dim='event_id')
179+
self._consecutive = self._stop - self._start + 1 == self._size
182180

183181
@property
184182
def detector_number(self) -> sc.Variable:
@@ -189,6 +187,10 @@ def data(self) -> sc.DataArray:
189187
return self._data
190188

191189
def bincount(self, data: Sequence[int]) -> sc.DataArray:
190+
if not self._sorted:
191+
raise ValueError("Detector numbers must be sorted to use `bincount`.")
192+
if not self._consecutive:
193+
raise ValueError("Detector numbers must be consecutive to use `bincount`.")
192194
offset = np.asarray(data, dtype=np.int32) - self._start
193195
# Ignore events with detector numbers outside the range of the detector. This
194196
# should not happen in valid files but for now it is useful until we are sure
@@ -242,7 +244,7 @@ def __init__(
242244
self._history: sc.DataArray | None = None
243245
self._cache: sc.DataArray | None = None
244246

245-
counts = self.bincount([])
247+
counts = sc.zeros_like(self.data)
246248
if self._projection is not None:
247249
counts = self._projection(counts)
248250
self._history = (

tests/live/raw_test.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ def test_Detector_bincount_drops_out_of_range_ids() -> None:
2727
)
2828

2929

30+
def test_Detector_bincount_raises_if_detector_number_not_sorted() -> None:
31+
detector_number = sc.array(dims=['pixel'], values=[1, 3, 2], unit=None)
32+
det = raw.Detector(detector_number)
33+
with pytest.raises(ValueError, match="sorted"):
34+
det.bincount([1])
35+
36+
37+
def test_Detector_bincount_raises_if_detector_number_not_consecutive() -> None:
38+
detector_number = sc.array(dims=['pixel'], values=[1, 2, 4], unit=None)
39+
det = raw.Detector(detector_number)
40+
with pytest.raises(ValueError, match="consecutive"):
41+
det.bincount([1])
42+
43+
3044
def test_RollingDetectorView_full_window() -> None:
3145
detector_number = sc.array(dims=['pixel'], values=[1, 2, 3], unit=None)
3246
det = raw.RollingDetectorView(detector_number=detector_number, window=2)
@@ -43,6 +57,26 @@ def test_RollingDetectorView_full_window() -> None:
4357
assert det.get().sum().value == 2
4458

4559

60+
def test_RollingDetectorView_add_events_accepts_unsorted_detector_number() -> None:
61+
detector_number = sc.array(dims=['detector_number'], values=[1, 3, 2], unit=None)
62+
det = raw.RollingDetectorView(detector_number=detector_number, window=2)
63+
pixel = sc.array(dims=['event'], values=[1, 2, 3, 2], unit=None)
64+
events = sc.DataArray(sc.ones_like(pixel), coords={'detector_number': pixel})
65+
det.add_events(events.group(detector_number))
66+
assert det.get().sum().value == 4
67+
68+
69+
def test_RollingDetectorView_add_events_accepts_non_consecutive_detector_number() -> (
70+
None
71+
):
72+
detector_number = sc.array(dims=['detector_number'], values=[1, 2, 4], unit=None)
73+
det = raw.RollingDetectorView(detector_number=detector_number, window=2)
74+
pixel = sc.array(dims=['event'], values=[1, 2, 4, 2], unit=None)
75+
events = sc.DataArray(sc.ones_like(pixel), coords={'detector_number': pixel})
76+
det.add_events(events.group(detector_number))
77+
assert det.get().sum().value == 4
78+
79+
4680
def test_RollingDetectorView_partial_window() -> None:
4781
detector_number = sc.array(dims=['pixel'], values=[1, 2, 3], unit=None)
4882
det = raw.RollingDetectorView(detector_number=detector_number, window=3)

0 commit comments

Comments
 (0)