def eprime2dm(eprime,pppi): import os import re import scipy.io as sp import glob as gl import numpy import nipype.interfaces.matlab as mlab from nipype.interfaces.base import Bunch # convert numpy data array def convert_numpy(ar,toString = False): lst = [] for a in ar.tolist(): if toString: lst.append(str(a)) elif type(a) == numpy.ndarray: if a.size > 1: lst.append(a.tolist()) else: lst.append([a.tolist()]) else: lst.append([a]) return lst m = re.search("eprime_([a-z]+)\.txt",eprime) sequence = m.group(1) # get nDM. mat files mat = os.path.join(os.path.dirname(eprime),"nDM*"+sequence+".mat") mat = gl.glob(mat) if len(mat) > 0: mat = mat[0] else: # execute matlab script to generate nDM file m = mlab.MatlabCommand() m.inputs.mfile = False m.inputs.script = sequence+"_eprime2dm_embarcs(\'"+eprime+"\');" m.run(); # get nDM file (again) mat = os.path.join(os.path.dirname(eprime),'nDM*.mat') mat = gl.glob(mat) if len(mat) > 0: mat = mat[0] dm = sp.loadmat(mat,squeeze_me=True) names = convert_numpy(dm.get('names'),True) onsets = convert_numpy(dm.get('onsets')) durations = convert_numpy(dm.get('durations')) # load up values and convert them # for PPPI remove last column for reward PPI; for ert last 3 columns # error, posterror, misc if pppi: trim = 3 if sequence == "reward": trim = 1 names = names[0:(len(names)-trim)] durations = durations[0:(len(durations)-trim)] onsets = onsets[0:(len(onsets)-trim)] # create bunch to return bunch = Bunch(conditions=names,onsets=onsets,durations=durations) if 'pmod' in dm: pmod = [] for i in range(0,len(dm.get('pmod'))): if dm['pmod']['name'][i].size == 0: pmod.append(None) else: name = str(dm['pmod']['name'][i]) param = dm['pmod']['param'][i].tolist() poly = dm['pmod']['poly'][i] pmod.append(Bunch(name=[name],param=[param],poly=[poly])) bunch.pmod = pmod return bunch
def load_design_matrix(mat_file,trim=0): import os import re import scipy.io as sp import glob as gl import numpy import nipype.interfaces.matlab as mlab from nipype.interfaces.base import Bunch # convert numpy data array def convert_numpy(ar,toString = False): lst = [] for a in ar.tolist(): if toString: lst.append(str(a)) elif type(a) == numpy.ndarray: if a.size > 1: lst.append(a.tolist()) else: lst.append([a.tolist()]) else: lst.append([a]) return lst # if list of mat_files, then do a list mat_files = [] if isinstance(mat_file,list): mat_files = mat_file else: mat_files = [mat_file] bunches = [] # go over mat files for mat_file in mat_files: # load design matrix dm = sp.loadmat(mat_file,squeeze_me=True) names = convert_numpy(dm.get('names'),True) onsets = convert_numpy(dm.get('onsets')) durations = convert_numpy(dm.get('durations')) # load up values and convert them # for PPPI remove last column for reward PPI; for ert last 3 columns # error, posterror, misc if trim > 0: names = names[0:(len(names)-trim)] durations = durations[0:(len(durations)-trim)] onsets = onsets[0:(len(onsets)-trim)] # create bunch to return bunch = Bunch(conditions=names,onsets=onsets,durations=durations) if 'pmod' in dm: pmod = [] for i in range(0,len(dm.get('pmod'))): if isinstance(dm['pmod']['name'][i],unicode) or dm['pmod']['name'][i].size == 1: name = str(dm['pmod']['name'][i]) param = dm['pmod']['param'][i].tolist() poly = dm['pmod']['poly'][i] pmod.append(Bunch(name=[name],param=[param],poly=[poly])) elif dm['pmod']['name'][i].size > 1: names = [] params = [] polys = [] for j in range(0,dm['pmod']['name'][i].size): names.append(str(dm['pmod']['name'][i][j])) params.append(dm['pmod']['param'][i][j].tolist()) polys.append(dm['pmod']['poly'][i][j]) pmod.append(Bunch(name=names,param=params,poly=polys)) else: pmod.append(None) bunch.pmod = pmod bunches.append(bunch) return bunches