def _comets(self) -> DataFrame: with self.load.open(mpc.COMET_URL) as f: return ( mpc.load_comets_dataframe(f).sort_values("reference").groupby( "designation", as_index=False).last().set_index("designation", drop=False))
def main(): f = load.open(mpc.COMET_URL) t0 = time() c = mpc.load_comets_dataframe(f) print(time() - t0, 'seconds for load_comets_dataframe()') assert len(c) == 864 f.seek(0) t0 = time() c = mpc.load_comets_dataframe_slow(f) print(time() - t0, 'seconds for load_comets_dataframe_slow()') assert len(c) == 864
def get_comet(name, timestamp): # https://rhodesmill.org/skyfield/example-plots.html#drawing-a-finder-chart-for-comet-neowise # https://astroquery.readthedocs.io/en/latest/mpc/mpc.html # name = "C/2020 F3 (NEOWISE)" # https://www.minorplanetcenter.net/iau/info/CometOrbitFormat.html with load.open(mpc.COMET_URL) as f: comets = mpc.load_comets_dataframe(f) comets = (comets.sort_values('reference') .groupby('designation', as_index=False).last() .set_index('designation', drop=False)) row = comets.loc[name] print(row) ts = load.timescale() eph = load('de421.bsp') sun, earth = eph['sun'], eph['earth'] comet = sun + mpc.comet_orbit(row, ts, GM_SUN) t = ts.utc(timestamp.year, timestamp.month, timestamp.day, timestamp.hour, timestamp.minute) ra, dec, distance = earth.at(t).observe(comet).radec() result = {} result['name'] = name result['designation'] = row['designation'] result['timestamp'] = str(timestamp) result['ra'] = str(ra) result['dec'] = str(dec) result['ra_decimal'] = str(ra.hours * 15) result['dec_decimal'] = str(dec.degrees) result['distance'] = str(distance) result['magnitude_g'] = row['magnitude_g'] result['magnitude_k'] = row['magnitude_k'] result['visual_magnitude'] = row['magnitude_k'] result['row'] = row return result,comet
def test_comet_with_eccentricity_of_exactly_one(): ts = load.timescale() t = ts.utc(2020, 8, 13) planets = load('de421.bsp') earth, sun = planets['earth'], planets['sun'] data = (b' CK15A020 2015 08 1.8353 5.341055 1.000000 208.8369 ' b'258.5042 109.1696 10.5 4.0 C/2015 A2 (PANSTARRS)' b' MPC 93587') with BytesIO(data) as f: df = mpc.load_comets_dataframe(f) df = df[df['designation'] == 'C/2015 A2 (PANSTARRS)'] comet = mpc.comet_orbit(df.iloc[0], ts, GM_SUN) ra, dec, distance = earth.at(t).observe(sun + comet).radec() # These are exactly the RA and declination from the Minor Planet # Center for this comet! (The RA seconds returned by Skyfield # actually say "46.45s", which would round up to 46.5, but what's a # tenth of an arcsecond among friends?) assert str(ra).startswith('18h 46m 46.4') assert str(dec).startswith("-72deg 05' 33.")
# time `t` we use for everything else. ts = load.timescale() t_comet = ts.utc(2020, 7, range(17, 27)) t = t_comet[len(t_comet) // 2] # middle date # An ephemeris from the JPL provides Sun and Earth positions. eph = load('de421.bsp') sun = eph['sun'] earth = eph['earth'] # The Minor Planet Center data file provides the comet orbit. with load.open(mpc.COMET_URL) as f: comets = mpc.load_comets_dataframe(f) comets = comets.set_index('designation', drop=False) row = comets.loc['C/2020 F3 (NEOWISE)'] comet = sun + mpc.comet_orbit(row, ts, GM_SUN) # The Hipparcos mission provides our star catalog. with load.open(hipparcos.URL) as f: stars = hipparcos.load_dataframe(f) # And the constellation outlines come from Stellarium. We make a list # of the stars at which each edge stars, and the star at which each edge # ends. url = ('https://raw.githubusercontent.com/Stellarium/stellarium/master'
def create_starmap(command, observation_id): # The comet is plotted on several dates `t_comet`. But the stars only # need to be drawn once, so we take the middle comet date as the single # time `t` we use for everything else. ts = load.timescale() t_comet = ts.utc(2020, 8, range(1, 10)) t = t_comet[len(t_comet) // 2] # middle date # An ephemeris from the JPL provides Sun and Earth positions. eph = load('de421.bsp') sun = eph['sun'] earth = eph['earth'] # The Minor Planet Center data file provides the comet orbit. with load.open(mpc.COMET_URL) as f: comets = mpc.load_comets_dataframe(f) comets = (comets.sort_values('reference') .groupby('designation', as_index=False).last() .set_index('designation', drop=False)) row = comets.loc['C/2020 F3 (NEOWISE)'] comet = sun + mpc.comet_orbit(row, ts, GM_SUN) # The Hipparcos mission provides our star catalog. # with load.open(hipparcos.URL) as f: with load.open(settings.MY_HIPPARCOS_URL) as f: stars = hipparcos.load_dataframe(f) # And the constellation outlines come from Stellarium. We make a list # of the stars at which each edge stars, and the star at which each edge # ends. url = ('https://raw.githubusercontent.com/Stellarium/stellarium/master' '/skycultures/western_SnT/constellationship.fab') with load.open(url) as f: constellations = stellarium.parse_constellations(f) edges = [edge for name, edges in constellations for edge in edges] edges_star1 = [star1 for star1, star2 in edges] edges_star2 = [star2 for star1, star2 in edges] # We will center the chart on the comet's middle position. center = earth.at(t).observe(comet) projection = build_stereographic_projection(center) field_of_view_degrees = 30.0 limiting_magnitude = 8.0 # Now that we have constructed our projection, compute the x and y # coordinates that each star and the comet will have on the plot. star_positions = earth.at(t).observe(Star.from_dataframe(stars)) stars['x'], stars['y'] = projection(star_positions) comet_x, comet_y = projection(earth.at(t_comet).observe(comet)) # Create a True/False mask marking the stars bright enough to be # included in our plot. And go ahead and compute how large their # markers will be on the plot. bright_stars = (stars.magnitude <= limiting_magnitude) magnitude = stars['magnitude'][bright_stars] marker_size = (0.5 + limiting_magnitude - magnitude) ** 2.0 # The constellation lines will each begin at the x,y of one star and end # at the x,y of another. We have to "rollaxis" the resulting coordinate # array into the shape that matplotlib expects. xy1 = stars[['x', 'y']].loc[edges_star1].values xy2 = stars[['x', 'y']].loc[edges_star2].values lines_xy = np.rollaxis(np.array([xy1, xy2]), 1) # Time to build the figure! fig, ax = plt.subplots(figsize=[9, 9]) # Draw the constellation lines. ax.add_collection(LineCollection(lines_xy, colors='#00f2')) # Draw the stars. ax.scatter(stars['x'][bright_stars], stars['y'][bright_stars], s=marker_size, color='k') # Draw the comet positions, and label them with dates. comet_color = '#f00' offset = 0.002 ax.plot(comet_x, comet_y, '+', c=comet_color, zorder=3) for xi, yi, tstr in zip(comet_x, comet_y, t_comet.utc_strftime('%m/%d')): tstr = tstr.lstrip('0') text = ax.text(xi + offset, yi - offset, tstr, color=comet_color, ha='left', va='top', fontsize=9, weight='bold', zorder=-1) text.set_alpha(0.5) # Finally, title the plot and set some final parameters. angle = np.pi - field_of_view_degrees / 360.0 * np.pi limit = np.sin(angle) / (1.0 - np.cos(angle)) ax.set_xlim(-limit, limit) ax.set_ylim(-limit, limit) ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) ax.set_aspect(1.0) ax.set_title('Comet NEOWISE {} through {}'.format( t_comet[0].utc_strftime('%Y %B %d'), t_comet[-1].utc_strftime('%Y %B %d'), )) # Save. filename = 'starmap.png' path = os.path.join(settings.MEDIA_ROOT, filename) fig.savefig(path, bbox_inches='tight') image_url = os.path.join(settings.MEDIA_URL, filename) return image_url