@@ -65,6 +65,7 @@ def init_surface_recon_wf(
65
65
* ,
66
66
omp_nthreads : int ,
67
67
hires : bool ,
68
+ fs_no_resume : bool ,
68
69
precomputed : dict ,
69
70
name = 'surface_recon_wf' ,
70
71
):
@@ -130,14 +131,21 @@ def init_surface_recon_wf(
130
131
:simple_form: yes
131
132
132
133
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={})
134
139
135
140
Parameters
136
141
----------
137
142
omp_nthreads : int
138
143
Maximum number of threads an individual process may use
139
144
hires : bool
140
145
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)
141
149
142
150
Inputs
143
151
------
@@ -239,39 +247,62 @@ def init_surface_recon_wf(
239
247
name = 'sync' ,
240
248
)
241
249
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
+
242
305
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
- ]),
275
306
(get_surfaces , midthickness , [
276
307
('white' , 'in_file' ),
277
308
('graymid' , 'graymid' ),
0 commit comments