From 83e0aa9b16c3b146a4d2b35049c24fcae068c805 Mon Sep 17 00:00:00 2001 From: fliem Date: Thu, 3 Mar 2016 20:00:11 +0100 Subject: [PATCH 01/10] wip: added wrapper for antsRegistrationSyNQuick.sh --- nipype/interfaces/ants/registration.py | 86 ++++++++++++++++++++++++++ nipype/interfaces/ants/syn_test.py | 1 + 2 files changed, 87 insertions(+) create mode 100644 nipype/interfaces/ants/syn_test.py diff --git a/nipype/interfaces/ants/registration.py b/nipype/interfaces/ants/registration.py index 89af092a33..beda7b6977 100644 --- a/nipype/interfaces/ants/registration.py +++ b/nipype/interfaces/ants/registration.py @@ -975,3 +975,89 @@ def _list_outputs(self): if len(self.inputs.save_state): outputs['save_state'] = os.path.abspath(self.inputs.save_state) return outputs + + + + + +class RegistrationSynQuickInputSpec(ANTSCommandInputSpec): + dimension = traits.Enum(3, 2, argstr='-d %d', + usedefault=True, desc='image dimension (2 or 3)') + fixed_image = InputMultiPath(File(exists=True), mandatory=True, argstr='-f %s', + desc='Fixed image or source image or reference image') + moving_image = InputMultiPath(File(exists=True), mandatory=True, argstr='-m %s', + desc='Moving image or target image') + output_prefix = traits.Str("transform", usedefault=True, argstr='-o %s', + desc="A prefix that is prepended to all output files") + + # todo ANTSCommandInputSpec already has this, but I can't figure out how to set it without defining it again + num_threads = traits.Int(default_value=1, desc='Number of threads (default = 1)', argstr='-n %d') + + transform_type = traits.Enum('s', 't', 'r', 'a', 'sr', 'b', 'br', argstr='-t %s', + desc='transform type\n\ + t: translation\ + r: rigid \n\ + a: rigid + affine\n\ + s: rigid + affine + deformable syn (default)\ + sr: rigid + deformable syn\ + b: rigid + affine + deformable b-spline syn\n\ + br: rigid + deformable b-spline syn', + usedefault=True) + + use_histogram_matching = traits.Bool(default=False, argstr='-j %s', + desc='use histogram matching') + histogram_bins = traits.Int(default_value=32, argstr='-r %d', + desc='histogram bins for mutual information in SyN stage \ + (default = 32)') + spline_distance = traits.Int(default_value=26, argstr='-s %d', + desc='spline distance for deformable B-spline SyN transform \ + (default = 26)') + precision_type = traits.Enum('double', 'float', argstr='-p %s', + desc='precision type (default = double)', usedefault=True) + + +class RegistrationSynQuickOutputSpec(TraitedSpec): + warped_image = File(exists=True, desc="Warped image") + inverse_warped_image = File(exists=True, desc="Inverse warped image") + out_matrix = File(exists=True, desc='Affine matrix') + forward_warp_field = File(exists=True, desc='Forward warp field') + inverse_warp_field = File(exists=True, desc='Inverse warp field') + + +class RegistrationSynQuick(ANTSCommand): + """ + Examples + -------- + + """ + # todo examples + + _cmd = 'antsRegistrationSynQuick.sh' + input_spec = RegistrationSynQuickInputSpec + output_spec = RegistrationSynQuickOutputSpec + + def _format_arg(self, name, spec, value): + if name == 'use_histogram_matching': + if isdefined(self.inputs.use_histogram_matching): + return spec.argstr % {False: '0', True: '1'}[value] + + elif name == 'precision_type': + if isdefined(self.inputs.precision_type): + return spec.argstr % {'float': 'f', 'double': 'd'}[value] + return super(RegistrationSynQuick, self)._format_arg(name, spec, value) + + def _list_outputs(self): + outputs = self.output_spec().get() + outputs['warped_image'] = os.path.abspath(self.inputs.output_prefix + 'Warped.nii.gz') + outputs['inverse_warped_image'] = os.path.abspath( + self.inputs.output_prefix + 'InverseWarped.nii.gz') + outputs['out_matrix'] = os.path.abspath(self.inputs.output_prefix + '0GenericAffine.mat') + + # todo in the case of linear transformation-only there won't be fields. is there a more elegant way to specify that? + if self.inputs.transform_type not in ('t', 'r', 'a'): + outputs['forward_warp_field'] = os.path.abspath( + self.inputs.output_prefix + '1Warp.nii.gz') + outputs['inverse_warp_field'] = os.path.abspath( + self.inputs.output_prefix + '1InverseWarp.nii.gz') + return outputs + diff --git a/nipype/interfaces/ants/syn_test.py b/nipype/interfaces/ants/syn_test.py new file mode 100644 index 0000000000..25e255a40c --- /dev/null +++ b/nipype/interfaces/ants/syn_test.py @@ -0,0 +1 @@ +__author__ = 'franzliem' From 26aa5d5bd46431d2c935202932f042504da98ae1 Mon Sep 17 00:00:00 2001 From: fliem Date: Thu, 3 Mar 2016 20:21:38 +0100 Subject: [PATCH 02/10] removed wrongly commited file --- nipype/interfaces/ants/syn_test.py | 1 - 1 file changed, 1 deletion(-) delete mode 100644 nipype/interfaces/ants/syn_test.py diff --git a/nipype/interfaces/ants/syn_test.py b/nipype/interfaces/ants/syn_test.py deleted file mode 100644 index 25e255a40c..0000000000 --- a/nipype/interfaces/ants/syn_test.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'franzliem' From 7af657a6f641beba85412eaa22efb0cd82bad042 Mon Sep 17 00:00:00 2001 From: Dorota Jarecka Date: Thu, 21 Dec 2017 13:23:07 -0500 Subject: [PATCH 03/10] applying suggestions from Oscar --- nipype/interfaces/ants/registration.py | 35 +++++++++++--------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/nipype/interfaces/ants/registration.py b/nipype/interfaces/ants/registration.py index 3c746cafda..3e44158dff 100644 --- a/nipype/interfaces/ants/registration.py +++ b/nipype/interfaces/ants/registration.py @@ -1352,9 +1352,6 @@ def aggregate_outputs(self, runtime=None, needed_outputs=None): return outputs - - - class RegistrationSynQuickInputSpec(ANTSCommandInputSpec): dimension = traits.Enum(3, 2, argstr='-d %d', usedefault=True, desc='image dimension (2 or 3)') @@ -1362,24 +1359,25 @@ class RegistrationSynQuickInputSpec(ANTSCommandInputSpec): desc='Fixed image or source image or reference image') moving_image = InputMultiPath(File(exists=True), mandatory=True, argstr='-m %s', desc='Moving image or target image') - output_prefix = traits.Str("transform", usedefault=True, argstr='-o %s', - desc="A prefix that is prepended to all output files") + output_prefix = Str("transform", usedefault=True, argstr='-o %s', + desc="A prefix that is prepended to all output files") # todo ANTSCommandInputSpec already has this, but I can't figure out how to set it without defining it again num_threads = traits.Int(default_value=1, desc='Number of threads (default = 1)', argstr='-n %d') transform_type = traits.Enum('s', 't', 'r', 'a', 'sr', 'b', 'br', argstr='-t %s', - desc='transform type\n\ - t: translation\ - r: rigid \n\ - a: rigid + affine\n\ - s: rigid + affine + deformable syn (default)\ - sr: rigid + deformable syn\ - b: rigid + affine + deformable b-spline syn\n\ - br: rigid + deformable b-spline syn', + desc=""" + transform type + t: translation + r: rigid + a: rigid + affine + s: rigid + affine + deformable syn (default) + sr: rigid + deformable syn + b: rigid + affine + deformable b-spline syn + br: rigid + deformable b-spline syn""", usedefault=True) - use_histogram_matching = traits.Bool(default=False, argstr='-j %s', + use_histogram_matching = traits.Bool(False, argstr='-j %d', desc='use histogram matching') histogram_bins = traits.Int(default_value=32, argstr='-r %d', desc='histogram bins for mutual information in SyN stage \ @@ -1412,13 +1410,8 @@ class RegistrationSynQuick(ANTSCommand): output_spec = RegistrationSynQuickOutputSpec def _format_arg(self, name, spec, value): - if name == 'use_histogram_matching': - if isdefined(self.inputs.use_histogram_matching): - return spec.argstr % {False: '0', True: '1'}[value] - - elif name == 'precision_type': - if isdefined(self.inputs.precision_type): - return spec.argstr % {'float': 'f', 'double': 'd'}[value] + if name == 'precision_type': + return spec.argstr % value[0] return super(RegistrationSynQuick, self)._format_arg(name, spec, value) def _list_outputs(self): From d256a5932245e59a1d545927728cd1ec532c34d2 Mon Sep 17 00:00:00 2001 From: Dorota Jarecka Date: Fri, 22 Dec 2017 05:13:55 -0500 Subject: [PATCH 04/10] running check-before-commit --- doc/users/config_file.rst | 2 +- doc/users/plugins.rst | 4 +- .../ants/tests/test_auto_Registration.py | 157 ------------------ .../tests/test_auto_RegistrationSynQuick.py | 64 +++++++ .../niftyseg/tests/test_auto_PatchMatch.py | 61 ------- 5 files changed, 67 insertions(+), 221 deletions(-) delete mode 100644 nipype/interfaces/ants/tests/test_auto_Registration.py create mode 100644 nipype/interfaces/ants/tests/test_auto_RegistrationSynQuick.py delete mode 100644 nipype/interfaces/niftyseg/tests/test_auto_PatchMatch.py diff --git a/doc/users/config_file.rst b/doc/users/config_file.rst index f53a2900db..279dc1aadd 100644 --- a/doc/users/config_file.rst +++ b/doc/users/config_file.rst @@ -170,7 +170,7 @@ Resource Monitor Indicates where the summary file collecting all profiling information from the resource monitor should be stored after execution of a workflow. The ``summary_file`` does not apply to interfaces run independently. - (unset by default, in which case the summary file will be written out to + (unset by default, in which case the summary file will be written out to ``/resource_monitor.json`` of the top-level workflow). *summary_append* diff --git a/doc/users/plugins.rst b/doc/users/plugins.rst index 501e7aa1d6..e655e5f6db 100644 --- a/doc/users/plugins.rst +++ b/doc/users/plugins.rst @@ -82,9 +82,9 @@ Optional arguments:: exceed the total amount of resources available (memory and threads), when ``False`` (default), only a warning will be issued. - maxtasksperchild : number of nodes to run on each process before refreshing + maxtasksperchild : number of nodes to run on each process before refreshing the worker (default: 10). - + To distribute processing on a multicore machine, simply call:: diff --git a/nipype/interfaces/ants/tests/test_auto_Registration.py b/nipype/interfaces/ants/tests/test_auto_Registration.py deleted file mode 100644 index ea9bc02e79..0000000000 --- a/nipype/interfaces/ants/tests/test_auto_Registration.py +++ /dev/null @@ -1,157 +0,0 @@ -# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT -from __future__ import unicode_literals -from ..registration import Registration - - -def test_Registration_inputs(): - input_map = dict(args=dict(argstr='%s', - ), - collapse_output_transforms=dict(argstr='--collapse-output-transforms %d', - usedefault=True, - ), - convergence_threshold=dict(requires=['number_of_iterations'], - usedefault=True, - ), - convergence_window_size=dict(requires=['convergence_threshold'], - usedefault=True, - ), - dimension=dict(argstr='--dimensionality %d', - usedefault=True, - ), - environ=dict(nohash=True, - usedefault=True, - ), - fixed_image=dict(mandatory=True, - ), - fixed_image_mask=dict(argstr='%s', - max_ver='2.1.0', - xor=['fixed_image_masks'], - ), - fixed_image_masks=dict(min_ver='2.2.0', - xor=['fixed_image_mask'], - ), - float=dict(argstr='--float %d', - ), - ignore_exception=dict(deprecated='1.0.0', - nohash=True, - usedefault=True, - ), - initial_moving_transform=dict(argstr='%s', - exists=True, - xor=['initial_moving_transform_com'], - ), - initial_moving_transform_com=dict(argstr='%s', - xor=['initial_moving_transform'], - ), - initialize_transforms_per_stage=dict(argstr='--initialize-transforms-per-stage %d', - usedefault=True, - ), - interpolation=dict(argstr='%s', - usedefault=True, - ), - interpolation_parameters=dict(), - invert_initial_moving_transform=dict(requires=['initial_moving_transform'], - xor=['initial_moving_transform_com'], - ), - metric=dict(mandatory=True, - ), - metric_item_trait=dict(), - metric_stage_trait=dict(), - metric_weight=dict(mandatory=True, - requires=['metric'], - usedefault=True, - ), - metric_weight_item_trait=dict(), - metric_weight_stage_trait=dict(), - moving_image=dict(mandatory=True, - ), - moving_image_mask=dict(max_ver='2.1.0', - requires=['fixed_image_mask'], - xor=['moving_image_masks'], - ), - moving_image_masks=dict(min_ver='2.2.0', - xor=['moving_image_mask'], - ), - num_threads=dict(nohash=True, - usedefault=True, - ), - number_of_iterations=dict(), - output_inverse_warped_image=dict(hash_files=False, - requires=['output_warped_image'], - ), - output_transform_prefix=dict(argstr='%s', - usedefault=True, - ), - output_warped_image=dict(hash_files=False, - ), - radius_bins_item_trait=dict(), - radius_bins_stage_trait=dict(), - radius_or_number_of_bins=dict(requires=['metric_weight'], - usedefault=True, - ), - restore_state=dict(argstr='--restore-state %s', - ), - restrict_deformation=dict(), - sampling_percentage=dict(requires=['sampling_strategy'], - ), - sampling_percentage_item_trait=dict(), - sampling_percentage_stage_trait=dict(), - sampling_strategy=dict(requires=['metric_weight'], - ), - sampling_strategy_item_trait=dict(), - sampling_strategy_stage_trait=dict(), - save_state=dict(argstr='--save-state %s', - ), - shrink_factors=dict(mandatory=True, - ), - sigma_units=dict(requires=['smoothing_sigmas'], - ), - smoothing_sigmas=dict(mandatory=True, - ), - terminal_output=dict(deprecated='1.0.0', - nohash=True, - ), - transform_parameters=dict(), - transforms=dict(argstr='%s', - mandatory=True, - ), - use_estimate_learning_rate_once=dict(), - use_histogram_matching=dict(usedefault=True, - ), - verbose=dict(argstr='-v', - ), - winsorize_lower_quantile=dict(argstr='%s', - usedefault=True, - ), - winsorize_upper_quantile=dict(argstr='%s', - usedefault=True, - ), - write_composite_transform=dict(argstr='--write-composite-transform %d', - usedefault=True, - ), - ) - inputs = Registration.input_spec() - - for key, metadata in list(input_map.items()): - for metakey, value in list(metadata.items()): - assert getattr(inputs.traits()[key], metakey) == value - - -def test_Registration_outputs(): - output_map = dict(composite_transform=dict(), - elapsed_time=dict(), - forward_invert_flags=dict(), - forward_transforms=dict(), - inverse_composite_transform=dict(), - inverse_warped_image=dict(), - metric_value=dict(), - reverse_invert_flags=dict(), - reverse_transforms=dict(), - save_state=dict(), - warped_image=dict(), - ) - outputs = Registration.output_spec() - - for key, metadata in list(output_map.items()): - for metakey, value in list(metadata.items()): - assert getattr(outputs.traits()[key], metakey) == value diff --git a/nipype/interfaces/ants/tests/test_auto_RegistrationSynQuick.py b/nipype/interfaces/ants/tests/test_auto_RegistrationSynQuick.py new file mode 100644 index 0000000000..e781f27133 --- /dev/null +++ b/nipype/interfaces/ants/tests/test_auto_RegistrationSynQuick.py @@ -0,0 +1,64 @@ +# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT +from __future__ import unicode_literals +from ..registration import RegistrationSynQuick + + +def test_RegistrationSynQuick_inputs(): + input_map = dict(args=dict(argstr='%s', + ), + dimension=dict(argstr='-d %d', + usedefault=True, + ), + environ=dict(nohash=True, + usedefault=True, + ), + fixed_image=dict(argstr='-f %s', + mandatory=True, + ), + histogram_bins=dict(argstr='-r %d', + ), + ignore_exception=dict(deprecated='1.0.0', + nohash=True, + usedefault=True, + ), + moving_image=dict(argstr='-m %s', + mandatory=True, + ), + num_threads=dict(argstr='-n %d', + ), + output_prefix=dict(argstr='-o %s', + usedefault=True, + ), + precision_type=dict(argstr='-p %s', + usedefault=True, + ), + spline_distance=dict(argstr='-s %d', + ), + terminal_output=dict(deprecated='1.0.0', + nohash=True, + ), + transform_type=dict(argstr='-t %s', + usedefault=True, + ), + use_histogram_matching=dict(argstr='-j %d', + ), + ) + inputs = RegistrationSynQuick.input_spec() + + for key, metadata in list(input_map.items()): + for metakey, value in list(metadata.items()): + assert getattr(inputs.traits()[key], metakey) == value + + +def test_RegistrationSynQuick_outputs(): + output_map = dict(forward_warp_field=dict(), + inverse_warp_field=dict(), + inverse_warped_image=dict(), + out_matrix=dict(), + warped_image=dict(), + ) + outputs = RegistrationSynQuick.output_spec() + + for key, metadata in list(output_map.items()): + for metakey, value in list(metadata.items()): + assert getattr(outputs.traits()[key], metakey) == value diff --git a/nipype/interfaces/niftyseg/tests/test_auto_PatchMatch.py b/nipype/interfaces/niftyseg/tests/test_auto_PatchMatch.py deleted file mode 100644 index ba6ea5a40c..0000000000 --- a/nipype/interfaces/niftyseg/tests/test_auto_PatchMatch.py +++ /dev/null @@ -1,61 +0,0 @@ -# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT -from __future__ import unicode_literals -from ..patchmatch import PatchMatch - - -def test_PatchMatch_inputs(): - input_map = dict(args=dict(argstr='%s', - ), - cs_size=dict(argstr='-cs %i', - ), - database_file=dict(argstr='-db %s', - mandatory=True, - position=3, - ), - environ=dict(nohash=True, - usedefault=True, - ), - ignore_exception=dict(deprecated='1.0.0', - nohash=True, - usedefault=True, - ), - in_file=dict(argstr='-i %s', - mandatory=True, - position=1, - ), - it_num=dict(argstr='-it %i', - ), - mask_file=dict(argstr='-m %s', - mandatory=True, - position=2, - ), - match_num=dict(argstr='-match %i', - ), - out_file=dict(argstr='-o %s', - name_source=['in_file'], - name_template='%s_pm.nii.gz', - position=4, - ), - patch_size=dict(argstr='-size %i', - ), - pm_num=dict(argstr='-pm %i', - ), - terminal_output=dict(deprecated='1.0.0', - nohash=True, - ), - ) - inputs = PatchMatch.input_spec() - - for key, metadata in list(input_map.items()): - for metakey, value in list(metadata.items()): - assert getattr(inputs.traits()[key], metakey) == value - - -def test_PatchMatch_outputs(): - output_map = dict(out_file=dict(), - ) - outputs = PatchMatch.output_spec() - - for key, metadata in list(output_map.items()): - for metakey, value in list(metadata.items()): - assert getattr(outputs.traits()[key], metakey) == value From cc72fbe4d7341b1146df4f000d42f18635510410 Mon Sep 17 00:00:00 2001 From: Dorota Jarecka Date: Fri, 22 Dec 2017 06:24:14 -0500 Subject: [PATCH 05/10] small pep8 changes --- nipype/interfaces/ants/registration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/ants/registration.py b/nipype/interfaces/ants/registration.py index 3e44158dff..82d100ae0b 100644 --- a/nipype/interfaces/ants/registration.py +++ b/nipype/interfaces/ants/registration.py @@ -1031,6 +1031,7 @@ def _format_winsorize_image_intensities(self): self._quantilesDone = True return '--winsorize-image-intensities [ %s, %s ]' % (self.inputs.winsorize_lower_quantile, self.inputs.winsorize_upper_quantile) + def _get_initial_transform_filenames(self): n_transforms = len(self.inputs.initial_moving_transform) @@ -1428,4 +1429,3 @@ def _list_outputs(self): outputs['inverse_warp_field'] = os.path.abspath( self.inputs.output_prefix + '1InverseWarp.nii.gz') return outputs - From fbf24fa00c048e49e4b1f081e3cb81d4fb13173f Mon Sep 17 00:00:00 2001 From: Dorota Jarecka Date: Tue, 20 Feb 2018 16:38:37 -0500 Subject: [PATCH 06/10] adding an example to RegistrationSynQuick; using LOCAL_DEFAULT_NUMBER_OF_THREADS env var as num_threads --- nipype/interfaces/ants/__init__.py | 3 ++- nipype/interfaces/ants/registration.py | 25 +++++++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/nipype/interfaces/ants/__init__.py b/nipype/interfaces/ants/__init__.py index 0de5c1646f..5ce3da60a3 100644 --- a/nipype/interfaces/ants/__init__.py +++ b/nipype/interfaces/ants/__init__.py @@ -4,7 +4,8 @@ """Top-level namespace for ants.""" # Registraiton programs -from .registration import ANTS, Registration, MeasureImageSimilarity +from .registration import (ANTS, Registration, RegistrationSynQuick, + MeasureImageSimilarity) # Resampling Programs from .resampling import (ApplyTransforms, ApplyTransformsToPoints, diff --git a/nipype/interfaces/ants/registration.py b/nipype/interfaces/ants/registration.py index 8f3e8e5be3..73ab890979 100644 --- a/nipype/interfaces/ants/registration.py +++ b/nipype/interfaces/ants/registration.py @@ -17,6 +17,11 @@ from ..base import TraitedSpec, File, Str, traits, InputMultiPath, isdefined from .base import ANTSCommand, ANTSCommandInputSpec +try: + LOCAL_DEFAULT_NUMBER_OF_THREADS = int(os.getenv("LOCAL_DEFAULT_NUMBER_OF_THREADS")) +except TypeError: + LOCAL_DEFAULT_NUMBER_OF_THREADS = 1 + class ANTSInputSpec(ANTSCommandInputSpec): dimension = traits.Enum( @@ -1516,9 +1521,8 @@ class RegistrationSynQuickInputSpec(ANTSCommandInputSpec): desc='Moving image or target image') output_prefix = Str("transform", usedefault=True, argstr='-o %s', desc="A prefix that is prepended to all output files") - - # todo ANTSCommandInputSpec already has this, but I can't figure out how to set it without defining it again - num_threads = traits.Int(default_value=1, desc='Number of threads (default = 1)', argstr='-n %d') + num_threads = traits.Int(default_value=LOCAL_DEFAULT_NUMBER_OF_THREADS, usedefault=True, + desc='Number of threads (default = 1)', argstr='-n %d') transform_type = traits.Enum('s', 't', 'r', 'a', 'sr', 'b', 'br', argstr='-t %s', desc=""" @@ -1554,11 +1558,24 @@ class RegistrationSynQuickOutputSpec(TraitedSpec): class RegistrationSynQuick(ANTSCommand): """ + Reistration using a symmetric image normalization method (SyN). + You can read more in Avants et al.; Med Image Anal., 2008 + (https://www.ncbi.nlm.nih.gov/pubmed/17659998). + Examples -------- + >>> import copy, pprint + >>> from nipype.interfaces.ants import Registration + >>> reg = RegistrationSynQuick() + >>> reg.inputs.fixed_image = 'fixed1.nii' + >>> reg.inputs.moving_image = 'moving1.nii' + >>> reg.inputs.num_threads = 2 + >>> reg.cmdline + 'antsRegistrationSynQuick.sh -d 3 -f fixed1.nii -m moving1.nii -n 2 -o transform -p d -t s' + >>> reg.run() # doctest: +SKIP """ - # todo examples + _cmd = 'antsRegistrationSynQuick.sh' input_spec = RegistrationSynQuickInputSpec From b1ea744a4242b09f3734e2f3cbf7ba7280b08cdd Mon Sep 17 00:00:00 2001 From: Dorota Jarecka Date: Thu, 22 Feb 2018 20:17:00 -0500 Subject: [PATCH 07/10] typo --- nipype/interfaces/ants/registration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/ants/registration.py b/nipype/interfaces/ants/registration.py index 73ab890979..d4bd966ccf 100644 --- a/nipype/interfaces/ants/registration.py +++ b/nipype/interfaces/ants/registration.py @@ -1558,7 +1558,7 @@ class RegistrationSynQuickOutputSpec(TraitedSpec): class RegistrationSynQuick(ANTSCommand): """ - Reistration using a symmetric image normalization method (SyN). + Registration using a symmetric image normalization method (SyN). You can read more in Avants et al.; Med Image Anal., 2008 (https://www.ncbi.nlm.nih.gov/pubmed/17659998). From 3403b0ab6795bc5cd5c2ef244ba085e09eb60a47 Mon Sep 17 00:00:00 2001 From: Dorota Jarecka Date: Fri, 23 Feb 2018 10:14:34 -0500 Subject: [PATCH 08/10] after Chris suggestions --- nipype/interfaces/ants/registration.py | 43 ++++++++++++++++---------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/nipype/interfaces/ants/registration.py b/nipype/interfaces/ants/registration.py index d4bd966ccf..3f39cd1ec2 100644 --- a/nipype/interfaces/ants/registration.py +++ b/nipype/interfaces/ants/registration.py @@ -15,12 +15,7 @@ from ...utils.filemanip import filename_to_list from ..base import TraitedSpec, File, Str, traits, InputMultiPath, isdefined -from .base import ANTSCommand, ANTSCommandInputSpec - -try: - LOCAL_DEFAULT_NUMBER_OF_THREADS = int(os.getenv("LOCAL_DEFAULT_NUMBER_OF_THREADS")) -except TypeError: - LOCAL_DEFAULT_NUMBER_OF_THREADS = 1 +from .base import ANTSCommand, ANTSCommandInputSpec, LOCAL_DEFAULT_NUMBER_OF_THREADS class ANTSInputSpec(ANTSCommandInputSpec): @@ -1565,8 +1560,7 @@ class RegistrationSynQuick(ANTSCommand): Examples -------- - >>> import copy, pprint - >>> from nipype.interfaces.ants import Registration + >>> from nipype.interfaces.ants import RegistrationSynQuick >>> reg = RegistrationSynQuick() >>> reg.inputs.fixed_image = 'fixed1.nii' >>> reg.inputs.moving_image = 'moving1.nii' @@ -1574,6 +1568,17 @@ class RegistrationSynQuick(ANTSCommand): >>> reg.cmdline 'antsRegistrationSynQuick.sh -d 3 -f fixed1.nii -m moving1.nii -n 2 -o transform -p d -t s' >>> reg.run() # doctest: +SKIP + + example for multiple images + + >>> from nipype.interfaces.ants import RegistrationSynQuick + >>> reg = RegistrationSynQuick() + >>> reg.inputs.fixed_image = ['fixed1.nii', 'fixed2.nii'] + >>> reg.inputs.moving_image = ['moving1.nii', 'moving2.nii'] + >>> reg.inputs.num_threads = 2 + >>> reg.cmdline + 'antsRegistrationSynQuick.sh -d 3 -f fixed1.nii fixed2.nii -m moving1.nii moving2.nii -n 2 -o transform -p d -t s' + >>> reg.run() # doctest: +SKIP """ @@ -1581,6 +1586,13 @@ class RegistrationSynQuick(ANTSCommand): input_spec = RegistrationSynQuickInputSpec output_spec = RegistrationSynQuickOutputSpec + def _num_threads_update(self): + """ + antsRegistrationSynQuick.sh ignores environment variables, + so override environment update frm ANTSCommand class + """ + pass + def _format_arg(self, name, spec, value): if name == 'precision_type': return spec.argstr % value[0] @@ -1588,15 +1600,12 @@ def _format_arg(self, name, spec, value): def _list_outputs(self): outputs = self.output_spec().get() - outputs['warped_image'] = os.path.abspath(self.inputs.output_prefix + 'Warped.nii.gz') - outputs['inverse_warped_image'] = os.path.abspath( - self.inputs.output_prefix + 'InverseWarped.nii.gz') - outputs['out_matrix'] = os.path.abspath(self.inputs.output_prefix + '0GenericAffine.mat') + out_base = os.path.abspath(self.inputs.output_prefix) + outputs['warped_image'] = out_base + 'Warped.nii.gz' + outputs['inverse_warped_image'] = out_base + 'InverseWarped.nii.gz' + outputs['out_matrix'] = out_base + '0GenericAffine.mat' - # todo in the case of linear transformation-only there won't be fields. is there a more elegant way to specify that? if self.inputs.transform_type not in ('t', 'r', 'a'): - outputs['forward_warp_field'] = os.path.abspath( - self.inputs.output_prefix + '1Warp.nii.gz') - outputs['inverse_warp_field'] = os.path.abspath( - self.inputs.output_prefix + '1InverseWarp.nii.gz') + outputs['forward_warp_field'] = out_base + '1Warp.nii.gz' + outputs['inverse_warp_field'] = out_base + '1InverseWarp.nii.gz' return outputs From dbb84a3bce5fc833d925b0f30ab5806503fc9b7a Mon Sep 17 00:00:00 2001 From: Dorota Jarecka Date: Fri, 23 Feb 2018 10:35:27 -0500 Subject: [PATCH 09/10] fixing doctest with multiple images --- nipype/interfaces/ants/registration.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nipype/interfaces/ants/registration.py b/nipype/interfaces/ants/registration.py index 3f39cd1ec2..bcc1d94b89 100644 --- a/nipype/interfaces/ants/registration.py +++ b/nipype/interfaces/ants/registration.py @@ -1510,9 +1510,9 @@ def aggregate_outputs(self, runtime=None, needed_outputs=None): class RegistrationSynQuickInputSpec(ANTSCommandInputSpec): dimension = traits.Enum(3, 2, argstr='-d %d', usedefault=True, desc='image dimension (2 or 3)') - fixed_image = InputMultiPath(File(exists=True), mandatory=True, argstr='-f %s', + fixed_image = InputMultiPath(File(exists=True), mandatory=True, argstr='-f %s...', desc='Fixed image or source image or reference image') - moving_image = InputMultiPath(File(exists=True), mandatory=True, argstr='-m %s', + moving_image = InputMultiPath(File(exists=True), mandatory=True, argstr='-m %s...', desc='Moving image or target image') output_prefix = Str("transform", usedefault=True, argstr='-o %s', desc="A prefix that is prepended to all output files") @@ -1577,7 +1577,7 @@ class RegistrationSynQuick(ANTSCommand): >>> reg.inputs.moving_image = ['moving1.nii', 'moving2.nii'] >>> reg.inputs.num_threads = 2 >>> reg.cmdline - 'antsRegistrationSynQuick.sh -d 3 -f fixed1.nii fixed2.nii -m moving1.nii moving2.nii -n 2 -o transform -p d -t s' + 'antsRegistrationSynQuick.sh -d 3 -f fixed1.nii -f fixed2.nii -m moving1.nii -m moving2.nii -n 2 -o transform -p d -t s' >>> reg.run() # doctest: +SKIP """ From 5cd952fae1c3f913fa9ee37ff0ee38187c3032fe Mon Sep 17 00:00:00 2001 From: Dorota Jarecka Date: Fri, 23 Feb 2018 12:11:24 -0500 Subject: [PATCH 10/10] update auto test --- .../ants/tests/test_auto_RegistrationSynQuick.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/nipype/interfaces/ants/tests/test_auto_RegistrationSynQuick.py b/nipype/interfaces/ants/tests/test_auto_RegistrationSynQuick.py index 0b8544cf4a..d481b810d5 100644 --- a/nipype/interfaces/ants/tests/test_auto_RegistrationSynQuick.py +++ b/nipype/interfaces/ants/tests/test_auto_RegistrationSynQuick.py @@ -15,7 +15,7 @@ def test_RegistrationSynQuick_inputs(): usedefault=True, ), fixed_image=dict( - argstr='-f %s', + argstr='-f %s...', mandatory=True, ), histogram_bins=dict(argstr='-r %d', ), @@ -25,10 +25,13 @@ def test_RegistrationSynQuick_inputs(): usedefault=True, ), moving_image=dict( - argstr='-m %s', + argstr='-m %s...', mandatory=True, ), - num_threads=dict(argstr='-n %d', ), + num_threads=dict( + argstr='-n %d', + usedefault=True, + ), output_prefix=dict( argstr='-o %s', usedefault=True,