Skip to content

Commit 2aa325e

Browse files
committed
Explicitly add extra options to ReconAllInputSpec
1 parent af036f7 commit 2aa325e

File tree

2 files changed

+114
-8
lines changed

2 files changed

+114
-8
lines changed

nipype/interfaces/freesurfer/preprocess.py

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
Directory, InputMultiPath,
2929
OutputMultiPath, CommandLine,
3030
CommandLineInputSpec, isdefined)
31-
from ..traits_extension import DictStrStr
3231
from .base import (FSCommand, FSTraitedSpec,
3332
FSTraitedSpecOpenMP,
3433
FSCommandOpenMP, Info)
@@ -635,12 +634,40 @@ class ReconAllInputSpec(CommandLineInputSpec):
635634
desc="Enable parallel execution")
636635
hires = traits.Bool(argstr="-hires", min_ver='6.0.0',
637636
desc="Conform to minimum voxel size (for voxels < 1mm)")
638-
expert = traits.Either(File(exists=True), DictStrStr, argstr='-expert %s',
637+
expert = File(exists=True, argstr='-expert %s',
639638
desc="Set parameters using expert file")
640639
subjects_dir = Directory(exists=True, argstr='-sd %s', hash_files=False,
641640
desc='path to subjects directory', genfile=True)
642641
flags = traits.Str(argstr='%s', desc='additional parameters')
643642

643+
# Expert options
644+
talairach = traits.Str(desc="Flags to pass to talairach commands", xor=['expert'])
645+
mri_normalize = traits.Str(desc="Flags to pass to mri_normalize commands", xor=['expert'])
646+
mri_watershed = traits.Str(desc="Flags to pass to mri_watershed commands", xor=['expert'])
647+
mri_em_register = traits.Str(desc="Flags to pass to mri_em_register commands", xor=['expert'])
648+
mri_ca_normalize = traits.Str(desc="Flags to pass to mri_ca_normalize commands", xor=['expert'])
649+
mri_ca_register = traits.Str(desc="Flags to pass to mri_ca_register commands", xor=['expert'])
650+
mri_remove_neck = traits.Str(desc="Flags to pass to mri_remove_neck commands", xor=['expert'])
651+
mri_ca_label = traits.Str(desc="Flags to pass to mri_ca_label commands", xor=['expert'])
652+
mri_segstats = traits.Str(desc="Flags to pass to mri_segstats commands", xor=['expert'])
653+
mri_mask = traits.Str(desc="Flags to pass to mri_mask commands", xor=['expert'])
654+
mri_segment = traits.Str(desc="Flags to pass to mri_segment commands", xor=['expert'])
655+
mri_edit_wm_with_aseg = traits.Str(desc="Flags to pass to mri_edit_wm_with_aseg commands", xor=['expert'])
656+
mri_pretess = traits.Str(desc="Flags to pass to mri_pretess commands", xor=['expert'])
657+
mri_fill = traits.Str(desc="Flags to pass to mri_fill commands", xor=['expert'])
658+
mri_tessellate = traits.Str(desc="Flags to pass to mri_tessellate commands", xor=['expert'])
659+
mris_smooth = traits.Str(desc="Flags to pass to mri_smooth commands", xor=['expert'])
660+
mris_inflate = traits.Str(desc="Flags to pass to mri_inflate commands", xor=['expert'])
661+
mris_sphere = traits.Str(desc="Flags to pass to mris_sphere commands", xor=['expert'])
662+
mris_fix_topology = traits.Str(desc="Flags to pass to mris_fix_topology commands", xor=['expert'])
663+
mris_make_surfaces = traits.Str(desc="Flags to pass to mris_make_surfaces commands", xor=['expert'])
664+
mris_surf2vol = traits.Str(desc="Flags to pass to mris_surf2vol commands", xor=['expert'])
665+
mris_register = traits.Str(desc="Flags to pass to mris_register commands", xor=['expert'])
666+
mrisp_paint = traits.Str(desc="Flags to pass to mrisp_paint commands", xor=['expert'])
667+
mris_ca_label = traits.Str(desc="Flags to pass to mris_ca_label commands", xor=['expert'])
668+
mris_anatomical_stats = traits.Str(desc="Flags to pass to mris_anatomical_stats commands", xor=['expert'])
669+
mri_aparc2aseg = traits.Str(desc="Flags to pass to mri_aparc2aseg commands", xor=['expert'])
670+
644671

645672
class ReconAllOutputSpec(FreeSurferSource.output_spec):
646673
subjects_dir = Directory(exists=True, desc='Freesurfer subjects directory.')
@@ -856,6 +883,16 @@ class ReconAll(CommandLine):
856883

857884
_steps = _autorecon1_steps + _autorecon2_steps + _autorecon3_steps
858885

886+
_binaries = ['talairach', 'mri_normalize', 'mri_watershed',
887+
'mri_em_register', 'mri_ca_normalize', 'mri_ca_register',
888+
'mri_remove_neck', 'mri_ca_label', 'mri_segstats',
889+
'mri_mask', 'mri_segment', 'mri_edit_wm_with_aseg',
890+
'mri_pretess', 'mri_fill', 'mri_tessellate', 'mris_smooth',
891+
'mris_inflate', 'mris_sphere', 'mris_fix_topology',
892+
'mris_make_surfaces', 'mris_surf2vol', 'mris_register',
893+
'mrisp_paint', 'mris_ca_label', 'mris_anatomical_stats',
894+
'mri_aparc2aseg']
895+
859896
def _gen_subjects_dir(self):
860897
return os.getcwd()
861898

@@ -900,17 +937,16 @@ def _format_arg(self, name, trait_spec, value):
900937
if name == 'T1_files':
901938
if self._is_resuming():
902939
return ''
903-
if name == 'expert' and isinstance(value, dict):
904-
expert_fname = os.path.abspath('expert.opts')
905-
expert = ['{} {}\n'.format(key, val) for key, val in value.items()]
906-
with open(expert_fname, 'w') as fobj:
907-
fobj.write(''.join(expert))
908-
value = expert_fname
909940
return super(ReconAll, self)._format_arg(name, trait_spec, value)
910941

911942
@property
912943
def cmdline(self):
913944
cmd = super(ReconAll, self).cmdline
945+
946+
# Adds '-expert' flag if expert flags are passed
947+
# Mutually exclusive with 'expert' input parameter
948+
cmd += self._prep_expert_file()
949+
914950
if not self._is_resuming():
915951
return cmd
916952
subjects_dir = self.inputs.subjects_dir
@@ -944,6 +980,24 @@ def cmdline(self):
944980
iflogger.info('resume recon-all : %s' % cmd)
945981
return cmd
946982

983+
def _prep_expert_file(self):
984+
if isdefined(self.inputs.expert):
985+
return ''
986+
987+
lines = []
988+
for binary in self._binaries:
989+
args = getattr(self.inputs, binary)
990+
if isdefined(args):
991+
lines.append('{} {}\n'.format(binary, args))
992+
993+
if lines == []:
994+
return ''
995+
996+
expert_fname = os.path.abspath('expert.opts')
997+
with open(expert_fname, 'w') as fobj:
998+
fobj.write(''.join(lines))
999+
return ' -expert {}'.format(expert_fname)
1000+
9471001

9481002
class BBRegisterInputSpec(FSTraitedSpec):
9491003
subject_id = traits.Str(argstr='--s %s',

nipype/interfaces/freesurfer/tests/test_auto_ReconAll.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,56 @@ def test_ReconAll_inputs():
3030
ignore_exception=dict(nohash=True,
3131
usedefault=True,
3232
),
33+
mri_aparc2aseg=dict(xor=['expert'],
34+
),
35+
mri_ca_label=dict(xor=['expert'],
36+
),
37+
mri_ca_normalize=dict(xor=['expert'],
38+
),
39+
mri_ca_register=dict(xor=['expert'],
40+
),
41+
mri_edit_wm_with_aseg=dict(xor=['expert'],
42+
),
43+
mri_em_register=dict(xor=['expert'],
44+
),
45+
mri_fill=dict(xor=['expert'],
46+
),
47+
mri_mask=dict(xor=['expert'],
48+
),
49+
mri_normalize=dict(xor=['expert'],
50+
),
51+
mri_pretess=dict(xor=['expert'],
52+
),
53+
mri_remove_neck=dict(xor=['expert'],
54+
),
55+
mri_segment=dict(xor=['expert'],
56+
),
57+
mri_segstats=dict(xor=['expert'],
58+
),
59+
mri_tessellate=dict(xor=['expert'],
60+
),
61+
mri_watershed=dict(xor=['expert'],
62+
),
63+
mris_anatomical_stats=dict(xor=['expert'],
64+
),
65+
mris_ca_label=dict(xor=['expert'],
66+
),
67+
mris_fix_topology=dict(xor=['expert'],
68+
),
69+
mris_inflate=dict(xor=['expert'],
70+
),
71+
mris_make_surfaces=dict(xor=['expert'],
72+
),
73+
mris_register=dict(xor=['expert'],
74+
),
75+
mris_smooth=dict(xor=['expert'],
76+
),
77+
mris_sphere=dict(xor=['expert'],
78+
),
79+
mris_surf2vol=dict(xor=['expert'],
80+
),
81+
mrisp_paint=dict(xor=['expert'],
82+
),
3383
openmp=dict(argstr='-openmp %d',
3484
),
3585
parallel=dict(argstr='-parallel',
@@ -41,6 +91,8 @@ def test_ReconAll_inputs():
4191
genfile=True,
4292
hash_files=False,
4393
),
94+
talairach=dict(xor=['expert'],
95+
),
4496
terminal_output=dict(nohash=True,
4597
),
4698
use_T2=dict(argstr='-T2pial',

0 commit comments

Comments
 (0)