From 4474b3a6ec2cd9c08ec89b754ccba62556f031d9 Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 30 Sep 2015 19:01:02 +0200 Subject: [PATCH 1/6] added antsBrainExtraction interface and test --- nipype/interfaces/ants/segmentation.py | 103 +++++++++++++++++- .../tests/test_auto_antsBrainExtraction.py | 62 +++++++++++ 2 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 nipype/interfaces/ants/tests/test_auto_antsBrainExtraction.py diff --git a/nipype/interfaces/ants/segmentation.py b/nipype/interfaces/ants/segmentation.py index 655741fd0e..5133f0b339 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,105 @@ 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 _format_arg(self, opt, spec, val): + if opt == 'anatomical_image': + retval = '-a %s' % val + return retval + if opt == 'brain_template': + retval = '-e %s' % val + return retval + if opt == 'brain_probability_mask': + retval = '-m %s' % val + return retval + if opt == 'out_prefix': + retval = '-o %s' % val + return retval + return super(ANTSCommand, self)._format_arg(opt, spec, val) + + def _run_interface(self, runtime, correct_return_codes=[0]): + runtime = super(antsBrainExtraction, self)._run_interface(runtime) + return runtime + + 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 From 9905a024512e9434e834672136d1ff17c96e3252 Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 30 Sep 2015 19:16:57 +0200 Subject: [PATCH 2/6] some corrections --- nipype/interfaces/ants/segmentation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/ants/segmentation.py b/nipype/interfaces/ants/segmentation.py index 5133f0b339..6b476a70b5 100644 --- a/nipype/interfaces/ants/segmentation.py +++ b/nipype/interfaces/ants/segmentation.py @@ -656,7 +656,7 @@ class antsBrainExtraction(ANTSCommand): >>> 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' From 8e5f0c40e822a10076e1a1a3ac51aae7d30c7d50 Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 30 Sep 2015 19:19:02 +0200 Subject: [PATCH 3/6] exposed import of brainextraction and corticalthickness --- nipype/interfaces/ants/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 55a530456b3b6fa58ae1ac5f7feecfb4dc49d3c0 Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 25 Oct 2015 23:22:58 +0100 Subject: [PATCH 4/6] corrected quotation mark --- nipype/interfaces/ants/segmentation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/ants/segmentation.py b/nipype/interfaces/ants/segmentation.py index 6b476a70b5..4cabfea042 100644 --- a/nipype/interfaces/ants/segmentation.py +++ b/nipype/interfaces/ants/segmentation.py @@ -655,7 +655,7 @@ class antsBrainExtraction(ANTSCommand): >>> 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_ + '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 From 4f89a05b430b1be5155a98fb85075639f8b75f11 Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 26 Oct 2015 19:55:12 +0100 Subject: [PATCH 5/6] took out unnecesary overload in format_args --- nipype/interfaces/ants/segmentation.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/nipype/interfaces/ants/segmentation.py b/nipype/interfaces/ants/segmentation.py index 4cabfea042..883e65e50a 100644 --- a/nipype/interfaces/ants/segmentation.py +++ b/nipype/interfaces/ants/segmentation.py @@ -662,18 +662,6 @@ class antsBrainExtraction(ANTSCommand): _cmd = 'antsBrainExtraction.sh' def _format_arg(self, opt, spec, val): - if opt == 'anatomical_image': - retval = '-a %s' % val - return retval - if opt == 'brain_template': - retval = '-e %s' % val - return retval - if opt == 'brain_probability_mask': - retval = '-m %s' % val - return retval - if opt == 'out_prefix': - retval = '-o %s' % val - return retval return super(ANTSCommand, self)._format_arg(opt, spec, val) def _run_interface(self, runtime, correct_return_codes=[0]): From 6c24260f1bb816cb7da4f3803d13aca0e59f97a1 Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 28 Oct 2015 01:35:05 +0100 Subject: [PATCH 6/6] took out unnecesary overloaded functions --- nipype/interfaces/ants/segmentation.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/nipype/interfaces/ants/segmentation.py b/nipype/interfaces/ants/segmentation.py index 883e65e50a..58fbb8b76d 100644 --- a/nipype/interfaces/ants/segmentation.py +++ b/nipype/interfaces/ants/segmentation.py @@ -661,13 +661,6 @@ class antsBrainExtraction(ANTSCommand): output_spec = antsBrainExtractionOutputSpec _cmd = 'antsBrainExtraction.sh' - def _format_arg(self, opt, spec, val): - return super(ANTSCommand, self)._format_arg(opt, spec, val) - - def _run_interface(self, runtime, correct_return_codes=[0]): - runtime = super(antsBrainExtraction, self)._run_interface(runtime) - return runtime - def _list_outputs(self): outputs = self._outputs().get() outputs['BrainExtractionMask'] = os.path.join(os.getcwd(),