Example #1
0
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)
Example #2
0
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)
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
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])
Example #6
0
    ]),
    ('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":
Example #7
0
#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 -"\
Example #8
0
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])