Skip to content

Commit a8f32b6

Browse files
committed
raising exception if the list provided as invert_affine doesnt make sense
1 parent 0b7742d commit a8f32b6

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

nipype/interfaces/ants/resampling.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ class WarpTimeSeriesImageMultiTransformInputSpec(ANTSCommandInputSpec):
4343
desc='transformation file(s) to be applied',
4444
mandatory=True, copyfile=False)
4545
invert_affine = traits.List(traits.Int,
46-
desc=('List of Affine transformations to invert. '
46+
desc=('List of Affine transformations to invert.'
4747
'E.g.: [1,4,5] inverts the 1st, 4th, and 5th Affines '
48-
'found in transformation_series'))
48+
'found in transformation_series. Note that indexing '
49+
'starts with 1 and does not include warp fields. Affine '
50+
'transformations are distinguished '
51+
'from warp fields by the word "affine" included in their filenames.'))
4952

5053

5154
class WarpTimeSeriesImageMultiTransformOutputSpec(TraitedSpec):
@@ -67,6 +70,14 @@ class WarpTimeSeriesImageMultiTransform(ANTSCommand):
6770
'WarpTimeSeriesImageMultiTransform 4 resting.nii resting_wtsimt.nii -R ants_deformed.nii.gz ants_Warp.nii.gz \
6871
ants_Affine.txt'
6972
73+
>>> wtsimt = WarpTimeSeriesImageMultiTransform()
74+
>>> wtsimt.inputs.input_image = 'resting.nii'
75+
>>> wtsimt.inputs.reference_image = 'ants_deformed.nii.gz'
76+
>>> wtsimt.inputs.transformation_series = ['ants_Warp.nii.gz','ants_Affine.txt']
77+
>>> wtsimt.inputs.invert_affine = [1] # # this will invert the 1st Affine file: ants_Affine.txt
78+
>>> wtsimt.cmdline # doctest: +ALLOW_UNICODE
79+
'WarpTimeSeriesImageMultiTransform 4 resting.nii resting_wtsimt.nii -R ants_deformed.nii.gz ants_Warp.nii.gz \
80+
-i ants_Affine.txt'
7081
"""
7182

7283
_cmd = 'WarpTimeSeriesImageMultiTransform'
@@ -81,13 +92,22 @@ def _format_arg(self, opt, spec, val):
8192
if opt == 'transformation_series':
8293
series = []
8394
affine_counter = 0
95+
affine_invert = []
8496
for transformation in val:
8597
if 'Affine' in transformation and \
8698
isdefined(self.inputs.invert_affine):
8799
affine_counter += 1
88100
if affine_counter in self.inputs.invert_affine:
89101
series += ['-i']
102+
affine_invert.append(affine_counter)
90103
series += [transformation]
104+
105+
if isdefined(self.inputs.invert_affine):
106+
diff_inv = set(self.inputs.invert_affine) - set(affine_invert)
107+
if diff_inv:
108+
raise Exceptions("Review invert_affine, not all indexes from invert_affine were used, "
109+
"check the description for the full definition")
110+
91111
return ' '.join(series)
92112
return super(WarpTimeSeriesImageMultiTransform, self)._format_arg(opt, spec, val)
93113

@@ -168,7 +188,7 @@ class WarpImageMultiTransform(ANTSCommand):
168188
>>> wimt.inputs.reference_image = 'functional.nii'
169189
>>> wimt.inputs.transformation_series = ['func2anat_coreg_Affine.txt','func2anat_InverseWarp.nii.gz', \
170190
'dwi2anat_Warp.nii.gz','dwi2anat_coreg_Affine.txt']
171-
>>> wimt.inputs.invert_affine = [1]
191+
>>> wimt.inputs.invert_affine = [1] # this will invert the 1st Affine file: 'func2anat_coreg_Affine.txt'
172192
>>> wimt.cmdline # doctest: +ALLOW_UNICODE
173193
'WarpImageMultiTransform 3 diffusion_weighted.nii diffusion_weighted_wimt.nii -R functional.nii \
174194
-i func2anat_coreg_Affine.txt func2anat_InverseWarp.nii.gz dwi2anat_Warp.nii.gz dwi2anat_coreg_Affine.txt'
@@ -190,14 +210,24 @@ def _format_arg(self, opt, spec, val):
190210
if opt == 'transformation_series':
191211
series = []
192212
affine_counter = 0
213+
affine_invert = []
193214
for transformation in val:
194215
if "affine" in transformation.lower() and \
195216
isdefined(self.inputs.invert_affine):
196217
affine_counter += 1
197218
if affine_counter in self.inputs.invert_affine:
198219
series += ['-i']
220+
affine_invert.append(affine_counter)
199221
series += [transformation]
222+
223+
if isdefined(self.inputs.invert_affine):
224+
diff_inv = set(self.inputs.invert_affine) - set(affine_invert)
225+
if diff_inv:
226+
raise Exceptions("Review invert_affine, not all indexes from invert_affine were used, "
227+
"check the description for the full definition")
228+
200229
return ' '.join(series)
230+
201231
return super(WarpImageMultiTransform, self)._format_arg(opt, spec, val)
202232

203233
def _list_outputs(self):

nipype/interfaces/ants/tests/test_resampling.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from nipype.interfaces.ants import WarpImageMultiTransform, WarpTimeSeriesImageMultiTransform
55
import os
6-
import pytest, pdb
6+
import pytest
77

88

99
@pytest.fixture()
@@ -47,7 +47,6 @@ def test_WarpImageMultiTransform_invaffine_2(change_dir, create_wimt):
4747
assert wimt.cmdline == 'WarpImageMultiTransform 3 diffusion_weighted.nii diffusion_weighted_wimt.nii -R functional.nii func2anat_coreg_Affine.txt func2anat_InverseWarp.nii.gz dwi2anat_Warp.nii.gz -i dwi2anat_coreg_Affine.txt'
4848

4949

50-
@pytest.mark.xfail(reason="dj: should it fail?")
5150
def test_WarpImageMultiTransform_invaffine_wrong(change_dir, create_wimt):
5251
wimt = create_wimt
5352
wimt.inputs.invert_affine = [3]
@@ -77,7 +76,6 @@ def test_WarpTimeSeriesImageMultiTransform_invaffine(change_dir, create_wtsimt):
7776
-R ants_deformed.nii.gz ants_Warp.nii.gz -i ants_Affine.txt'
7877

7978

80-
@pytest.mark.xfail(reason="dj: should it fail?")
8179
def test_WarpTimeSeriesImageMultiTransform_invaffine_wrong(change_dir, create_wtsimt):
8280
wtsimt = create_wtsimt
8381
wtsimt.inputs.invert_affine = [0]

0 commit comments

Comments
 (0)