Skip to content

Commit b9a4a5b

Browse files
committed
fix: fixes to handle various openfmri datasets
1 parent fcae401 commit b9a4a5b

File tree

1 file changed

+57
-25
lines changed

1 file changed

+57
-25
lines changed

examples/fmri_ants_openfmri.py

Lines changed: 57 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
from nipype import config
1616
config.enable_provenance()
17-
from nipype.external import six
1817

18+
from nipype.external import six
1919

2020
from glob import glob
2121
import os
@@ -174,8 +174,8 @@ def create_reg_workflow(name='registration'):
174174
reg.inputs.winsorize_upper_quantile = 0.995
175175
reg.inputs.args = '--float'
176176
reg.inputs.output_warped_image = 'output_warped_image.nii.gz'
177-
reg.inputs.num_threads = 4
178-
reg.plugin_args = {'qsub_args': '-l nodes=1:ppn=4'}
177+
reg.inputs.num_threads = 2
178+
reg.plugin_args = {'qsub_args': '-pe orte 2'}
179179
register.connect(stripper, 'out_file', reg, 'moving_image')
180180
register.connect(inputnode,'target_image_brain', reg,'fixed_image')
181181

@@ -361,25 +361,45 @@ def analyze_openfmri_dataset(data_dir, subject=None, model_id=None,
361361
"""
362362
Return data components as anat, bold and behav
363363
"""
364-
365-
datasource = pe.Node(nio.DataGrabber(infields=['subject_id', 'run_id',
364+
contrast_file = os.path.join(data_dir, 'models', 'model%03d' % model_id,
365+
'task_contrasts.txt')
366+
has_contrast = os.path.exists(contrast_file)
367+
if has_contrast:
368+
datasource = pe.Node(nio.DataGrabber(infields=['subject_id', 'run_id',
366369
'task_id', 'model_id'],
367370
outfields=['anat', 'bold', 'behav',
368371
'contrasts']),
369372
name='datasource')
373+
else:
374+
datasource = pe.Node(nio.DataGrabber(infields=['subject_id', 'run_id',
375+
'task_id', 'model_id'],
376+
outfields=['anat', 'bold', 'behav']),
377+
name='datasource')
370378
datasource.inputs.base_directory = data_dir
371379
datasource.inputs.template = '*'
372-
datasource.inputs.field_template = {'anat': '%s/anatomy/highres001.nii.gz',
373-
'bold': '%s/BOLD/task%03d_r*/bold.nii.gz',
374-
'behav': ('%s/model/model%03d/onsets/task%03d_'
375-
'run%03d/cond*.txt'),
376-
'contrasts': ('models/model%03d/'
377-
'task_contrasts.txt')}
378-
datasource.inputs.template_args = {'anat': [['subject_id']],
380+
381+
if has_contrast:
382+
datasource.inputs.field_template = {'anat': '%s/anatomy/highres001.nii.gz',
383+
'bold': '%s/BOLD/task%03d_r*/bold.nii.gz',
384+
'behav': ('%s/model/model%03d/onsets/task%03d_'
385+
'run%03d/cond*.txt'),
386+
'contrasts': ('models/model%03d/'
387+
'task_contrasts.txt')}
388+
datasource.inputs.template_args = {'anat': [['subject_id']],
379389
'bold': [['subject_id', 'task_id']],
380390
'behav': [['subject_id', 'model_id',
381391
'task_id', 'run_id']],
382392
'contrasts': [['model_id']]}
393+
else:
394+
datasource.inputs.field_template = {'anat': '%s/anatomy/highres001.nii.gz',
395+
'bold': '%s/BOLD/task%03d_r*/bold.nii.gz',
396+
'behav': ('%s/model/model%03d/onsets/task%03d_'
397+
'run%03d/cond*.txt')}
398+
datasource.inputs.template_args = {'anat': [['subject_id']],
399+
'bold': [['subject_id', 'task_id']],
400+
'behav': [['subject_id', 'model_id',
401+
'task_id', 'run_id']]}
402+
383403
datasource.inputs.sort_filelist = True
384404

385405
"""
@@ -412,9 +432,11 @@ def get_highpass(TR, hpcutoff):
412432

413433
def get_contrasts(contrast_file, task_id, conds):
414434
import numpy as np
415-
contrast_def = np.genfromtxt(contrast_file, dtype=object)
416-
if len(contrast_def.shape) == 1:
417-
contrast_def = contrast_def[None, :]
435+
import os
436+
contrast_def = []
437+
if os.path.exists(contrast_file):
438+
with open(contrast_file, 'rt') as fp:
439+
contrast_def.extend([np.array(row.split()) for row in fp.readlines() if row.strip()])
418440
contrasts = []
419441
for row in contrast_def:
420442
if row[0] != 'task%03d' % task_id:
@@ -448,22 +470,32 @@ def get_contrasts(contrast_file, task_id, conds):
448470
name="modelspec")
449471
modelspec.inputs.input_units = 'secs'
450472

451-
def check_behav_list(behav):
452-
out_behav = []
473+
def check_behav_list(behav, conds):
474+
from nipype.external import six
475+
import numpy as np
476+
num_conds = len(conds)
453477
if isinstance(behav, six.string_types):
454478
behav = [behav]
455-
for val in behav:
456-
if not isinstance(val, list):
457-
out_behav.append([val])
458-
else:
459-
out_behav.append(val)
460-
return out_behav
479+
behav_array = np.array(behav).flatten()
480+
num_elements = behav_array.shape[0]
481+
return behav_array.reshape(num_elements/num_conds, num_conds).tolist()
482+
483+
reshape_behav = pe.Node(niu.Function(input_names=['behav', 'conds'],
484+
output_names=['behav'],
485+
function=check_behav_list),
486+
name='reshape_behav')
461487

462488
wf.connect(subjinfo, 'TR', modelspec, 'time_repetition')
463-
wf.connect(datasource, ('behav', check_behav_list), modelspec, 'event_files')
489+
wf.connect(datasource, 'behav', reshape_behav, 'behav')
490+
wf.connect(subjinfo, 'conds', reshape_behav, 'conds')
491+
wf.connect(reshape_behav, 'behav', modelspec, 'event_files')
492+
464493
wf.connect(subjinfo, 'TR', modelfit, 'inputspec.interscan_interval')
465494
wf.connect(subjinfo, 'conds', contrastgen, 'conds')
466-
wf.connect(datasource, 'contrasts', contrastgen, 'contrast_file')
495+
if has_contrast:
496+
wf.connect(datasource, 'contrasts', contrastgen, 'contrast_file')
497+
else:
498+
contrastgen.inputs.contrast_file = ''
467499
wf.connect(infosource, 'task_id', contrastgen, 'task_id')
468500
wf.connect(contrastgen, 'contrasts', modelfit, 'inputspec.contrasts')
469501

0 commit comments

Comments
 (0)