From bffa4083c46077706e5a3c2a3c7543503a575948 Mon Sep 17 00:00:00 2001 From: Brett Date: Thu, 14 Nov 2024 11:05:35 -0500 Subject: [PATCH] Revert "Revert "AL-875: Add memory saving options to compute_weight_threshold sigma_clip call" (#315)" This reverts commit 63d52808d1122596225447d06355f09b6126e589, reversing changes made to 5299646bd96ccce9322cda441d9046ba3d65623f. --- src/stcal/outlier_detection/utils.py | 7 ++++++- tests/outlier_detection/test_utils.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/stcal/outlier_detection/utils.py b/src/stcal/outlier_detection/utils.py index 886fac37..ba3bf041 100644 --- a/src/stcal/outlier_detection/utils.py +++ b/src/stcal/outlier_detection/utils.py @@ -77,7 +77,12 @@ def compute_weight_threshold(weight, maskpt): weight_masked = np.ma.array(weight, mask=np.logical_or( mask_zero_weight, mask_nans)) # Sigma-clip the unmasked data - weight_masked = sigma_clip(weight_masked, sigma=3, maxiters=5) + weight_masked = sigma_clip(weight_masked, + sigma=3, + maxiters=5, + masked=False, + copy=False, + ) mean_weight = np.mean(weight_masked) # Mask pixels where weight falls below maskpt percent weight_threshold = mean_weight * maskpt diff --git a/tests/outlier_detection/test_utils.py b/tests/outlier_detection/test_utils.py index fd72d9dc..4e14c508 100644 --- a/tests/outlier_detection/test_utils.py +++ b/tests/outlier_detection/test_utils.py @@ -16,6 +16,7 @@ reproject, medfilt, ) +from stcal.testing_helpers import MemoryThreshold @pytest.mark.parametrize("shape,diff", [ @@ -81,6 +82,23 @@ def test_compute_weight_threshold_zeros(): np.testing.assert_allclose(result, 21) +def test_compute_weight_threshold_memory(): + """Test that weight threshold function modifies + the weight array in place""" + arr = np.zeros([500, 500], dtype=np.float32) + arr[:250, :250] = 42 + arr[10,10] = 0 + arr[-10,-10] = np.nan + + # buffer to account for memory overhead needs to be small enough + # to ensure that the array was not copied + fractional_memory_buffer = 1.9 + expected_mem = int(arr.nbytes*fractional_memory_buffer) + with MemoryThreshold(str(expected_mem) + " B"): + result = compute_weight_threshold(arr, 0.5) + np.testing.assert_allclose(result, 21) + + def test_flag_crs(): sci = np.zeros((10, 10), dtype=np.float32) err = np.ones_like(sci)