Skip to content

Commit 07a75a6

Browse files
authored
Merge pull request #1857 from effigies/reconall_newparams
ENH: Add -hires and -expert flags to ReconAll
2 parents dd4f101 + 2aa325e commit 07a75a6

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed

nipype/interfaces/freesurfer/preprocess.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,10 +632,42 @@ class ReconAllInputSpec(CommandLineInputSpec):
632632
desc="Number of processors to use in parallel")
633633
parallel = traits.Bool(argstr="-parallel",
634634
desc="Enable parallel execution")
635+
hires = traits.Bool(argstr="-hires", min_ver='6.0.0',
636+
desc="Conform to minimum voxel size (for voxels < 1mm)")
637+
expert = File(exists=True, argstr='-expert %s',
638+
desc="Set parameters using expert file")
635639
subjects_dir = Directory(exists=True, argstr='-sd %s', hash_files=False,
636640
desc='path to subjects directory', genfile=True)
637641
flags = traits.Str(argstr='%s', desc='additional parameters')
638642

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+
639671

640672
class ReconAllOutputSpec(FreeSurferSource.output_spec):
641673
subjects_dir = Directory(exists=True, desc='Freesurfer subjects directory.')
@@ -851,6 +883,16 @@ class ReconAll(CommandLine):
851883

852884
_steps = _autorecon1_steps + _autorecon2_steps + _autorecon3_steps
853885

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+
854896
def _gen_subjects_dir(self):
855897
return os.getcwd()
856898

@@ -900,6 +942,11 @@ def _format_arg(self, name, trait_spec, value):
900942
@property
901943
def cmdline(self):
902944
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+
903950
if not self._is_resuming():
904951
return cmd
905952
subjects_dir = self.inputs.subjects_dir
@@ -933,6 +980,24 @@ def cmdline(self):
933980
iflogger.info('resume recon-all : %s' % cmd)
934981
return cmd
935982

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+
9361001

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

nipype/interfaces/freesurfer/tests/test_auto_ReconAll.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,68 @@ def test_ReconAll_inputs():
1818
environ=dict(nohash=True,
1919
usedefault=True,
2020
),
21+
expert=dict(argstr='-expert %s',
22+
),
2123
flags=dict(argstr='%s',
2224
),
2325
hemi=dict(argstr='-hemi %s',
2426
),
27+
hires=dict(argstr='-hires',
28+
min_ver='6.0.0',
29+
),
2530
ignore_exception=dict(nohash=True,
2631
usedefault=True,
2732
),
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+
),
2883
openmp=dict(argstr='-openmp %d',
2984
),
3085
parallel=dict(argstr='-parallel',
@@ -36,6 +91,8 @@ def test_ReconAll_inputs():
3691
genfile=True,
3792
hash_files=False,
3893
),
94+
talairach=dict(xor=['expert'],
95+
),
3996
terminal_output=dict(nohash=True,
4097
),
4198
use_T2=dict(argstr='-T2pial',

0 commit comments

Comments
 (0)