Skip to content

Commit 2f9c77c

Browse files
committed
[ENH] Add interface to antsAffineInitializer
Adds a very simple interface to `antsAffineInitializer`, which is used in the `antsBrainExtraction.sh` script to initialize the registration to template.
1 parent a17af6b commit 2f9c77c

File tree

3 files changed

+114
-2
lines changed

3 files changed

+114
-2
lines changed

nipype/interfaces/ants/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@
1919
from .visualization import ConvertScalarImageToRGB, CreateTiledMosaic
2020

2121
# Utility Programs
22-
from .utils import AverageAffineTransform, AverageImages, MultiplyImages, CreateJacobianDeterminantImage
22+
from .utils import (AverageAffineTransform, AverageImages, MultiplyImages,
23+
CreateJacobianDeterminantImage, AffineInitializer)
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT
2+
from __future__ import unicode_literals
3+
from ..utils import AffineInitializer
4+
5+
6+
def test_AffineInitializer_inputs():
7+
input_map = dict(args=dict(argstr='%s',
8+
),
9+
dimension=dict(argstr='%s',
10+
position=0,
11+
usedefault=True,
12+
),
13+
environ=dict(nohash=True,
14+
usedefault=True,
15+
),
16+
fixed_image=dict(argstr='%s',
17+
mandatory=True,
18+
position=1,
19+
),
20+
ignore_exception=dict(nohash=True,
21+
usedefault=True,
22+
),
23+
local_search=dict(argstr='%d',
24+
position=7,
25+
usedefault=True,
26+
),
27+
moving_image=dict(argstr='%s',
28+
mandatory=True,
29+
position=2,
30+
),
31+
out_file=dict(argstr='%s',
32+
position=3,
33+
usedefault=True,
34+
),
35+
principal_axes=dict(argstr='%d',
36+
position=6,
37+
usedefault=True,
38+
),
39+
radian_fraction=dict(argstr='%f',
40+
position=5,
41+
usedefault=True,
42+
),
43+
search_factor=dict(argstr='%f',
44+
position=4,
45+
usedefault=True,
46+
),
47+
terminal_output=dict(nohash=True,
48+
),
49+
)
50+
inputs = AffineInitializer.input_spec()
51+
52+
for key, metadata in list(input_map.items()):
53+
for metakey, value in list(metadata.items()):
54+
assert getattr(inputs.traits()[key], metakey) == value
55+
56+
57+
def test_AffineInitializer_outputs():
58+
output_map = dict(out_file=dict(),
59+
)
60+
outputs = AffineInitializer.output_spec()
61+
62+
for key, metadata in list(output_map.items()):
63+
for metakey, value in list(metadata.items()):
64+
assert getattr(outputs.traits()[key], metakey) == value

nipype/interfaces/ants/utils.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import os
1313

1414
from ...utils.filemanip import split_filename
15-
from ..base import TraitedSpec, File, traits, isdefined, InputMultiPath
15+
from ..base import (TraitedSpec, File, traits, isdefined, InputMultiPath,
16+
CommandLine, CommandLineInputSpec)
1617
from .base import ANTSCommand, ANTSCommandInputSpec
1718

1819

@@ -178,3 +179,49 @@ def _list_outputs(self):
178179
outputs['jacobian_image'] = os.path.abspath(
179180
self.inputs.outputImage)
180181
return outputs
182+
183+
184+
class AffineInitializerInputSpec(CommandLineInputSpec):
185+
dimension = traits.Enum(3, 2, usedefault=True, position=0, argstr='%s',
186+
desc='dimension')
187+
fixed_image = File(exists=True, mandatory=True, position=1, argstr='%s',
188+
desc='reference image')
189+
moving_image = File(exists=True, mandatory=True, position=2, argstr='%s',
190+
desc='moving image')
191+
out_file = File('transform.mat', usedefault=True, position=3, argstr='%s',
192+
desc='output transform file')
193+
# Defaults in antsBrainExtraction.sh -> 15 0.1 0 10
194+
search_factor = traits.Float(15.0, usedefault=True, position=4, argstr='%f',
195+
desc='increments (degrees) for affine search')
196+
radian_fraction = traits.Range(0.0, 1.0, value=0.1, usedefault=True, position=5,
197+
argstr='%f', desc='search this arc +/- principal axes')
198+
principal_axes = traits.Bool(
199+
False, usedefault=True, position=6, argstr='%d',
200+
desc='whether the rotation is searched around an initial principal axis alignment.')
201+
local_search = traits.Int(
202+
10, usedefault=True, position=7, argstr='%d',
203+
desc=' determines if a local optimization is run at each search point for the set '
204+
'number of iterations')
205+
206+
class AffineInitializerOutputSpec(TraitedSpec):
207+
out_file = File(desc='output transform file')
208+
209+
210+
class AffineInitializer(CommandLine):
211+
"""
212+
Initialize an affine transform (as in antsBrainExtraction.sh)
213+
214+
>>> from nipype.interfaces.ants import AffineInitializer
215+
>>> init = AffineInitializer()
216+
>>> init.inputs.fixed_image = 'fixed1.nii'
217+
>>> init.inputs.moving_image = 'moving1.nii'
218+
>>> init.cmdline # doctest: +ALLOW_UNICODE
219+
'antsAffineInitializer 3 fixed1.nii moving1.nii transform.mat 15.000000 0.100000 0 10'
220+
221+
"""
222+
_cmd = 'antsAffineInitializer'
223+
input_spec = AffineInitializerInputSpec
224+
output_spec = AffineInitializerOutputSpec
225+
226+
def _list_outputs(self):
227+
return {'out_file': os.path.abspath(self.inputs.out_file)}

0 commit comments

Comments
 (0)