@@ -65,6 +65,7 @@ def init_surface_recon_wf(
6565 * ,
6666 omp_nthreads : int ,
6767 hires : bool ,
68+ fs_no_resume : bool ,
6869 precomputed : dict ,
6970 name = 'surface_recon_wf' ,
7071):
@@ -130,14 +131,21 @@ def init_surface_recon_wf(
130131 :simple_form: yes
131132
132133 from smriprep.workflows.surfaces import init_surface_recon_wf
133- wf = init_surface_recon_wf(omp_nthreads=1, hires=True, precomputed={})
134+ wf = init_surface_recon_wf(
135+ omp_nthreads=1,
136+ hires=True,
137+ fs_no_resume=False,
138+ precomputed={})
134139
135140 Parameters
136141 ----------
137142 omp_nthreads : int
138143 Maximum number of threads an individual process may use
139144 hires : bool
140145 Enable sub-millimeter preprocessing in FreeSurfer
146+ fs_no_resume : bool
147+ use precomputed freesurfer without attempting to resume
148+ (eg. for longitudinal base or fastsurfer)
141149
142150 Inputs
143151 ------
@@ -239,39 +247,62 @@ def init_surface_recon_wf(
239247 name = 'sync' ,
240248 )
241249
250+ if not fs_no_resume :
251+ workflow .connect ([
252+ # Configuration
253+ (inputnode , recon_config , [('t1w' , 't1w_list' ),
254+ ('t2w' , 't2w_list' ),
255+ ('flair' , 'flair_list' )]),
256+ # Passing subjects_dir / subject_id enforces serial order
257+ (inputnode , autorecon1 , [('subjects_dir' , 'subjects_dir' ),
258+ ('subject_id' , 'subject_id' )]),
259+ (autorecon1 , skull_strip_extern , [('subjects_dir' , 'subjects_dir' ),
260+ ('subject_id' , 'subject_id' )]),
261+ (skull_strip_extern , autorecon_resume_wf , [('subjects_dir' , 'inputnode.subjects_dir' ),
262+ ('subject_id' , 'inputnode.subject_id' )]),
263+ # Reconstruction phases
264+ (inputnode , autorecon1 , [('t1w' , 'T1_files' )]),
265+ (inputnode , fov_check , [('t1w' , 'in_files' )]),
266+ (fov_check , autorecon1 , [('out' , 'flags' )]),
267+ (recon_config , autorecon1 , [('t2w' , 'T2_file' ),
268+ ('flair' , 'FLAIR_file' ),
269+ ('hires' , 'hires' ),
270+ # First run only (recon-all saves expert options)
271+ ('mris_inflate' , 'mris_inflate' )]),
272+ (inputnode , skull_strip_extern , [('skullstripped_t1' , 'in_brain' )]),
273+ (recon_config , autorecon_resume_wf , [('use_t2w' , 'inputnode.use_T2' ),
274+ ('use_flair' , 'inputnode.use_FLAIR' )]),
275+ # Generate mid-thickness surfaces
276+ (autorecon_resume_wf , get_surfaces , [
277+ ('outputnode.subjects_dir' , 'subjects_dir' ),
278+ ('outputnode.subject_id' , 'subject_id' ),
279+ ]),
280+ (autorecon_resume_wf , save_midthickness , [
281+ ('outputnode.subjects_dir' , 'base_directory' ),
282+ ('outputnode.subject_id' , 'container' ),
283+ ]),
284+ ]) # fmt:skip
285+ else :
286+ # Pretend to be the autorecon1 node so fsnative2t1w_xfm gets run ASAP
287+ fs_base_inputs = autorecon1 = pe .Node (nio .FreeSurferSource (), name = 'fs_base_inputs' )
288+
289+ workflow .connect ([
290+ (inputnode , fs_base_inputs , [
291+ ('subjects_dir' , 'subjects_dir' ),
292+ ('subject_id' , 'subject_id' ),
293+ ]),
294+ # Generate mid-thickness surfaces
295+ (inputnode , get_surfaces , [
296+ ('subjects_dir' , 'subjects_dir' ),
297+ ('subject_id' , 'subject_id' ),
298+ ]),
299+ (inputnode , save_midthickness , [
300+ ('subjects_dir' , 'base_directory' ),
301+ ('subject_id' , 'container' ),
302+ ]),
303+ ]) # fmt:skip
304+
242305 workflow .connect ([
243- # Configuration
244- (inputnode , recon_config , [('t1w' , 't1w_list' ),
245- ('t2w' , 't2w_list' ),
246- ('flair' , 'flair_list' )]),
247- # Passing subjects_dir / subject_id enforces serial order
248- (inputnode , autorecon1 , [('subjects_dir' , 'subjects_dir' ),
249- ('subject_id' , 'subject_id' )]),
250- (autorecon1 , skull_strip_extern , [('subjects_dir' , 'subjects_dir' ),
251- ('subject_id' , 'subject_id' )]),
252- (skull_strip_extern , autorecon_resume_wf , [('subjects_dir' , 'inputnode.subjects_dir' ),
253- ('subject_id' , 'inputnode.subject_id' )]),
254- # Reconstruction phases
255- (inputnode , autorecon1 , [('t1w' , 'T1_files' )]),
256- (inputnode , fov_check , [('t1w' , 'in_files' )]),
257- (fov_check , autorecon1 , [('out' , 'flags' )]),
258- (recon_config , autorecon1 , [('t2w' , 'T2_file' ),
259- ('flair' , 'FLAIR_file' ),
260- ('hires' , 'hires' ),
261- # First run only (recon-all saves expert options)
262- ('mris_inflate' , 'mris_inflate' )]),
263- (inputnode , skull_strip_extern , [('skullstripped_t1' , 'in_brain' )]),
264- (recon_config , autorecon_resume_wf , [('use_t2w' , 'inputnode.use_T2' ),
265- ('use_flair' , 'inputnode.use_FLAIR' )]),
266- # Generate mid-thickness surfaces
267- (autorecon_resume_wf , get_surfaces , [
268- ('outputnode.subjects_dir' , 'subjects_dir' ),
269- ('outputnode.subject_id' , 'subject_id' ),
270- ]),
271- (autorecon_resume_wf , save_midthickness , [
272- ('outputnode.subjects_dir' , 'base_directory' ),
273- ('outputnode.subject_id' , 'container' ),
274- ]),
275306 (get_surfaces , midthickness , [
276307 ('white' , 'in_file' ),
277308 ('graymid' , 'graymid' ),
0 commit comments