Пример #1
0
def plot_comparison_measure(group_order,group_cycle,mclesionsham,bracket_offset=5,bracket_tickheight=1):
    scale = 46
    offsetscale = 2
    plt.close('all')
    fig = plt.figure('stable sessions average trial times',figsize=(4,7))
    ax = fig.gca()
    ax.set_color_cycle(group_cycle)
    measures = [plot_average_trial_times('stable sessions',mclesionsham[group_order[i]][1:5],label='lesion' if group_cycle[i] == 'r' else 'control',offset=i*2,scale=46) for i in range(14)]
    plt.ylabel('time between rewards (s)')
    plt.xlabel('sessions')
    
    lesionoffset = 3*offsetscale
    lesioncenter = [scale*i+lesionoffset for i in range(4)]
    lesion_times = [[get_average_trial_time(mclesionsham[i][s]) for i in group_order[0:7]] for s in range(1,5)]
    lesion_mean = [np.mean(x) for x in lesion_times]
    lesion_std = [np.std(x) for x in lesion_times]
    plt.errorbar(lesioncenter,lesion_mean,lesion_std,fmt='--o',color=group_cycle[0],ecolor='k',linewidth=2,capthick=2,markersize=0)
    
    controloffset = 10*offsetscale
    controlcenter = [scale*i+controloffset for i in range(4)]
    control_times = [[get_average_trial_time(mclesionsham[i][s]) for i in group_order[7:14]] for s in range(1,5)]
    control_mean = [np.mean(x) for x in control_times]
    control_std = [np.std(x) for x in control_times]
    plt.errorbar(controlcenter,control_mean,control_std,fmt='--o',color=group_cycle[7],ecolor='k',linewidth=2,capthick=2,markersize=0)
    
    pltutils.fix_font_size()
    handles, labels = ax.get_legend_handles_labels()
    plt.legend((handles[0],handles[7]),(labels[0],labels[7]))
    
    tickoffset = 6.5*offsetscale
    xticks = [scale*i+tickoffset for i in range(4)]
    ax.set_xticks(xticks)
    ax.set_xticklabels([1,2,3,4])
    
    ### BRACKETS (BETWEEN GROUPS) ###
    maxstd = []
    minstd = []
    significance = 0.05
    maxrange = len(measures)
    for i in range(len(xticks)):
        sigtest = stats.ttest_ind(lesion_times[i],control_times[i])[1]
        print sigtest,"groups"
        testlabel = str.format("*",sigtest) if sigtest < significance else 'n.s.'
        maxstd.append(get_bracket_y(measures,range(maxrange) if i < 1 else range(0,7)+range(8,14),i))
        minstd.append(get_negative_bracket_y(measures,range(maxrange) if i < 1 else range(0,7)+range(8,14),i))
        
    minstd = min(minstd)
    for i in range(len(xticks)):
        pltutils.hbracket(xticks[i],minstd-bracket_offset,1.4,label=testlabel,tickheight=-10*bracket_tickheight)
    #################################
    
    plt.draw()
def plot_comparison_measure(group_order,group_cycle,mclesionsham,bracket_offset=5,bracket_tickheight=1):
    scale = 46
    offsetscale = 2
    plt.close('all')
    fig = plt.figure('stable sessions average trial times',figsize=(4,7))
    ax = fig.gca()
    ax.set_color_cycle(group_cycle)
    measures = [plot_average_trial_times('stable sessions',mclesionsham[group_order[i]][1:5],label='lesion' if group_cycle[i] == 'r' else 'control',offset=i*2,scale=46) for i in range(14)]
    plt.ylabel('time between rewards (s)')
    plt.xlabel('sessions')
    
    lesionoffset = 3*offsetscale
    lesioncenter = [scale*i+lesionoffset for i in range(4)]
    lesion_times = [[get_average_trial_time(mclesionsham[i][s]) for i in group_order[0:7]] for s in range(1,5)]
    lesion_mean = [np.mean(x) for x in lesion_times]
    lesion_std = [np.std(x) for x in lesion_times]
    plt.errorbar(lesioncenter,lesion_mean,lesion_std,fmt='--o',color=group_cycle[0],ecolor='k',linewidth=2,capthick=2,markersize=0)
    
    controloffset = 10*offsetscale
    controlcenter = [scale*i+controloffset for i in range(4)]
    control_times = [[get_average_trial_time(mclesionsham[i][s]) for i in group_order[7:14]] for s in range(1,5)]
    control_mean = [np.mean(x) for x in control_times]
    control_std = [np.std(x) for x in control_times]
    plt.errorbar(controlcenter,control_mean,control_std,fmt='--o',color=group_cycle[7],ecolor='k',linewidth=2,capthick=2,markersize=0)
    
    pltutils.fix_font_size()
    handles, labels = ax.get_legend_handles_labels()
    plt.legend((handles[0],handles[7]),(labels[0],labels[7]))
    
    tickoffset = 6.5*offsetscale
    xticks = [scale*i+tickoffset for i in range(4)]
    ax.set_xticks(xticks)
    ax.set_xticklabels([1,2,3,4])
    
    ### BRACKETS (BETWEEN GROUPS) ###
    maxstd = []
    minstd = []
    significance = 0.05
    maxrange = len(measures)
    for i in range(len(xticks)):
        sigtest = stats.ttest_ind(lesion_times[i],control_times[i])[1]
        print sigtest,"groups"
        testlabel = str.format("*",sigtest) if sigtest < significance else 'n.s.'
        maxstd.append(get_bracket_y(measures,range(maxrange) if i < 1 else range(0,7)+range(8,14),i))
        minstd.append(get_negative_bracket_y(measures,range(maxrange) if i < 1 else range(0,7)+range(8,14),i))
        
    minstd = min(minstd)
    for i in range(len(xticks)):
        pltutils.hbracket(xticks[i],minstd-bracket_offset,1.4,label=testlabel,tickheight=-10*bracket_tickheight)
    #################################
    
    plt.draw()
Пример #3
0
def plot_trial_measures(group_cycle,group_order,trial_measures,bracket_offset=0.5,bracket_tickheight=1,ylims=None,xticklabels=None):
    scale = 46
    offsetscale = 2
    num_sessions = len(trial_measures[0])
    ax = plt.gca()
    ax.set_color_cycle(group_cycle)
    measures = [[trial_measures[group_order[i]][s] for s in (range(num_sessions) if i != 7 else [0])] for i in range(len(trial_measures))]
    [plot_epoch_average(measures[i],label='lesion' if group_cycle[i] == 'r' else 'control',offset=i*offsetscale,scale=scale) for i in range(len(trial_measures))]
    plt.ylabel('time to cross obstacles (s)')
    plt.xlabel('x')
    
    offset1 = 3*offsetscale
    center1 = [scale*i+offset1 for i in range(num_sessions)]
    group1_times = [[np.mean(trial_measures[i][s]) for i in group_order[0:7]] for s in range(num_sessions)]
    group1_mean = [np.mean(x) for x in group1_times]
    group1_std = [np.std(x) for x in group1_times]
    plt.errorbar(center1,group1_mean,group1_std,fmt='o',color=group_cycle[0],ecolor='k',linewidth=2,capthick=2,markersize=0)
    
    offset2 = 10*offsetscale
    center2 = [scale*i+offset2 for i in range(num_sessions)]
    group2_times = [[np.mean(trial_measures[i][s]) for i in (group_order[7:14] if s < 1 else group_order[8:14])] for s in range(num_sessions)]
    group2_mean = [np.mean(x) for x in group2_times]
    group2_std = [np.std(x) for x in group2_times]
    plt.errorbar(center2,group2_mean,group2_std,fmt='o',color=group_cycle[7],ecolor='k',linewidth=2,capthick=2,markersize=0)
    
    pltutils.fix_font_size()
    #handles, labels = ax.get_legend_handles_labels()
    #plt.legend((handles[0],handles[7]),(labels[0],labels[7]))
    tickoffset = 6.5*offsetscale
    xticks = [scale*i+tickoffset for i in range(num_sessions)]
    ax.set_xticks(xticks)
    ax.set_xticklabels(xticklabels)
    
    
    ### BRACKETS (BETWEEN GROUPS) ###
    maxstd = []
    minstd = []
    significance = 0.01
    maxrange = len(measures)
    for i in range(len(xticks)):
        sigtest = stats.ttest_ind(group1_times[i],group2_times[i])[1]
        print sigtest,"groups"
        testlabel = str.format("*",sigtest) if sigtest < significance else 'n.s.'
        maxstd.append(get_bracket_y(measures,range(maxrange) if i < 1 else range(0,7)+range(8,14),i))
        minstd.append(get_negative_bracket_y(measures,range(maxrange) if i < 1 else range(0,7)+range(8,14),i))
        
    maxstd = max(maxstd)
    for i in range(len(xticks)):
        pltutils.hbracket(xticks[i],maxstd+bracket_offset,2,label=testlabel,tickheight=bracket_tickheight)
    ##################################
        
    ### BRACKETS (BETWEEN CONDITIONS) ###
    minstd = min(minstd)
    sigtest = stats.ttest_ind(group1_times[0]+group2_times[0],group1_times[-1]+group2_times[-1])[1]
    print sigtest,"conditions"
    testlabel = str.format("*",sigtest) if sigtest < significance else 'n.s.'
    #pltutils.hbracket(xticks[1],minstd-bracket_offset,5.5,label=testlabel,tickheight=-1.5*bracket_tickheight)
    pltutils.hbracket((xticks[-1]-xticks[0])/2+xticks[0],minstd-bracket_offset,9.5,label=testlabel,tickheight=-1.5*bracket_tickheight)
    #####################################
    
    ### SEPARATORS ###
    ylims = plt.ylim() if ylims is None else ylims
    for i in range(len(xticks)-1):
        separatorxi = (xticks[i]+xticks[i+1])/2
        ax.plot((separatorxi,separatorxi),ylims,'k--')
    plt.ylim(ylims)
    ##################
    
    plt.xlabel('')
    plt.draw()

############# FIGURE 3 ##############################

#### Get contact step activation ###
#def get_contact_step_activity(session,i):
#    activity = session.steps[i]
#    step_index = 3 if session.labels[i]['direction'] == 'right' else 4
#    return activity[:,step_index]
#    
#### Plot contact maximum activation distribution ###
#def plot_contact_distribution(session):
#    max_contacts = [np.max(get_contact_step_activity(session,i)) for i in range(len(session.steps))]
#    maxStContacts = [mc for state,mc in zip(session.labels,max_contacts) if state['state'] == 'stable']
#    maxUnContacts = [mc for state,mc in zip(session.labels,max_contacts) if state['state'] == 'unstable']
#    plt.plot(maxStContacts,'b.')
#    plt.plot(maxUnContacts,'r.')
#    
## Time Difference in microseconds
#def time_diff(t):
#    numTimes = np.size(t)    
#    dT = np.zeros(numTimes-1)    
#    for i in range(numTimes-1):
#        dT[i] = (t[i+1]-t[i]).microseconds
#
#    return dT
#    
#def get_randomized_speed_profiles(experiment,a,sessions,filterpath):    
#    avgSpeeds_allsess = []
#    trialTypes_allsess = []
#
#    # Select Session
#    for s in sessions:
#
#        # Load Valid Trial Filter (manually sorted)
#        validFilename = filterpath +  r'\valid_a' + str(a) + '_s' + str(s) + '.pickle'
#        valid_trials = load_data.load_pickle(validFilename)
#        numTrials = np.size(valid_trials)
#    
#        # There is some misalignment for sessions on the last 4 animals..there session 0 is other session 1
#        if a >= 10:
#            s = s-1
#        
#        # Set Trial Lables
#        labelfilter1 = {'state':'stable'}
#        labelfilter2 = {'state':'unstable'}
#        labelFilters = [labelfilter1, labelfilter2]
#        
#        # Look at all Trajectories
#        trajectories = experiment[a][s].trajectories
#        times = experiment[a][s].time    
#        slices = experiment[a][s].slices
#        labels = experiment[a][s].labels
#        steps = experiment[a][s].steps
#        speeds = experiment[a][s].speeds
#        
#        print str.format('a:s {0}:{1} {2} {3}', a, s, numTrials, len(slices))
#        
#        # Set Valid Trials (No exploration or tracking errors)
#        crossings = valid_trials
#    
#        # Set Binning and Range
#        avgSpeeds = np.zeros((numTrials, numBins))
#        trialTypes = np.zeros((numTrials, 1))
#        for t in range(0,numTrials):
#        
#            #label_indices = np.array(pt.get_labeled_indices(labels,labelFilters[l]))
#            c = crossings[t]
#            
#            # Load X Trajectories and flip all of 'Left'
#            trialX = trajectories[slices[c],0]
#            if utils.is_dict_subset({'direction':'left'},labels[c]):
#                # ALign on 2 important rails (the center of rail 3 is 550)
#                # and the centr of rail 4 is 737, therefore, the first encounter
#                # is at 550 going "right", and when flipped, (1280-737 = 543)
#                # going "left"...therefore, to correct for the shift, I subteact 1273 
#                # and align the left and right trials
#                trialX = np.abs(trialX-1273)
#                
#            # Load Y Trajectories
#            trialY = trajectories[slices[c],1]
#            
#            # Load and Parse Times
#            trialTstrings = times[slices[c]]
#            trialT = np.array([dateutil.parser.parse(timeString) for timeString in trialTstrings])
#            
#            # Measure Progression Speed
#            diffX =  np.diff(trialX)
#            diffT = time_diff(trialT)/1000000 # Time interval in seconds
#            speedX = np.concatenate((np.zeros(1) , diffX/diffT))
#        
#            # Find enter/exit and crop trials
#            indR = np.where(trialX > 1200)
#            indL = np.where(trialX < 150)
#            if (np.size(indR) > 0) and (np.size(indL) > 0):
#                exitInd = indR[0][0]+1
#                enterInd = indL[0][-1]
#                
#            trialX = trialX[enterInd:exitInd]
#            trialY = trialY[enterInd:exitInd]
#            speedX = speedX[enterInd:exitInd]
#            
#            # Bin (progrssion - X) Speed Profiles (from position 200 to 1200)
#            for b in range(0,numBins):
#                bins = np.where((trialX >= (200+(b*binSize))) & (trialX < (200+(b*binSize)+binSize)))
#                if np.size(bins) > 0:
#                    avgSpeeds[t, b] = np.mean(speedX[bins])
#                else:
#                    avgSpeeds[t, b] = np.NaN
#            
#            # Correct for starting speed - - first Third of assay
#            baseSpeed = stats.nanmean(avgSpeeds[t, 0:14])
#            avgSpeeds[t,:] = avgSpeeds[t,:]/baseSpeed
#            
#            # Get Lables
#            label = labels[c]
#            
#            if utils.is_dict_subset({'state':'stable'},label):
#                trialTypes[t] = 0
#            else:
#                trialTypes[t] = 1
#        
#        # Pool All Average Speeds/TrialTypes Across Sessions        
#        avgSpeeds_allsess.append(avgSpeeds)
#        trialTypes_allsess.append(trialTypes)
#    
#    avgSpeeds = np.concatenate(avgSpeeds_allsess)
#    trialTypes = np.concatenate(trialTypes_allsess)
#    return avgSpeeds,trialTypes
#
#def plot_randomized_speed_profiles(avgSpeeds,trialTypes):
#    # Set Plotting Attributes
#    color1 = (0.0, 0.0, 0.0, 0.1)
#    color2 = (1.0, 0.6, 0.0, 0.1)
#    color1b = (0.0, 0.0, 0.0, 1.0)
#    color2b = (1.0, 0.6, 0.0, 1.0)
#    
#    traceColors = [color1, color2]
#    boldColors = [color1b, color2b]    
#    
#    # Plot Average Speeds in bins
#    plt.figure()
#    numTrials = np.size(trialTypes)
#    for t in range(0,numTrials):
#        if trialTypes[t] == 0:
#            plt.plot(avgSpeeds[t,:], color=color1)
#        else:
#            plt.plot(avgSpeeds[t,:], color=color2)
#
#    stableTrials = np.where(trialTypes == 0)
#    unstableTrials = np.where(trialTypes == 1)
#    mSt = stats.nanmean(avgSpeeds[stableTrials, :], 1)
#    mUn = stats.nanmean(avgSpeeds[unstableTrials, :], 1)
#    eSt = stats.nanstd(avgSpeeds[stableTrials, :], 1)/np.sqrt(np.size(stableTrials)-1)
#    eUn = stats.nanstd(avgSpeeds[unstableTrials, :], 1)/np.sqrt(np.size(unstableTrials)-1)
#    
##    eSt = stats.nanstd(avgSpeeds[stableTrials, :], 1)
##    eUn = stats.nanstd(avgSpeeds[unstableTrials, :], 1)
#
#
#    mSt = mSt[0];    
#    mUn = mUn[0];    
#    eSt = eSt[0];    
#    eUn = eUn[0];
#    
#    plt.plot(mUn, color=color2b, linewidth = 7)
#    plt.plot(mSt, color=color1b, linewidth = 7)
#
##    plt.plot(mSt + eSt, color=color1b, linewidth = 0.5)
##    plt.plot(mSt - eSt, color=color1b, linewidth = 0.5)
##    plt.plot(mUn + eUn, color=color2b, linewidth = 0.5)
##    plt.plot(mUn - eUn, color=color2b, linewidth = 0.5)
#    #pltutils.fix_font_size()
#    plt.xlabel('crossing extent (cm)')
#    plt.ylabel('normalized horizontal speed')
#    pltutils.fix_font_size()
#    plt.axis([0, 39, 0, 3])
#    
#    
##### Figure 3b ####
#    
#def get_randomized_group_average_speed_profiles(profiles):        
#    stAvg = []
#    unAvg = []
#    stErr = []
#    unErr = []
#    
#    for avgSpeeds,trialTypes in profiles:
#        # Plot Average Speeds in bins
#        stableTrials = np.where(trialTypes == 0)
#        unstableTrials = np.where(trialTypes == 1)
#        
#        mSt = stats.nanmean(avgSpeeds[stableTrials, :], 1)
#        mUn = stats.nanmean(avgSpeeds[unstableTrials, :], 1)
#        eSt = stats.nanstd(avgSpeeds[stableTrials, :], 1)/np.sqrt(np.size(stableTrials)-1)
#        eUn = stats.nanstd(avgSpeeds[unstableTrials, :], 1)/np.sqrt(np.size(unstableTrials)-1)
#    
#        mSt = mSt[0]
#        mUn = mUn[0]
#        eSt = eSt[0]
#        eUn = eUn[0]
#    
#        stAvg.append(mSt)
#        unAvg.append(mUn)
#        stErr.append(eSt)
#        unErr.append(eUn)
#    return (stAvg,stErr),(unAvg,unErr)
#    
#def get_randomized_group_speed_profile_difference(avgProfiles):    
#    diffs = []
#    errors = []
#
#    # Unpack average profile structure
#    (stAvg,stErr),(unAvg,unErr) = avgProfiles
#    
#    for mSt,eSt,mUn,eUn in zip(stAvg,stErr,unAvg,unErr):
#        # Compute Difference Speed between Stable and Unstable Trials
#        mDiff = mUn-mSt
#        eDiff = np.sqrt((eSt*eSt) + (eUn*eUn))
#        diffs.append(mDiff)
#        errors.append(eDiff)
#        
#    diffs = np.array(diffs)
#    errors = np.array(errors)
#    return diffs,errors,np.mean(diffs[:, 20:], 1)
#    
#def plot_randomized_group_average_speed_profiles(avgProfiles,labelx=True,labely=True,legend=True,title=None):
#    # Set Plotting Attributes
#    color1b = (0.0, 0.0, 0.0, 1.0)
#    color2b = (1.0, 0.6, 0.0, 1.0)
#    
#    # Unpack average profile structure
#    (stAvg,stErr),(unAvg,unErr) = avgProfiles
#    
#    # Prepare Bulk Arrays
#    stAvg = np.array(stAvg)
#    unAvg = np.array(unAvg)
#    stErr = np.array(stErr)
#    unErr = np.array(unErr)
#    
#    # Plot Averge Speed Profiles
#    a1 = plt.plot(np.mean(unAvg,0), color = color2b, linewidth = 3,label='unstable')
#    a2 = plt.plot(np.mean(stAvg,0), color = color1b, linewidth = 3,label='stable')
#    if labelx:
#        plt.xlabel('crossing extent (cm)')
#    if labely:
#        plt.ylabel('normalized horizontal speed')
#    pltutils.fix_font_size()
#    plt.axis([0, numBins, 0.5, 2.0])
#    plt.yticks([0.75,1.0,1.25,1.5,1.75])
#    if legend:
#        plt.legend((a2[0],a1[0]),('stable','unstable'),loc='upper left')
#        
#    if title is not None:
#        ax = plt.gca()
#        ax.text(0.5,0.9,title,horizontalalignment='center',transform=ax.transAxes)
#    
#def plot_randomized_speed_profile_difference_comparison(controls,lesions):
#    controlMeans = np.mean(controls, 0)
#    controlMeanAll = np.mean(controlMeans)
#    controlError = np.std(controlMeans)/np.sqrt(7-1)
#    
#    lesionMeans = np.mean(lesions, 0)
#    lesionMeanAll = np.mean(lesionMeans)
#    lesionlError = np.std(lesionMeans)/np.sqrt(6-1)
#    
#    significance = 0.05
#    sigtest = stats.ttest_ind(controlMeans, lesionMeans)[1]
#    testlabel = str.format("*",sigtest) if sigtest < significance else 'n.s.'
#    print sigtest
#    
#    cX = [1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1]
#    lX = [1.9, 1.9, 1.9, 1.9, 1.9, 1.9]
#    
#    plt.plot([0,3], [0,0], color=[0.25,0.25,0.25,1], linewidth = 1)
#    plt.plot(cX, controlMeans, 'bo')
#    plt.plot(lX, lesionMeans, 'ro')
#    plt.plot(1.9, lesionMeans[5], 'o', color = [1.0, 0.75, 0.75, 1.0])
#    
#    #plt.bar(1.2, controlMeanAll, 0.2, color=[1.0,1.0,1.0,0.0])
#    plt.errorbar(1.3, controlMeanAll, controlError, marker='s', mfc='blue', ecolor = 'black', mec='black', ms=1, mew=1, capsize=5, elinewidth=2)
#    plt.plot([1.0,1.4], [controlMeanAll,controlMeanAll], color=[0.25,0.25,1.0,1], linewidth = 2)
#    
#    #plt.bar(1.6, lesionMeanAll, 0.2, color=[1.0,1.0,1.0,0.0])
#    plt.errorbar(1.7, lesionMeanAll, lesionlError, marker='s', mfc='red', ecolor = 'black', mec='black', ms=1, mew=1, capsize=5, elinewidth=2)
#    plt.plot([1.6,2.0], [lesionMeanAll,lesionMeanAll], color=[1.00,0.25,0.25,1], linewidth = 2)
#    pltutils.hbracket(1.5,0.17,4.5,label=testlabel,tickheight=0.01)
#    
#    ax = plt.gca()
#    ax.set_xticks([1.1,1.9])
#    ax.set_xticklabels(['controls','lesions'])
#    plt.ylabel('normalized speed difference')
#    
#    pltutils.fix_font_size()
#    plt.axis([0.75,2.25,-0.2,0.2])
def plot_trial_measures(group_cycle,group_order,trial_measures,bracket_offset=0.5,bracket_tickheight=1,ylims=None,xticklabels=None):
    scale = 46
    offsetscale = 2
    num_sessions = len(trial_measures[0])
    ax = plt.gca()
    ax.set_color_cycle(group_cycle)
    measures = [[trial_measures[group_order[i]][s] for s in (range(num_sessions) if i != 7 else [0])] for i in range(len(trial_measures))]
    [plot_epoch_average(measures[i],label='lesion' if group_cycle[i] == 'r' else 'control',offset=i*offsetscale,scale=scale) for i in range(len(trial_measures))]
    plt.ylabel('time to cross obstacles (s)')
    plt.xlabel('x')
    
    offset1 = 3*offsetscale
    center1 = [scale*i+offset1 for i in range(num_sessions)]
    group1_times = [[np.mean(trial_measures[i][s]) for i in group_order[0:7]] for s in range(num_sessions)]
    group1_mean = [np.mean(x) for x in group1_times]
    group1_std = [np.std(x) for x in group1_times]
    plt.errorbar(center1,group1_mean,group1_std,fmt='o',color=group_cycle[0],ecolor='k',linewidth=2,capthick=2,markersize=0)
    
    offset2 = 10*offsetscale
    center2 = [scale*i+offset2 for i in range(num_sessions)]
    group2_times = [[np.mean(trial_measures[i][s]) for i in (group_order[7:14] if s < 1 else group_order[8:14])] for s in range(num_sessions)]
    group2_mean = [np.mean(x) for x in group2_times]
    group2_std = [np.std(x) for x in group2_times]
    plt.errorbar(center2,group2_mean,group2_std,fmt='o',color=group_cycle[7],ecolor='k',linewidth=2,capthick=2,markersize=0)
    
    pltutils.fix_font_size()
    #handles, labels = ax.get_legend_handles_labels()
    #plt.legend((handles[0],handles[7]),(labels[0],labels[7]))
    tickoffset = 6.5*offsetscale
    xticks = [scale*i+tickoffset for i in range(num_sessions)]
    ax.set_xticks(xticks)
    ax.set_xticklabels(xticklabels)
    
    
    ### BRACKETS (BETWEEN GROUPS) ###
    maxstd = []
    minstd = []
    significance = 0.01
    maxrange = len(measures)
    for i in range(len(xticks)):
        sigtest = stats.ttest_ind(group1_times[i],group2_times[i])[1]
        print sigtest,"groups"
        testlabel = str.format("*",sigtest) if sigtest < significance else 'n.s.'
        maxstd.append(get_bracket_y(measures,range(maxrange) if i < 1 else range(0,7)+range(8,14),i))
        minstd.append(get_negative_bracket_y(measures,range(maxrange) if i < 1 else range(0,7)+range(8,14),i))
        
    maxstd = max(maxstd)
    for i in range(len(xticks)):
        pltutils.hbracket(xticks[i],maxstd+bracket_offset,2,label=testlabel,tickheight=bracket_tickheight)
    ##################################
        
    ### BRACKETS (BETWEEN CONDITIONS) ###
    minstd = min(minstd)
    sigtest = stats.ttest_ind(group1_times[0]+group2_times[0],group1_times[-1]+group2_times[-1])[1]
    print sigtest,"conditions"
    testlabel = str.format("*",sigtest) if sigtest < significance else 'n.s.'
    #pltutils.hbracket(xticks[1],minstd-bracket_offset,5.5,label=testlabel,tickheight=-1.5*bracket_tickheight)
    pltutils.hbracket((xticks[-1]-xticks[0])/2+xticks[0],minstd-bracket_offset,9.5,label=testlabel,tickheight=-1.5*bracket_tickheight)
    #####################################
    
    ### SEPARATORS ###
    ylims = plt.ylim() if ylims is None else ylims
    for i in range(len(xticks)-1):
        separatorxi = (xticks[i]+xticks[i+1])/2
        ax.plot((separatorxi,separatorxi),ylims,'k--')
    plt.ylim(ylims)
    ##################
    
    plt.xlabel('')
    plt.draw()

############# FIGURE 3 ##############################

#### Get contact step activation ###
#def get_contact_step_activity(session,i):
#    activity = session.steps[i]
#    step_index = 3 if session.labels[i]['direction'] == 'right' else 4
#    return activity[:,step_index]
#    
#### Plot contact maximum activation distribution ###
#def plot_contact_distribution(session):
#    max_contacts = [np.max(get_contact_step_activity(session,i)) for i in range(len(session.steps))]
#    maxStContacts = [mc for state,mc in zip(session.labels,max_contacts) if state['state'] == 'stable']
#    maxUnContacts = [mc for state,mc in zip(session.labels,max_contacts) if state['state'] == 'unstable']
#    plt.plot(maxStContacts,'b.')
#    plt.plot(maxUnContacts,'r.')
#    
## Time Difference in microseconds
#def time_diff(t):
#    numTimes = np.size(t)    
#    dT = np.zeros(numTimes-1)    
#    for i in range(numTimes-1):
#        dT[i] = (t[i+1]-t[i]).microseconds
#
#    return dT
#    
#def get_randomized_speed_profiles(experiment,a,sessions,filterpath):    
#    avgSpeeds_allsess = []
#    trialTypes_allsess = []
#
#    # Select Session
#    for s in sessions:
#
#        # Load Valid Trial Filter (manually sorted)
#        validFilename = filterpath +  r'\valid_a' + str(a) + '_s' + str(s) + '.pickle'
#        valid_trials = load_data.load_pickle(validFilename)
#        numTrials = np.size(valid_trials)
#    
#        # There is some misalignment for sessions on the last 4 animals..there session 0 is other session 1
#        if a >= 10:
#            s = s-1
#        
#        # Set Trial Lables
#        labelfilter1 = {'state':'stable'}
#        labelfilter2 = {'state':'unstable'}
#        labelFilters = [labelfilter1, labelfilter2]
#        
#        # Look at all Trajectories
#        trajectories = experiment[a][s].trajectories
#        times = experiment[a][s].time    
#        slices = experiment[a][s].slices
#        labels = experiment[a][s].labels
#        steps = experiment[a][s].steps
#        speeds = experiment[a][s].speeds
#        
#        print str.format('a:s {0}:{1} {2} {3}', a, s, numTrials, len(slices))
#        
#        # Set Valid Trials (No exploration or tracking errors)
#        crossings = valid_trials
#    
#        # Set Binning and Range
#        avgSpeeds = np.zeros((numTrials, numBins))
#        trialTypes = np.zeros((numTrials, 1))
#        for t in range(0,numTrials):
#        
#            #label_indices = np.array(pt.get_labeled_indices(labels,labelFilters[l]))
#            c = crossings[t]
#            
#            # Load X Trajectories and flip all of 'Left'
#            trialX = trajectories[slices[c],0]
#            if utils.is_dict_subset({'direction':'left'},labels[c]):
#                # ALign on 2 important rails (the center of rail 3 is 550)
#                # and the centr of rail 4 is 737, therefore, the first encounter
#                # is at 550 going "right", and when flipped, (1280-737 = 543)
#                # going "left"...therefore, to correct for the shift, I subteact 1273 
#                # and align the left and right trials
#                trialX = np.abs(trialX-1273)
#                
#            # Load Y Trajectories
#            trialY = trajectories[slices[c],1]
#            
#            # Load and Parse Times
#            trialTstrings = times[slices[c]]
#            trialT = np.array([dateutil.parser.parse(timeString) for timeString in trialTstrings])
#            
#            # Measure Progression Speed
#            diffX =  np.diff(trialX)
#            diffT = time_diff(trialT)/1000000 # Time interval in seconds
#            speedX = np.concatenate((np.zeros(1) , diffX/diffT))
#        
#            # Find enter/exit and crop trials
#            indR = np.where(trialX > 1200)
#            indL = np.where(trialX < 150)
#            if (np.size(indR) > 0) and (np.size(indL) > 0):
#                exitInd = indR[0][0]+1
#                enterInd = indL[0][-1]
#                
#            trialX = trialX[enterInd:exitInd]
#            trialY = trialY[enterInd:exitInd]
#            speedX = speedX[enterInd:exitInd]
#            
#            # Bin (progrssion - X) Speed Profiles (from position 200 to 1200)
#            for b in range(0,numBins):
#                bins = np.where((trialX >= (200+(b*binSize))) & (trialX < (200+(b*binSize)+binSize)))
#                if np.size(bins) > 0:
#                    avgSpeeds[t, b] = np.mean(speedX[bins])
#                else:
#                    avgSpeeds[t, b] = np.NaN
#            
#            # Correct for starting speed - - first Third of assay
#            baseSpeed = stats.nanmean(avgSpeeds[t, 0:14])
#            avgSpeeds[t,:] = avgSpeeds[t,:]/baseSpeed
#            
#            # Get Lables
#            label = labels[c]
#            
#            if utils.is_dict_subset({'state':'stable'},label):
#                trialTypes[t] = 0
#            else:
#                trialTypes[t] = 1
#        
#        # Pool All Average Speeds/TrialTypes Across Sessions        
#        avgSpeeds_allsess.append(avgSpeeds)
#        trialTypes_allsess.append(trialTypes)
#    
#    avgSpeeds = np.concatenate(avgSpeeds_allsess)
#    trialTypes = np.concatenate(trialTypes_allsess)
#    return avgSpeeds,trialTypes
#
#def plot_randomized_speed_profiles(avgSpeeds,trialTypes):
#    # Set Plotting Attributes
#    color1 = (0.0, 0.0, 0.0, 0.1)
#    color2 = (1.0, 0.6, 0.0, 0.1)
#    color1b = (0.0, 0.0, 0.0, 1.0)
#    color2b = (1.0, 0.6, 0.0, 1.0)
#    
#    traceColors = [color1, color2]
#    boldColors = [color1b, color2b]    
#    
#    # Plot Average Speeds in bins
#    plt.figure()
#    numTrials = np.size(trialTypes)
#    for t in range(0,numTrials):
#        if trialTypes[t] == 0:
#            plt.plot(avgSpeeds[t,:], color=color1)
#        else:
#            plt.plot(avgSpeeds[t,:], color=color2)
#
#    stableTrials = np.where(trialTypes == 0)
#    unstableTrials = np.where(trialTypes == 1)
#    mSt = stats.nanmean(avgSpeeds[stableTrials, :], 1)
#    mUn = stats.nanmean(avgSpeeds[unstableTrials, :], 1)
#    eSt = stats.nanstd(avgSpeeds[stableTrials, :], 1)/np.sqrt(np.size(stableTrials)-1)
#    eUn = stats.nanstd(avgSpeeds[unstableTrials, :], 1)/np.sqrt(np.size(unstableTrials)-1)
#    
##    eSt = stats.nanstd(avgSpeeds[stableTrials, :], 1)
##    eUn = stats.nanstd(avgSpeeds[unstableTrials, :], 1)
#
#
#    mSt = mSt[0];    
#    mUn = mUn[0];    
#    eSt = eSt[0];    
#    eUn = eUn[0];
#    
#    plt.plot(mUn, color=color2b, linewidth = 7)
#    plt.plot(mSt, color=color1b, linewidth = 7)
#
##    plt.plot(mSt + eSt, color=color1b, linewidth = 0.5)
##    plt.plot(mSt - eSt, color=color1b, linewidth = 0.5)
##    plt.plot(mUn + eUn, color=color2b, linewidth = 0.5)
##    plt.plot(mUn - eUn, color=color2b, linewidth = 0.5)
#    #pltutils.fix_font_size()
#    plt.xlabel('crossing extent (cm)')
#    plt.ylabel('normalized horizontal speed')
#    pltutils.fix_font_size()
#    plt.axis([0, 39, 0, 3])
#    
#    
##### Figure 3b ####
#    
#def get_randomized_group_average_speed_profiles(profiles):        
#    stAvg = []
#    unAvg = []
#    stErr = []
#    unErr = []
#    
#    for avgSpeeds,trialTypes in profiles:
#        # Plot Average Speeds in bins
#        stableTrials = np.where(trialTypes == 0)
#        unstableTrials = np.where(trialTypes == 1)
#        
#        mSt = stats.nanmean(avgSpeeds[stableTrials, :], 1)
#        mUn = stats.nanmean(avgSpeeds[unstableTrials, :], 1)
#        eSt = stats.nanstd(avgSpeeds[stableTrials, :], 1)/np.sqrt(np.size(stableTrials)-1)
#        eUn = stats.nanstd(avgSpeeds[unstableTrials, :], 1)/np.sqrt(np.size(unstableTrials)-1)
#    
#        mSt = mSt[0]
#        mUn = mUn[0]
#        eSt = eSt[0]
#        eUn = eUn[0]
#    
#        stAvg.append(mSt)
#        unAvg.append(mUn)
#        stErr.append(eSt)
#        unErr.append(eUn)
#    return (stAvg,stErr),(unAvg,unErr)
#    
#def get_randomized_group_speed_profile_difference(avgProfiles):    
#    diffs = []
#    errors = []
#
#    # Unpack average profile structure
#    (stAvg,stErr),(unAvg,unErr) = avgProfiles
#    
#    for mSt,eSt,mUn,eUn in zip(stAvg,stErr,unAvg,unErr):
#        # Compute Difference Speed between Stable and Unstable Trials
#        mDiff = mUn-mSt
#        eDiff = np.sqrt((eSt*eSt) + (eUn*eUn))
#        diffs.append(mDiff)
#        errors.append(eDiff)
#        
#    diffs = np.array(diffs)
#    errors = np.array(errors)
#    return diffs,errors,np.mean(diffs[:, 20:], 1)
#    
#def plot_randomized_group_average_speed_profiles(avgProfiles,labelx=True,labely=True,legend=True,title=None):
#    # Set Plotting Attributes
#    color1b = (0.0, 0.0, 0.0, 1.0)
#    color2b = (1.0, 0.6, 0.0, 1.0)
#    
#    # Unpack average profile structure
#    (stAvg,stErr),(unAvg,unErr) = avgProfiles
#    
#    # Prepare Bulk Arrays
#    stAvg = np.array(stAvg)
#    unAvg = np.array(unAvg)
#    stErr = np.array(stErr)
#    unErr = np.array(unErr)
#    
#    # Plot Averge Speed Profiles
#    a1 = plt.plot(np.mean(unAvg,0), color = color2b, linewidth = 3,label='unstable')
#    a2 = plt.plot(np.mean(stAvg,0), color = color1b, linewidth = 3,label='stable')
#    if labelx:
#        plt.xlabel('crossing extent (cm)')
#    if labely:
#        plt.ylabel('normalized horizontal speed')
#    pltutils.fix_font_size()
#    plt.axis([0, numBins, 0.5, 2.0])
#    plt.yticks([0.75,1.0,1.25,1.5,1.75])
#    if legend:
#        plt.legend((a2[0],a1[0]),('stable','unstable'),loc='upper left')
#        
#    if title is not None:
#        ax = plt.gca()
#        ax.text(0.5,0.9,title,horizontalalignment='center',transform=ax.transAxes)
#    
#def plot_randomized_speed_profile_difference_comparison(controls,lesions):
#    controlMeans = np.mean(controls, 0)
#    controlMeanAll = np.mean(controlMeans)
#    controlError = np.std(controlMeans)/np.sqrt(7-1)
#    
#    lesionMeans = np.mean(lesions, 0)
#    lesionMeanAll = np.mean(lesionMeans)
#    lesionlError = np.std(lesionMeans)/np.sqrt(6-1)
#    
#    significance = 0.05
#    sigtest = stats.ttest_ind(controlMeans, lesionMeans)[1]
#    testlabel = str.format("*",sigtest) if sigtest < significance else 'n.s.'
#    print sigtest
#    
#    cX = [1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1]
#    lX = [1.9, 1.9, 1.9, 1.9, 1.9, 1.9]
#    
#    plt.plot([0,3], [0,0], color=[0.25,0.25,0.25,1], linewidth = 1)
#    plt.plot(cX, controlMeans, 'bo')
#    plt.plot(lX, lesionMeans, 'ro')
#    plt.plot(1.9, lesionMeans[5], 'o', color = [1.0, 0.75, 0.75, 1.0])
#    
#    #plt.bar(1.2, controlMeanAll, 0.2, color=[1.0,1.0,1.0,0.0])
#    plt.errorbar(1.3, controlMeanAll, controlError, marker='s', mfc='blue', ecolor = 'black', mec='black', ms=1, mew=1, capsize=5, elinewidth=2)
#    plt.plot([1.0,1.4], [controlMeanAll,controlMeanAll], color=[0.25,0.25,1.0,1], linewidth = 2)
#    
#    #plt.bar(1.6, lesionMeanAll, 0.2, color=[1.0,1.0,1.0,0.0])
#    plt.errorbar(1.7, lesionMeanAll, lesionlError, marker='s', mfc='red', ecolor = 'black', mec='black', ms=1, mew=1, capsize=5, elinewidth=2)
#    plt.plot([1.6,2.0], [lesionMeanAll,lesionMeanAll], color=[1.00,0.25,0.25,1], linewidth = 2)
#    pltutils.hbracket(1.5,0.17,4.5,label=testlabel,tickheight=0.01)
#    
#    ax = plt.gca()
#    ax.set_xticks([1.1,1.9])
#    ax.set_xticklabels(['controls','lesions'])
#    plt.ylabel('normalized speed difference')
#    
#    pltutils.fix_font_size()
#    plt.axis([0.75,2.25,-0.2,0.2])