Skip to content

Commit ee44a57

Browse files
committed
Symplifying the interfaces when possible using name_source/name_template
1 parent 55e555e commit ee44a57

14 files changed

+68
-285
lines changed

nipype/interfaces/niftyseg/base.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
2121
"""
2222

23-
from nipype.interfaces.base import CommandLine, isdefined
23+
from nipype.interfaces.base import CommandLine
2424
from nipype.utils.filemanip import split_filename
2525
import os
2626
import subprocess
@@ -89,16 +89,3 @@ def _gen_fname(self, basename, out_dir=None, suffix=None, ext=None):
8989
if suffix is not None:
9090
final_bn = ''.join((final_bn, suffix))
9191
return os.path.abspath(os.path.join(out_dir, final_bn + final_ext))
92-
93-
def _gen_filename(self, name):
94-
if name == 'out_file':
95-
return self._gen_fname(self.inputs.in_file, suffix=self._suffix)
96-
return None
97-
98-
def _list_outputs(self):
99-
outputs = self.output_spec().get()
100-
if isdefined(self.inputs.out_file):
101-
outputs['out_file'] = self.inputs.out_file
102-
else:
103-
outputs['out_file'] = self._gen_filename('out_file')
104-
return outputs

nipype/interfaces/niftyseg/em.py

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
>>> os.chdir(datadir)
1919
"""
2020

21-
import os
22-
23-
from ..base import (TraitedSpec, File, traits, isdefined, CommandLineInputSpec,
21+
from ..base import (TraitedSpec, File, traits, CommandLineInputSpec,
2422
InputMultiPath)
2523
from .base import NiftySegCommand, get_custom_path
2624

@@ -91,14 +89,17 @@ class EMInputSpec(CommandLineInputSpec):
9189
desc=desc)
9290

9391
# outputs
94-
out_file = File(argstr='-out %s',
95-
genfile=True,
92+
out_file = File(name_source=['in_file'],
93+
name_template='%s_em.nii.gz',
94+
argstr='-out %s',
9695
desc='Output segmentation')
97-
out_bc_file = File(argstr='-bc_out %s',
98-
genfile=True,
96+
out_bc_file = File(name_source=['in_file'],
97+
name_template='%s_bc_em.nii.gz',
98+
argstr='-bc_out %s',
9999
desc='Output bias corrected image')
100-
out_outlier_file = File(argstr='-out_outlier %s',
101-
genfile=True,
100+
out_outlier_file = File(name_source=['in_file'],
101+
name_template='%s_outlier_em.nii.gz',
102+
argstr='-out_outlier %s',
102103
desc='Output outlierness image')
103104

104105

@@ -126,9 +127,9 @@ class EM(NiftySegCommand):
126127
>>> node = niftyseg.EM()
127128
>>> node.inputs.in_file = 'im1.nii'
128129
>>> node.inputs.no_prior = 4
129-
>>> node.cmdline # doctest: +ELLIPSIS +ALLOW_UNICODE
130-
'seg_EM -in im1.nii -nopriors 4 -bc_out .../im1_bc_em.nii \
131-
-out .../im1_em.nii -out_outlier .../im1_outlier_em.nii'
130+
>>> node.cmdline # doctest: +ALLOW_UNICODE
131+
'seg_EM -in im1.nii -nopriors 4 -bc_out im1_bc_em.nii.gz \
132+
-out im1_em.nii.gz -out_outlier im1_outlier_em.nii.gz'
132133
133134
"""
134135
_cmd = get_custom_path('seg_EM')
@@ -143,32 +144,3 @@ def _format_arg(self, opt, spec, val):
143144
return '-priors %d %s' % (_nb_priors, ' '.join(self.inputs.priors))
144145
else:
145146
return super(EM, self)._format_arg(opt, spec, val)
146-
147-
def _list_outputs(self):
148-
outputs = self.output_spec().get()
149-
outputs['out_file'] = self.inputs.out_file
150-
if not isdefined(self.inputs.out_file):
151-
outputs['out_file'] = self._gen_fname(self.inputs.in_file,
152-
suffix=self._suffix)
153-
outputs['out_file'] = os.path.abspath(outputs['out_file'])
154-
outputs['out_bc_file'] = self.inputs.out_bc_file
155-
if not isdefined(self.inputs.out_bc_file):
156-
outputs['out_bc_file'] = self._gen_fname(
157-
self.inputs.in_file, suffix=('_bc%s' % self._suffix))
158-
outputs['out_bc_file'] = os.path.abspath(outputs['out_bc_file'])
159-
outputs['out_outlier_file'] = self.inputs.out_outlier_file
160-
if not isdefined(self.inputs.out_outlier_file):
161-
outputs['out_outlier_file'] = self._gen_fname(
162-
self.inputs.in_file, suffix=('_outlier%s' % self._suffix))
163-
outputs['out_outlier_file'] = os.path.abspath(
164-
outputs['out_outlier_file'])
165-
return outputs
166-
167-
def _gen_filename(self, name):
168-
if name == 'out_file':
169-
return self._list_outputs()['out_file']
170-
if name == 'out_bc_file':
171-
return self._list_outputs()['out_bc_file']
172-
if name == 'out_outlier_file':
173-
return self._list_outputs()['out_outlier_file']
174-
return None

nipype/interfaces/niftyseg/lesions.py

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818
>>> os.chdir(datadir)
1919
"""
2020

21-
import os
2221
import warnings
2322

24-
from ..base import TraitedSpec, File, traits, isdefined, CommandLineInputSpec
23+
from ..base import TraitedSpec, File, traits, CommandLineInputSpec
2524
from .base import NiftySegCommand, get_custom_path
2625

2726

@@ -39,7 +38,9 @@ class FillLesionsInputSpec(CommandLineInputSpec):
3938
desc='Lesion mask', position=2)
4039

4140
# Output file name
42-
out_file = File(desc='The output filename of the fill lesions results',
41+
out_file = File(name_source=['in_file'],
42+
name_template='%s_lesions_filled.nii.gz',
43+
desc='The output filename of the fill lesions results',
4344
argstr='-o %s', position=3)
4445

4546
# Optional arguments
@@ -108,31 +109,10 @@ class FillLesions(NiftySegCommand):
108109
>>> node = niftyseg.FillLesions()
109110
>>> node.inputs.in_file = 'im1.nii'
110111
>>> node.inputs.lesion_mask = 'im2.nii'
111-
>>> node.cmdline # doctest: +ELLIPSIS +ALLOW_UNICODE
112-
'seg_FillLesions -i im1.nii -l im2.nii -o .../im1_lesions_filled.nii'
112+
>>> node.cmdline # doctest: +ALLOW_UNICODE
113+
'seg_FillLesions -i im1.nii -l im2.nii -o im1_lesions_filled.nii.gz'
113114
114115
"""
115116
_cmd = get_custom_path('seg_FillLesions')
116117
input_spec = FillLesionsInputSpec
117118
output_spec = FillLesionsOutputSpec
118-
119-
def _list_outputs(self):
120-
outputs = self.output_spec().get()
121-
outputs['out_file'] = self.inputs.out_file
122-
if not isdefined(self.inputs.out_file):
123-
outputs['out_file'] = self._gen_filename('out_file')
124-
outputs['out_file'] = os.path.abspath(outputs['out_file'])
125-
return outputs
126-
127-
def _parse_inputs(self, skip=None):
128-
"""Set non-mandatory inputs if not given by user."""
129-
skip = []
130-
if not isdefined(self.inputs.out_file):
131-
self.inputs.out_file = self._gen_filename('out_file')
132-
return super(FillLesions, self)._parse_inputs(skip=skip)
133-
134-
def _gen_filename(self, name):
135-
if name == 'out_file':
136-
return self._gen_fname(self.inputs.in_file,
137-
suffix='_lesions_filled')
138-
return None

nipype/interfaces/niftyseg/maths.py

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
>>> datadir = os.path.realpath(os.path.join(filepath, '../../testing/data'))
1818
>>> os.chdir(datadir)
1919
"""
20-
import os
2120

2221
from ..base import (TraitedSpec, File, traits, isdefined, CommandLineInputSpec,
2322
NipypeInterfaceError)
@@ -71,6 +70,7 @@ class MathsCommand(NiftySegCommand):
7170
_cmd = get_custom_path('seg_maths')
7271
input_spec = MathsInput
7372
output_spec = MathsOutput
73+
_suffix = '_maths'
7474

7575
def _list_outputs(self):
7676
outputs = self.output_spec().get()
@@ -79,11 +79,11 @@ def _list_outputs(self):
7979
if suffix != '_merged' and isdefined(self.inputs.operation):
8080
suffix = '_' + self.inputs.operation
8181

82-
outputs['out_file'] = self.inputs.out_file
83-
if not isdefined(self.inputs.out_file):
82+
if isdefined(self.inputs.out_file):
83+
outputs['out_file'] = self.inputs.out_file
84+
else:
8485
outputs['out_file'] = self._gen_fname(self.inputs.in_file,
8586
suffix=suffix)
86-
outputs['out_file'] = os.path.abspath(outputs['out_file'])
8787
return outputs
8888

8989
def _gen_filename(self, name):
@@ -149,8 +149,8 @@ class UnaryMaths(MathsCommand):
149149
>>> node.inputs.in_file = 'im1.nii'
150150
>>> node.inputs.operation = 'sqrt'
151151
>>> node.inputs.output_datatype = 'float'
152-
>>> node.cmdline # doctest: +ELLIPSIS +ALLOW_UNICODE
153-
'seg_maths im1.nii -sqrt -odt float .../im1_sqrt.nii'
152+
>>> node.cmdline # doctest: +ALLOW_UNICODE
153+
'seg_maths im1.nii -sqrt -odt float im1_sqrt.nii'
154154
155155
"""
156156
input_spec = UnaryMathsInput
@@ -237,8 +237,8 @@ class BinaryMaths(MathsCommand):
237237
>>> node.inputs.operation = 'sub'
238238
>>> node.inputs.operand_file = 'im2.nii'
239239
>>> node.inputs.output_datatype = 'float'
240-
>>> node.cmdline # doctest: +ELLIPSIS +ALLOW_UNICODE
241-
'seg_maths im1.nii -sub im2.nii -odt float .../im1_sub.nii'
240+
>>> node.cmdline # doctest: +ALLOW_UNICODE
241+
'seg_maths im1.nii -sub im2.nii -odt float im1_sub.nii'
242242
243243
"""
244244
input_spec = BinaryMathsInput
@@ -256,19 +256,12 @@ def _format_arg(self, opt, spec, val):
256256
return super(BinaryMaths, self)._format_arg(opt, spec, val)
257257

258258
def _list_outputs(self):
259-
outputs = self.output_spec().get()
260-
self._suffix = '_' + self.inputs.operation
261-
262-
outputs['out_file'] = self.inputs.out_file
263-
if not isdefined(self.inputs.out_file):
264-
if isdefined(self.inputs.operation) and \
265-
self.inputs.operation == 'hdr_copy':
266-
outputs['out_file'] = self._gen_fname(self.inputs.operand_file,
267-
suffix=self._suffix)
268-
else:
269-
outputs['out_file'] = self._gen_fname(self.inputs.in_file,
270-
suffix=self._suffix)
271-
outputs['out_file'] = os.path.abspath(outputs['out_file'])
259+
outputs = super(BinaryMaths, self)._list_outputs()
260+
261+
if self.inputs.operation == 'hdr_copy':
262+
outputs['out_file'] = self._gen_fname(
263+
self.inputs.operand_file,
264+
suffix='_{0}'.format(self.inputs.operation))
272265
return outputs
273266

274267

@@ -312,8 +305,8 @@ class BinaryMathsInteger(MathsCommand):
312305
>>> node.inputs.operation = 'dil'
313306
>>> node.inputs.operand_value = 2
314307
>>> node.inputs.output_datatype = 'float'
315-
>>> node.cmdline # doctest: +ELLIPSIS +ALLOW_UNICODE
316-
'seg_maths im1.nii -dil 2 -odt float .../im1_dil.nii'
308+
>>> node.cmdline # doctest: +ALLOW_UNICODE
309+
'seg_maths im1.nii -dil 2 -odt float im1_dil.nii'
317310
318311
"""
319312
input_spec = BinaryMathsInputInteger
@@ -383,8 +376,8 @@ class TupleMaths(MathsCommand):
383376
>>> node.inputs.operand_file1 = 'im2.nii'
384377
>>> node.inputs.operand_value2 = 2.0
385378
>>> node.inputs.output_datatype = 'float'
386-
>>> node.cmdline # doctest: +ELLIPSIS +ALLOW_UNICODE
387-
'seg_maths im1.nii -lncc im2.nii 2.00000000 -odt float .../im1_lncc.nii'
379+
>>> node.cmdline # doctest: +ALLOW_UNICODE
380+
'seg_maths im1.nii -lncc im2.nii 2.00000000 -odt float im1_lncc.nii'
388381
389382
"""
390383
input_spec = TupleMathsInput
@@ -424,9 +417,9 @@ class Merge(MathsCommand):
424417
>>> node.inputs.merge_files = files
425418
>>> node.inputs.dimension = 2
426419
>>> node.inputs.output_datatype = 'float'
427-
>>> node.cmdline # doctest: +ELLIPSIS +ALLOW_UNICODE
420+
>>> node.cmdline # doctest: +ALLOW_UNICODE
428421
'seg_maths im1.nii -merge 2 2 im2.nii im3.nii -odt float \
429-
.../im1_merged.nii'
422+
im1_merged.nii'
430423
431424
"""
432425
input_spec = MergeInput

nipype/interfaces/niftyseg/patchmatch.py

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,17 @@ class PatchMatchInputSpec(CommandLineInputSpec):
3838
position=2)
3939

4040
database_file = File(argstr='-db %s',
41-
genfile=True,
41+
exists=True,
4242
mandatory=True,
4343
desc='Database with the segmentations',
4444
position=3)
4545

4646
# Output file name
47-
out_file = File(desc='The output filename of the patchmatch results',
47+
out_file = File(name_source=['in_file'],
48+
name_template='%s_pm.nii.gz',
49+
desc='The output filename of the patchmatch results',
4850
argstr='-o %s',
49-
position=4,
50-
genfile=True)
51+
position=4)
5152

5253
# Optional arguments
5354
patch_size = traits.Int(desc="Patch size, #voxels",
@@ -105,25 +106,11 @@ class PatchMatch(NiftySegCommand):
105106
>>> node.inputs.in_file = 'im1.nii'
106107
>>> node.inputs.mask_file = 'im2.nii'
107108
>>> node.inputs.database_file = 'db.xml'
108-
>>> node.cmdline # doctest: +ELLIPSIS +ALLOW_UNICODE
109-
'seg_PatchMatch -i im1.nii -m im2.nii -db db.xml -o .../im1_pm.nii'
109+
>>> node.cmdline # doctest: +ALLOW_UNICODE
110+
'seg_PatchMatch -i im1.nii -m im2.nii -db db.xml -o im1_pm.nii.gz'
110111
111112
"""
112113
_cmd = get_custom_path('seg_PatchMatch')
113114
input_spec = PatchMatchInputSpec
114115
output_spec = PatchMatchOutputSpec
115116
_suffix = '_pm'
116-
117-
def _list_outputs(self):
118-
outputs = self.output_spec().get()
119-
outputs['out_file'] = self.inputs.out_file
120-
if not isdefined(self.inputs.out_file):
121-
outputs['out_file'] = self._gen_fname(self.inputs.in_file,
122-
suffix=self._suffix)
123-
outputs['out_file'] = os.path.abspath(outputs['out_file'])
124-
return outputs
125-
126-
def _gen_filename(self, name):
127-
if name == 'out_file':
128-
return self._list_outputs()['out_file']
129-
return None

0 commit comments

Comments
 (0)