Пример #1
0
def freq_shooting_plot(player_name, gridNum=25):
    plot_size = (12, 8)
    shot_df = df[df.name == player_name]

    from matplotlib.patches import Circle
    x = shot_df.x[shot_df['y'] < 425.1]
    y = shot_df.y[shot_df['y'] < 425.1]

    #compute shooting percentage and # of shots
    (ShootingPctLocs, shotNumber) = find_shootingPcts(shot_df, gridNum)

    #draw figure and court
    fig = plt.figure(figsize=plot_size)  #(12,7)
    cmap = mymap  #my modified colormap
    ax = plt.axes([0.1, 0.1, 0.8,
                   0.8])  #where to place the plot within the figure
    draw_court(outer_lines=False)
    plt.xlim(-250, 250)
    plt.ylim(400, -25)

    #draw player image
    zoom = np.float(plot_size[0]) / (
        12.0 * 2
    )  #how much to zoom the player's pic. I have this hackily dependent on figure size
    img = acquire_playerPic(shot_df.player_id, zoom)
    ax.add_artist(img)

    #draw circles
    for i, shots in enumerate(ShootingPctLocs):
        restricted = Circle(shotNumber.get_offsets()[i],
                            radius=shotNumber.get_array()[i],
                            color=cmap(shots),
                            alpha=1,
                            fill=True)
        if restricted.radius > 240 / gridNum: restricted.radius = 240 / gridNum
        ax.add_patch(restricted)

    #draw color bar
    ax2 = fig.add_axes([0.95, 0.1, 0.02, 0.8])
    cb = matplotlib.colorbar.ColorbarBase(ax2,
                                          cmap=cmap,
                                          orientation='vertical')
    cb.set_label('Field Goal %')
    cb.set_ticks([0.0, 0.25, 0.5, 0.75, 1.0])
    cb.set_ticklabels(['0%', '25%', '50%', '75%', '100%'])

    ax.set_title(shot_df.name.unique()[0] + ' - Shot Chart 2014-15')
    #plot season stats
    ax.text(135, 395, get_season_stats(player_name)[1])
    plt.show()
    return ax
Пример #2
0
def shooting_plot(shot_df, plot_size=(12,11), gridNum=30, mymap=plt.get_cmap('Spectral')):

    from matplotlib.patches import Circle
    x = shot_df.LOC_X[shot_df['LOC_Y']<425.1]
    y = shot_df.LOC_Y[shot_df['LOC_Y']<425.1]

    (shotVals, shotNumber) = find_shot_vals(shot_df, gridNum)

    fig = plt.figure(figsize=plot_size)
    cmap = mymap
    ax = plt.axes([0.1, 0.1, 0.8, 0.8])
    draw_court(outer_lines=False)
    plt.xlim(-250,250)
    plt.ylim(422.5, -47.5)

    norm = mpl.colors.Normalize(vmin=-0.5, vmax = -0.1)

    import math
    def logistic(x):
        return 20 / (1 + math.exp(-0.18*(x-np.median(shotNumber.get_array()))))

    for i, shots in enumerate(shotVals):
        restricted = Circle(shotNumber.get_offsets()[i], radius=shotNumber.get_array()[i],
                            color=cmap(norm(shots)),alpha=0.8, fill=True)
        restricted.radius = logistic( np.sqrt(restricted.radius) )
        if restricted.radius > 240/gridNum: restricted.radius=240/gridNum
        ax.add_patch(restricted)

    ax2 = fig.add_axes([0.92, 0.1, 0.02, 0.8])
    cb = mpl.colorbar.ColorbarBase(ax2,cmap=cmap, orientation='vertical')
    cb.set_label('next-possession value')
    cb.set_ticks([0.0, 0.25, 0.5, 0.75, 1.0])
    cb.set_ticklabels(['-0.5','-0.4', '-0.3','-0.2', '-0.1'])

    plt.show()

    return ax
Пример #3
0
def team_freq_plot(team, gridNum=25):
    plot_size = (12, 8)
    team_df = df[df.team_name == team]

    from matplotlib.patches import Circle

    #compute shooting percentage and # of shots
    (ShootingPctLocs, shotNumber) = find_shootingPcts(team_df, gridNum)

    #draw figure and court
    fig = plt.figure(figsize=plot_size)
    cmap = mymap  #my modified colormap
    ax = plt.axes([0.1, 0.1, 0.8,
                   0.8])  #where to place the plot within the figure
    draw_court(outer_lines=False)
    plt.xlim(-250, 250)
    plt.ylim(400, -25)

    #draw team image
    team_ac = team_df.htm[team_df.is_home == 1].unique()[0]
    zoom = 1  #np.float(plot_size[0])/(8.0)
    img = get_team_logo(team_ac, zoom)
    ax.add_artist(img)

    #draw circles
    for i, shots in enumerate(ShootingPctLocs):
        restricted = Circle(shotNumber.get_offsets()[i],
                            radius=shotNumber.get_array()[i],
                            color=cmap(shots),
                            alpha=.95,
                            fill=True)
        if restricted.radius > 240 / gridNum: restricted.radius = 240 / gridNum
        ax.add_patch(restricted)

    #draw color bar
    ax2 = fig.add_axes([0.95, 0.1, 0.02, 0.8])
    cb = matplotlib.colorbar.ColorbarBase(ax2,
                                          cmap=cmap,
                                          orientation='vertical')
    cb.set_label('Field Goal %')
    cb.set_ticks([0.0, 0.25, 0.5, 0.75, 1.0])
    cb.set_ticklabels(['0%', '25%', '50%', '75%', '100%'])

    ax.set_title(team_df.team_name.unique()[0] + ' - Shot Chart 2014-15')
    #plot season stats
    ax.text(150, 395, get_team_stats(team)[1])
    plt.show()
Пример #4
0
def kobe_shooting_plot(kobe_df, kobeyear, gridNum, isClutch):

    #compute shooting percentage and # of shots
    (ShootingPctLocs, shotNumber,
     shootingFreqLocs) = find_shootingPcts(kobe_df, kobeyear, gridNum,
                                           isClutch)
    #draw figure and court
    fig = plt.figure()  #(12,7)
    ax = plt.axes([0.1, 0.1, 0.8,
                   0.8])  #where to place the plot within the figure
    draw_court(outer_lines=False)
    ax.set_xlabel('')
    ax.set_ylabel('')
    ax.tick_params(labelbottom='off', labelleft='off')
    plt.xlim(-250, 250)
    plt.ylim(400, -25)
    #cdict = {'red': (
    #}
    cmap = plt.cm.RdYlBu
    #mymap = mpl.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)
    #cmap = mymap
    #draw circles
    for i, shots in enumerate(ShootingPctLocs):
        restricted = Circle(shotNumber.get_offsets()[i],
                            radius=shootingFreqLocs[i] * 50,
                            color=cmap(shots),
                            alpha=0.8,
                            fill=True)

        if restricted.radius > 240 / gridNum: restricted.radius = 240 / gridNum
        ax.add_patch(restricted)

    #draw color bar
    ax2 = fig.add_axes([0.92, 0.1, 0.02, 0.8])
    cb = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, orientation='vertical')
    cb.set_label('Efficiency Compared to Career Avg.')
    cb.set_ticks([0.0, 1.0])
    cb.set_ticklabels(['Low %', 'High %'])
    if isClutch:
        plt.suptitle('Kobe Bryant: ' + str(kobeyear) + ' Clutch Shot Chart')
    else:
        plt.suptitle('Kobe Bryant: ' + str(kobeyear) + ' Shot Chart')
    plt.show()
    return ax
Пример #5
0
def shooting_plot(shot_df, plot_size=(12, 8), gridNum=30):
    from matplotlib.patches import Circle
    x = shot_df.loc_x[shot_df['loc_y'] < 425.1]
    y = shot_df.loc_y[shot_df['loc_y'] < 425.1]

    #compute shooting percentage and # of shots
    (ShootingPctLocs, shotNumber) = find_shootingPcts(shot_df, gridNum)

    #draw figure and court
    fig = plt.figure(figsize=plot_size)  #(12,7)
    cmap = mymap  #my modified colormap
    ax = plt.axes([0.1, 0.1, 0.8,
                   0.8])  #where to place the plot within the figure
    draw_court(outer_lines=False)
    plt.xlim(-250, 250)
    plt.ylim(400, -25)

    #draw player image
    #zoom = np.float(plot_size[0])/(12.0*2) #how much to zoom the player's pic. I have this hackily dependent on figure size
    #img = acquire_playerPic(PlayerID, zoom)
    #ax.add_artist(img)

    #draw circles
    for i, shots in enumerate(ShootingPctLocs):
        restricted = Circle(shotNumber.get_offsets()[i],
                            radius=shotNumber.get_array()[i],
                            color=cmap(shots),
                            alpha=0.8,
                            fill=True)
        if restricted.radius > 240 / gridNum: restricted.radius = 240 / gridNum
        ax.add_patch(restricted)

    #draw color bar
    ax2 = fig.add_axes([0.92, 0.1, 0.02, 0.8])
    cb = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, orientation='vertical')
    cb.set_label('Shooting %')
    cb.set_ticks([0.0, 0.25, 0.5, 0.75, 1.0])
    cb.set_ticklabels(['0%', '25%', '50%', '75%', '100%'])

    ax.set_xticks([])
    ax.set_yticks([])

    plt.show()
    return ax
Пример #6
0
    def create_shot_chart_plot(self,
                               shooting_pct,
                               shot_num,
                               plot_size=(12, 8),
                               gridnum=30):
        """Show plot that has X and Y coordinate values for court."""
        # Draw figure and court
        fig = plt.figure(figsize=plot_size)

        # Where the plot places within the figure
        ax = plt.axes([0.1, 0.1, 0.8, 0.8])
        self.draw_court(outer_lines=False)

        # Add main title to graph
        plt.title("Shot chart for{} {} for the last {} games".format(
            self.player_info.player_firstname,
            self.player_info.player_lastname, self.player_info.num_games))

        # Set court limits
        plt.xlim(-250, 250)
        plt.ylim(400, -25)

        for i, shots in enumerate(shooting_pct):
            restricted = Circle(shot_num.get_offsets()[i],
                                radius=shot_num.get_array()[i],
                                color=mymap(shots),
                                alpha=0.8,
                                fill=True)
            if restricted.radius > 240 / gridnum:
                restricted.radius = 240 / gridnum
            ax.add_patch(restricted)

        # Draw color bar to indicate percentage as heatmap
        ax2 = fig.add_axes([0.92, 0.1, 0.02, 0.8])
        cb = colorbar.ColorbarBase(ax2, cmap=mymap, orientation='vertical')
        cb.set_label('Shooting %')
        cb.set_ticks([0.0, 0.25, 0.5, 0.75, 1.0])
        cb.set_ticklabels(['0%', '25%', '50%', '75%', '100%'])

        plt.show()
        return ax
def team_freq_plot(team, gridNum=25):
    plot_size = (10, 8)
    team_df = df[df.team_name == team]

    from matplotlib.patches import Circle
    #compute shooting percentage and # of shots
    (ShootingPctLocs2, shotNumber2) = find_shootingPcts(team_df, gridNum)[0:2]
    (ShootingPctLocs3, shotNumber3) = find_shootingPcts(team_df, gridNum)[2:]

    #draw figure and court
    fig = plt.figure(figsize=plot_size)
    ax = plt.axes([0.1, 0.1, 0.8,
                   0.8])  #where to place the plot within the figure
    draw_court(outer_lines=False)
    plt.xlim(-250, 250)
    plt.ylim(400, -25)

    #draw team image
    team_ac = team_df.htm[team_df.is_home == 1].unique()[0]
    zoom = 1  #np.float(plot_size[0])/(8.0)
    img = get_team_logo(team_ac, zoom)
    ax.add_artist(img)

    ############################################  TWO POINTERS  #################################################
    cmap = mymap.from_list('Color Map', [(0, '#ff0000'), (.45, '#ffff00'),
                                         (.6, '#00ff00'), (1, '#004d00')])
    #draw circles
    for i, shots in enumerate(ShootingPctLocs2):
        restricted2 = Circle(shotNumber2.get_offsets()[i],
                             radius=shotNumber2.get_array()[i],
                             color=cmap(shots),
                             alpha=.9,
                             fill=True)
        if restricted2.radius > 240 / gridNum:
            restricted2.radius = 240 / gridNum
        ax.add_patch(restricted2)

    #draw color bar
    ax2 = fig.add_axes([0.95, 0.1, 0.02, 0.8])
    cb = matplotlib.colorbar.ColorbarBase(ax2,
                                          cmap=cmap,
                                          orientation='vertical')
    cb.set_label('Field Goal %', labelpad=20)
    cb.set_ticks([0.0, 0.25, .485, 0.75, 1.0])
    cb.set_ticklabels(['0%', '25%', '48.5%\nLg Avg', '75%', '100%'])

    ###########################################  THREE POINTERS  ################################################
    #plotting 3 pointers separately to account for expected lower fg% from deep
    cmap3 = mymap.from_list('Color Map', [(0, '#ff0000'), (.35, '#ffff00'),
                                          (.6, '#00ff00'), (1, '#004d00')])
    #draw circles
    for i, shots in enumerate(ShootingPctLocs3):
        restricted3 = Circle(shotNumber3.get_offsets()[i],
                             radius=shotNumber3.get_array()[i],
                             color=cmap3(shots),
                             alpha=.9,
                             fill=True)
        if restricted3.radius > 240 / gridNum:
            restricted3.radius = 240 / gridNum
        ax.add_patch(restricted3)

    #draw color bar
    ax3 = fig.add_axes([1.1, 0.1, 0.02, 0.8])
    cb3 = matplotlib.colorbar.ColorbarBase(ax3,
                                           cmap=cmap3,
                                           orientation='vertical')
    cb3.set_label('Three Point %', labelpad=-8)
    cb3.set_ticks([0.0, 0.25, .35, 0.5, 0.75, 1.0])
    cb3.set_ticklabels(['0%', '25%', '35% - Lg Avg', '50%', '75%', '100%'])

    ax.set_title(team_df.team_name.unique()[0] + ' - Shot Chart 2014-15')
    #plot season stats
    ax.text(150, 395, get_team_stats(team)[1])
    plt.show()
def Visualize(Date,
              PlotID=1,
              FPS=15,
              Steps=20,
              MP4_quality=300,
              Name="LSST Scheduler Simulator.mp4",
              showClouds=True):

    # Import data
    All_Fields = np.loadtxt("NightDataInLIS/Constants/fieldID.lis",
                            unpack=True)
    N_Fields = len(All_Fields[0])

    if showClouds:
        Time_slots = np.loadtxt("NightDataInLIS/TimeSlots{}.lis".format(
            int(ephem.julian_date(Date))),
                                unpack=True)
        All_Cloud_cover = np.loadtxt("NightDataInLIS/Clouds{}.lis".format(
            int(ephem.julian_date(Date))),
                                     unpack=True)

    Site = ephem.Observer()
    Site.lon = -1.2320792
    Site.lat = -0.517781017
    Site.elevation = 2650
    Site.pressure = 0.
    Site.horizon = 0.

    #Initialize date and time
    lastN_start = float(Date) - 1
    lastN_end = float(Date)
    toN_start = float(Date)
    toN_end = float(Date) + 1

    #Connect to the History data base
    con = lite.connect('FBDE.db')
    cur = con.cursor()

    # Prepare to save in MP4 format
    FFMpegWriter = animation.writers['ffmpeg']
    metadata = dict(title='LSST Simulation', artist='Elahe', comment='Test')
    writer = FFMpegWriter(fps=FPS, metadata=metadata)

    #Progress bar initialization

    pbar = ProgressBar()

    # Initialize plot
    Fig = plt.figure()
    if PlotID == 1:
        ax = plt.subplot(111, axisbg='black')
    if PlotID == 2:
        ax = plt.subplot(211, axisbg='black')

    unobserved, Observed_lastN, Obseved_toN,\
    ToN_History_line, last_10_History_line,\
    Horizon, airmass_horizon, S_Pole,\
    LSST,\
    Clouds\
        = ax.plot([], [], '*',[], [], '*',[], [], '*',
                  [], [], '-',[], [], '*',
                  [], [], '-',[], [], '-',[], [], 'D',
                  [], [], 'o',
                  [], [], 'o')

    ax.set_xlim(-1.5, 1.5)
    ax.set_ylim(-1.5, 1.5)
    ax.set_aspect('equal', adjustable='box')
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    # Coloring
    Horizon.set_color('white')
    airmass_horizon.set_color('red')
    S_Pole.set_markersize(3)
    S_Pole.set_markerfacecolor('red')
    star_size = 4

    unobserved.set_color('dimgray')
    unobserved.set_markersize(star_size)
    Observed_lastN.set_color('blue')
    Observed_lastN.set_markersize(star_size)
    Obseved_toN.set_color('chartreuse')
    Obseved_toN.set_markersize(star_size + 2)
    Clouds.set_color('white')
    Clouds.set_markersize(10)

    ToN_History_line.set_color('orange')
    ToN_History_line.set_lw(.5)
    last_10_History_line.set_color('red')
    last_10_History_line.set_lw(.5)

    LSST.set_color('red')
    LSST.set_markersize(8)

    if PlotID == 2:
        freqAX = plt.subplot(212)
        cur.execute(
            'SELECT N_visit, Last_visit, Second_last_visit, Third_last_visit, Fourth_last_visit From FieldsStatistics'
        )
        row = cur.fetchall()
        N_visit = [x[0] for x in row]
        Last_visit = [x[1] for x in row]
        Second_last_visit = [x[2] for x in row]
        Third_last_visit = [x[3] for x in row]
        Fourth_last_visit = [x[4] for x in row]

        initHistoricalcoverage = N_visit
        for index, id in enumerate(All_Fields):
            if Last_visit[index] > toN_start:
                initHistoricalcoverage[index] -= 1
                if Second_last_visit[index] > toN_start:
                    initHistoricalcoverage[index] -= 1
                    if Third_last_visit > toN_start:
                        initHistoricalcoverage[index] -= 1

        covering, current_cover = freqAX.plot(All_Fields[0],
                                              initHistoricalcoverage, '-', [],
                                              [], 'o')

        freqAX.set_xlim(0, N_Fields)
        freqAX.set_ylim(0, np.max(initHistoricalcoverage) + 5)
        covering.set_color('chartreuse')
        covering.set_markersize(2)
        current_cover.set_color('red')
        current_cover.set_markersize(6)

    cur.execute(
        'SELECT Night_count, T_start, T_end FROM NightSummary WHERE T_start BETWEEN (?) AND (?)',
        (toN_start, toN_end))
    row = cur.fetchone()
    vID = row[0]
    t_start = row[1]
    t_end = row[2]
    t = t_start

    # Figure labels and fixed elements
    Phi = np.arange(0, 2 * np.pi, 0.05)
    Horizon.set_data(1.01 * np.cos(Phi), 1.01 * np.sin(Phi))
    ax.text(-1.3, 0, 'West', color='white', fontsize=7)
    ax.text(1.15, 0, 'East', color='white', fontsize=7)
    ax.text(0, 1.1, 'North', color='white', fontsize=7)
    airmass_horizon.set_data(
        np.cos(np.pi / 4) * np.cos(Phi),
        np.cos(np.pi / 4) * np.sin(Phi))
    ax.text(-.3,
            0.6,
            'Acceptable airmass horizon',
            color='white',
            fontsize=5,
            fontweight='bold')
    Alt, Az = Fields_local_coordinate(180, -90, t, Site)
    x, y = AltAz2XY(Alt, Az)
    S_Pole.set_data(x, y)
    ax.text(x + .05, y, 'S-Pole', color='white', fontsize=7)

    # Observed last night fields
    cur.execute(
        'SELECT Field_id FROM Schedule WHERE ephemDate BETWEEN (?) AND (?)',
        (lastN_start, lastN_end))
    row = cur.fetchall()
    if row is not None:
        F1 = [x[0] for x in row]
    else:
        F1 = []

    # Tonight observation path
    cur.execute(
        'SELECT Field_id, ephemDate FROM Schedule WHERE ephemDate BETWEEN (?) AND (?)',
        (toN_start, toN_end))
    row = cur.fetchall()
    if row[0][0] is not None:
        F2 = [x[0] for x in row]
        F2_timing = [x[1] for x in row]
    else:
        F2 = []
        F2_timing = []

    # Sky elements
    Moon = Circle((0, 0), 0, color='silver', zorder=3)
    ax.add_patch(Moon)
    Moon_text = ax.text([], [], 'Moon', color='white', fontsize=7)

    with writer.saving(Fig, Name, MP4_quality):
        for t in pbar(np.linspace(t_start, t_end, num=Steps)):

            # Find the index of the current time
            time_index = 0
            while t > F2_timing[time_index]:
                time_index += 1
            if showClouds:
                Slot_n = 0
                while t > Time_slots[Slot_n]:
                    Slot_n += 1

            visit_index = 0
            visited_field = 0

            # Object fields: F1)Observed last night F2)Observed tonight F3)Unobserved F4)Covered by clouds
            F1_X = []
            F1_Y = []
            F2_X = []
            F2_Y = []
            F3_X = []
            F3_Y = []
            F4_X = []
            F4_Y = []

            # F1  coordinate:
            for i in F1:
                Alt, Az = Fields_local_coordinate(All_Fields[1, i - 1],
                                                  All_Fields[2,
                                                             i - 1], t, Site)
                if Alt > 0:
                    X, Y = AltAz2XY(Alt, Az)
                    F1_X.append(X)
                    F1_Y.append(Y)

            # F2  coordinate:
            for i, tau in zip(F2, F2_timing):
                Alt, Az = Fields_local_coordinate(All_Fields[1, i - 1],
                                                  All_Fields[2,
                                                             i - 1], t, Site)
                if Alt > 0:
                    X, Y = AltAz2XY(Alt, Az)
                    F2_X.append(X)
                    F2_Y.append(Y)
                    if t >= tau:
                        visit_index = len(F2_X) - 1
                        visited_field = i

            # F3  coordinate:
            for i in range(0, N_Fields):
                if True:
                    Alt, Az = Fields_local_coordinate(All_Fields[1, i],
                                                      All_Fields[2,
                                                                 i], t, Site)
                    if Alt > 0:
                        X, Y = AltAz2XY(Alt, Az)
                        F3_X.append(X)
                        F3_Y.append(Y)

            # F4 coordinates
            if showClouds:
                for i in range(0, N_Fields):
                    if All_Cloud_cover[i, Slot_n] == 1:
                        Alt, Az = Fields_local_coordinate(
                            All_Fields[1, i], All_Fields[2, i], t, Site)
                    if Alt > 0:
                        X, Y = AltAz2XY(Alt, Az)
                        F4_X.append(X)
                        F4_Y.append(Y)

            # Update plot
            unobserved.set_data([F3_X, F3_Y])
            Observed_lastN.set_data([F1_X, F1_Y])
            Obseved_toN.set_data([F2_X[0:visit_index], F2_Y[0:visit_index]])

            ToN_History_line.set_data(
                [F2_X[0:visit_index], F2_Y[0:visit_index]])
            last_10_History_line.set_data([
                F2_X[visit_index - 10:visit_index],
                F2_Y[visit_index - 10:visit_index]
            ])
            LSST.set_data([F2_X[visit_index], F2_Y[visit_index]])
            Clouds.set_data([F4_X, F4_Y])

            # Update Moon
            X, Y, r, alt = update_moon(t, Site)
            Moon.center = X, Y
            Moon.radius = r
            if alt > 0:
                #Moon.set_visible(True)
                Moon_text.set_visible(True)
                Moon_text.set_x(X + .002)
                Moon_text.set_y(Y + .002)
            else:
                Moon.set_visible(False)
                Moon_text.set_visible(False)

            #Update coverage
            if PlotID == 2:
                Historicalcoverage = np.zeros(N_Fields)
                for i, tau in zip(F2, F2_timing):
                    if tau <= t:
                        Historicalcoverage[i - 1] += 1
                    else:
                        break
                tot = Historicalcoverage + initHistoricalcoverage
                current_cover.set_data(visited_field - 1,
                                       tot[visited_field - 1])
                covering.set_data(All_Fields[0], tot)

            #Observation statistics
            leg = plt.legend([Observed_lastN, Obseved_toN],
                             ['Visited last night', time_index])
            for l in leg.get_texts():
                l.set_fontsize(6)
            date = ephem.date(t)
            Fig.suptitle('Top view of the LSST site on {}, GMT'.format(date))
            '''
            # progress
            perc= int(100*(t - t_start)/(t_end - t_start))
            if perc <= 100:
                print('{} %'.format(perc))
            else:
                print('100 %')
            '''
            #Save current frame
            writer.grab_frame()
Пример #9
0
def visualize(night,
              file_name,
              PlotID=1,
              FPS=15,
              Steps=20,
              MP4_quality=300,
              Name="Visualization.mp4",
              showClouds=False,
              nside=64,
              fancy_slow=True):

    Site = ephem.Observer()
    Site.lon = -1.2320792
    Site.lat = -0.517781017
    Site.elevation = 2650
    Site.pressure = 0.
    Site.horizon = 0.

    # create pix
    hpid = np.arange(hp.nside2npix(16))
    ra, dec = _hpid2RaDec(16, hpid)
    SCP_indx, NES_indx, GP_indx, WFD_indx = mutually_exclusive_regions(
        nside=16)
    DD_indx = []

    #Initialize date and time
    last_night = night - 1

    #Connect to the History data base
    con = lite.connect(file_name)
    cur = con.cursor()

    # Prepare to save in MP4 format
    FFMpegWriter = animation.writers['ffmpeg']
    metadata = dict(title='LSST Simulation', artist='Elahe', comment='Test')
    writer = FFMpegWriter(fps=FPS, metadata=metadata)

    # Initialize plot
    Fig = plt.figure()
    if PlotID == 1:
        ax = plt.subplot(111, axisbg='black')
    if PlotID == 2:
        ax = plt.subplot(211, axisbg='black')

    unobserved, Observed_lastN, Obseved_toN,\
    WFD, GP, NE, SE, DD,\
    ToN_History_line,\
    uu,gg,rr,ii,zz,yy,\
    last_10_History_line,\
    Horizon, airmass_horizon, S_Pole,\
    LSST,\
    Clouds\
        = ax.plot([], [], '*',[], [], '*',[], [], '*',
                  [], [], '*',[], [], '*',[], [], '*', [], [], '*', [], [], '*', # regions
                  [], [], '*',
                  [], [], '*',[], [], '*',[], [], '*',
                  [], [], '*',[], [], '*',[], [], '*',
                  [], [], '-',
                  [], [], '-',[], [], '-',[], [], 'D',
                  [], [], 'o',
                  [], [], 'o')

    ax.set_xlim(-1.5, 1.5)
    ax.set_ylim(-1.5, 1.5)
    ax.set_aspect('equal', adjustable='box')
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    # Coloring
    Horizon.set_color('white')
    airmass_horizon.set_color('red')
    S_Pole.set_markersize(3)
    S_Pole.set_markerfacecolor('red')
    star_size = 4

    unobserved.set_color('dimgray')
    unobserved.set_markersize(star_size)
    Observed_lastN.set_color('blue')
    Observed_lastN.set_markersize(star_size)
    Obseved_toN.set_color('chartreuse')
    Obseved_toN.set_markersize(0)

    # regions
    WFD.set_color('black')
    WFD.set_alpha(0.3)
    SE.set_color('orange')
    SE.set_alpha(0.3)
    NE.set_color('orange')
    NE.set_alpha(0.3)
    GP.set_color('orange')
    GP.set_alpha(0.3)
    DD.set_color('orange')
    DD.set_alpha(0.3)
    DD.set_markersize(7)

    # filters
    uu.set_color('purple')
    gg.set_color('green')
    rr.set_color('red')
    ii.set_color('orange')
    zz.set_color('pink')
    yy.set_color('deeppink')

    # clouds
    Clouds.set_color('white')
    Clouds.set_markersize(10)
    Clouds.set_alpha(0.2)
    Clouds.set_markeredgecolor(None)

    ToN_History_line.set_color('orange')
    ToN_History_line.set_lw(.5)
    last_10_History_line.set_color('gray')
    last_10_History_line.set_lw(.5)

    LSST.set_color('red')
    LSST.set_markersize(8)

    if PlotID == 2:
        freqAX = plt.subplot(212)
        cur.execute(
            'SELECT N_visit, Last_visit, Second_last_visit, Third_last_visit, Fourth_last_visit From FieldsStatistics'
        )
        row = cur.fetchall()
        N_visit = [x[0] for x in row]
        Last_visit = [x[1] for x in row]
        Second_last_visit = [x[2] for x in row]
        Third_last_visit = [x[3] for x in row]
        Fourth_last_visit = [x[4] for x in row]

        initHistoricalcoverage = N_visit
        for index, id in enumerate(All_Fields):
            if Last_visit[index] > toN_start:
                initHistoricalcoverage[index] -= 1
                if Second_last_visit[index] > toN_start:
                    initHistoricalcoverage[index] -= 1
                    if Third_last_visit > toN_start:
                        initHistoricalcoverage[index] -= 1

        covering, current_cover = freqAX.plot(All_Fields[0],
                                              initHistoricalcoverage, '-', [],
                                              [], 'o')

        freqAX.set_xlim(0, N_Fields)
        freqAX.set_ylim(0, np.max(initHistoricalcoverage) + 5)
        covering.set_color('chartreuse')
        covering.set_markersize(2)
        current_cover.set_color('red')
        current_cover.set_markersize(6)

    # Figure labels and fixed elements
    Phi = np.arange(0, 2 * np.pi, 0.05)
    Horizon.set_data(1.01 * np.cos(Phi), 1.01 * np.sin(Phi))
    ax.text(-1.3, 0, 'East', color='white', fontsize=7)
    ax.text(1.15, 0, 'West', color='white', fontsize=7)
    ax.text(0, 1.1, 'North', color='white', fontsize=7)
    airmass_horizon.set_data(
        np.cos(np.pi / 4) * np.cos(Phi),
        np.cos(np.pi / 4) * np.sin(Phi))
    ax.text(-.3,
            0.6,
            'airmass horizon',
            color='white',
            fontsize=5,
            fontweight='bold')
    Alt, Az = Fields_local_coordinate(180, -90, 59581.0381944435, Site)
    x, y = AltAz2XY(Alt, Az)
    S_Pole.set_data(x, y)
    ax.text(x + .05, y, 'S-Pole', color='white', fontsize=7)
    DD_indicator = ax.text(-1.4,
                           1.3,
                           'Deep Drilling Observation',
                           color='red',
                           fontsize=9,
                           visible=False)
    WFD_indicator = ax.text(-1.4,
                            1.3,
                            'Wide Fast Deep Observation',
                            color='white',
                            fontsize=9,
                            visible=False)
    GP_indicator = ax.text(-1.4,
                           1.3,
                           'Galactic Plane Observation',
                           color='white',
                           fontsize=9,
                           visible=False)
    NES_indicator = ax.text(-1.4,
                            1.3,
                            'Notrh Ecliptic Spur Observation',
                            color='white',
                            fontsize=9,
                            visible=False)
    SCP_indicator = ax.text(-1.4,
                            1.3,
                            'South Celestial Pole Observation',
                            color='white',
                            fontsize=9,
                            visible=False)

    # Observed last night fields
    cur.execute(
        'SELECT RA, dec, mjd, filter FROM SummaryAllProps WHERE night=%i' %
        (last_night))
    row = cur.fetchall()
    if row is not None:
        F1 = [x[0:2] for x in row]
    else:
        F1 = []

    # Tonight observation path
    cur.execute(
        'SELECT RA, dec, mjd, filter FROM SummaryAllProps WHERE night=%i' %
        (night))
    row = cur.fetchall()
    if row[0][0] is not None:
        F2 = [x[0:2] for x in row]
        RA = np.asanyarray([x[0] for x in row])
        DEC = np.asarray([x[1] for x in row])
        F2_timing = [x[2] for x in row]
        F2_filtering = [x[3] for x in row]
        F2_region = RaDec2region(RA, DEC, nside)
    else:
        F2 = []
        F2_timing = []
        F2_filtering = []
        F2_region = []

    # Sky elements
    Moon = Circle((0, 0), 0, color='silver', zorder=3)
    ax.add_patch(Moon)
    Moon_text = ax.text([], [], 'Moon', color='white', fontsize=7)

    doff = ephem.Date(0) - ephem.Date('1858/11/17')
    with writer.saving(Fig, Name, MP4_quality):
        for t in np.linspace(F2_timing[0], F2_timing[-1], num=Steps):

            # Find the index of the current time
            time_index = 0
            while t > F2_timing[time_index]:
                time_index += 1
            if showClouds:
                Slot_n = 0
                while t > Time_slots[Slot_n]:
                    Slot_n += 1

            visit_index = 0
            visited_field = 0
            visit_index_u = 0
            visit_index_g = 0
            visit_index_r = 0
            visit_index_i = 0
            visit_index_z = 0
            visit_index_y = 0
            visit_filter = 'r'

            # Object fields: F1)Observed last night F2)Observed tonight F3)Unobserved F4)Covered by clouds
            F1_X = []
            F1_Y = []
            F2_X = []
            F2_Y = []
            F3_X = []
            F3_Y = []
            F4_X = []
            F4_Y = []
            # Filter coloring for tonight observation
            U_X = []
            U_Y = []
            G_X = []
            G_Y = []
            R_X = []
            R_Y = []
            I_X = []
            I_Y = []
            Z_X = []
            Z_Y = []
            Y_X = []
            Y_Y = []
            # Coloring different proposals
            WFD_X = []
            WFD_Y = []
            NE_X = []
            NE_Y = []
            SE_X = []
            SE_Y = []
            GP_X = []
            GP_Y = []
            DD_X = []
            DD_Y = []

            # F1  coordinate:
            for i in F1:
                Alt, Az = Fields_local_coordinate(i[0], i[1], t - doff, Site)
                if Alt > 0:
                    X, Y = AltAz2XY(Alt, Az)
                    F1_X.append(X)
                    F1_Y.append(Y)

            # F2  coordinate:
            for i, tau, filter in zip(F2, F2_timing, F2_filtering):
                Alt, Az = Fields_local_coordinate(i[0], i[1], t - doff, Site)
                if Alt > 0:
                    X, Y = AltAz2XY(Alt, Az)
                    F2_X.append(X)
                    F2_Y.append(Y)
                    if filter == 'u':
                        U_X.append(X)
                        U_Y.append(Y)
                        if t >= tau:
                            visit_index_u = len(U_X) - 1
                    elif filter == 'g':
                        G_X.append(X)
                        G_Y.append(Y)
                        if t >= tau:
                            visit_index_g = len(G_Y) - 1
                    elif filter == 'r':
                        R_X.append(X)
                        R_Y.append(Y)
                        if t >= tau:
                            visit_index_r = len(R_Y) - 1
                    elif filter == 'i':
                        I_X.append(X)
                        I_Y.append(Y)
                        if t >= tau:
                            visit_index_i = len(I_Y) - 1
                    elif filter == 'z':
                        Z_X.append(X)
                        Z_Y.append(Y)
                        if t >= tau:
                            visit_index_z = len(Z_Y) - 1
                    elif filter == 'y':
                        Y_X.append(X)
                        Y_Y.append(Y)
                        if t >= tau:
                            visit_index_y = len(Y_Y) - 1

                    if t >= tau:
                        visit_index = len(F2_X) - 1
                        visited_field = i
                        visit_filter = filter

            # F3  coordinate:
            if fancy_slow:
                Alt, Az = stupidFast_RaDec2AltAz(ra, dec, t)
                for al, az, i in zip(Alt, Az, hpid):
                    if al > 0:
                        X, Y = AltAz2XY(al, az)
                        F3_X.append(X)
                        F3_Y.append(Y)
                        if i in DD_indx:
                            DD_X.append(X)
                            DD_Y.append(Y)
                        elif i in WFD_indx:
                            WFD_X.append(X)
                            WFD_Y.append(Y)
                        elif i in GP_indx:
                            GP_X.append(X)
                            GP_Y.append(Y)
                        elif i in NES_indx:
                            NE_X.append(X)
                            NE_Y.append(Y)
                        elif i in SCP_indx:
                            SE_X.append(X)
                            SE_Y.append(Y)

            # F4 coordinates
            if showClouds:
                for i in range(0, N_Fields):
                    if All_Cloud_cover[Slot_n, i] == 2 or All_Cloud_cover[
                            Slot_n, i] == 1 or All_Cloud_cover[Slot_n,
                                                               i] == -1:
                        Alt, Az = Fields_local_coordinate(
                            i[0], i[1], t - doff, Site)
                    if Alt > 0:
                        X, Y = AltAz2XY(Alt, Az)
                        F4_X.append(X)
                        F4_Y.append(Y)

            # Update plot
            unobserved.set_data([F3_X, F3_Y])
            Observed_lastN.set_data([F1_X, F1_Y])
            Obseved_toN.set_data([F2_X[0:visit_index], F2_Y[0:visit_index]])

            # filters
            uu.set_data([U_X[0:visit_index_u], U_Y[0:visit_index_u]])
            gg.set_data([G_X[0:visit_index_g], G_Y[0:visit_index_g]])
            rr.set_data([R_X[0:visit_index_r], R_Y[0:visit_index_r]])
            ii.set_data([I_X[0:visit_index_i], I_Y[0:visit_index_i]])
            zz.set_data([Z_X[0:visit_index_z], Z_Y[0:visit_index_z]])
            yy.set_data([Y_X[0:visit_index_y], Y_Y[0:visit_index_y]])

            ToN_History_line.set_data(
                [F2_X[0:visit_index], F2_Y[0:visit_index]])
            last_10_History_line.set_data([
                F2_X[visit_index - 10:visit_index],
                F2_Y[visit_index - 10:visit_index]
            ])

            # telescope position and color
            LSST.set_data([F2_X[visit_index], F2_Y[visit_index]])
            if visit_filter == 'u':
                LSST.set_color('purple')
            if visit_filter == 'g':
                LSST.set_color('green')
            if visit_filter == 'r':
                LSST.set_color('red')
            if visit_filter == 'i':
                LSST.set_color('orange')
            if visit_filter == 'z':
                LSST.set_color('pink')
            if visit_filter == 'y':
                LSST.set_color('deeppink')

            Clouds.set_data([F4_X, F4_Y])

            # regions
            WFD.set_data([WFD_X, WFD_Y])
            DD.set_data([DD_X, DD_Y])
            NE.set_data([NE_X, NE_Y])
            SE.set_data([SE_X, SE_Y])
            GP.set_data([GP_X, GP_Y])

            # Update Moon
            X, Y, r, alt = update_moon(t, Site)
            Moon.center = X, Y
            Moon.radius = r
            if alt > 0:
                #Moon.set_visible(True)
                Moon_text.set_visible(True)
                Moon_text.set_x(X + .002)
                Moon_text.set_y(Y + .002)
            else:
                Moon.set_visible(False)
                Moon_text.set_visible(False)

            #Update coverage
            if PlotID == 2:
                Historicalcoverage = np.zeros(N_Fields)
                for i, tau in zip(F2, F2_timing):
                    if tau <= t:
                        Historicalcoverage[i - 1] += 1
                    else:
                        break
                tot = Historicalcoverage + initHistoricalcoverage
                current_cover.set_data(visited_field - 1,
                                       tot[visited_field - 1])
                covering.set_data(All_Fields[0], tot)

            #Update indicators of the proposal
            if F2_region[time_index] == 'DD':
                DD_indicator.set_visible(True)
            else:
                DD_indicator.set_visible(False)
            if F2_region[time_index] == 'WFD':
                WFD_indicator.set_visible(True)
            else:
                WFD_indicator.set_visible(False)
            if F2_region[time_index] == 'GP':
                GP_indicator.set_visible(True)
            else:
                GP_indicator.set_visible(False)
            if F2_region[time_index] == 'NES':
                NES_indicator.set_visible(True)
            else:
                NES_indicator.set_visible(False)
            if F2_region[time_index] == 'SCP':
                SCP_indicator.set_visible(True)
            else:
                SCP_indicator.set_visible(False)

            #Observation statistics
            leg = plt.legend([Observed_lastN, Obseved_toN],
                             ['Visited last night', time_index])
            for l in leg.get_texts():
                l.set_fontsize(6)
            date = t
            Fig.suptitle('Top view of the LSST site on {}, GMT'.format(date))
            '''
            # progress
            perc= int(100*(t - t_start)/(t_end - t_start))
            if perc <= 100:
                print('{} %'.format(perc))
            else:
                print('100 %')
            '''
            #Save current frame
            writer.grab_frame()