@@ -291,6 +291,11 @@ class RegistrationInputSpec(ANTSCommandInputSpec):
291
291
'each stage directly updates the estimated linear transform from the previous '
292
292
'stage. (e.g. Translation -> Rigid -> Affine). '
293
293
))
294
+ # NOTE: Even though only 0=False and 1=True are allowed, ants uses integer
295
+ # values instead of booleans
296
+ float = traits .Bool (
297
+ argstr = '--float %d' , default = False ,
298
+ desc = ('Use float instead of double for computations.' ))
294
299
295
300
transforms = traits .List (traits .Enum ('Rigid' , 'Affine' , 'CompositeAffine' ,
296
301
'Similarity' , 'Translation' , 'BSpline' ,
@@ -405,6 +410,16 @@ class Registration(ANTSCommand):
405
410
>>> reg3.cmdline
406
411
'antsRegistration --collapse-output-transforms 0 --dimensionality 3 --initial-moving-transform [ trans.mat, 1 ] --initialize-transforms-per-stage 0 --interpolation Linear --output [ output_, output_warped_image.nii.gz ] --transform Affine[ 2.0 ] --metric Mattes[ fixed1.nii, moving1.nii, 1, 32, Random, 0.05 ] --convergence [ 1500x200, 1e-08, 20 ] --smoothing-sigmas 1.0x0.0vox --shrink-factors 2x1 --use-estimate-learning-rate-once 1 --use-histogram-matching 1 --transform SyN[ 0.25, 3.0, 0.0 ] --metric Mattes[ fixed1.nii, moving1.nii, 1, 32 ] --convergence [ 100x50x30, 1e-09, 20 ] --smoothing-sigmas 2.0x1.0x0.0vox --shrink-factors 3x2x1 --use-estimate-learning-rate-once 1 --use-histogram-matching 1 --winsorize-image-intensities [ 0.025, 0.975 ] --write-composite-transform 1'
407
412
413
+ >>> reg3a = copy.deepcopy(reg)
414
+ >>> reg3a.inputs.float = True
415
+ >>> reg3a.cmdline
416
+ 'antsRegistration --collapse-output-transforms 0 --dimensionality 3 --float 1 --initial-moving-transform [ trans.mat, 1 ] --initialize-transforms-per-stage 0 --interpolation Linear --output [ output_, output_warped_image.nii.gz ] --transform Affine[ 2.0 ] --metric Mattes[ fixed1.nii, moving1.nii, 1, 32, Random, 0.05 ] --convergence [ 1500x200, 1e-08, 20 ] --smoothing-sigmas 1.0x0.0vox --shrink-factors 2x1 --use-estimate-learning-rate-once 1 --use-histogram-matching 1 --transform SyN[ 0.25, 3.0, 0.0 ] --metric Mattes[ fixed1.nii, moving1.nii, 1, 32 ] --convergence [ 100x50x30, 1e-09, 20 ] --smoothing-sigmas 2.0x1.0x0.0vox --shrink-factors 3x2x1 --use-estimate-learning-rate-once 1 --use-histogram-matching 1 --winsorize-image-intensities [ 0.0, 1.0 ] --write-composite-transform 1'
417
+
418
+ >>> reg3b = copy.deepcopy(reg)
419
+ >>> reg3b.inputs.float = False
420
+ >>> reg3b.cmdline
421
+ 'antsRegistration --collapse-output-transforms 0 --dimensionality 3 --float 0 --initial-moving-transform [ trans.mat, 1 ] --initialize-transforms-per-stage 0 --interpolation Linear --output [ output_, output_warped_image.nii.gz ] --transform Affine[ 2.0 ] --metric Mattes[ fixed1.nii, moving1.nii, 1, 32, Random, 0.05 ] --convergence [ 1500x200, 1e-08, 20 ] --smoothing-sigmas 1.0x0.0vox --shrink-factors 2x1 --use-estimate-learning-rate-once 1 --use-histogram-matching 1 --transform SyN[ 0.25, 3.0, 0.0 ] --metric Mattes[ fixed1.nii, moving1.nii, 1, 32 ] --convergence [ 100x50x30, 1e-09, 20 ] --smoothing-sigmas 2.0x1.0x0.0vox --shrink-factors 3x2x1 --use-estimate-learning-rate-once 1 --use-histogram-matching 1 --winsorize-image-intensities [ 0.0, 1.0 ] --write-composite-transform 1'
422
+
408
423
>>> # Test collapse transforms flag
409
424
>>> reg4 = copy.deepcopy(reg)
410
425
>>> reg.inputs.save_state = 'trans.mat'
@@ -647,8 +662,9 @@ def _format_arg(self, opt, spec, val):
647
662
if not self ._quantilesDone :
648
663
return self ._formatWinsorizeImageIntensities ()
649
664
return '' # Must return something for argstr!
650
- elif opt == 'collapse_linear_transforms_to_fixed_image_header' :
651
- return '' # Command no longer exist, so return empty string for backwards compatibility
665
+ # This feature was removed from recent versions of antsRegistration due to corrupt outputs.
666
+ #elif opt == 'collapse_linear_transforms_to_fixed_image_header':
667
+ # return self._formatCollapseLinearTransformsToFixedImageHeader()
652
668
return super (Registration , self )._format_arg (opt , spec , val )
653
669
654
670
def _outputFileNames (self , prefix , count , transform , inverse = False ):
@@ -684,91 +700,93 @@ def _list_outputs(self):
684
700
if isdefined (self .inputs .invert_initial_moving_transform ):
685
701
invert_initial_moving_transform = self .inputs .invert_initial_moving_transform
686
702
687
- if not self .inputs .collapse_output_transforms :
688
- transformCount = 0
689
- if isdefined (self .inputs .initial_moving_transform ):
690
- outputs ['forward_transforms' ].append (
691
- self .inputs .initial_moving_transform )
692
- outputs ['forward_invert_flags' ].append (
693
- invert_initial_moving_transform )
694
- outputs ['reverse_transforms' ].insert (
695
- 0 , self .inputs .initial_moving_transform )
696
- outputs ['reverse_invert_flags' ].insert (
697
- 0 , not invert_initial_moving_transform ) # Prepend
698
- transformCount += 1
699
- elif isdefined (self .inputs .initial_moving_transform_com ):
700
- forwardFileName , forwardInverseMode = self ._outputFileNames (
701
- self .inputs .output_transform_prefix ,
702
- transformCount ,
703
- 'Initial' )
704
- reverseFileName , reverseInverseMode = self ._outputFileNames (
705
- self .inputs .output_transform_prefix ,
706
- transformCount ,
707
- 'Initial' ,
708
- True )
709
- outputs ['forward_transforms' ].append (os .path .abspath (forwardFileName ))
710
- outputs ['forward_invert_flags' ].append (False )
711
- outputs ['reverse_transforms' ].insert (0 ,
712
- os .path .abspath (reverseFileName ))
713
- outputs ['reverse_invert_flags' ].insert (0 , True )
714
- transformCount += 1
715
-
716
- for count in range (len (self .inputs .transforms )):
717
- forwardFileName , forwardInverseMode = self ._outputFileNames (
718
- self .inputs .output_transform_prefix , transformCount ,
719
- self .inputs .transforms [count ])
720
- reverseFileName , reverseInverseMode = self ._outputFileNames (
721
- self .inputs .output_transform_prefix , transformCount ,
722
- self .inputs .transforms [count ], True )
723
- outputs ['forward_transforms' ].append (
724
- os .path .abspath (forwardFileName ))
725
- outputs ['forward_invert_flags' ].append (forwardInverseMode )
726
- outputs ['reverse_transforms' ].insert (
727
- 0 , os .path .abspath (reverseFileName ))
728
- outputs [
729
- 'reverse_invert_flags' ].insert (0 , reverseInverseMode )
730
- transformCount += 1
731
- elif not self .inputs .write_composite_transform :
732
- transformCount = 0
733
- isLinear = [any (self ._linear_transform_names == t )
734
- for t in self .inputs .transforms ]
735
- collapse_list = []
736
-
737
- if isdefined (self .inputs .initial_moving_transform ) or \
738
- isdefined (self .inputs .initial_moving_transform_com ):
739
- isLinear .insert (0 , True )
740
-
741
- # Only files returned by collapse_output_transforms
742
- if any (isLinear ):
743
- collapse_list .append ('GenericAffine' )
744
- if not all (isLinear ):
745
- collapse_list .append ('SyN' )
746
-
747
- for transform in collapse_list :
748
- forwardFileName , forwardInverseMode = self ._outputFileNames (
749
- self .inputs .output_transform_prefix ,
750
- transformCount ,
751
- transform ,
752
- inverse = False )
753
- reverseFileName , reverseInverseMode = self ._outputFileNames (
754
- self .inputs .output_transform_prefix ,
755
- transformCount ,
756
- transform ,
757
- inverse = True )
758
- outputs ['forward_transforms' ].append (os .path .abspath (
759
- forwardFileName ))
760
- outputs ['forward_invert_flags' ].append (forwardInverseMode )
761
- outputs ['reverse_transforms' ].append (
762
- os .path .abspath (reverseFileName ))
763
- outputs ['reverse_invert_flags' ].append (reverseInverseMode )
764
- transformCount += 1
765
703
if self .inputs .write_composite_transform :
766
704
fileName = self .inputs .output_transform_prefix + 'Composite.h5'
767
705
outputs ['composite_transform' ] = [os .path .abspath (fileName )]
768
706
fileName = self .inputs .output_transform_prefix + \
769
707
'InverseComposite.h5'
770
708
outputs ['inverse_composite_transform' ] = [
771
709
os .path .abspath (fileName )]
710
+ else : # If composite transforms are written, then individuals are not written (as of 2014-10-26
711
+ if not self .inputs .collapse_output_transforms :
712
+ transformCount = 0
713
+ if isdefined (self .inputs .initial_moving_transform ):
714
+ outputs ['forward_transforms' ].append (
715
+ self .inputs .initial_moving_transform )
716
+ outputs ['forward_invert_flags' ].append (
717
+ invert_initial_moving_transform )
718
+ outputs ['reverse_transforms' ].insert (
719
+ 0 , self .inputs .initial_moving_transform )
720
+ outputs ['reverse_invert_flags' ].insert (
721
+ 0 , not invert_initial_moving_transform ) # Prepend
722
+ transformCount += 1
723
+ elif isdefined (self .inputs .initial_moving_transform_com ):
724
+ forwardFileName , forwardInverseMode = self ._outputFileNames (
725
+ self .inputs .output_transform_prefix ,
726
+ transformCount ,
727
+ 'Initial' )
728
+ reverseFileName , reverseInverseMode = self ._outputFileNames (
729
+ self .inputs .output_transform_prefix ,
730
+ transformCount ,
731
+ 'Initial' ,
732
+ True )
733
+ outputs ['forward_transforms' ].append (os .path .abspath (forwardFileName ))
734
+ outputs ['forward_invert_flags' ].append (False )
735
+ outputs ['reverse_transforms' ].insert (0 ,
736
+ os .path .abspath (reverseFileName ))
737
+ outputs ['reverse_invert_flags' ].insert (0 , True )
738
+ transformCount += 1
739
+
740
+ for count in range (len (self .inputs .transforms )):
741
+ forwardFileName , forwardInverseMode = self ._outputFileNames (
742
+ self .inputs .output_transform_prefix , transformCount ,
743
+ self .inputs .transforms [count ])
744
+ reverseFileName , reverseInverseMode = self ._outputFileNames (
745
+ self .inputs .output_transform_prefix , transformCount ,
746
+ self .inputs .transforms [count ], True )
747
+ outputs ['forward_transforms' ].append (
748
+ os .path .abspath (forwardFileName ))
749
+ outputs ['forward_invert_flags' ].append (forwardInverseMode )
750
+ outputs ['reverse_transforms' ].insert (
751
+ 0 , os .path .abspath (reverseFileName ))
752
+ outputs [
753
+ 'reverse_invert_flags' ].insert (0 , reverseInverseMode )
754
+ transformCount += 1
755
+ else :
756
+ transformCount = 0
757
+ isLinear = [any (self ._linear_transform_names == t )
758
+ for t in self .inputs .transforms ]
759
+ collapse_list = []
760
+
761
+ if isdefined (self .inputs .initial_moving_transform ) or \
762
+ isdefined (self .inputs .initial_moving_transform_com ):
763
+ isLinear .insert (0 , True )
764
+
765
+ # Only files returned by collapse_output_transforms
766
+ if any (isLinear ):
767
+ collapse_list .append ('GenericAffine' )
768
+ if not all (isLinear ):
769
+ collapse_list .append ('SyN' )
770
+
771
+ for transform in collapse_list :
772
+ forwardFileName , forwardInverseMode = self ._outputFileNames (
773
+ self .inputs .output_transform_prefix ,
774
+ transformCount ,
775
+ transform ,
776
+ inverse = False )
777
+ reverseFileName , reverseInverseMode = self ._outputFileNames (
778
+ self .inputs .output_transform_prefix ,
779
+ transformCount ,
780
+ transform ,
781
+ inverse = True )
782
+ outputs ['forward_transforms' ].append (os .path .abspath (
783
+ forwardFileName ))
784
+ outputs ['forward_invert_flags' ].append (forwardInverseMode )
785
+ outputs ['reverse_transforms' ].append (
786
+ os .path .abspath (reverseFileName ))
787
+ outputs ['reverse_invert_flags' ].append (reverseInverseMode )
788
+ transformCount += 1
789
+
772
790
out_filename = self ._get_outputfilenames (inverse = False )
773
791
inv_out_filename = self ._get_outputfilenames (inverse = True )
774
792
if out_filename :
0 commit comments