Skip to content

Commit 6a2962a

Browse files
committed
TEST: Test get/set_norm_zooms
1 parent 6a6755a commit 6a2962a

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed

nibabel/freesurfer/tests/test_mghformat.py

+48
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,54 @@ def check_dtypes(self, expected, actual):
388388
# MGH requires the actual to be a big endian version of expected
389389
assert_equal(expected.newbyteorder('>'), actual)
390390

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

392440
class TestMGHHeader(_TestLabeledWrapStruct):
393441
header_class = MGHHeader

nibabel/tests/test_nifti1.py

+49
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,55 @@ def test_write_scaling(self):
10491049
with np.errstate(invalid='ignore'):
10501050
self._check_write_scaling(slope, inter, e_slope, e_inter)
10511051

1052+
def test_norm_zooms_edge_cases(self):
1053+
img_klass = self.image_class
1054+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
1055+
aff = np.eye(4)
1056+
img = img_klass(arr, aff)
1057+
1058+
# Unknown units = 2 warnings
1059+
with warnings.catch_warnings(record=True) as warns:
1060+
assert_array_almost_equal(img.header.get_norm_zooms(),
1061+
(1, 1, 1, 1))
1062+
assert_equal(len(warns), 2)
1063+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1064+
1065+
img.header.set_xyzt_units(xyz='meter')
1066+
with warnings.catch_warnings(record=True) as warns:
1067+
assert_array_almost_equal(img.header.get_norm_zooms(),
1068+
(1000, 1000, 1000, 1))
1069+
assert_equal(len(warns), 1)
1070+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1071+
1072+
img.header.set_xyzt_units(xyz='mm', t='sec')
1073+
assert_array_almost_equal(img.header.get_norm_zooms(),
1074+
(1, 1, 1, 1))
1075+
img.header.set_xyzt_units(xyz='micron', t='sec')
1076+
assert_array_almost_equal(img.header.get_norm_zooms(),
1077+
(0.001, 0.001, 0.001, 1))
1078+
1079+
img.header.set_xyzt_units(t='sec')
1080+
with warnings.catch_warnings(record=True) as warns:
1081+
assert_array_equal(img.header.get_norm_zooms(), (1, 1, 1, 1))
1082+
assert_equal(len(warns), 1)
1083+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1084+
1085+
img.header.set_xyzt_units(xyz='mm', t='msec')
1086+
assert_array_almost_equal(img.header.get_norm_zooms(),
1087+
(1, 1, 1, 0.001))
1088+
1089+
img.header.set_xyzt_units(xyz='mm', t='usec')
1090+
assert_array_almost_equal(img.header.get_norm_zooms(),
1091+
(1, 1, 1, 0.000001))
1092+
1093+
# Verify `set_norm_zooms` resets units
1094+
img.header.set_xyzt_units(xyz='meter', t='usec')
1095+
assert_equal(img.header.get_xyzt_units(), ('meter', 'usec'))
1096+
img.header.set_norm_zooms((2, 2, 2, 2.5))
1097+
assert_array_almost_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
1098+
assert_array_almost_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
1099+
assert_equal(img.header.get_xyzt_units(), ('mm', 'sec'))
1100+
10521101

10531102
class TestNifti1Image(TestNifti1Pair):
10541103
# Run analyze-flavor spatialimage tests

nibabel/tests/test_spatialimages.py

+22
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,28 @@ def test_get_data(self):
411411
assert_false(rt_img.get_data() is out_data)
412412
assert_array_equal(rt_img.get_data(), in_data)
413413

414+
def test_norm_zooms(self):
415+
''' Should be true for all images '''
416+
img_klass = self.image_class
417+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
418+
aff = np.eye(4)
419+
img = img_klass(arr, aff)
420+
img.header.set_norm_zooms((2, 2, 2, 2.5))
421+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
422+
423+
def test_norm_zooms_edge_cases(self):
424+
''' Override for classes where *_norm_zooms != *_zooms '''
425+
img_klass = self.image_class
426+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
427+
aff = np.eye(4)
428+
img = img_klass(arr, aff)
429+
img.header.set_zooms((2, 2, 2, 2.5))
430+
assert_array_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
431+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
432+
img.header.set_norm_zooms((2, 2, 2, 2.5))
433+
assert_array_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
434+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
435+
414436
def test_api_deprecations(self):
415437

416438
class FakeImage(self.image_class):

0 commit comments

Comments
 (0)