@@ -87,7 +87,7 @@ def get_subjectinfo(subject_id, base_dir, task_id, model_id):
87
87
88
88
89
89
def analyze_openfmri_dataset (data_dir , subject = None , model_id = None ,
90
- task_id = None , output_dir = None ):
90
+ task_id = None , output_dir = None , subj_prefix = '*' ):
91
91
"""Analyzes an open fmri dataset
92
92
93
93
Parameters
@@ -122,21 +122,21 @@ def analyze_openfmri_dataset(data_dir, subject=None, model_id=None,
122
122
"""
123
123
124
124
subjects = sorted ([path .split (os .path .sep )[- 1 ] for path in
125
- glob (os .path .join (data_dir , 'sub*' ))])
125
+ glob (os .path .join (data_dir , subj_prefix ))])
126
126
127
127
infosource = pe .Node (niu .IdentityInterface (fields = ['subject_id' ,
128
128
'model_id' ,
129
129
'task_id' ]),
130
130
name = 'infosource' )
131
- if subject is None :
131
+ if len ( subject ) == 0 :
132
132
infosource .iterables = [('subject_id' , subjects ),
133
133
('model_id' , [model_id ]),
134
- ('task_id' , [ task_id ] )]
134
+ ('task_id' , task_id )]
135
135
else :
136
136
infosource .iterables = [('subject_id' ,
137
- [subjects [subjects .index (subject )] ]),
137
+ [subjects [subjects .index (subj )] for subj in subject ]),
138
138
('model_id' , [model_id ]),
139
- ('task_id' , [ task_id ] )]
139
+ ('task_id' , task_id )]
140
140
141
141
subjinfo = pe .Node (niu .Function (input_names = ['subject_id' , 'base_dir' ,
142
142
'task_id' , 'model_id' ],
@@ -156,7 +156,7 @@ def analyze_openfmri_dataset(data_dir, subject=None, model_id=None,
156
156
name = 'datasource' )
157
157
datasource .inputs .base_directory = data_dir
158
158
datasource .inputs .template = '*'
159
- datasource .inputs .field_template = {'anat' : '%s/anatomy/highres001 .nii.gz' ,
159
+ datasource .inputs .field_template = {'anat' : '%s/anatomy/T1_001 .nii.gz' ,
160
160
'bold' : '%s/BOLD/task%03d_r*/bold.nii.gz' ,
161
161
'behav' : ('%s/model/model%03d/onsets/task%03d_'
162
162
'run%03d/cond*.txt' ),
@@ -235,8 +235,19 @@ def get_contrasts(contrast_file, task_id, conds):
235
235
name = "modelspec" )
236
236
modelspec .inputs .input_units = 'secs'
237
237
238
+ def check_behav_list (behav ):
239
+ out_behav = []
240
+ if isinstance (behav , basestring ):
241
+ behav = [behav ]
242
+ for val in behav :
243
+ if not isinstance (val , list ):
244
+ out_behav .append ([val ])
245
+ else :
246
+ out_behav .append (val )
247
+ return out_behav
248
+
238
249
wf .connect (subjinfo , 'TR' , modelspec , 'time_repetition' )
239
- wf .connect (datasource , 'behav' , modelspec , 'event_files' )
250
+ wf .connect (datasource , ( 'behav' , check_behav_list ) , modelspec , 'event_files' )
240
251
wf .connect (subjinfo , 'TR' , modelfit , 'inputspec.interscan_interval' )
241
252
wf .connect (subjinfo , 'conds' , contrastgen , 'conds' )
242
253
wf .connect (datasource , 'contrasts' , contrastgen , 'contrast_file' )
@@ -294,33 +305,41 @@ def num_copes(files):
294
305
wf .connect (preproc , 'outputspec.mean' , registration , 'inputspec.mean_image' )
295
306
wf .connect (datasource , 'anat' , registration , 'inputspec.anatomical_image' )
296
307
registration .inputs .inputspec .target_image = fsl .Info .standard_image ('MNI152_T1_2mm.nii.gz' )
308
+ registration .inputs .inputspec .target_image_brain = fsl .Info .standard_image ('MNI152_T1_2mm_brain.nii.gz' )
309
+ registration .inputs .inputspec .config_file = 'T1_2_MNI152_2mm'
297
310
298
- def merge_files (copes , varcopes ):
311
+ def merge_files (copes , varcopes , zstats ):
299
312
out_files = []
300
313
splits = []
301
314
out_files .extend (copes )
302
315
splits .append (len (copes ))
303
316
out_files .extend (varcopes )
304
317
splits .append (len (varcopes ))
318
+ out_files .extend (zstats )
319
+ splits .append (len (zstats ))
305
320
return out_files , splits
306
321
307
- mergefunc = pe .Node (niu .Function (input_names = ['copes' , 'varcopes' ],
322
+ mergefunc = pe .Node (niu .Function (input_names = ['copes' , 'varcopes' ,
323
+ 'zstats' ],
308
324
output_names = ['out_files' , 'splits' ],
309
325
function = merge_files ),
310
326
name = 'merge_files' )
311
327
wf .connect ([(fixed_fx .get_node ('outputspec' ), mergefunc ,
312
328
[('copes' , 'copes' ),
313
329
('varcopes' , 'varcopes' ),
330
+ ('zstats' , 'zstats' ),
314
331
])])
315
332
wf .connect (mergefunc , 'out_files' , registration , 'inputspec.source_files' )
316
333
317
334
def split_files (in_files , splits ):
318
- copes = in_files [:splits [1 ]]
319
- varcopes = in_files [splits [1 ]:]
320
- return copes , varcopes
335
+ copes = in_files [:splits [0 ]]
336
+ varcopes = in_files [splits [0 ]:(splits [0 ] + splits [1 ])]
337
+ zstats = in_files [(splits [0 ] + splits [1 ]):]
338
+ return copes , varcopes , zstats
321
339
322
340
splitfunc = pe .Node (niu .Function (input_names = ['in_files' , 'splits' ],
323
- output_names = ['copes' , 'varcopes' ],
341
+ output_names = ['copes' , 'varcopes' ,
342
+ 'zstats' ],
324
343
function = split_files ),
325
344
name = 'split_files' )
326
345
wf .connect (mergefunc , 'splits' , splitfunc , 'splits' )
@@ -336,18 +355,23 @@ def get_subs(subject_id, conds, model_id, task_id):
336
355
subs = [('_subject_id_%s_' % subject_id , '' )]
337
356
subs .append (('_model_id_%d' % model_id , 'model%03d' % model_id ))
338
357
subs .append (('task_id_%d/' % task_id , '/task%03d_' % task_id ))
339
- subs .append (('bold_dtype_mcf_mask_smooth_mask_gms_tempfilt_mean_warp_warp ' ,
358
+ subs .append (('bold_dtype_mcf_mask_smooth_mask_gms_tempfilt_mean_warp ' ,
340
359
'mean' ))
360
+ subs .append (('bold_dtype_mcf_mask_smooth_mask_gms_tempfilt_mean_flirt' ,
361
+ 'affine' ))
362
+
341
363
for i in range (len (conds )):
342
364
subs .append (('_flameo%d/cope1.' % i , 'cope%02d.' % (i + 1 )))
343
365
subs .append (('_flameo%d/varcope1.' % i , 'varcope%02d.' % (i + 1 )))
344
366
subs .append (('_flameo%d/zstat1.' % i , 'zstat%02d.' % (i + 1 )))
345
367
subs .append (('_flameo%d/tstat1.' % i , 'tstat%02d.' % (i + 1 )))
346
368
subs .append (('_flameo%d/res4d.' % i , 'res4d%02d.' % (i + 1 )))
347
- subs .append (('_warpall%d/cope1_warp_warp .' % i ,
369
+ subs .append (('_warpall%d/cope1_warp .' % i ,
348
370
'cope%02d.' % (i + 1 )))
349
- subs .append (('_warpall%d/varcope1_warp_warp .' % (len (conds ) + i ),
371
+ subs .append (('_warpall%d/varcope1_warp .' % (len (conds ) + i ),
350
372
'varcope%02d.' % (i + 1 )))
373
+ subs .append (('_warpall%d/zstat1_warp.' % (2 * len (conds ) + i ),
374
+ 'zstat%02d.' % (i + 1 )))
351
375
return subs
352
376
353
377
subsgen = pe .Node (niu .Function (input_names = ['subject_id' , 'conds' ,
@@ -374,8 +398,11 @@ def get_subs(subject_id, conds, model_id, task_id):
374
398
wf .connect ([(splitfunc , datasink ,
375
399
[('copes' , 'copes.mni' ),
376
400
('varcopes' , 'varcopes.mni' ),
401
+ ('zstats' , 'zstats.mni' ),
377
402
])])
378
403
wf .connect (registration , 'outputspec.transformed_mean' , datasink , 'mean.mni' )
404
+ wf .connect (registration , 'outputspec.func2anat_transform' , datasink , 'xfm.mean2anat' )
405
+ wf .connect (registration , 'outputspec.anat2target_transform' , datasink , 'xfm.anat2target' )
379
406
380
407
"""
381
408
Set processing parameters
@@ -398,12 +425,15 @@ def get_subs(subject_id, conds, model_id, task_id):
398
425
parser = argparse .ArgumentParser (prog = 'fmri_openfmri.py' ,
399
426
description = __doc__ )
400
427
parser .add_argument ('-d' , '--datasetdir' , required = True )
401
- parser .add_argument ('-s' , '--subject' , default = None ,
428
+ parser .add_argument ('-s' , '--subject' , default = [],
429
+ nargs = '+' , type = str ,
402
430
help = "Subject name (e.g. 'sub001')" )
403
431
parser .add_argument ('-m' , '--model' , default = 1 ,
404
432
help = "Model index" + defstr )
405
- parser .add_argument ('-t' , '--task' , default = 1 ,
406
- help = "Task index" + defstr )
433
+ parser .add_argument ('-x' , '--subjectprefix' , default = 'sub*' ,
434
+ help = "Subject prefix" + defstr )
435
+ parser .add_argument ('-t' , '--task' , default = 1 , #nargs='+',
436
+ type = int , help = "Task index" + defstr )
407
437
parser .add_argument ("-o" , "--output_dir" , dest = "outdir" ,
408
438
help = "Output directory base" )
409
439
parser .add_argument ("-w" , "--work_dir" , dest = "work_dir" ,
@@ -427,7 +457,8 @@ def get_subs(subject_id, conds, model_id, task_id):
427
457
wf = analyze_openfmri_dataset (data_dir = os .path .abspath (args .datasetdir ),
428
458
subject = args .subject ,
429
459
model_id = int (args .model ),
430
- task_id = int (args .task ),
460
+ task_id = [int (args .task )],
461
+ subj_prefix = args .subjectprefix ,
431
462
output_dir = outdir )
432
463
wf .base_dir = work_dir
433
464
if args .plugin_args :
0 commit comments