From fb3d2f3589bf4229e79d4c3e454a035d56dc0a21 Mon Sep 17 00:00:00 2001 From: oesteban Date: Sun, 27 Oct 2019 16:21:24 -0700 Subject: [PATCH 1/2] ENH: Added a couple of minimal test-cases to the Affine constructor --- nitransforms/base.py | 4 ++++ nitransforms/conftest.py | 2 +- nitransforms/linear.py | 23 ++++++++++++++--------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/nitransforms/base.py b/nitransforms/base.py index 8eb6e846..7fda11bd 100644 --- a/nitransforms/base.py +++ b/nitransforms/base.py @@ -154,6 +154,10 @@ def __eq__(self, other): return (np.allclose(self.affine, other.affine, rtol=EQUALITY_TOL) and self.shape == other.shape) + def __ne__(self, other): + """Overload not equal operator.""" + return not self == other + class TransformBase(object): """Abstract image class to represent transforms.""" diff --git a/nitransforms/conftest.py b/nitransforms/conftest.py index 2cb5c0c5..abcdddec 100644 --- a/nitransforms/conftest.py +++ b/nitransforms/conftest.py @@ -19,7 +19,7 @@ def doctest_autoimport(doctest_namespace): doctest_namespace['nb'] = nb doctest_namespace['os'] = os doctest_namespace['Path'] = Path - doctest_namespace['datadir'] = os.path.join(os.path.dirname(__file__), 'tests/data') + doctest_namespace['datadir'] = Path(__file__).parent / 'tests' / 'data' tmpdir = tempfile.TemporaryDirectory() doctest_namespace['tmpdir'] = tmpdir.name diff --git a/nitransforms/linear.py b/nitransforms/linear.py index 9f925b2d..74950794 100644 --- a/nitransforms/linear.py +++ b/nitransforms/linear.py @@ -7,8 +7,9 @@ # ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## """Linear transforms.""" -import numpy as np from pathlib import Path +import warnings +import numpy as np from nibabel.loadsave import load as loadimg from nibabel.affines import from_matvec, voxel_sizes, obliquity @@ -40,6 +41,13 @@ def __init__(self, matrix=None, reference=None): Examples -------- + >>> xfm = Affine(reference=datadir / 'someones_anatomy.nii.gz') + >>> xfm.matrix # doctest: +NORMALIZE_WHITESPACE + array([[[1., 0., 0., 0.], + [0., 1., 0., 0.], + [0., 0., 1., 0.], + [0., 0., 0., 1.]]]) + >>> xfm = Affine([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) >>> xfm.matrix # doctest: +NORMALIZE_WHITESPACE array([[[1, 0, 0, 4], @@ -62,8 +70,6 @@ def __init__(self, matrix=None, reference=None): ), 'affine matrix is not square' if reference: - if isinstance(reference, str): - reference = loadimg(reference) self.reference = reference def __eq__(self, other): @@ -78,9 +84,10 @@ def __eq__(self, other): True """ - if not self._reference == other._reference: - return False - return np.allclose(self.matrix, other.matrix, rtol=EQUALITY_TOL) + _eq = np.allclose(self.matrix, other.matrix, rtol=EQUALITY_TOL) + if _eq and self._reference != other._reference: + warnings.warn('Affines are equal, but references do not match.') + return _eq @property def matrix(self): @@ -257,9 +264,7 @@ def load(filename, fmt='X5', reference=None): else: raise NotImplementedError - if reference and isinstance(reference, str): - reference = loadimg(reference) - return Affine(matrix, reference) + return Affine(matrix, reference=reference) def _fsl_aff_adapt(space): From 74884213d2474135bf29130e33e655554e7b7d97 Mon Sep 17 00:00:00 2001 From: oesteban Date: Sun, 27 Oct 2019 16:44:16 -0700 Subject: [PATCH 2/2] enh: add test to the HDF5 export function --- nitransforms/tests/test_base.py | 1 + nitransforms/tests/test_linear.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/nitransforms/tests/test_base.py b/nitransforms/tests/test_base.py index 6559fbf6..0de12ad8 100644 --- a/nitransforms/tests/test_base.py +++ b/nitransforms/tests/test_base.py @@ -46,6 +46,7 @@ def test_ImageGrid(get_testdata, image_orientation): img2 = ImageGrid(img) assert img2 == img + assert (img2 != img) is False def test_ImageGrid_utils(tmpdir, data_path, get_testdata): diff --git a/nitransforms/tests/test_linear.py b/nitransforms/tests/test_linear.py index 7a9c93a3..a3ca3700 100644 --- a/nitransforms/tests/test_linear.py +++ b/nitransforms/tests/test_linear.py @@ -6,6 +6,7 @@ import numpy as np from subprocess import check_call import shutil +import h5py import nibabel as nb from nibabel.eulerangles import euler2mat @@ -155,3 +156,9 @@ def test_apply_linear_transform( diff = sw_moved.get_fdata() - nt_moved.get_fdata() # A certain tolerance is necessary because of resampling at borders assert (np.abs(diff) > 1e-3).sum() / diff.size < TESTS_BORDER_TOLERANCE + + +def test_Affine(tmpdir): + """Test affine's operations.""" + with h5py.File('xfm.x5', 'w') as f: + nbl.Affine()._to_hdf5(f.create_group('Affine'))