1
1
"""Anatomical surface projections"""
2
+ from typing import Optional
3
+
2
4
from nipype .interfaces import freesurfer as fs
3
5
from nipype .interfaces import io as nio
4
6
from nipype .interfaces import utility as niu
34
36
35
37
36
38
def init_mcribs_surface_recon_wf (
37
- * , use_aseg : bool , mcribs_dir : str = None , name : str = "mcribs_surface_recon_wf"
39
+ * ,
40
+ omp_nthreads : int ,
41
+ use_aseg : bool ,
42
+ use_mask : bool ,
43
+ mcribs_dir : Optional [str ] = None ,
44
+ name : str = "mcribs_surface_recon_wf" ,
38
45
):
39
46
"""
40
47
Reconstruct cortical surfaces using the M-CRIB-S pipeline.
@@ -51,7 +58,9 @@ def init_mcribs_surface_recon_wf(
51
58
"A previously computed segmentation is required for the M-CRIB-S workflow."
52
59
)
53
60
54
- inputnode = pe .Node (niu .IdentityInterface (fields = SURFACE_INPUTS ), name = 'inputnode' )
61
+ inputnode = pe .Node (
62
+ niu .IdentityInterface (fields = SURFACE_INPUTS + ['anat_mask' ]), name = 'inputnode'
63
+ )
55
64
outputnode = pe .Node (niu .IdentityInterface (fields = SURFACE_OUTPUTS ), name = 'outputnode' )
56
65
57
66
wf = LiterateWorkflow (name = name )
@@ -103,10 +112,39 @@ def init_mcribs_surface_recon_wf(
103
112
seg_las = t2w_las .clone (name = "seg_las" )
104
113
105
114
mcribs_recon = pe .Node (
106
- MCRIBReconAll (surfrecon = True , autorecon_after_surf = True ), name = "mcribs_recon"
115
+ MCRIBReconAll (
116
+ surfrecon = True ,
117
+ surfrecon_method = 'Deformable' ,
118
+ join_thresh = 1.0 ,
119
+ fast_collision = True ,
120
+ nthreads = omp_nthreads ,
121
+ ),
122
+ name = "mcribs_recon" ,
123
+ mem_gb = 5 ,
107
124
)
108
125
if mcribs_dir :
109
126
mcribs_recon .inputs .outdir = mcribs_dir
127
+ mcribs_recon .config = {'execution' : {'remove_unnecessary_outputs' : False }}
128
+
129
+ if use_mask :
130
+ # If available, dilated mask and use in recon-neonatal-cortex
131
+ from niworkflows .interfaces .morphology import BinaryDilation
132
+
133
+ mask_dil = pe .Node (BinaryDilation (radius = 3 ), name = "mask_dil" )
134
+ mask_las = t2w_las .clone (name = "mask_las" )
135
+ # fmt:off
136
+ wf .connect ([
137
+ (inputnode , mask_dil , [("anat_mask" , "in_mask" )]),
138
+ (mask_dil , mask_las , [("out_mask" , "in_file" )]),
139
+ (mask_las , mcribs_recon , [("out_file" , "mask_file" )]),
140
+ ])
141
+ # fmt:on
142
+
143
+ mcribs_postrecon = pe .Node (
144
+ MCRIBReconAll (autorecon_after_surf = True , nthreads = omp_nthreads ),
145
+ name = "mcribs_postrecon" ,
146
+ mem_gb = 5 ,
147
+ )
110
148
111
149
fssource = pe .Node (nio .FreeSurferSource (), name = 'fssource' , run_without_submitting = True )
112
150
norm2nii = pe .Node (fs .MRIConvert (out_type = "niigz" ), name = "norm2nii" )
@@ -134,9 +172,13 @@ def init_mcribs_surface_recon_wf(
134
172
("subject_id" , "subject_id" )]),
135
173
(t2w_las , mcribs_recon , [("out_file" , "t2w_file" )]),
136
174
(seg_las , mcribs_recon , [("out_file" , "segmentation_file" )]),
175
+ (inputnode , mcribs_postrecon , [
176
+ ("subjects_dir" , "subjects_dir" ),
177
+ ("subject_id" , "subject_id" )]),
178
+ (mcribs_recon , mcribs_postrecon , [("mcribs_dir" , "outdir" )]),
137
179
(inputnode , fssource , [("subject_id" , "subject_id" )]),
138
- (mcribs_recon , fssource , [("subjects_dir" , "subjects_dir" )]),
139
- (mcribs_recon , outputnode , [("subjects_dir" , "subjects_dir" )]),
180
+ (mcribs_postrecon , fssource , [("subjects_dir" , "subjects_dir" )]),
181
+ (mcribs_postrecon , outputnode , [("subjects_dir" , "subjects_dir" )]),
140
182
(inputnode , outputnode , [("subject_id" , "subject_id" )]),
141
183
142
184
(inputnode , fsnative2t1w_xfm , [('skullstripped_t1' , 'target_file' )]),
@@ -146,7 +188,7 @@ def init_mcribs_surface_recon_wf(
146
188
(norm2nii , fsnative2t1w_xfm , [('out_file' , 'source_file' )]),
147
189
(fsnative2t1w_xfm , t1w2fsnative_xfm , [('out_reg_file' , 'in_lta' )]),
148
190
(inputnode , gifti_surface_wf , [("subject_id" , "inputnode.subject_id" )]),
149
- (mcribs_recon , gifti_surface_wf , [("subjects_dir" , "inputnode.subjects_dir" )]),
191
+ (mcribs_postrecon , gifti_surface_wf , [("subjects_dir" , "inputnode.subjects_dir" )]),
150
192
(fsnative2t1w_xfm , gifti_surface_wf , [
151
193
('out_reg_file' , 'inputnode.fsnative2t1w_xfm' )]),
152
194
(fsnative2t1w_xfm , outputnode , [('out_reg_file' , 'fsnative2t1w_xfm' )]),
0 commit comments