def merge_fmri_sessions(fmri_data_sets): """ fmri_data_sets: list of FmriData objects. Each FmriData object is assumed to contain only one session """ from pyhrf.tools import apply_to_leaves all_onsets = stack_trees([fd.paradigm.stimOnsets for fd in fmri_data_sets]) all_onsets = apply_to_leaves(all_onsets, lambda l: [e[0] for e in l]) durations = stack_trees([fd.paradigm.stimDurations for fd in fmri_data_sets]) durations = apply_to_leaves(durations, lambda x: [e[0] for e in x]) bold = np.concatenate([fd.bold for fd in fmri_data_sets]) ss = [] lastScan = 0 for fd in fmri_data_sets: nscans = fd.bold.shape[0] ss.append(np.arange(lastScan,lastScan+nscans,dtype=int)) lastScan += nscans if fd.simulation is not None: simu = [fd.simulation[0] for fd in fmri_data_sets] else: simu=None return FmriData(all_onsets, bold, fmri_data_sets[0].tr, ss, fmri_data_sets[0].roiMask, fmri_data_sets[0].graphs, durations, fmri_data_sets[0].meta_obj, simu, backgroundLabel=fmri_data_sets[0].backgroundLabel, data_files=fmri_data_sets[0].data_files, data_type=fmri_data_sets[0].data_type, edge_lengths=fmri_data_sets[0].edge_lengths, mask_loaded_from_file=fmri_data_sets[0].mask_loaded_from_file)
def merge_fmri_sessions(fmri_data_sets): """ fmri_data_sets: list of FmriData objects. Each FmriData object is assumed to contain only one session """ from pyhrf.tools import apply_to_leaves all_onsets = stack_trees([fd.paradigm.stimOnsets for fd in fmri_data_sets]) all_onsets = apply_to_leaves(all_onsets, lambda l: [e[0] for e in l]) durations = stack_trees( [fd.paradigm.stimDurations for fd in fmri_data_sets]) durations = apply_to_leaves(durations, lambda x: [e[0] for e in x]) bold = np.concatenate([fd.bold for fd in fmri_data_sets]) session_scan = [] last_scan = 0 for fmri_data in fmri_data_sets: nscans = fmri_data.bold.shape[0] session_scan.append(np.arange(last_scan, last_scan + nscans, dtype=int)) last_scan += nscans # FIXME: define fmri_data instead of loop indice if fmri_data.simulation is not None: simu = [fmri_data.simulation[0] for fmri_data in fmri_data_sets] else: simu = None return FmriData( all_onsets, bold, fmri_data_sets[0].tr, session_scan, fmri_data_sets[0].roiMask, fmri_data_sets[0].graphs, durations, fmri_data_sets[0].meta_obj, simu, backgroundLabel=fmri_data_sets[0].backgroundLabel, data_files=fmri_data_sets[0].data_files, data_type=fmri_data_sets[0].data_type, edge_lengths=fmri_data_sets[0].edge_lengths, mask_loaded_from_file=fmri_data_sets[0].mask_loaded_from_file)
def evaluate(self): ''' Evaluate the mathematical expression given as a string in the expression member variable. ''' variables = apply_to_leaves(self.variables, self.call_if_func) try: result = eval(self.expression, variables, self.functions) except NameError, err: undef_var = re.findall("name '(.*)' is not defined", err.args[0])[0] raise NameError("Variable '%s' is not defined in expression '%s'" \ %(undef_var, self.expression), undef_var)
def parse_data_options(options): """ Return an FmriData object corresponding to input options """ from pyhrf.core import DEFAULT_BOLD_SURF_FILE, DEFAULT_BOLD_VOL_FILE, \ DEFAULT_SIMULATION_FILE # If SPM.mat is provided, retrieve paradigm from it for all sessions. # Leave data file pathes to unknown. if options.spmFile is not None: paradigm,tr = load_paradigm_from_mat(options.spmFile) nb_sessions = len(paradigm) if options.inputDataType == 'volume': SessDataClass = FMRISessionVolumicData if options.func_data_file is None: data_fns = [DEFAULT_BOLD_VOL_FILE] * nb_sessions else: data_fns = options.func_data_file if options.mask_file is None: options.mask_file = DEFAULT_MASK_VOL_FILE fmriDataInit = FmriData.from_vol_ui elif options.inputDataType == 'surface': SessDataClass = FMRISessionSurfacicData if options.func_data_file is None: data_fns = [DEFAULT_BOLD_SURF_FILE] * nb_sessions else: data_fns = options.func_data_file if options.mask_file is None: options.mask_file = DEFAULT_MASK_SURF_FILE fmriDataInit = FmriData.from_surf_ui elif options.inputDataType == 'simulation': SessDataClass = FMRISessionSimulationData data_fns = DEFAULT_SIMULATION_FILE fmriDataInit = FmriData.from_simu_ui sessions_data = [] if len(data_fns) != nb_sessions: raise Exception('Inconsistent number of data files and sessions: '\ '%d sessions in paradigm, %d data files' \ %(nb_sessions, len(data_fns))) # print 'paradigm:', paradigm.keys() # print 'data_fns:', len(data_fns) # print data_fns #TODO: check nb of sessions and nb of data files for isess, sess in enumerate(sorted(paradigm.keys())): #print len(paradigm.keys()) sessions_data.append(SessDataClass(paradigm[sess]['onsets'], paradigm[sess]['stimulusLength'], data_fns[isess])) if options.inputDataType == 'surface': return fmriDataInit(sessions_data=sessions_data, tr=tr, mask_file=options.mask_file, mesh_file=options.mesh_file) return fmriDataInit(sessions_data=sessions_data, tr=tr, mask_file=options.mask_file) #unstack & take 1st set of onsets for each condition to get only one session onsets = unstack_trees(eval('pyhrf.paradigm.onsets_%s' %options.paradigm))[0] durations = unstack_trees(eval('pyhrf.paradigm.durations_%s' \ %options.paradigm))[0] #print options.paradigm if options.paradigm_csv is not None: onsets, durations = load_paradigm_from_csv(options.paradigm_csv) from pyhrf.tools import apply_to_leaves onsets = apply_to_leaves(onsets, lambda x: x[0]) durations = apply_to_leaves(durations, lambda x: x[0]) ### Set data type: if options.inputDataType == 'volume' : if options.data_scenario == 'default': SessDataClass = FMRISessionVolumicData sd = SessDataClass(onsets, durations) if options.mask_file is None: options.mask_file = DEFAULT_MASK_VOL_FILE elif options.data_scenario == 'small': sd = SessDataClass(onsets, durations) if options.mask_file is None: options.mask_file = DEFAULT_MASK_SMALL_VOL_FILE elif options.data_scenario == 'realistic': sd = FMRISessionVolumicData(onsets, durations, REALISTIC_REAL_DATA_BOLD_VOL_FILE) if options.mask_file is None: options.mask_file = REALISTIC_REAL_DATA_MASK_VOL_FILE else: raise Exception("Uknown data scenario: %s" %options.data_scenario) #print 'sd!!:', sd #print 'mask:', options.mask_file if options.func_data_file is not None: #print 'options.func_data_file:', options.func_data_file sessions_data = [] sessions_data.append(SessDataClass(onsets, durations, options.func_data_file)) else: sessions_data = [sd] #print options if hasattr(options, 'tr') and options.tr is not None: tr = options.tr res = FmriData.from_vol_ui(sessions_data=sessions_data, tr=tr, mask_file=options.mask_file) else: res = FmriData.from_vol_ui(sessions_data=sessions_data, mask_file=options.mask_file) return res elif options.inputDataType == 'surface': mask_fn = DEFAULT_MASK_SURF_FILE mesh_fn = DEFAULT_MESH_FILE if options.data_scenario == 'default': #TODO: create a bigger surface default dataset sd = FMRISessionSurfacicData(onsets, durations) if options.data_scenario == 'small': sd = FMRISessionSurfacicData(onsets, durations) elif options.data_scenario == 'realistic': raise NotImplementedError('Realistic surfacic dataset not yet '\ 'available (TODO)') return FmriData.from_surf_ui(sessions_data=[sd], mask_file=mask_fn, mesh_file=mesh_fn) elif options.inputDataType == 'simulation': if options.data_scenario == 'default': sd = FMRISessionSimulationData(onsets,durations) elif options.data_scenario == 'small': raise NotImplementedError('Small artificial dataset not yet '\ 'available (TODO)') if options.data_scenario == 'realistic': raise NotImplementedError('Realistic artificial dataset not yet '\ 'available (TODO)') return FmriData.from_simu_ui(sessions_data=[sd])
]), ('LangForeignRep', [np.array([12.031, 84.031, 132.031, 180.031])]), ('LangMat', [np.array([24.031, 48.031, 96.031, 144.031])]), ('LangMatRep', [np.array([36.031, 60.031, 108.031, 156.031])]), ]) durations_language_sess4 = dict([ ('LangForeign', [np.array([3.292, 2.53, 2.945, 2.775])]), ('LangForeignRep', [np.array([3.292, 2.53, 2.945, 2.775])]), ('LangMat', [np.array([2.819, 2.771, 2.736, 2.492])]), ('LangMatRep', [np.array([2.819, 2.771, 2.736, 2.492])]), ]) builtin_paradigms.extend('language_sess%d' % i for i in range(1, 5)) durations_loc = apply_to_leaves(onsets_loc, lambda x: 2. + np.zeros_like(x)) default_contrasts_loc = OrderedDict({ "left_click": "clicGaudio + clicGvideo", "right_click": "clicDaudio + clicDvideo", "checkerboard_H-V": "damier_H - damier_V", "checkerboard_V-H": "damier_V - damier_H", "left_click-right_click": "clicGaudio-clicDaudio + clicGvideo-clicDvideo", "right_click-left_click": "clicDaudio-clicGaudio + clicDvideo-clicGvideo", "computation-sentences":
#onsets_language_sess4 = OrderedDict([ #('LangMat', np.array([ 0.036, 48.036, 72.036, 120.036])), #('LangMatRep', np.array([ 12.036, 60.036, 84.036, 132.036])), #('LangForeign', np.array([ 24.036, 96.036, 144.036, 168.036 ])),#2 #('LangForeignRep', np.array([ 36.036, 108.036, 156.036, 180.036])) #]) #durations_language_sess4 = OrderedDict([ #('LangMat', np.array([ 2.831, 2.327, 2.587, 2.936])), #('LangMatRep', np.array([ 2.831, 2.327, 2.587, 2.936])), #('LangForeign', np.array([ 2.771, 2.753, 2.715, 2.774])),#2 #('LangForeignRep', np.array([ 2.771, 2.753, 2.715, 2.774])) #]) durations_loc = apply_to_leaves(onsets_loc, lambda x: 2. + np.zeros_like(x)) default_contrasts_loc = { "left_click" : "clicGaudio + clicGvideo", "right_click" : "clicDaudio + clicDvideo", "checkerboard_H-V" : "damier_H - damier_V", "checkerboard_V-H" : "damier_V - damier_H", "left_click-right_click" : "clicGaudio-clicDaudio + clicGvideo-clicDvideo", "right_click-left_click" : "clicDaudio-clicGaudio + clicDvideo-clicGvideo", "computation-sentences" : "calculaudio-phraseaudio + calculvideo-phrasevideo", "sentences-computation" : "phraseaudio-calculaudio + phrasevideo-calculvideo", "video_computation-sentences" : "calculvideo-phrasevideo", "audio_computation-sentences" : "calculaudio-phraseaudio", "motor-cognitive" : "clicGaudio + clicDaudio + clicGvideo + clicDvideo -" \ "calculaudio - phraseaudio - calculvideo - phrasevideo", "cognitive-motor" : "calculaudio + phraseaudio + calculvideo + phrasevideo -"\
def parse_data_options(options): """ Return an FmriData object corresponding to input options """ from pyhrf.core import DEFAULT_BOLD_SURF_FILE, DEFAULT_BOLD_VOL_FILE, \ DEFAULT_SIMULATION_FILE # If SPM.mat is provided, retrieve paradigm from it for all sessions. # Leave data file pathes to unknown. if options.spmFile is not None: paradigm, tr = load_paradigm_from_mat(options.spmFile) nb_sessions = len(paradigm) if options.inputDataType == 'volume': SessDataClass = FMRISessionVolumicData if options.func_data_file is None: data_fns = [DEFAULT_BOLD_VOL_FILE] * nb_sessions else: data_fns = options.func_data_file if options.mask_file is None: options.mask_file = DEFAULT_MASK_VOL_FILE fmriDataInit = FmriData.from_vol_ui elif options.inputDataType == 'surface': SessDataClass = FMRISessionSurfacicData if options.func_data_file is None: data_fns = [DEFAULT_BOLD_SURF_FILE] * nb_sessions else: data_fns = options.func_data_file if options.mask_file is None: options.mask_file = DEFAULT_MASK_SURF_FILE fmriDataInit = FmriData.from_surf_ui elif options.inputDataType == 'simulation': SessDataClass = FMRISessionSimulationData data_fns = DEFAULT_SIMULATION_FILE fmriDataInit = FmriData.from_simu_ui sessions_data = [] if len(data_fns) != nb_sessions: raise Exception('Inconsistent number of data files and sessions: ' '%d sessions in paradigm, %d data files' % (nb_sessions, len(data_fns))) # TODO: check nb of sessions and nb of data files for isess, sess in enumerate(sorted(paradigm.keys())): sessions_data.append( SessDataClass(paradigm[sess]['onsets'], paradigm[sess]['stimulusLength'], data_fns[isess])) if options.inputDataType == 'surface': return fmriDataInit(sessions_data=sessions_data, tr=tr, mask_file=options.mask_file, mesh_file=options.mesh_file) return fmriDataInit(sessions_data=sessions_data, tr=tr, mask_file=options.mask_file) # unstack & take 1st set of onsets for each condition to get only one # session onsets = unstack_trees(eval('pyhrf.paradigm.onsets_%s' % options.paradigm))[0] durations = unstack_trees( eval('pyhrf.paradigm.durations_%s' % options.paradigm))[0] if options.paradigm_csv is not None: onsets, durations = load_paradigm_from_csv(options.paradigm_csv) from pyhrf.tools import apply_to_leaves onsets = apply_to_leaves(onsets, lambda x: x[0]) durations = apply_to_leaves(durations, lambda x: x[0]) # Set data type: if options.inputDataType == 'volume': if options.data_scenario == 'default': SessDataClass = FMRISessionVolumicData sd = SessDataClass(onsets, durations) if options.mask_file is None: options.mask_file = DEFAULT_MASK_VOL_FILE elif options.data_scenario == 'small': sd = SessDataClass(onsets, durations) if options.mask_file is None: options.mask_file = DEFAULT_MASK_SMALL_VOL_FILE elif options.data_scenario == 'realistic': sd = FMRISessionVolumicData(onsets, durations, REALISTIC_REAL_DATA_BOLD_VOL_FILE) if options.mask_file is None: options.mask_file = REALISTIC_REAL_DATA_MASK_VOL_FILE else: raise Exception("Uknown data scenario: %s" % options.data_scenario) if options.func_data_file is not None: sessions_data = [] sessions_data.append( SessDataClass(onsets, durations, options.func_data_file)) else: sessions_data = [sd] if hasattr(options, 'tr') and options.tr is not None: tr = options.tr res = FmriData.from_vol_ui(sessions_data=sessions_data, tr=tr, mask_file=options.mask_file) else: res = FmriData.from_vol_ui(sessions_data=sessions_data, mask_file=options.mask_file) return res elif options.inputDataType == 'surface': mask_fn = DEFAULT_MASK_SURF_FILE mesh_fn = DEFAULT_MESH_FILE if options.data_scenario == 'default': # TODO: create a bigger surface default dataset sd = FMRISessionSurfacicData(onsets, durations) if options.data_scenario == 'small': sd = FMRISessionSurfacicData(onsets, durations) elif options.data_scenario == 'realistic': raise NotImplementedError('Realistic surfacic dataset not yet ' 'available (TODO)') return FmriData.from_surf_ui(sessions_data=[sd], mask_file=mask_fn, mesh_file=mesh_fn) elif options.inputDataType == 'simulation': if options.data_scenario == 'default': sd = FMRISessionSimulationData(onsets, durations) elif options.data_scenario == 'small': raise NotImplementedError('Small artificial dataset not yet ' 'available (TODO)') if options.data_scenario == 'realistic': raise NotImplementedError('Realistic artificial dataset not yet ' 'available (TODO)') return FmriData.from_simu_ui(sessions_data=[sd])