From 56b4adc86997ac5431bebb5cb5096c23285a5f40 Mon Sep 17 00:00:00 2001 From: Matthew Brett Date: Thu, 8 Mar 2012 14:22:12 -0800 Subject: [PATCH] BF - only update header if affine not close Discussion at https://github.com/nipy/nibabel/issues/55. Because affine in nifti1 stored as float32, using == to check if affine has changed would give false positives, comparing to float64 input. Brendan Moloney kindly suggested allclose fix. --- nibabel/analyze.py | 2 +- nibabel/nifti1.py | 2 +- nibabel/tests/test_nifti1.py | 12 ++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/nibabel/analyze.py b/nibabel/analyze.py index bd74b7c899..de3d75af3d 100644 --- a/nibabel/analyze.py +++ b/nibabel/analyze.py @@ -1055,7 +1055,7 @@ def update_header(self): # the header, update the heaader if self._affine is None: return - if np.all(self._affine == hdr.get_best_affine()): + if np.allclose(self._affine, hdr.get_best_affine()): return RZS = self._affine[:3, :3] vox = np.sqrt(np.sum(RZS * RZS, axis=0)) diff --git a/nibabel/nifti1.py b/nibabel/nifti1.py index bea84da9cf..940a073e4e 100644 --- a/nibabel/nifti1.py +++ b/nibabel/nifti1.py @@ -1432,7 +1432,7 @@ def update_header(self): # the header, update the heaader if self._affine is None: return - if np.all(self._affine == hdr.get_best_affine()): + if np.allclose(self._affine, hdr.get_best_affine()): return # Set affine into sform with default code hdr.set_sform(self._affine, code='aligned') diff --git a/nibabel/tests/test_nifti1.py b/nibabel/tests/test_nifti1.py index 1f553678c8..adcb402223 100644 --- a/nibabel/tests/test_nifti1.py +++ b/nibabel/tests/test_nifti1.py @@ -211,6 +211,18 @@ def test_qform_cycle(self): assert_array_equal(hdr_back.get_sform(), exp_aff) assert_array_equal(hdr_back.get_qform(), exp_aff) + def test_header_update_affine(self): + # Test that updating occurs only if affine is not allclose + img = self.image_class(np.zeros((2,3,4)), np.eye(4)) + hdr = img.get_header() + aff = img.get_affine() + aff[:] = np.diag([1.1, 1.1, 1.1, 1]) # inexact floats + hdr.set_qform(aff, 2) + hdr.set_sform(aff, 2) + img.update_header() + assert_equal(hdr['sform_code'], 2) + assert_equal(hdr['qform_code'], 2) + class TestNifti1Pair(TestNifti1Image): # Run analyze-flavor spatialimage tests