From 97040347f38116ee9ab5122a0090ddf62d8d7110 Mon Sep 17 00:00:00 2001 From: Peter Suter Date: Tue, 11 Jul 2023 20:16:41 +0200 Subject: [PATCH 1/4] ENH: only warn about invalid Minc2 spacing declaration Accept other values (like `xspacing`), assuming regular spacing. #1236 --- nibabel/minc2.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/nibabel/minc2.py b/nibabel/minc2.py index e00608eb2..5ad8a8495 100644 --- a/nibabel/minc2.py +++ b/nibabel/minc2.py @@ -25,6 +25,7 @@ mincstats my_funny.mnc """ +import warnings import numpy as np from .minc1 import Minc1File, Minc1Image, MincError, MincHeader @@ -58,8 +59,12 @@ def __init__(self, mincfile): # We don't currently support irregular spacing # https://en.wikibooks.org/wiki/MINC/Reference/MINC2.0_File_Format_Reference#Dimension_variable_attributes for dim in self._dims: - if dim.spacing != b'regular__': - raise ValueError('Irregular spacing not supported') + if hasattr(dim, 'spacing'): + if dim.spacing == b'irregular': + raise ValueError('Irregular spacing not supported') + elif dim.spacing != b'regular__': + warnings.warn(f'Invalid spacing declaration: {dim.spacing}; assuming regular') + self._spatial_dims = [name for name in self._dim_names if name.endswith('space')] self._image_max = image['image-max'] self._image_min = image['image-min'] From ff4f855d9a493d9bba85d662b3b2579f82f816ca Mon Sep 17 00:00:00 2001 From: Peter Suter Date: Tue, 11 Jul 2023 20:43:18 +0200 Subject: [PATCH 2/4] Update nibabel/minc2.py Co-authored-by: Chris Markiewicz --- nibabel/minc2.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/nibabel/minc2.py b/nibabel/minc2.py index 5ad8a8495..d02eb6cef 100644 --- a/nibabel/minc2.py +++ b/nibabel/minc2.py @@ -59,11 +59,12 @@ def __init__(self, mincfile): # We don't currently support irregular spacing # https://en.wikibooks.org/wiki/MINC/Reference/MINC2.0_File_Format_Reference#Dimension_variable_attributes for dim in self._dims: - if hasattr(dim, 'spacing'): - if dim.spacing == b'irregular': - raise ValueError('Irregular spacing not supported') - elif dim.spacing != b'regular__': - warnings.warn(f'Invalid spacing declaration: {dim.spacing}; assuming regular') + # "If this attribute is absent, a value of regular__ should be assumed." + spacing = getattr(dim, 'spacing', b'regular__') + if spacing == b'irregular': + raise ValueError('Irregular spacing not supported') + elif spacing != b'regular__': + warnings.warn(f'Invalid spacing declaration: {spacing}; assuming regular') self._spatial_dims = [name for name in self._dim_names if name.endswith('space')] self._image_max = image['image-max'] From 43895ef4af0bd5f141e00effe4fd4dda04dc7217 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Wed, 12 Jul 2023 10:48:10 -0400 Subject: [PATCH 3/4] TEST: Add test file with bad spacing field --- nibabel/tests/data/minc2_baddim.mnc | Bin 0 -> 19825 bytes nibabel/tests/test_minc2.py | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 nibabel/tests/data/minc2_baddim.mnc diff --git a/nibabel/tests/data/minc2_baddim.mnc b/nibabel/tests/data/minc2_baddim.mnc new file mode 100644 index 0000000000000000000000000000000000000000..c7de97bd5e0c257bece9f6a8b667494f0661ff51 GIT binary patch literal 19825 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�HBl~(Tx$TLpZCcAIPTU9mVVBMAIjPQQks!2HP#&&= z=?&e=GiJ3FMAawiiV zhBU7sszr5hAADg`)ac5I^DhTnGYV2n14bZY5_te!%viREumIN=zn(;>>woY zuBzJ~Qe}6u*=bl+-gYx(@WIuXu^in~@is1Ko;9zT4H8BdjagF}iFc9hcmS zf66rc*YBqux3b}(4mvXQ?0LDQ1fGStqRCZ0L{Qa-bH$s>TC~^RE>0UsgAPwpWd2)Y zcBYf29?yF1RHon@_NI%o6sJAIL>+>q*Ruv?aACd%{$SyZaR=WkL&)#&196lCjkY-M NbC5-}wc67>>Hoa>xl{lE literal 0 HcmV?d00001 diff --git a/nibabel/tests/test_minc2.py b/nibabel/tests/test_minc2.py index 251393818..e76cb05ce 100644 --- a/nibabel/tests/test_minc2.py +++ b/nibabel/tests/test_minc2.py @@ -10,6 +10,7 @@ from os.path import join as pjoin import numpy as np +import pytest from .. import minc2 from ..minc2 import Minc2File, Minc2Image @@ -121,3 +122,12 @@ class TestMinc2Image(tm2.TestMinc1Image): image_class = Minc2Image eg_images = (pjoin(data_path, 'small.mnc'),) module = minc2 + + +def test_bad_diminfo(): + fname = pjoin(data_path, 'minc2_baddim.mnc') + # File has a bad spacing field 'xspace' when it should be + # `irregular`, `regular__` or absent (default to regular__). + # We interpret an invalid spacing as absent, but warn. + with pytest.warns(UserWarning) as w: + Minc2Image.from_filename(fname) From 1402f18e6131aed5e4c62cd98f0d8bd087451c73 Mon Sep 17 00:00:00 2001 From: Peter Suter Date: Thu, 13 Jul 2023 08:16:47 +0200 Subject: [PATCH 4/4] Update .zenodo.json --- .zenodo.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.zenodo.json b/.zenodo.json index a436bfd31..d79c0cf93 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -377,6 +377,9 @@ }, { "name": "freec84" + }, + { + "name": "Suter, Peter" } ], "keywords": [