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
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
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()
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
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
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()
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()