def heatmap_of_straight_landing_trajecs(dataset_landing, dataset_flyby):

    speeds = []
    angles_subtended = []
    for k, trajec in dataset_landing.trajecs.items():
        if trajec.classification == 'no_saccade_after_deceleration':
            speeds.extend(trajec.speed[0:trajec.frame_of_landing].tolist())
            angles_subtended.extend(trajec.angle_subtended_by_post[0:trajec.frame_of_landing].tolist())
        
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    fpl.histogram2d(ax, np.log(np.array(angles_subtended)), np.array(speeds), bins=50, normed=False, histrange=None, weights=None, logcolorscale=True, colormap='jet', interpolation='bicubic')
    
    fig_saccades_flyby = plt.figure()
    ax_saccades_flyby = fig_saccades_flyby.add_subplot(111)
    
    
    # now look at speed and retinal size for flyby trajectories at last saccade if headed towards post:
    for k, trajec in dataset_flyby.trajecs.items():
        fd, fs = get_frame_of_decel_and_last_saccade(trajec)
        for sac_range in trajec.sac_ranges:
            if fs in sac_range:
                if trajec.angle_subtended_by_post[sac_range[0]] > 0.*np.pi/180.:
                    
                #if np.abs(trajec.angle_to_post[sac_range[0]]) < 180.*np.pi/180.:
                    ax.plot(np.log(trajec.angle_subtended_by_post[sac_range[0]]), trajec.speed[sac_range[0]], '.', markersize=2, color='white', markeredgecolor='black', linewidth=0.5)

                    angle = sac.get_angle_of_saccade(trajec, sac_range)
                    ax_saccades_flyby.plot(-1*trajec.angle_to_post[sac_range[0]], angle, '.', color='red', markersize=2)

    set_log_angle_ticks(ax)
    ax.set_aspect('auto')
        
    fig.savefig('landing_deceleration_heatmap.pdf')
        
    fpl.adjust_spines(ax_saccades_flyby, ['left', 'bottom'], yticks=[-np.pi, -np.pi/2., 0, np.pi/2., np.pi], xticks=[-np.pi, -np.pi/2., 0, np.pi/2., np.pi], smart_bounds=True)
    ax_saccades_flyby.set_xlim([-np.pi, np.pi])
    ax_saccades_flyby.set_ylim([-np.pi, np.pi])
    
    deg_ticks = ['-180', '-90', '0', '90', '180']
    ax_saccades_flyby.set_xticklabels(deg_ticks)
    ax_saccades_flyby.set_yticklabels(deg_ticks)
    
    ax_saccades_flyby.set_xlabel('Angle to post, deg')
    ax_saccades_flyby.set_ylabel('Turn angle, deg')
    
    fig_saccades_flyby.savefig('saccades_flyby.pdf', format='pdf')
def heatmap_of_flyby_trajecs(dataset_flyby):

    speeds = []
    angles_subtended = []
    for k, trajec in dataset_flyby.trajecs.items():
        speeds.extend(trajec.speed[0:trajec.frame_of_landing].tolist())
        angles_subtended.extend(trajec.angle_subtended_by_post[0:trajec.frame_of_landing].tolist())
        
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    fpl.histogram2d(ax, np.log(np.array(angles_subtended)), np.array(speeds), bins=100, normed=False, histrange=None, weights=None, logcolorscale=True, colormap='jet', interpolation='bicubic')
    
    set_log_angle_ticks(ax)
    ax.set_aspect('auto')
        
    fig.savefig('flyby_deceleration_heatmap.pdf')
def heatmap(ax, dataset, axis='xy'):  

    # collect data
    xpos = np.array([])
    ypos = np.array([])
    zpos = np.array([])
    
    for key, trajec in dataset.trajecs.items():
        xpos = np.hstack( (xpos, trajec.positions[:,0]) )
        ypos = np.hstack( (ypos, trajec.positions[:,1]) )
        zpos = np.hstack( (zpos, trajec.positions[:,2]) )
    
    if axis == 'xy':
        fpl.histogram2d(ax, xpos, ypos, bins=100, logcolorscale=True)
    elif axis == 'xz':
        fpl.histogram2d(ax, xpos, zpos, bins=100, logcolorscale=True)
    elif axis == 'yz':
        fpl.histogram2d(ax, ypos, zpos, bins=100, logcolorscale=True)
    
    if axis == 'xy':
        post = patches.Circle( (0, 0), radius=0.01, facecolor='black', edgecolor='none', alpha=1, linewidth=0)
    elif axis == 'yz':
        post = patches.Rectangle( (-.01,0), width=0.02, facecolor='black', height=.16, edgecolor='none', alpha=1, linewidth=0)
    artists = [post]
    
    if artists is not None:
        for artist in artists:
            ax.add_artist(artist)
    
    if 'x' in axis:
        xticks = [-0.15, 0, 0.15]
    else:
        xticks = None
        
    if 'z' in axis:
        yticks = [0, .15, .30]
    else:
        yticks = None
        
    if axis == 'xy':
        ax.set_xlim(-.15, .15)
        ax.set_ylim(.2,-.8)
        
    fpl.adjust_spines(ax, ['left', 'bottom'], xticks=xticks, yticks=yticks)
    
    ax.set_aspect('equal')