Skip to content

Commit 34ef5a6

Browse files
committed
fix: update openfmri script to handle subjects better
1 parent e815741 commit 34ef5a6

File tree

1 file changed

+33
-13
lines changed

1 file changed

+33
-13
lines changed

examples/fmri_openfmri.py

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def get_subjectinfo(subject_id, base_dir, task_id, model_id):
8787

8888

8989
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='*'):
9191
"""Analyzes an open fmri dataset
9292
9393
Parameters
@@ -122,21 +122,21 @@ def analyze_openfmri_dataset(data_dir, subject=None, model_id=None,
122122
"""
123123

124124
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))])
126126

127127
infosource = pe.Node(niu.IdentityInterface(fields=['subject_id',
128128
'model_id',
129129
'task_id']),
130130
name='infosource')
131-
if subject is None:
131+
if len(subject) == 0:
132132
infosource.iterables = [('subject_id', subjects),
133133
('model_id', [model_id]),
134-
('task_id', [task_id])]
134+
('task_id', task_id)]
135135
else:
136136
infosource.iterables = [('subject_id',
137-
[subjects[subjects.index(subject)]]),
137+
[subjects[subjects.index(subj)] for subj in subject]),
138138
('model_id', [model_id]),
139-
('task_id', [task_id])]
139+
('task_id', task_id)]
140140

141141
subjinfo = pe.Node(niu.Function(input_names=['subject_id', 'base_dir',
142142
'task_id', 'model_id'],
@@ -156,7 +156,7 @@ def analyze_openfmri_dataset(data_dir, subject=None, model_id=None,
156156
name='datasource')
157157
datasource.inputs.base_directory = data_dir
158158
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',
160160
'bold': '%s/BOLD/task%03d_r*/bold.nii.gz',
161161
'behav': ('%s/model/model%03d/onsets/task%03d_'
162162
'run%03d/cond*.txt'),
@@ -235,8 +235,19 @@ def get_contrasts(contrast_file, task_id, conds):
235235
name="modelspec")
236236
modelspec.inputs.input_units = 'secs'
237237

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+
238249
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')
240251
wf.connect(subjinfo, 'TR', modelfit, 'inputspec.interscan_interval')
241252
wf.connect(subjinfo, 'conds', contrastgen, 'conds')
242253
wf.connect(datasource, 'contrasts', contrastgen, 'contrast_file')
@@ -338,6 +349,9 @@ def get_subs(subject_id, conds, model_id, task_id):
338349
subs.append(('task_id_%d/' % task_id, '/task%03d_' % task_id))
339350
subs.append(('bold_dtype_mcf_mask_smooth_mask_gms_tempfilt_mean_warp_warp',
340351
'mean'))
352+
subs.append(('bold_dtype_mcf_mask_smooth_mask_gms_tempfilt_mean_flirt',
353+
'affine'))
354+
341355
for i in range(len(conds)):
342356
subs.append(('_flameo%d/cope1.' % i, 'cope%02d.' % (i + 1)))
343357
subs.append(('_flameo%d/varcope1.' % i, 'varcope%02d.' % (i + 1)))
@@ -376,7 +390,9 @@ def get_subs(subject_id, conds, model_id, task_id):
376390
('varcopes', 'varcopes.mni'),
377391
])])
378392
wf.connect(registration, 'outputspec.transformed_mean', datasink, 'mean.mni')
379-
393+
wf.connect(registration, 'outputspec.func2anat_transform', datasink, 'xfm.mean2anat')
394+
wf.connect(registration, 'outputspec.anat2target_transform', datasink, 'xfm.anat2target')
395+
380396
"""
381397
Set processing parameters
382398
"""
@@ -398,12 +414,15 @@ def get_subs(subject_id, conds, model_id, task_id):
398414
parser = argparse.ArgumentParser(prog='fmri_openfmri.py',
399415
description=__doc__)
400416
parser.add_argument('-d', '--datasetdir', required=True)
401-
parser.add_argument('-s', '--subject', default=None,
417+
parser.add_argument('-s', '--subject', default=[],
418+
nargs='+', type=str,
402419
help="Subject name (e.g. 'sub001')")
403420
parser.add_argument('-m', '--model', default=1,
404421
help="Model index" + defstr)
405-
parser.add_argument('-t', '--task', default=1,
406-
help="Task index" + defstr)
422+
parser.add_argument('-x', '--subjectprefix', default='sub*',
423+
help="Subject prefix" + defstr)
424+
parser.add_argument('-t', '--task', default=1, #nargs='+',
425+
type=int, help="Task index" + defstr)
407426
parser.add_argument("-o", "--output_dir", dest="outdir",
408427
help="Output directory base")
409428
parser.add_argument("-w", "--work_dir", dest="work_dir",
@@ -427,7 +446,8 @@ def get_subs(subject_id, conds, model_id, task_id):
427446
wf = analyze_openfmri_dataset(data_dir=os.path.abspath(args.datasetdir),
428447
subject=args.subject,
429448
model_id=int(args.model),
430-
task_id=int(args.task),
449+
task_id=[int(args.task)],
450+
subj_prefix=args.subjectprefix,
431451
output_dir=outdir)
432452
wf.base_dir = work_dir
433453
if args.plugin_args:

0 commit comments

Comments
 (0)