Hi,
the PPI patch is not in master. I pushed a newer version of nipype with the PPI patch to
https://github.com/cni-md/nipype.git branch PPI.
For the PPI model I use:
################################################
# PPI Model
################################################
class GenModelInputSpec(BaseInterfaceInputSpec):
bids_event_files = File(exists=True,
mandatory=True,
desc='TSV event file containing common BIDS fields: `onset`,'
'`duration`, and categorization and amplitude columns')
regressors = traits.List(desc='ROI time course', mandatory=False)
regressor_names = traits.List(desc='regressor names', mandatory=False)
class GenModelOutputSpec(TraitedSpec):
model = traits.Any(desc="Model")
class GenModel(BaseInterface):
input_spec = GenModelInputSpec
output_spec = GenModelOutputSpec
def _run_interface(self, runtime):
from nipype.interfaces.base import Bunch
from nipype.algorithms.modelgen import bids_gen_info
self.model = bids_gen_info([self.inputs.bids_event_files], 'trial_type')
if self.inputs.regressors:
self.model[0].update(regressors=[list(self.inputs.regressors)])
if self.inputs.regressor_names:
self.model[0].update(regressor_names=list(self.inputs.regressor_names)) # Must be list otherwise Error Traits.list has no trait...
return runtime
def _list_outputs(self):
outputs = self._outputs().get()
outputs['model'] = self.model
return outputs
rh_ppi_model = pe.Node(interface=GenModel(), name='ppi_model_rh')
rh_ppi_model.inputs.bids_event_files = os.path.abspath('./FM_r_v_train.tsv')
rh_ppi_model.inputs.regressor_names=['rh_seed']
# seed time course form nilearn NiftiSpheresMasker
main.connect(episphere, ('ts', get_listElemt, 0), rh_ppi_model, 'regressors')
rh_ppi_modelspec = pe.Node(interface=model.SpecifyModel(), name='RH_PPI_Modelspec')
rh_ppi_modelspec.inputs.input_units = 'secs'
rh_ppi_modelspec.inputs.time_repetition = TR
rh_ppi_modelspec.inputs.high_pass_filter_cutoff = highpass
# 0 = RH, 1 = LH
main.connect(datasource, 'epi', rh_ppi_modelspec, 'functional_runs')
main.connect(datasource, 'outl', rh_ppi_modelspec, 'outlier_files')
main.connect(rh_ppi_model, 'model', rh_ppi_modelspec, 'subject_info')
rh_modelfit_ppi = create_modelfit_workflow(f_contrasts=False, name='rh_modelfit_ppi')
rh_modelfit_ppi.inputs.inputspec.interscan_interval = TR
rh_modelfit_ppi.inputs.inputspec.model_serial_correlations = True
ppi1 = ['p1', ['rh_seed', 'bil'],['mean','centre']] # interaction between seed and bil condition
rh_modelfit_ppi.inputs.inputspec.ppi = [ppi1]
rh_modelfit_ppi.inputs.inputspec.bases = {'dgamma': {'derivs': False}}
contp2 = ['PPI > bil', 'T', [ 'bil', 'li','limr','re','remr',
'rh_seed', 'p1' ], [0,0,0,0,0,0,1]]
rh_modelfit_ppi.inputs.inputspec.contrasts = [contp2]
main.connect(rh_ppi_modelspec, 'session_info', rh_modelfit_ppi, 'inputspec.session_info')
main.connect(datasource, 'epi', rh_modelfit_ppi, 'inputspec.functional_data')
The last column of my .fsf contains:
# EV title
set fmri(evtitle10) "p1"
# Basic waveform shape (EV 10)
# 0 : Square
# 1 : Sinusoid
# 2 : Custom (1 entry per volume)
# 3 : Custom (3 column format)
# 4 : Interaction
# 10 : Empty (all zeros)
set fmri(shape10) 4
Joerg