11
11
import nibabel as nb
12
12
from nibabel .eulerangles import euler2mat
13
13
from nibabel .affines import from_matvec
14
- from .. import linear as ntl
14
+ from .. import linear as nitl
15
15
from .utils import assert_affines_by_filename
16
16
17
17
TESTS_BORDER_TOLERANCE = 0.05
42
42
def test_linear_typeerrors1 (matrix ):
43
43
"""Exercise errors in Affine creation."""
44
44
with pytest .raises (TypeError ):
45
- ntl .Affine (matrix )
45
+ nitl .Affine (matrix )
46
46
47
47
48
48
def test_linear_typeerrors2 (data_path ):
49
49
"""Exercise errors in Affine creation."""
50
50
with pytest .raises (TypeError ):
51
- ntl .Affine .from_filename (data_path / 'itktflist.tfm' , fmt = 'itk' )
51
+ nitl .Affine .from_filename (data_path / 'itktflist.tfm' , fmt = 'itk' )
52
52
53
53
54
54
def test_linear_valueerror ():
55
55
"""Exercise errors in Affine creation."""
56
56
with pytest .raises (ValueError ):
57
- ntl .Affine (np .ones ((4 , 4 )))
57
+ nitl .Affine (np .ones ((4 , 4 )))
58
58
59
59
60
60
def test_loadsave_itk (tmp_path , data_path , testdata_path ):
61
61
"""Test idempotency."""
62
62
ref_file = testdata_path / 'someones_anatomy.nii.gz'
63
- xfm = ntl .load (data_path / 'itktflist2.tfm' , fmt = 'itk' )
64
- assert isinstance (xfm , ntl .LinearTransformsMapping )
63
+ xfm = nitl .load (data_path / 'itktflist2.tfm' , fmt = 'itk' )
64
+ assert isinstance (xfm , nitl .LinearTransformsMapping )
65
65
xfm .reference = ref_file
66
66
xfm .to_filename (tmp_path / 'transform-mapping.tfm' , fmt = 'itk' )
67
67
68
68
assert (data_path / 'itktflist2.tfm' ).read_text () \
69
69
== (tmp_path / 'transform-mapping.tfm' ).read_text ()
70
70
71
- single_xfm = ntl .load (data_path / 'affine-LAS.itk.tfm' , fmt = 'itk' )
72
- assert isinstance (single_xfm , ntl .Affine )
73
- assert single_xfm == ntl .Affine .from_filename (
71
+ single_xfm = nitl .load (data_path / 'affine-LAS.itk.tfm' , fmt = 'itk' )
72
+ assert isinstance (single_xfm , nitl .Affine )
73
+ assert single_xfm == nitl .Affine .from_filename (
74
74
data_path / 'affine-LAS.itk.tfm' , fmt = 'itk' )
75
75
76
76
@@ -79,23 +79,23 @@ def test_loadsave_itk(tmp_path, data_path, testdata_path):
79
79
def test_loadsave (tmp_path , data_path , testdata_path , fmt ):
80
80
"""Test idempotency."""
81
81
ref_file = testdata_path / 'someones_anatomy.nii.gz'
82
- xfm = ntl .load (data_path / 'itktflist2.tfm' , fmt = 'itk' )
82
+ xfm = nitl .load (data_path / 'itktflist2.tfm' , fmt = 'itk' )
83
83
xfm .reference = ref_file
84
84
85
85
fname = tmp_path / '.' .join (('transform-mapping' , fmt ))
86
86
xfm .to_filename (fname , fmt = fmt )
87
- xfm == ntl .load (fname , fmt = fmt , reference = ref_file )
87
+ xfm == nitl .load (fname , fmt = fmt , reference = ref_file )
88
88
xfm .to_filename (fname , fmt = fmt , moving = ref_file )
89
- xfm == ntl .load (fname , fmt = fmt , reference = ref_file )
89
+ xfm == nitl .load (fname , fmt = fmt , reference = ref_file )
90
90
91
91
ref_file = testdata_path / 'someones_anatomy.nii.gz'
92
- xfm = ntl .load (data_path / 'affine-LAS.itk.tfm' , fmt = 'itk' )
92
+ xfm = nitl .load (data_path / 'affine-LAS.itk.tfm' , fmt = 'itk' )
93
93
xfm .reference = ref_file
94
94
fname = tmp_path / '.' .join (('single-transform' , fmt ))
95
95
xfm .to_filename (fname , fmt = fmt )
96
- xfm == ntl .load (fname , fmt = fmt , reference = ref_file )
96
+ xfm == nitl .load (fname , fmt = fmt , reference = ref_file )
97
97
xfm .to_filename (fname , fmt = fmt , moving = ref_file )
98
- xfm == ntl .load (fname , fmt = fmt , reference = ref_file )
98
+ xfm == nitl .load (fname , fmt = fmt , reference = ref_file )
99
99
100
100
101
101
@pytest .mark .xfail (reason = "Not fully implemented" )
@@ -107,7 +107,7 @@ def test_linear_save(tmpdir, data_path, get_testdata, image_orientation, sw_tool
107
107
img = get_testdata [image_orientation ]
108
108
# Generate test transform
109
109
T = from_matvec (euler2mat (x = 0.9 , y = 0.001 , z = 0.001 ), [4.0 , 2.0 , - 1.0 ])
110
- xfm = ntl .Affine (T )
110
+ xfm = nitl .Affine (T )
111
111
xfm .reference = img
112
112
113
113
ext = ''
@@ -140,7 +140,7 @@ def test_apply_linear_transform(
140
140
img = get_testdata [image_orientation ]
141
141
# Generate test transform
142
142
T = from_matvec (euler2mat (x = 0.9 , y = 0.001 , z = 0.001 ), [4.0 , 2.0 , - 1.0 ])
143
- xfm = ntl .Affine (T )
143
+ xfm = nitl .Affine (T )
144
144
xfm .reference = img
145
145
146
146
ext = ''
@@ -172,11 +172,16 @@ def test_apply_linear_transform(
172
172
# A certain tolerance is necessary because of resampling at borders
173
173
assert (np .abs (diff ) > 1e-3 ).sum () / diff .size < TESTS_BORDER_TOLERANCE
174
174
175
+ nt_moved = xfm .apply ('img.nii.gz' , order = 0 )
176
+ diff = sw_moved .get_fdata () - nt_moved .get_fdata ()
177
+ # A certain tolerance is necessary because of resampling at borders
178
+ assert (np .abs (diff ) > 1e-3 ).sum () / diff .size < TESTS_BORDER_TOLERANCE
179
+
175
180
176
181
def test_Affine_to_x5 (tmpdir , testdata_path ):
177
182
"""Test affine's operations."""
178
183
tmpdir .chdir ()
179
- aff = ntl .Affine ()
184
+ aff = nitl .Affine ()
180
185
with h5py .File ('xfm.x5' , 'w' ) as f :
181
186
aff ._to_hdf5 (f .create_group ('Affine' ))
182
187
@@ -185,34 +190,42 @@ def test_Affine_to_x5(tmpdir, testdata_path):
185
190
aff ._to_hdf5 (f .create_group ('Affine' ))
186
191
187
192
188
- def test_concatenation (testdata_path ):
189
- """Check concatenation of affines."""
190
- aff = ntl .Affine (reference = testdata_path / 'someones_anatomy.nii.gz' )
191
- x = [(0. , 0. , 0. ), (1. , 1. , 1. ), (- 1. , - 1. , - 1. )]
192
- assert np .all ((aff + ntl .Affine ())(x ) == x )
193
- assert np .all ((aff + ntl .Affine ())(x , inverse = True ) == x )
194
-
195
-
196
193
def test_LinearTransformsMapping_apply (tmp_path , data_path , testdata_path ):
197
194
"""Apply transform mappings."""
198
- hmc = ntl .load (data_path / 'hmc-itk.tfm' , fmt = 'itk' ,
199
- reference = testdata_path / 'sbref.nii.gz' )
200
- assert isinstance (hmc , ntl .LinearTransformsMapping )
195
+ hmc = nitl .load (data_path / 'hmc-itk.tfm' , fmt = 'itk' ,
196
+ reference = testdata_path / 'sbref.nii.gz' )
197
+ assert isinstance (hmc , nitl .LinearTransformsMapping )
201
198
202
- # Test-case: realing functional data on to sbref
199
+ # Test-case: realign functional data on to sbref
203
200
nii = hmc .apply (testdata_path / 'func.nii.gz' , order = 1 ,
204
201
reference = testdata_path / 'sbref.nii.gz' )
205
202
assert nii .dataobj .shape [- 1 ] == len (hmc )
206
203
207
204
# Test-case: write out a fieldmap moved with head
208
- hmcinv = ntl .LinearTransformsMapping (
205
+ hmcinv = nitl .LinearTransformsMapping (
209
206
np .linalg .inv (hmc .matrix ),
210
207
reference = testdata_path / 'func.nii.gz' )
211
208
nii = hmcinv .apply (testdata_path / 'fmap.nii.gz' , order = 1 )
212
209
assert nii .dataobj .shape [- 1 ] == len (hmc )
213
210
214
211
# Ensure a ValueError is issued when trying to do weird stuff
215
- hmc = ntl .LinearTransformsMapping (hmc .matrix [:1 , ...])
212
+ hmc = nitl .LinearTransformsMapping (hmc .matrix [:1 , ...])
216
213
with pytest .raises (ValueError ):
217
214
hmc .apply (testdata_path / 'func.nii.gz' , order = 1 ,
218
215
reference = testdata_path / 'sbref.nii.gz' )
216
+
217
+
218
+ def test_mulmat_operator (testdata_path ):
219
+ """Check the @ operator."""
220
+ ref = testdata_path / 'someones_anatomy.nii.gz'
221
+ mat1 = np .diag ([2. , 2. , 2. , 1. ])
222
+ mat2 = from_matvec (np .eye (3 ), (4 , 2 , - 1 ))
223
+ aff = nitl .Affine (mat1 , reference = ref )
224
+
225
+ composed = aff @ mat2
226
+ assert composed .reference is None
227
+ assert composed == nitl .Affine (mat1 .dot (mat2 ))
228
+
229
+ composed = nitl .Affine (mat2 ) @ aff
230
+ assert composed .reference == aff .reference
231
+ assert composed == nitl .Affine (mat2 .dot (mat1 ), reference = ref )
0 commit comments