From 540228ec90756b2798f5dd55ebbb49753345af6a Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Tue, 15 Feb 2022 16:59:50 -0500 Subject: [PATCH 1/3] RF/FIX: Use consistent multiplication to reduce the chance of bugs --- nitransforms/io/fsl.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nitransforms/io/fsl.py b/nitransforms/io/fsl.py index 4d9bc2f0..15569983 100644 --- a/nitransforms/io/fsl.py +++ b/nitransforms/io/fsl.py @@ -46,14 +46,14 @@ def from_ras(cls, ras, moving=None, reference=None): # Adjust for reference image offset and orientation refswp, refspc = _fsl_aff_adapt(reference) - pre = reference.affine.dot(inv(refspc).dot(inv(refswp))) + pre = reference.affine @ inv(refswp @ refspc) # Adjust for moving image offset and orientation movswp, movspc = _fsl_aff_adapt(moving) - post = inv(movswp).dot(movspc.dot(inv(moving.affine))) + post = movswp @ movspc @ inv(moving.affine) # Compose FSL transform - mat = inv(np.swapaxes(post.dot(ras.dot(pre)), 0, 1)) + mat = inv(np.swapaxes(post @ ras @ pre, 0, 1)) tf = cls() tf.structarr["parameters"] = mat.T @@ -92,7 +92,7 @@ def to_ras(self, moving=None, reference=None): pre = refswp @ refspc @ inv(reference.affine) # Adjust for moving image offset and orientation movswp, movspc = _fsl_aff_adapt(moving) - post = moving.affine @ inv(movspc) @ inv(movswp) + post = moving.affine @ inv(movswp @ movspc) mat = self.structarr["parameters"].T return post @ np.swapaxes(inv(mat), 0, 1) @ pre From c8448b84f99eedd403d0f3bc04a80ab8ef9c2e1b Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Tue, 15 Feb 2022 17:00:50 -0500 Subject: [PATCH 2/3] FIX/TEST: Use higher precision serialization for FSLLinearTransform --- nitransforms/io/fsl.py | 2 +- nitransforms/tests/test_linear.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/nitransforms/io/fsl.py b/nitransforms/io/fsl.py index 15569983..c718892e 100644 --- a/nitransforms/io/fsl.py +++ b/nitransforms/io/fsl.py @@ -20,7 +20,7 @@ class FSLLinearTransform(LinearParameters): def __str__(self): """Generate a string representation.""" lines = [ - " ".join(["%g" % col for col in row]) + " ".join("%.08f" % col for col in row) for row in self.structarr["parameters"] ] return "\n".join(lines + [""]) diff --git a/nitransforms/tests/test_linear.py b/nitransforms/tests/test_linear.py index ef30b334..48528896 100644 --- a/nitransforms/tests/test_linear.py +++ b/nitransforms/tests/test_linear.py @@ -92,13 +92,11 @@ def test_loadsave(tmp_path, data_path, testdata_path, fmt): assert np.allclose( xfm.matrix, nitl.load(fname, fmt=fmt, reference=ref_file).matrix, - rtol=1e-2, # FSL incurs into large errors due to rounding ) assert np.allclose( xfm.matrix, nitl.load(fname, fmt=fmt, reference=ref_file, moving=ref_file).matrix, - rtol=1e-2, # FSL incurs into large errors due to rounding ) else: assert xfm == nitl.load(fname, fmt=fmt, reference=ref_file) From 77d93fda48cd63552edf1fab95bd692653439190 Mon Sep 17 00:00:00 2001 From: Oscar Esteban Date: Wed, 16 Feb 2022 16:55:53 +0100 Subject: [PATCH 3/3] fix: update precision on test files --- nitransforms/tests/data/affine-LPS.fsl | 8 ++++---- nitransforms/tests/data/affine-RAS.fsl | 8 ++++---- nitransforms/tests/data/affine-oblique.fsl | 8 ++++---- nitransforms/tests/utils.py | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/nitransforms/tests/data/affine-LPS.fsl b/nitransforms/tests/data/affine-LPS.fsl index baf012ae..f41c04bf 100644 --- a/nitransforms/tests/data/affine-LPS.fsl +++ b/nitransforms/tests/data/affine-LPS.fsl @@ -1,4 +1,4 @@ -0.999999 -0.00140494 0.000161717 -3.89014 -0.000999999 0.621609 -0.783327 105.905 -0.001 0.783327 0.62161 -34.3513 -0 0 0 1 +0.99999900 -0.00140494 0.00016172 -3.89014000 +0.00100000 0.62160900 -0.78332700 105.90500000 +0.00100000 0.78332700 0.62161000 -34.35130000 +0.00000000 0.00000000 0.00000000 1.00000000 diff --git a/nitransforms/tests/data/affine-RAS.fsl b/nitransforms/tests/data/affine-RAS.fsl index d26cf54b..26f36db0 100644 --- a/nitransforms/tests/data/affine-RAS.fsl +++ b/nitransforms/tests/data/affine-RAS.fsl @@ -1,4 +1,4 @@ -0.999999 -0.00140494 -0.000161717 4.14529 -0.000999999 0.621609 0.783327 -37.3811 --0.001 -0.783327 0.62161 107.976 -0 0 0 1 +0.99999900 -0.00140494 -0.00016172 4.14529000 +0.00100000 0.62160900 0.78332700 -37.38110000 +-0.00100000 -0.78332700 0.62161000 107.97600000 +0.00000000 0.00000000 0.00000000 1.00000000 diff --git a/nitransforms/tests/data/affine-oblique.fsl b/nitransforms/tests/data/affine-oblique.fsl index 48f811e6..642482bb 100644 --- a/nitransforms/tests/data/affine-oblique.fsl +++ b/nitransforms/tests/data/affine-oblique.fsl @@ -1,4 +1,4 @@ -0.999998 -0.00181872 -0.0011965 4.26083 -0.00206779 0.621609 0.783325 -25.3129 --0.000680894 -0.783326 0.621611 101.967 -0 0 0 1 +0.99999800 -0.00181872 -0.00119650 4.26083000 +0.00206779 0.62160900 0.78332500 -25.31290000 +-0.00068089 -0.78332600 0.62161100 101.96700000 +0.00000000 0.00000000 0.00000000 1.00000000 diff --git a/nitransforms/tests/utils.py b/nitransforms/tests/utils.py index abb7a07f..2a0d8c4a 100644 --- a/nitransforms/tests/utils.py +++ b/nitransforms/tests/utils.py @@ -24,4 +24,4 @@ def assert_affines_by_filename(affine1, affine2): else: xfm1 = np.loadtxt(str(affine1)) xfm2 = np.loadtxt(str(affine2)) - np.testing.assert_almost_equal(xfm1, xfm2) + np.allclose(xfm1, xfm2, atol=1e-04)