Nipype provides also an interfaces to create a first level Model for an fMRI analysis. Such a model is needed to specify the study specific information, such as condition, their onsets and durations. For more information, make sure to check out Model Specificaton and nipype.algorithms.modelgen
Let's consider a simple experiment, where we have three different stimuli such as 'faces'
, 'houses'
and 'scrambled pix'
. Now each of those three conditions has different stimuli onsets, but all of them have a stimuli presentation duration of 3 seconds.
So to summarize:
conditions = ['faces', 'houses', 'scrambled pix']
onsets = [[0, 30, 60, 90],
[10, 40, 70, 100],
[20, 50, 80, 110]]
durations = [[3], [3], [3]]
The way we would create this model with Nipype is almsot as simple as that. The only step that is missing is to put this all into a Bunch
object. This can be done as follows:
In [ ]:
from nipype.interfaces.base import Bunch
conditions = ['faces', 'houses', 'scrambled pix']
onsets = [[0, 30, 60, 90],
[10, 40, 70, 100],
[20, 50, 80, 110]]
durations = [[3], [3], [3]]
subject_info = Bunch(conditions=conditions,
onsets=onsets,
durations=durations)
It's also possible to specify additional regressors. For this you need to additionally specify:
regressors
: list of regressors that you want to include in the model (must correspond to the number of volumes in the functional run)regressor_names
: name of the regressors that you want to include
In [ ]:
!cat /data/ds102/sub-01/func/sub-01_task-flanker_run-1_events.tsv
So, the only things that we need to specify our model are the onset and the stimuli type, i.e. column 0 and column 5 or 7. Those we can get with the command:
In [ ]:
import numpy as np
filename = '/data/ds102/sub-01/func/sub-01_task-flanker_run-1_events.tsv'
trailinfo = np.genfromtxt(filename, delimiter='\t', dtype=None, skip_header=1)
trailinfo = [[t[0], t[7]] for t in trailinfo]
trailinfo
Before we can use the onsets, we first need to split them into the two conditions:
In [ ]:
onset1 = []
onset2 = []
for t in trailinfo:
if 'incongruent' in t[1]:
onset2.append(t[0])
else:
onset1.append(t[0])
print onset1
print onset2
The last thing we now need to to is to put this into a Bunch
object and we're done:
In [ ]:
from nipype.interfaces.base import Bunch
conditions = ['congruent', 'incongruent']
onsets = [onset1, onset2]
durations = [[2], [2]]
subject_info = Bunch(conditions=conditions,
onsets=onsets,
durations=durations)