308.1. Discoveries¶
308.1. Solar System object discoveries¶
Data Release: DP1
Container Size: small
LSST Science Pipelines version: Release r29.1.1
Last verified to run: 2025-06-27
Repository: github.com/lsst/tutorial-notebooks
Learning objective: An overview of the Data Preview 1 (DP1) Solar System object discoveries.
LSST data products: MPCORB
, SSObject
Packages: lsst.rsp
Credit: Originally developed by the Rubin Community Science team. Please consider acknowledging them if this notebook is used for the preparation of journal articles, software releases, or other notebooks.
Get Support: Everyone is encouraged to ask questions or raise issues in the Support Category of the Rubin Community Forum. Rubin staff will respond to all questions posted there.
1. Introduction¶
This notebook examines the DP1 Solar System object discoveries, including exploring their orbital parameters. The DP1 data release contains 431 Solar System objects, 93 of those are discoveries.
Related tutorials: The 100-level tutorials demonstrate how to use the TAP service. The 200-level tutorials introduce the types of catalog data.
1.1. Import packages¶
Import numpy
, a fundamental package for scientific computing with arrays in Python
(numpy.org), and
matplotlib
, a comprehensive library for data visualization
(matplotlib.org;
matplotlib gallery).
From the lsst
package, import modules for accessing the Table Access Protocol (TAP) service, and
for retrieving datasets from the butler from the LSST Science Pipelines (pipelines.lsst.io). Additional modules support standardized multiband plotting (lsst.utils.plotting
) for LSST data analysis and visualization.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from lsst.rsp import get_tap_service
1.2. Define parameters and functions¶
Create an instance of the TAP service, and assert that it exists.
service = get_tap_service("tap")
assert service is not None
Define parameters to use colorblind-friendly colors with matplotlib
.
plt.style.use('seaborn-v0_8-colorblind')
prop_cycle = plt.rcParams['axes.prop_cycle']
colors = prop_cycle.by_key()['color']
2. Find discoveries¶
Query the MPCORB
table for the orbital parameters joined with the SSObject
table to query for the discoverySubmissionDate
for all DP1 Solar System objects.
query = "SELECT mpc.ssObjectId, "\
"mpc.q, mpc.e, mpc.incl, "\
"sso.discoverySubmissionDate "\
"FROM dp1.MPCORB as mpc "\
"INNER JOIN dp1.SSObject as sso "\
"ON mpc.ssObjectId = sso.ssObjectId "\
"ORDER BY mpc.ssObjectId"
job = service.submit_job(query)
job.run()
job.wait(phases=['COMPLETED', 'ERROR'])
print('Job phase is', job.phase)
if job.phase == 'ERROR':
job.raise_if_error()
Job phase is COMPLETED
Fetch the job results and assign to an astropy result
table. There are 431 Solar System objects in DP1.
assert job.phase == 'COMPLETED'
result = job.fetch_result()
print(len(result))
431
Convert the result
astropy table to a pandas dataframe.
result_df = pd.DataFrame(result)
Find the objects with non-zero discoverySubmissionDate
s. These are the Solar System objects discovered by Rubin. 93 of the 431 DP1 Solar System objects are discoveries.
discoveries = result_df[result_df['discoverySubmissionDate'] > 0]
len(discoveries)
93
Any Solar System objects that do not have a discoverySubmissionDate
(i.e., they were not discovered by Rubin) and do thus not appear in the discoveries
dataframe, are objects detected by Rubin that have been associated with known objects. 338 of the 431 DP1 Solar System objects are previously-known objects.
select = np.isin(result_df['ssObjectId'], discoveries['ssObjectId'], invert=True)
known_obj = result_df[select].copy()
len(known_obj)
338
Plot the semimajor axes, eccentricities, and inclinations of the 431 detected Solar System Objects, making the newly discovered objects a different color to distinguish them from those associated with known objects.
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5), sharey=False)
ax1.scatter((known_obj['q']/(1.0-known_obj['e'])),
known_obj['e'], s=1, color='green',
label='DP1 known objects')
ax1.scatter((discoveries['q']/(1.0-discoveries['e'])),
discoveries['e'], s=1, color='orange',
label='DP1 discoveries')
ax2.scatter((known_obj['q']/(1.0-known_obj['e'])),
known_obj['incl'], s=1, color='green',
label='DP1 known objects')
ax2.scatter((discoveries['q']/(1.0-discoveries['e'])),
discoveries['incl'], s=1, color='orange',
label='DP1 discoveries')
ax1.set_xlabel('semimajor axis (au)')
ax1.set_ylabel('eccentricity')
ax1.minorticks_on()
ax1.legend()
ax2.set_xlabel('semimajor axis (au)')
ax2.set_ylabel('inclination (deg)')
ax2.minorticks_on()
ax2.legend()
plt.show()
Figure 1: Semimajor axes, eccentricities, and inclinations of the 431 DP1 Solar System objects, overplotted with the 93 DP1 Solar System object discoveries.
Clean up.
del result, result_df, discoveries