diff --git a/nipype/interfaces/ants/__init__.py b/nipype/interfaces/ants/__init__.py index ac976ef034..0ca7ad545e 100644 --- a/nipype/interfaces/ants/__init__.py +++ b/nipype/interfaces/ants/__init__.py @@ -11,7 +11,7 @@ # Segmentation Programs -from .segmentation import Atropos, LaplacianThickness, N4BiasFieldCorrection, JointFusion +from .segmentation import Atropos, LaplacianThickness, N4BiasFieldCorrection, JointFusion, antsCorticalThickness, antsBrainExtraction # Visualization Programs from .visualization import ConvertScalarImageToRGB, CreateTiledMosaic diff --git a/nipype/interfaces/ants/segmentation.py b/nipype/interfaces/ants/segmentation.py index 655741fd0e..58fbb8b76d 100644 --- a/nipype/interfaces/ants/segmentation.py +++ b/nipype/interfaces/ants/segmentation.py @@ -465,7 +465,7 @@ class antsCorticalThicknessInputSpec(ANTSCommandInputSpec): 'Requires single thread computation for complete reproducibility.')) -class antsCorticalThicknessoutputSpec(TraitedSpec): +class antsCorticalThicknessOutputSpec(TraitedSpec): BrainExtractionMask = File(exists=True, desc='brain extraction mask') BrainSegmentation = File(exists=True, desc='brain segmentaion image') BrainSegmentationN4 = File(exists=True, desc='N4 corrected image') @@ -503,7 +503,7 @@ class antsCorticalThickness(ANTSCommand): """ input_spec = antsCorticalThicknessInputSpec - output_spec = antsCorticalThicknessoutputSpec + output_spec = antsCorticalThicknessOutputSpec _cmd = 'antsCorticalThickness.sh' def _format_arg(self, opt, spec, val): @@ -594,6 +594,86 @@ def _list_outputs(self): return outputs +class antsBrainExtractionInputSpec(ANTSCommandInputSpec): + dimension = traits.Enum(3, 2, argstr='-d %d', usedefault=True, + desc='image dimension (2 or 3)') + anatomical_image = File(exists=True, argstr='-a %s', + desc=('Structural image, typically T1. If more than one' + 'anatomical image is specified, subsequently specified' + 'images are used during the segmentation process. However,' + 'only the first image is used in the registration of priors.' + 'Our suggestion would be to specify the T1 as the first image.' + 'Anatomical template created using e.g. LPBA40 data set with' + 'buildtemplateparallel.sh in ANTs.'), + mandatory=True) + brain_template = File(exists=True, argstr='-e %s', + desc=('Anatomical template created using e.g. LPBA40 data set with' + 'buildtemplateparallel.sh in ANTs.'), + mandatory=True) + brain_probability_mask = File(exists=True, argstr='-m %s', + desc=('Brain probability mask created using e.g. LPBA40 data set which' + 'have brain masks defined, and warped to anatomical template and' + 'averaged resulting in a probability image.'), + copyfile=False, mandatory=True) + out_prefix = traits.Str('highres001_', argstr='-o %s', usedefault=True, + desc=('Prefix that is prepended to all output' + ' files (default = highress001_)')) + + extraction_registration_mask = File(exists=True, argstr='-f %s', + desc=('Mask (defined in the template space) used during' + ' registration for brain extraction.' + 'To limit the metric computation to a specific region.')) + image_suffix = traits.Str('nii.gz', desc=('any of standard ITK formats,' + ' nii.gz is default'), + argstr='-s %s', usedefault=True) + use_random_seeding = traits.Enum(0, 1, argstr='-u %d', + desc=('Use random number generated from system clock in Atropos' + '(default = 1)')) + keep_temporary_files = traits.Int(argstr='-k %d', + desc='Keep brain extraction/segmentation warps, etc (default = 0).') + use_floatingpoint_precision = traits.Enum(0, 1, argstr='-q %d', + desc=('Use floating point precision ' + 'in registrations (default = 0)')) + debug = traits.Bool(argstr='-z 1', + desc=('If > 0, runs a faster version of the script.' + 'Only for testing. Implies -u 0.' + 'Requires single thread computation for complete reproducibility.')) + + +class antsBrainExtractionOutputSpec(TraitedSpec): + BrainExtractionMask = File(exists=True, desc='brain extraction mask') + BrainExtractionBrain = File(exists=True, desc='brain extraction image') + +class antsBrainExtraction(ANTSCommand): + """ + Examples + -------- + >>> from nipype.interfaces.ants.segmentation import antsBrainExtraction + >>> brainextraction = antsBrainExtraction() + >>> brainextraction.inputs.dimension = 3 + >>> brainextraction.inputs.anatomical_image ='T1.nii.gz' + >>> brainextraction.inputs.brain_template = 'study_template.nii.gz' + >>> brainextraction.inputs.brain_probability_mask ='ProbabilityMaskOfStudyTemplate.nii.gz' + >>> brainextraction.cmdline + 'antsBrainExtraction.sh -a T1.nii.gz -m ProbabilityMaskOfStudyTemplate.nii.gz -e study_template.nii.gz -d 3 -s nii.gz -o highres001_' + """ + input_spec = antsBrainExtractionInputSpec + output_spec = antsBrainExtractionOutputSpec + _cmd = 'antsBrainExtraction.sh' + + def _list_outputs(self): + outputs = self._outputs().get() + outputs['BrainExtractionMask'] = os.path.join(os.getcwd(), + self.inputs.out_prefix + + 'BrainExtractionMask.' + + self.inputs.image_suffix) + outputs['BrainExtractionBrain'] = os.path.join(os.getcwd(), + self.inputs.out_prefix + + 'BrainExtractionBrain.' + + self.inputs.image_suffix) + return outputs + + class JointFusionInputSpec(ANTSCommandInputSpec): dimension = traits.Enum(3, 2, 4, argstr='%d', position=0, usedefault=True, mandatory=True, diff --git a/nipype/interfaces/ants/tests/test_auto_antsBrainExtraction.py b/nipype/interfaces/ants/tests/test_auto_antsBrainExtraction.py new file mode 100644 index 0000000000..66588a35a4 --- /dev/null +++ b/nipype/interfaces/ants/tests/test_auto_antsBrainExtraction.py @@ -0,0 +1,62 @@ +# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT +from nipype.testing import assert_equal +from nipype.interfaces.ants.segmentation import antsBrainExtraction + + +def test_antsBrainExtraction_inputs(): + input_map = dict(anatomical_image=dict(argstr='-a %s', + mandatory=True, + ), + args=dict(argstr='%s', + ), + brain_probability_mask=dict(argstr='-m %s', + copyfile=False, + mandatory=True, + ), + brain_template=dict(argstr='-e %s', + mandatory=True, + ), + debug=dict(argstr='-z 1', + ), + dimension=dict(argstr='-d %d', + usedefault=True, + ), + environ=dict(nohash=True, + usedefault=True, + ), + extraction_registration_mask=dict(argstr='-f %s', + ), + ignore_exception=dict(nohash=True, + usedefault=True, + ), + image_suffix=dict(argstr='-s %s', + usedefault=True, + ), + keep_temporary_files=dict(argstr='-k %d', + ), + out_prefix=dict(argstr='-o %s', + usedefault=True, + ), + terminal_output=dict(nohash=True, + ), + use_floatingpoint_precision=dict(argstr='-q %d', + ), + use_random_seeding=dict(argstr='-u %d', + ), + ) + inputs = antsBrainExtraction.input_spec() + + for key, metadata in input_map.items(): + for metakey, value in metadata.items(): + yield assert_equal, getattr(inputs.traits()[key], metakey), value + + +def test_antsBrainExtraction_outputs(): + output_map = dict(BrainExtractionMask=dict(), + BrainExtractionBrain=dict(), + ) + outputs = antsBrainExtraction.output_spec() + + for key, metadata in output_map.items(): + for metakey, value in metadata.items(): + yield assert_equal, getattr(outputs.traits()[key], metakey), value