Skip to content

Commit bddf15c

Browse files
committed
TEST: Test get/set_norm_zooms
1 parent 9b8a7fa commit bddf15c

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
@@ -1030,6 +1030,55 @@ def test_write_scaling(self):
10301030
with np.errstate(invalid='ignore'):
10311031
self._check_write_scaling(slope, inter, e_slope, e_inter)
10321032

1033+
def test_norm_zooms_edge_cases(self):
1034+
img_klass = self.image_class
1035+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
1036+
aff = np.eye(4)
1037+
img = img_klass(arr, aff)
1038+
1039+
# Unknown units = 2 warnings
1040+
with warnings.catch_warnings(record=True) as warns:
1041+
assert_array_almost_equal(img.header.get_norm_zooms(),
1042+
(1, 1, 1, 1))
1043+
assert_equal(len(warns), 2)
1044+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1045+
1046+
img.header.set_xyzt_units(xyz='meter')
1047+
with warnings.catch_warnings(record=True) as warns:
1048+
assert_array_almost_equal(img.header.get_norm_zooms(),
1049+
(1000, 1000, 1000, 1))
1050+
assert_equal(len(warns), 1)
1051+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1052+
1053+
img.header.set_xyzt_units(xyz='mm', t='sec')
1054+
assert_array_almost_equal(img.header.get_norm_zooms(),
1055+
(1, 1, 1, 1))
1056+
img.header.set_xyzt_units(xyz='micron', t='sec')
1057+
assert_array_almost_equal(img.header.get_norm_zooms(),
1058+
(0.001, 0.001, 0.001, 1))
1059+
1060+
img.header.set_xyzt_units(t='sec')
1061+
with warnings.catch_warnings(record=True) as warns:
1062+
assert_array_equal(img.header.get_norm_zooms(), (1, 1, 1, 1))
1063+
assert_equal(len(warns), 1)
1064+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1065+
1066+
img.header.set_xyzt_units(xyz='mm', t='msec')
1067+
assert_array_almost_equal(img.header.get_norm_zooms(),
1068+
(1, 1, 1, 0.001))
1069+
1070+
img.header.set_xyzt_units(xyz='mm', t='usec')
1071+
assert_array_almost_equal(img.header.get_norm_zooms(),
1072+
(1, 1, 1, 0.000001))
1073+
1074+
# Verify `set_norm_zooms` resets units
1075+
img.header.set_xyzt_units(xyz='meter', t='usec')
1076+
assert_equal(img.header.get_xyzt_units(), ('meter', 'usec'))
1077+
img.header.set_norm_zooms((2, 2, 2, 2.5))
1078+
assert_array_almost_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
1079+
assert_array_almost_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
1080+
assert_equal(img.header.get_xyzt_units(), ('mm', 'sec'))
1081+
10331082

10341083
class TestNifti1Image(TestNifti1Pair):
10351084
# 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)