Skip to content

ENH: Add -hires and -expert flags to ReconAll #1857

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 4, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions nipype/interfaces/freesurfer/preprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -632,10 +632,42 @@ class ReconAllInputSpec(CommandLineInputSpec):
desc="Number of processors to use in parallel")
parallel = traits.Bool(argstr="-parallel",
desc="Enable parallel execution")
hires = traits.Bool(argstr="-hires", min_ver='6.0.0',
desc="Conform to minimum voxel size (for voxels < 1mm)")
expert = File(exists=True, argstr='-expert %s',
desc="Set parameters using expert file")
subjects_dir = Directory(exists=True, argstr='-sd %s', hash_files=False,
desc='path to subjects directory', genfile=True)
flags = traits.Str(argstr='%s', desc='additional parameters')

# Expert options
talairach = traits.Str(desc="Flags to pass to talairach commands", xor=['expert'])
mri_normalize = traits.Str(desc="Flags to pass to mri_normalize commands", xor=['expert'])
mri_watershed = traits.Str(desc="Flags to pass to mri_watershed commands", xor=['expert'])
mri_em_register = traits.Str(desc="Flags to pass to mri_em_register commands", xor=['expert'])
mri_ca_normalize = traits.Str(desc="Flags to pass to mri_ca_normalize commands", xor=['expert'])
mri_ca_register = traits.Str(desc="Flags to pass to mri_ca_register commands", xor=['expert'])
mri_remove_neck = traits.Str(desc="Flags to pass to mri_remove_neck commands", xor=['expert'])
mri_ca_label = traits.Str(desc="Flags to pass to mri_ca_label commands", xor=['expert'])
mri_segstats = traits.Str(desc="Flags to pass to mri_segstats commands", xor=['expert'])
mri_mask = traits.Str(desc="Flags to pass to mri_mask commands", xor=['expert'])
mri_segment = traits.Str(desc="Flags to pass to mri_segment commands", xor=['expert'])
mri_edit_wm_with_aseg = traits.Str(desc="Flags to pass to mri_edit_wm_with_aseg commands", xor=['expert'])
mri_pretess = traits.Str(desc="Flags to pass to mri_pretess commands", xor=['expert'])
mri_fill = traits.Str(desc="Flags to pass to mri_fill commands", xor=['expert'])
mri_tessellate = traits.Str(desc="Flags to pass to mri_tessellate commands", xor=['expert'])
mris_smooth = traits.Str(desc="Flags to pass to mri_smooth commands", xor=['expert'])
mris_inflate = traits.Str(desc="Flags to pass to mri_inflate commands", xor=['expert'])
mris_sphere = traits.Str(desc="Flags to pass to mris_sphere commands", xor=['expert'])
mris_fix_topology = traits.Str(desc="Flags to pass to mris_fix_topology commands", xor=['expert'])
mris_make_surfaces = traits.Str(desc="Flags to pass to mris_make_surfaces commands", xor=['expert'])
mris_surf2vol = traits.Str(desc="Flags to pass to mris_surf2vol commands", xor=['expert'])
mris_register = traits.Str(desc="Flags to pass to mris_register commands", xor=['expert'])
mrisp_paint = traits.Str(desc="Flags to pass to mrisp_paint commands", xor=['expert'])
mris_ca_label = traits.Str(desc="Flags to pass to mris_ca_label commands", xor=['expert'])
mris_anatomical_stats = traits.Str(desc="Flags to pass to mris_anatomical_stats commands", xor=['expert'])
mri_aparc2aseg = traits.Str(desc="Flags to pass to mri_aparc2aseg commands", xor=['expert'])


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

_steps = _autorecon1_steps + _autorecon2_steps + _autorecon3_steps

_binaries = ['talairach', 'mri_normalize', 'mri_watershed',
'mri_em_register', 'mri_ca_normalize', 'mri_ca_register',
'mri_remove_neck', 'mri_ca_label', 'mri_segstats',
'mri_mask', 'mri_segment', 'mri_edit_wm_with_aseg',
'mri_pretess', 'mri_fill', 'mri_tessellate', 'mris_smooth',
'mris_inflate', 'mris_sphere', 'mris_fix_topology',
'mris_make_surfaces', 'mris_surf2vol', 'mris_register',
'mrisp_paint', 'mris_ca_label', 'mris_anatomical_stats',
'mri_aparc2aseg']

def _gen_subjects_dir(self):
return os.getcwd()

Expand Down Expand Up @@ -900,6 +942,11 @@ def _format_arg(self, name, trait_spec, value):
@property
def cmdline(self):
cmd = super(ReconAll, self).cmdline

# Adds '-expert' flag if expert flags are passed
# Mutually exclusive with 'expert' input parameter
cmd += self._prep_expert_file()

if not self._is_resuming():
return cmd
subjects_dir = self.inputs.subjects_dir
Expand Down Expand Up @@ -933,6 +980,24 @@ def cmdline(self):
iflogger.info('resume recon-all : %s' % cmd)
return cmd

def _prep_expert_file(self):
if isdefined(self.inputs.expert):
return ''

lines = []
for binary in self._binaries:
args = getattr(self.inputs, binary)
if isdefined(args):
lines.append('{} {}\n'.format(binary, args))

if lines == []:
return ''

expert_fname = os.path.abspath('expert.opts')
with open(expert_fname, 'w') as fobj:
fobj.write(''.join(lines))
return ' -expert {}'.format(expert_fname)


class BBRegisterInputSpec(FSTraitedSpec):
subject_id = traits.Str(argstr='--s %s',
Expand Down
57 changes: 57 additions & 0 deletions nipype/interfaces/freesurfer/tests/test_auto_ReconAll.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,68 @@ def test_ReconAll_inputs():
environ=dict(nohash=True,
usedefault=True,
),
expert=dict(argstr='-expert %s',
),
flags=dict(argstr='%s',
),
hemi=dict(argstr='-hemi %s',
),
hires=dict(argstr='-hires',
min_ver='6.0.0',
),
ignore_exception=dict(nohash=True,
usedefault=True,
),
mri_aparc2aseg=dict(xor=['expert'],
),
mri_ca_label=dict(xor=['expert'],
),
mri_ca_normalize=dict(xor=['expert'],
),
mri_ca_register=dict(xor=['expert'],
),
mri_edit_wm_with_aseg=dict(xor=['expert'],
),
mri_em_register=dict(xor=['expert'],
),
mri_fill=dict(xor=['expert'],
),
mri_mask=dict(xor=['expert'],
),
mri_normalize=dict(xor=['expert'],
),
mri_pretess=dict(xor=['expert'],
),
mri_remove_neck=dict(xor=['expert'],
),
mri_segment=dict(xor=['expert'],
),
mri_segstats=dict(xor=['expert'],
),
mri_tessellate=dict(xor=['expert'],
),
mri_watershed=dict(xor=['expert'],
),
mris_anatomical_stats=dict(xor=['expert'],
),
mris_ca_label=dict(xor=['expert'],
),
mris_fix_topology=dict(xor=['expert'],
),
mris_inflate=dict(xor=['expert'],
),
mris_make_surfaces=dict(xor=['expert'],
),
mris_register=dict(xor=['expert'],
),
mris_smooth=dict(xor=['expert'],
),
mris_sphere=dict(xor=['expert'],
),
mris_surf2vol=dict(xor=['expert'],
),
mrisp_paint=dict(xor=['expert'],
),
openmp=dict(argstr='-openmp %d',
),
parallel=dict(argstr='-parallel',
Expand All @@ -36,6 +91,8 @@ def test_ReconAll_inputs():
genfile=True,
hash_files=False,
),
talairach=dict(xor=['expert'],
),
terminal_output=dict(nohash=True,
),
use_T2=dict(argstr='-T2pial',
Expand Down