diff --git a/nipype/interfaces/freesurfer/preprocess.py b/nipype/interfaces/freesurfer/preprocess.py index abc6e5b51d..9c25f93e43 100644 --- a/nipype/interfaces/freesurfer/preprocess.py +++ b/nipype/interfaces/freesurfer/preprocess.py @@ -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.') @@ -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() @@ -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 @@ -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', diff --git a/nipype/interfaces/freesurfer/tests/test_auto_ReconAll.py b/nipype/interfaces/freesurfer/tests/test_auto_ReconAll.py index f86d934d7a..b0e89e9a3f 100644 --- a/nipype/interfaces/freesurfer/tests/test_auto_ReconAll.py +++ b/nipype/interfaces/freesurfer/tests/test_auto_ReconAll.py @@ -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', @@ -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',