@@ -41,6 +41,7 @@ def init_pet_reg_wf(
4141 pet2anat_dof : AffineDOF ,
4242 mem_gb : float ,
4343 omp_nthreads : int ,
44+ use_robust_register : bool = False ,
4445 name : str = 'pet_reg_wf' ,
4546 sloppy : bool = False ,
4647):
@@ -69,6 +70,10 @@ def init_pet_reg_wf(
6970 Size of PET file in GB
7071 omp_nthreads : :obj:`int`
7172 Maximum number of threads an individual process may use
73+ use_robust_register : :obj:`bool`
74+ Run FreeSurfer ``mri_robust_register`` with an NMI cost function for
75+ PET-to-anatomical alignment. Only rigid-body (6 dof) alignment is
76+ supported in this mode.
7277 name : :obj:`str`
7378 Name of workflow (default: ``pet_reg_wf``)
7479
@@ -90,7 +95,7 @@ def init_pet_reg_wf(
9095 Affine transform from anatomical space to PET space (ITK format)
9196
9297 """
93- from nipype .interfaces .freesurfer import MRICoreg
98+ from nipype .interfaces .freesurfer import MRICoreg , RobustRegister
9499 from niworkflows .engine .workflows import LiterateWorkflow as Workflow
95100 from niworkflows .interfaces .nibabel import ApplyMask
96101 from niworkflows .interfaces .nitransforms import ConcatenateXFMs
@@ -107,26 +112,56 @@ def init_pet_reg_wf(
107112 )
108113
109114 mask_brain = pe .Node (ApplyMask (), name = 'mask_brain' )
110- mri_coreg = pe .Node (
111- MRICoreg (dof = pet2anat_dof , sep = [4 ], ftol = 0.0001 , linmintol = 0.01 ),
112- name = 'mri_coreg' ,
113- n_procs = omp_nthreads ,
114- mem_gb = 5 ,
115- )
115+ if use_robust_register :
116+ coreg = pe .Node (
117+ RobustRegister (
118+ auto_sens = False ,
119+ est_int_scale = False ,
120+ init_orient = True ,
121+ args = '--cost NMI' ,
122+ max_iterations = 10 ,
123+ high_iterations = 20 ,
124+ iteration_thresh = 0.01 ,
125+ ),
126+ name = 'mri_robust_register' ,
127+ n_procs = omp_nthreads ,
128+ mem_gb = 5 ,
129+ )
130+ coreg_target = 'target_file'
131+ coreg_output = 'out_reg_file'
132+ else :
133+ coreg = pe .Node (
134+ MRICoreg (dof = pet2anat_dof , sep = [4 ], ftol = 0.0001 , linmintol = 0.01 ),
135+ name = 'mri_coreg' ,
136+ n_procs = omp_nthreads ,
137+ mem_gb = 5 ,
138+ )
139+ coreg_target = 'reference_file'
140+ coreg_output = 'out_lta_file'
116141 convert_xfm = pe .Node (ConcatenateXFMs (inverse = True ), name = 'convert_xfm' )
117142
118- workflow .connect ([
119- (inputnode , mask_brain , [
120- ('anat_preproc' , 'in_file' ),
121- ('anat_mask' , 'in_mask' ),
122- ]),
123- (inputnode , mri_coreg , [('ref_pet_brain' , 'source_file' )]),
124- (mask_brain , mri_coreg , [('out_file' , 'reference_file' )]),
125- (mri_coreg , convert_xfm , [('out_lta_file' , 'in_xfms' )]),
126- (convert_xfm , outputnode , [
127- ('out_xfm' , 'itk_pet_to_t1' ),
128- ('out_inv' , 'itk_t1_to_pet' ),
129- ]),
130- ]) # fmt:skip
143+ connections = [
144+ (
145+ inputnode ,
146+ mask_brain ,
147+ [
148+ ('anat_preproc' , 'in_file' ),
149+ ('anat_mask' , 'in_mask' ),
150+ ],
151+ ),
152+ (inputnode , coreg , [('ref_pet_brain' , 'source_file' )]),
153+ (mask_brain , coreg , [('out_file' , coreg_target )]),
154+ (coreg , convert_xfm , [(coreg_output , 'in_xfms' )]),
155+ (
156+ convert_xfm ,
157+ outputnode ,
158+ [
159+ ('out_xfm' , 'itk_pet_to_t1' ),
160+ ('out_inv' , 'itk_t1_to_pet' ),
161+ ],
162+ ),
163+ ]
164+
165+ workflow .connect (connections ) # fmt:skip
131166
132167 return workflow
0 commit comments