From 2af8c0d30e0ae2a2e1fbae91aa8f890dd66d08cb Mon Sep 17 00:00:00 2001 From: Simon Heybrock Date: Tue, 9 Jun 2026 04:36:11 +0000 Subject: [PATCH] Seed RNG in position_noise_for_cylindrical_pixel Unlike gaussian_position_noise, the cylindrical pixel noise used an unseeded np.random.default_rng(), making the generated noise and all downstream projected coords nondeterministic between calls. Seed it with 1234 to match the gaussian variant. Co-Authored-By: Claude Opus 4.8 --- packages/essreduce/src/ess/reduce/live/raw.py | 2 +- packages/essreduce/tests/live/raw_test.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/essreduce/src/ess/reduce/live/raw.py b/packages/essreduce/src/ess/reduce/live/raw.py index 48197886d..36095a439 100644 --- a/packages/essreduce/src/ess/reduce/live/raw.py +++ b/packages/essreduce/src/ess/reduce/live/raw.py @@ -739,7 +739,7 @@ def position_noise_for_cylindrical_pixel( # fulfill this. However, the rest of the data reduction currently assumes that # the pixel offset corresponds to the pixel center, so if it is not fulfilled # there are bigger problems elsewhere anywhere. - rng = np.random.default_rng() + rng = np.random.default_rng(seed=1234) dims = ('position',) size = _noise_size z_hat = axis / sc.norm(axis) # Unit vector along the cylinder axis diff --git a/packages/essreduce/tests/live/raw_test.py b/packages/essreduce/tests/live/raw_test.py index e82f072fd..95f8f87ff 100644 --- a/packages/essreduce/tests/live/raw_test.py +++ b/packages/essreduce/tests/live/raw_test.py @@ -19,6 +19,14 @@ def test_gaussian_position_noise_is_sigma_unit_independent(sigma: sc.Variable) - assert sc.identical(noise, reference) +def test_position_noise_for_cylindrical_pixel_is_deterministic() -> None: + axis = raw.PixelCylinderAxis(sc.vector([0.0, 0.0, 1.0], unit='m')) + radius = raw.PixelCylinderRadius(sc.vector([0.5, 0.0, 0.0], unit='m')) + reference = raw.position_noise_for_cylindrical_pixel(axis=axis, radius=radius) + noise = raw.position_noise_for_cylindrical_pixel(axis=axis, radius=radius) + assert sc.identical(noise, reference) + + def test_clear_counts_resets_counts_to_zero() -> None: detector_number = sc.array(dims=['pixel'], values=[1, 2, 3], unit=None) det = raw.Detector(detector_number)