Skip to content

Commit 4b86d3e

Browse files
committed
TEST: Test get/set_norm_zooms
1 parent 5c30366 commit 4b86d3e

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
@@ -351,6 +351,54 @@ def check_dtypes(self, expected, actual):
351351
# MGH requires the actual to be a big endian version of expected
352352
assert expected.newbyteorder('>') == actual
353353

354+
def test_norm_zooms_edge_cases(self):
355+
img_klass = self.image_class
356+
aff = np.eye(4)
357+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
358+
img = img_klass(arr, aff)
359+
360+
assert_array_almost_equal(img.header.get_zooms(),
361+
(1, 1, 1, 0))
362+
assert_array_almost_equal(img.header.get_norm_zooms(),
363+
(1, 1, 1, 0))
364+
365+
img.header.set_zooms((1, 1, 1, 2000))
366+
assert_array_almost_equal(img.header.get_zooms(),
367+
(1, 1, 1, 2000))
368+
assert_array_almost_equal(img.header.get_norm_zooms(),
369+
(1, 1, 1, 2))
370+
371+
img.header.set_norm_zooms((2, 2, 2, 3))
372+
assert_array_almost_equal(img.header.get_zooms(),
373+
(2, 2, 2, 3000))
374+
assert_array_almost_equal(img.header.get_norm_zooms(),
375+
(2, 2, 2, 3))
376+
377+
# It's legal to set zooms for spatial dimensions only
378+
img.header.set_norm_zooms((3, 3, 3))
379+
assert_array_almost_equal(img.header.get_zooms(),
380+
(3, 3, 3, 3000))
381+
assert_array_almost_equal(img.header.get_norm_zooms(),
382+
(3, 3, 3, 3))
383+
384+
arr = np.arange(24, dtype=np.int16).reshape((2, 3, 4))
385+
img = img_klass(arr, aff)
386+
387+
assert_array_almost_equal(img.header.get_zooms(), (1, 1, 1))
388+
assert_array_almost_equal(img.header.get_norm_zooms(), (1, 1, 1))
389+
390+
img.header.set_zooms((2, 2, 2))
391+
assert_array_almost_equal(img.header.get_zooms(), (2, 2, 2))
392+
assert_array_almost_equal(img.header.get_norm_zooms(), (2, 2, 2))
393+
394+
img.header.set_norm_zooms((3, 3, 3))
395+
assert_array_almost_equal(img.header.get_zooms(), (3, 3, 3))
396+
assert_array_almost_equal(img.header.get_norm_zooms(), (3, 3, 3))
397+
398+
# Cannot set TR as zoom for 3D image
399+
assert_raises(HeaderDataError, img.header.set_zooms, (4, 4, 4, 5))
400+
assert_raises(HeaderDataError, img.header.set_norm_zooms, (4, 4, 4, 5))
401+
354402

355403
class TestMGHHeader(tws._TestLabeledWrapStruct):
356404
header_class = MGHHeader

nibabel/tests/test_nifti1.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,55 @@ def test_static_dtype_aliases(self):
11761176
img_rt = bytesio_round_trip(img)
11771177
assert img_rt.get_data_dtype() == effective_dt
11781178

1179+
def test_norm_zooms_edge_cases(self):
1180+
img_klass = self.image_class
1181+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
1182+
aff = np.eye(4)
1183+
img = img_klass(arr, aff)
1184+
1185+
# Unknown units = 2 warnings
1186+
with warnings.catch_warnings(record=True) as warns:
1187+
assert_array_almost_equal(img.header.get_norm_zooms(),
1188+
(1, 1, 1, 1))
1189+
assert_equal(len(warns), 2)
1190+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1191+
1192+
img.header.set_xyzt_units(xyz='meter')
1193+
with warnings.catch_warnings(record=True) as warns:
1194+
assert_array_almost_equal(img.header.get_norm_zooms(),
1195+
(1000, 1000, 1000, 1))
1196+
assert_equal(len(warns), 1)
1197+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1198+
1199+
img.header.set_xyzt_units(xyz='mm', t='sec')
1200+
assert_array_almost_equal(img.header.get_norm_zooms(),
1201+
(1, 1, 1, 1))
1202+
img.header.set_xyzt_units(xyz='micron', t='sec')
1203+
assert_array_almost_equal(img.header.get_norm_zooms(),
1204+
(0.001, 0.001, 0.001, 1))
1205+
1206+
img.header.set_xyzt_units(t='sec')
1207+
with warnings.catch_warnings(record=True) as warns:
1208+
assert_array_equal(img.header.get_norm_zooms(), (1, 1, 1, 1))
1209+
assert_equal(len(warns), 1)
1210+
assert_raises(ValueError, img.header.get_norm_zooms, True)
1211+
1212+
img.header.set_xyzt_units(xyz='mm', t='msec')
1213+
assert_array_almost_equal(img.header.get_norm_zooms(),
1214+
(1, 1, 1, 0.001))
1215+
1216+
img.header.set_xyzt_units(xyz='mm', t='usec')
1217+
assert_array_almost_equal(img.header.get_norm_zooms(),
1218+
(1, 1, 1, 0.000001))
1219+
1220+
# Verify `set_norm_zooms` resets units
1221+
img.header.set_xyzt_units(xyz='meter', t='usec')
1222+
assert_equal(img.header.get_xyzt_units(), ('meter', 'usec'))
1223+
img.header.set_norm_zooms((2, 2, 2, 2.5))
1224+
assert_array_almost_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
1225+
assert_array_almost_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
1226+
assert_equal(img.header.get_xyzt_units(), ('mm', 'sec'))
1227+
11791228

11801229
class TestNifti1Image(TestNifti1Pair):
11811230
# Run analyze-flavor spatialimage tests

nibabel/tests/test_spatialimages.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,28 @@ def test_slicer(self):
528528
assert (sliced_data == img.get_data()[sliceobj]).all()
529529
assert (sliced_data == img.get_fdata()[sliceobj]).all()
530530

531+
def test_norm_zooms(self):
532+
''' Should be true for all images '''
533+
img_klass = self.image_class
534+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
535+
aff = np.eye(4)
536+
img = img_klass(arr, aff)
537+
img.header.set_norm_zooms((2, 2, 2, 2.5))
538+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
539+
540+
def test_norm_zooms_edge_cases(self):
541+
''' Override for classes where *_norm_zooms != *_zooms '''
542+
img_klass = self.image_class
543+
arr = np.arange(120, dtype=np.int16).reshape((2, 3, 4, 5))
544+
aff = np.eye(4)
545+
img = img_klass(arr, aff)
546+
img.header.set_zooms((2, 2, 2, 2.5))
547+
assert_array_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
548+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
549+
img.header.set_norm_zooms((2, 2, 2, 2.5))
550+
assert_array_equal(img.header.get_zooms(), (2, 2, 2, 2.5))
551+
assert_array_equal(img.header.get_norm_zooms(), (2, 2, 2, 2.5))
552+
531553

532554
class MmapImageMixin:
533555
""" Mixin for testing images that may return memory maps """

0 commit comments

Comments
 (0)