Skip to content

Commit 227917e

Browse files
committed
TEST - refactor Bago's tests to match new API
After some thought, the set_sform, set_qform should match behavior of their header equivalents, and therefore should not touch the zooms. These should be fairly specialized methods in any case.
1 parent 0158e29 commit 227917e

File tree

1 file changed

+77
-39
lines changed

1 file changed

+77
-39
lines changed

nibabel/tests/test_nifti1.py

Lines changed: 77 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -364,65 +364,103 @@ def test_set_qform(self):
364364
img = self.image_class(np.zeros((2,3,4)), np.diag([2.2, 3.3, 4.3, 1]))
365365
hdr = img.get_header()
366366
new_affine = np.diag([1.1, 1.1, 1.1, 1])
367-
#Set qform using new_affine
368-
stat = img.set_qform(new_affine, 1)
369-
assert_false(stat)
367+
# Affine is same as sform (best affine)
368+
assert_array_almost_equal(img.get_affine(), hdr.get_best_affine())
369+
# Reset affine to something different again
370+
aff_affine = np.diag([3.3, 4.5, 6.6, 1])
371+
img.get_affine()[:] = aff_affine
372+
assert_array_almost_equal(img.get_affine(), aff_affine)
373+
# Set qform using new_affine
374+
img.set_qform(new_affine, 1)
375+
assert_array_almost_equal(img.get_qform(), new_affine)
370376
assert_equal(hdr['qform_code'], 1)
371-
assert_array_almost_equal(hdr.get_qform(), new_affine)
377+
# Image get is same as header get
378+
assert_array_almost_equal(img.get_qform(), new_affine)
379+
# Coded version of get gets same information
380+
qaff, code = img.get_qform(coded=True)
381+
assert_equal(code, 1)
382+
assert_array_almost_equal(qaff, new_affine)
383+
# Image affine now reset to best affine (which is sform)
372384
assert_array_almost_equal(img.get_affine(), hdr.get_best_affine())
373-
#Clear qform using None, zooms sould update from best_affine
374-
stat = img.set_qform(None)
375-
assert_false(stat)
376-
assert_equal(hdr['qform_code'], 0)
377-
assert_array_almost_equal(hdr.get_zooms(), [2.2, 3.3, 4.3])
385+
# Reset image affine and try update_affine == False
386+
img.get_affine()[:] = aff_affine
387+
img.set_qform(new_affine, 1, update_affine=False)
388+
assert_array_almost_equal(img.get_affine(), aff_affine)
389+
# Clear qform using None, zooms unchanged
390+
assert_array_almost_equal(hdr.get_zooms(), [1.1, 1.1, 1.1])
391+
img.set_qform(None)
392+
qaff, code = img.get_qform(coded=True)
393+
assert_equal((qaff, code), (None, 0))
394+
assert_array_almost_equal(hdr.get_zooms(), [1.1, 1.1, 1.1])
395+
# Best affine similarly
378396
assert_array_almost_equal(img.get_affine(), hdr.get_best_affine())
379-
#If sform is not set, qfrom should update affine
397+
# If sform is not set, qform should update affine
380398
img.set_sform(None)
381-
stat = img.set_qform(new_affine, 1)
382-
assert_true(stat)
383-
assert_equal(hdr['qform_code'], 1)
399+
img.set_qform(new_affine, 1)
400+
qaff, code = img.get_qform(coded=True)
401+
assert_equal(code, 1)
384402
assert_array_almost_equal(img.get_affine(), new_affine)
385403
new_affine[0, 1] = 2
386-
#If affine has has shear, should return false
387-
stat = img.set_qform(new_affine, 2)
388-
assert_false(stat)
389-
assert_equal(hdr['qform_code'], 2)
404+
# If affine has has shear, should raise Error if strip_shears=False
405+
img.set_qform(new_affine, 2)
406+
assert_raises(HeaderDataError, img.set_qform, new_affine, 2, False)
407+
# Unexpected keyword raises error
408+
assert_raises(TypeError, img.get_qform, strange=True)
390409

391410
def test_set_sform(self):
392-
img = self.image_class(np.zeros((2,3,4)), np.diag([2.2, 3.3, 4.3, 1]))
411+
orig_aff = np.diag([2.2, 3.3, 4.3, 1])
412+
img = self.image_class(np.zeros((2,3,4)), orig_aff)
393413
hdr = img.get_header()
394414
new_affine = np.diag([1.1, 1.1, 1.1, 1])
395415
qform_affine = np.diag([1.2, 1.2, 1.2, 1])
396-
stat = img.set_qform(qform_affine, 0)
397-
assert_false(stat)
398-
#Set sform using new_affine when qfrom is 0
399-
stat = img.set_sform(new_affine, 1)
400-
assert_true(stat)
416+
# Reset image affine to something different again
417+
aff_affine = np.diag([3.3, 4.5, 6.6, 1])
418+
img.get_affine()[:] = aff_affine
419+
assert_array_almost_equal(img.get_affine(), aff_affine)
420+
# Sform, Qform codes are 'aligned', 'unknown' by default
421+
assert_equal((hdr['sform_code'], hdr['qform_code']), (2, 0))
422+
# Set sform using new_affine when qform is 0
423+
img.set_sform(new_affine, 1)
401424
assert_equal(hdr['sform_code'], 1)
402425
assert_array_almost_equal(hdr.get_sform(), new_affine)
426+
# Image get is same as header get
427+
assert_array_almost_equal(img.get_sform(), new_affine)
428+
# Coded version gives same result
429+
saff, code = img.get_sform(coded=True)
430+
assert_equal(code, 1)
431+
assert_array_almost_equal(saff, new_affine)
432+
# Because we've reset the sform with update_affine, the affine changes
403433
assert_array_almost_equal(img.get_affine(), hdr.get_best_affine())
404-
#zooms get updated when qform is 0
405-
assert_array_almost_equal(hdr.get_zooms(), [1.1, 1.1, 1.1])
406-
434+
# Reset image affine and try update_affine == False
435+
img.get_affine()[:] = aff_affine
436+
img.set_sform(new_affine, 1, update_affine=False)
437+
assert_array_almost_equal(img.get_affine(), aff_affine)
438+
# zooms do not get updated when qform is 0
439+
assert_array_almost_equal(img.get_qform(), orig_aff)
440+
assert_array_almost_equal(hdr.get_zooms(), [2.2, 3.3, 4.3])
441+
img.set_qform(None)
442+
assert_array_almost_equal(hdr.get_zooms(), [2.2, 3.3, 4.3])
443+
# Set sform using new_affine when qform is set
407444
img.set_qform(qform_affine, 1)
408-
#Set sform using new_affine when qfrom is set
409-
stat = img.set_sform(new_affine, 1)
410-
assert_true(stat)
411-
assert_equal(hdr['sform_code'], 1)
412-
assert_array_almost_equal(hdr.get_sform(), new_affine)
413-
assert_array_almost_equal(img.get_affine(), hdr.get_best_affine())
414-
#zooms don't change if qform is set
445+
img.set_sform(new_affine, 1)
446+
saff, code = img.get_sform(coded=True)
447+
assert_equal(code, 1)
448+
assert_array_almost_equal(saff, new_affine)
449+
assert_array_almost_equal(img.get_affine(), new_affine)
450+
# zooms follow qform
415451
assert_array_almost_equal(hdr.get_zooms(), [1.2, 1.2, 1.2])
416-
#Clear sform using None, best_affine should fall back on qform
417-
stat = img.set_sform(None)
418-
assert_false(stat)
452+
# Clear sform using None, best_affine should fall back on qform
453+
img.set_sform(None)
419454
assert_equal(hdr['sform_code'], 0)
420455
assert_equal(hdr['qform_code'], 1)
421-
zeros = np.zeros((4,4))
422-
zeros[3, 3] = 1
423-
assert_array_almost_equal(hdr.get_sform(), zeros)
456+
# Sform holds previous affine from last set
457+
assert_array_almost_equal(hdr.get_sform(), saff)
458+
# Image affine follows qform
424459
assert_array_almost_equal(img.get_affine(), qform_affine)
425460
assert_array_almost_equal(hdr.get_best_affine(), img.get_affine())
461+
# Unexpected keyword raises error
462+
assert_raises(TypeError, img.get_sform, strange=True)
463+
426464

427465
class TestNifti1Pair(TestNifti1Image):
428466
# Run analyze-flavor spatialimage tests

0 commit comments

Comments
 (0)