Skip to content

Commit 50551f9

Browse files
committed
TEST: Test get/set_norm_zooms
1 parent 8eb3bce commit 50551f9

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed

nibabel/freesurfer/tests/test_mghformat.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,54 @@ def check_dtypes(self, expected, actual):
390390
# MGH requires the actual to be a big endian version of expected
391391
assert_equal(expected.newbyteorder('>'), actual)
392392

393+
def test_norm_zooms_edge_cases(self):
394+
img_klass = self.image_class
395+
aff = np.eye(4)
396+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
397+
img = img_klass(arr, aff)
398+
399+
assert_array_almost_equal(img.header.get_zooms(),
400+
(1, 1, 1, 0))
401+
assert_array_almost_equal(img.header.get_norm_zooms(),
402+
(1, 1, 1, 0))
403+
404+
img.header.set_zooms((1, 1, 1, 2000))
405+
assert_array_almost_equal(img.header.get_zooms(),
406+
(1, 1, 1, 2000))
407+
assert_array_almost_equal(img.header.get_norm_zooms(),
408+
(1, 1, 1, 2))
409+
410+
img.header.set_norm_zooms((2, 2, 2, 3))
411+
assert_array_almost_equal(img.header.get_zooms(),
412+
(2, 2, 2, 3000))
413+
assert_array_almost_equal(img.header.get_norm_zooms(),
414+
(2, 2, 2, 3))
415+
416+
# It's legal to set zooms for spatial dimensions only
417+
img.header.set_norm_zooms((3, 3, 3))
418+
assert_array_almost_equal(img.header.get_zooms(),
419+
(3, 3, 3, 3000))
420+
assert_array_almost_equal(img.header.get_norm_zooms(),
421+
(3, 3, 3, 3))
422+
423+
arr = np.arange(24, dtype=np.int16).reshape((2, 3, 4))
424+
img = img_klass(arr, aff)
425+
426+
assert_array_almost_equal(img.header.get_zooms(), (1, 1, 1))
427+
assert_array_almost_equal(img.header.get_norm_zooms(), (1, 1, 1))
428+
429+
img.header.set_zooms((2, 2, 2))
430+
assert_array_almost_equal(img.header.get_zooms(), (2, 2, 2))
431+
assert_array_almost_equal(img.header.get_norm_zooms(), (2, 2, 2))
432+
433+
img.header.set_norm_zooms((3, 3, 3))
434+
assert_array_almost_equal(img.header.get_zooms(), (3, 3, 3))
435+
assert_array_almost_equal(img.header.get_norm_zooms(), (3, 3, 3))
436+
437+
# Cannot set TR as zoom for 3D image
438+
assert_raises(HeaderDataError, img.header.set_zooms, (4, 4, 4, 5))
439+
assert_raises(HeaderDataError, img.header.set_norm_zooms, (4, 4, 4, 5))
440+
393441

394442
class TestMGHHeader(_TestLabeledWrapStruct):
395443
header_class = MGHHeader

nibabel/tests/test_nifti1.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,55 @@ def test_write_scaling(self):
10871087
with np.errstate(invalid='ignore'):
10881088
self._check_write_scaling(slope, inter, e_slope, e_inter)
10891089

1090+
def test_norm_zooms_edge_cases(self):
1091+
img_klass = self.image_class
1092+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
1093+
aff = np.eye(4)
1094+
img = img_klass(arr, aff)
1095+
1096+
# Unknown units = 2 warnings
1097+
with warnings.catch_warnings(record=True) as warns:
1098+
assert_array_almost_equal(img.header.get_norm_zooms(),
1099+
(1, 1, 1, 1))
1100+
assert_equal(len(warns), 2)
1101+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1102+
1103+
img.header.set_xyzt_units(xyz='meter')
1104+
with warnings.catch_warnings(record=True) as warns:
1105+
assert_array_almost_equal(img.header.get_norm_zooms(),
1106+
(1000, 1000, 1000, 1))
1107+
assert_equal(len(warns), 1)
1108+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1109+
1110+
img.header.set_xyzt_units(xyz='mm', t='sec')
1111+
assert_array_almost_equal(img.header.get_norm_zooms(),
1112+
(1, 1, 1, 1))
1113+
img.header.set_xyzt_units(xyz='micron', t='sec')
1114+
assert_array_almost_equal(img.header.get_norm_zooms(),
1115+
(0.001, 0.001, 0.001, 1))
1116+
1117+
img.header.set_xyzt_units(t='sec')
1118+
with warnings.catch_warnings(record=True) as warns:
1119+
assert_array_equal(img.header.get_norm_zooms(), (1, 1, 1, 1))
1120+
assert_equal(len(warns), 1)
1121+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1122+
1123+
img.header.set_xyzt_units(xyz='mm', t='msec')
1124+
assert_array_almost_equal(img.header.get_norm_zooms(),
1125+
(1, 1, 1, 0.001))
1126+
1127+
img.header.set_xyzt_units(xyz='mm', t='usec')
1128+
assert_array_almost_equal(img.header.get_norm_zooms(),
1129+
(1, 1, 1, 0.000001))
1130+
1131+
# Verify `set_norm_zooms` resets units
1132+
img.header.set_xyzt_units(xyz='meter', t='usec')
1133+
assert_equal(img.header.get_xyzt_units(), ('meter', 'usec'))
1134+
img.header.set_norm_zooms((2, 2, 2, 2.5))
1135+
assert_array_almost_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
1136+
assert_array_almost_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
1137+
assert_equal(img.header.get_xyzt_units(), ('mm', 'sec'))
1138+
10901139

10911140
class TestNifti1Image(TestNifti1Pair):
10921141
# Run analyze-flavor spatialimage tests

nibabel/tests/test_spatialimages.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,28 @@ def test_slicer(self):
539539
assert_array_equal(sliced_data, img.dataobj[sliceobj])
540540
assert_array_equal(sliced_data, img.get_data()[sliceobj])
541541

542+
def test_norm_zooms(self):
543+
''' Should be true for all images '''
544+
img_klass = self.image_class
545+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
546+
aff = np.eye(4)
547+
img = img_klass(arr, aff)
548+
img.header.set_norm_zooms((2, 2, 2, 2.5))
549+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
550+
551+
def test_norm_zooms_edge_cases(self):
552+
''' Override for classes where *_norm_zooms != *_zooms '''
553+
img_klass = self.image_class
554+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
555+
aff = np.eye(4)
556+
img = img_klass(arr, aff)
557+
img.header.set_zooms((2, 2, 2, 2.5))
558+
assert_array_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
559+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
560+
img.header.set_norm_zooms((2, 2, 2, 2.5))
561+
assert_array_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
562+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
563+
542564
def test_api_deprecations(self):
543565

544566
class FakeImage(self.image_class):

0 commit comments

Comments
 (0)