diff --git a/tests/preprocessing/test_norm_stats.py b/tests/preprocessing/test_norm_stats.py new file mode 100644 index 000000000..fe51bf59a --- /dev/null +++ b/tests/preprocessing/test_norm_stats.py @@ -0,0 +1,20 @@ +import numpy as np +from viscy.utils.mp_utils import get_val_stats + + +def test_get_val_stats(): + sample_values = np.arange(0, 101) + stats = get_val_stats(sample_values) + expected_stats = { + "mean": 50.0, + "std": np.std(sample_values), + "median": 50.0, + "iqr": 50.0, + "p1": 1.0, + "p5": 5.0, + "p95": 95.0, + "p99": 99.0, + "p99_p1": 98.0, + "p95_p5": 90.0, + } + assert stats == expected_stats diff --git a/viscy/utils/meta_utils.py b/viscy/utils/meta_utils.py index f948fb849..2bd79081d 100644 --- a/viscy/utils/meta_utils.py +++ b/viscy/utils/meta_utils.py @@ -31,7 +31,15 @@ def write_meta_field(position: ngff.Position, metadata, field_name, subfield_nam """ if field_name in position.zattrs: if subfield_name in position.zattrs[field_name]: - position.zattrs[field_name][subfield_name].update(metadata) + # Need to create a new dict and reassign to trigger zarr write + updated_subfield = { + **position.zattrs[field_name][subfield_name], + **metadata, + } + position.zattrs[field_name] = { + **position.zattrs[field_name], + subfield_name: updated_subfield, + } else: D1 = position.zattrs[field_name] field_metadata = { diff --git a/viscy/utils/mp_utils.py b/viscy/utils/mp_utils.py index 4db77e4de..6b39795f8 100644 --- a/viscy/utils/mp_utils.py +++ b/viscy/utils/mp_utils.py @@ -2,7 +2,6 @@ import iohub.ngff as ngff import numpy as np -import scipy.stats import viscy.utils.image_utils as image_utils import viscy.utils.masks as mask_utils @@ -260,11 +259,21 @@ def get_val_stats(sample_values): indices :return dict meta_row: Dict with intensity data for image """ - + percentiles = [1, 5, 25, 50, 75, 95, 99] + percentile_values = { + k: float(v) + for k, v in zip(percentiles, np.nanpercentile(sample_values, percentiles)) + } meta_row = { "mean": float(np.nanmean(sample_values)), "std": float(np.nanstd(sample_values)), - "median": float(np.nanmedian(sample_values)), - "iqr": float(scipy.stats.iqr(sample_values)), + "median": percentile_values[50], + "iqr": percentile_values[75] - percentile_values[25], + "p5": percentile_values[5], + "p95": percentile_values[95], + "p95_p5": percentile_values[95] - percentile_values[5], + "p1": percentile_values[1], + "p99": percentile_values[99], + "p99_p1": percentile_values[99] - percentile_values[1], } return meta_row