201.15. Current_identifications table#
201.15. Current_identifications table¶
For the Rubin Science Platform at data.lsst.cloud.
Data Release: Data Preview 2
Container Size: Large
LSST Science Pipelines version: r30.0.10
Last verified to run: 2026-08-05
Repository: github.com/lsst/tutorial-notebooks
DOI: 10.11578/rubin/dc.20250909.20
Learning objective: To understand the contents of the current_identifications table and how to access it.
LSST data products: current_identifications
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¶
The current_identifications table contains all the primary objects (minor planets, comets, and natural satellites) and their secondary designations, plus additional information from the Minor Planet Center (MPC) for all known Solar System objects (SSOs) as of a given date, including but not limited to detections and discoveries made by Rubin. For DP2, this includes known SSOs up to 30 March 2026, a total of 2,047,622 objects.
This table is ingested from the MPC, where Rubin acts as a downstream distributor with the fields in the current_identifications table originating upstream at the MPC; inconsistencies or missing information in the MPC's current_identifications table may therefore be present in the DP2 table.
For further information on the current_identifications table, see the MPC documentation.
The current_identifications table can be joined with the DP2 mpc_orbits and numbered_identifications tables on the packed_primary_provisional_designation and unpacked_primary_provisional_designation fields (see Section 3.1.3).
- TAP table name:
dp2.current_identifications - columns: 10
- rows: 2,047,622
Related tutorials: The TAP data access services are demonstrated in the 100-level "How to" tutorials.
1.1. Import packages¶
Import standard python packages pandas and matplotlib.
From the lsst package, import module for the TAP service.
import pandas as pd
import matplotlib.pyplot as plt
from lsst.rsp import RSPDiscovery
1.2. Define parameters and functions¶
Create an instance of the TAP service.
discovery = RSPDiscovery("dp2")
service = discovery.get_tap_client()
2. Schema (columns)¶
To browse the table schema visit the Rubin schema browser, or use the TAP service via the Portal Aspect or as demonstrated in Section 2.1.
2.1. Retrieve table schema¶
To retrieve the table schema, define a query for the schema columns of the current_identifications table and run the query job.
query = "SELECT column_name, datatype, description, unit " \
"FROM tap_schema.columns " \
"WHERE table_name = 'dp2.current_identifications'"
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
Retrieve the query results and display them as an astropy table with the to_table() attribute.
assert job.phase == 'COMPLETED'
results = job.fetch_result().to_table()
results
| column_name | datatype | description | unit |
|---|---|---|---|
| str64 | str64 | str512 | str64 |
| created_at | char | When this row was created | |
| id | int | Internal ID (generally not seen/used by the user) | |
| numbered | boolean | Has the object been numbered and hence does it appear in the numbered_objects table? | |
| object_type | int | Integer to indicate the object type. To be linked (foreign key) to object_type lookup table | |
| packed_primary_provisional_designation | char | The primary provisional designation in packed form (e.g. K08A00B) | |
| packed_secondary_provisional_designation | char | The secondary provisional designation in packed form (e.g. K08A00B). May be the same-as (A=A) or different-to (A=B) the primary provisional designation | |
| published | boolean | Has this been published yet? i.e. has it been released to the public? | |
| unpacked_primary_provisional_designation | char | The primary provisional designation in unpacked form (e.g. 2008 AB) | |
| unpacked_secondary_provisional_designation | char | The secondary provisional designation in unpacked form (e.g. 2008 AB). May be the same-as (A=A) or different-to (A=B) the primary provisional designation | |
| updated_at | char | When this row was updated |
Delete the job, but not the results.
del query
job.delete()
2.2. Key Columns¶
Of the 10 columns in the current_identifications table, a few are the most commonly used.
2.2.1. Primary designation¶
The primary provisional designation (unpacked format):
unpacked_primary_provisional_designation
The primary provisional designation (packed format):
packed_primary_provisional_designation
2.2.2. Secondary designation¶
The secondary provisional designation (unpacked format):
unpacked_secondary_provisional_designation
The secondary provisional designation (packed format):
packed_secondary_provisional_designation
The secondary provisional designation may be the same as or different from the primary provisional designation. For more information, see the MPC documentation.
2.2.3. Numbered boolean¶
Boolean field for marking whether an object has been numbered:
numbered
Numbered objects appear in the numbered_identifications table.
2.2.4. Object type¶
Integer to indicate the object type (based on orbital elements):
object_type
The object type and their MPC-assigned integer values are as follows:
Object type | Assigned value
---------------------------- \
| Minor Planet | 0 \ |
|---|---|
| Past Impactor | 6 \ |
| Minor Planet (Forced Orbit) | 8 \ |
| Minor Planet (No Orbit) | 9 \ |
| Comet | 10 \ |
| Comet (Fragment) | 11 \ |
| Comet Without Orbit | 12 \ |
| Disintegrated Comet | 13 \ |
| Comet (Forced Orbit) | 14 \ |
| Dual Status (Minor Planet and Comet) | 20 \ |
| Irregular Natural Satellite (of planet) | 30 \ |
| Regular Natural Satellite (of planet) | 31 \ |
| Natural Satellite (of minor planet) | 40 \ |
| Interstellar Object | 50 \ |
For the object_type definitions, see the MPC documentation.
3. Data access¶
The current_identifications table is only available via the TAP service. It is not available with the butler.
3.1. TAP (Table Access Protocol)¶
The current_identifications table is stored in Qserv and accessible via the TAP services using ADQL queries.
3.1.1. Catalog size¶
Retrieve the size of the current_identifications catalog.
query = "SELECT COUNT(*) "\
"FROM dp2.current_identifications "
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 results as an astropy table.
assert job.phase == 'COMPLETED'
results = job.fetch_result().to_table()
print(results)
COUNT1 ------- 2047622
Define a query to count how many numbered objects are in the current_identifications table. There are 1,335,577 numbered objects in the DP2 current_identifications table.
query = "SELECT COUNT(numbered) "\
"FROM dp2.current_identifications "\
"WHERE numbered > 0.5"
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
Retrieve the query results and display them as an astropy table with the to_table() attribute.
assert job.phase == 'COMPLETED'
results = job.fetch_result().to_table()
results
| COUNT1 |
|---|
| int64 |
| 1335577 |
Define a query to count how many unnumbered objects are in the current_identifications table. There are 712,045 unnumbered objects in the DP2 current_identifications table.
query = "SELECT COUNT(numbered) "\
"FROM dp2.current_identifications "\
"WHERE numbered < 0.5"
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
assert job.phase == 'COMPLETED'
results = job.fetch_result().to_table()
results
| COUNT1 |
|---|
| int64 |
| 712045 |
Clean up.
del query, results
job.delete()
3.1.2. Demo query¶
Define a query to return three of the key columns from Section 2.2 for the top 100 entries in the current_identifications table.
To query the full current_identifications table, remove "TOP 100" from the below query.
query = "SELECT TOP 100 unpacked_primary_provisional_designation, "\
"numbered, object_type "\
"FROM dp2.current_identifications "\
"ORDER BY unpacked_primary_provisional_designation ASC "
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 results as an astropy table and convert to a pandas dataframe.
assert job.phase == 'COMPLETED'
results = job.fetch_result()
result_df = results.to_table().to_pandas()
Option to display the results.
# result_df
Clean up.
job.delete()
del query, results
3.1.3. Joinable tables¶
The current_identifications table (including Rubin detected objects and non-Rubin detected objects) can be joined with the mpc_orbits and numbered_identifications tables using the packed_primary_provisional_designation and unpacked_primary_provisional_designation fields.
However, while these tables can be joined, the DP2 mpc_orbits, current_identifications, and numbered_identifications tables are too large to query two together for the orbital parameters and identification information for all of the Solar System objects in these tables without long query times.
To avoid long query times on joined tables, query the TOP 100 objects in the mpc_orbits table separately and merge the results as a dataframe with result_df from the query above on the current_identifications table.
query = "SELECT TOP 100 unpacked_primary_provisional_designation, "\
"q, e "\
"FROM dp2.mpc_orbits "\
"ORDER BY unpacked_primary_provisional_designation ASC"
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
assert job.phase == 'COMPLETED'
results = job.fetch_result()
result_df_mpc = results.to_table().to_pandas()
print(len(result_df_mpc))
100
Option to print the results
# result_df_mpc
Merge the result_df dataframe from the current_identifications query above with the result_df_mpc dataframe from the mpc_orbits query on the unpacked_primary_provisional_designation field. Use an inner merge to only keep matching rows present in both dataframes.
merged_df = pd.merge(result_df, result_df_mpc, on='unpacked_primary_provisional_designation', how='inner')
len(merged_df)
100
Option to print the merged dataframe.
# merged_df
The semimajor axis is included in the mpc_orbits table, but many entries are missing, as described in Section 1. For further information on the known issues with the mpc_orbits table, see the MPC documentation. The semimajor axis ($a$) can be computed from the perihelion distance ($q$) and eccentricity ($e$) using the relationship $a$ = $q$ / (1.0-$e$).
Add a column to merged_df with the calculated semimajor axis.
merged_df['a_calc'] = merged_df['q'] / (1.0-merged_df['e'])
Plot histograms of the calculated semimajor axes for the 100 objects in the merged current_identifications and mpc_orbits tables.
fig, ax = plt.subplots(figsize=(6, 3))
ax.hist((merged_df['a_calc']).clip(0, 5), bins=50,
edgecolor='none', alpha=0.85)
ax.set_xlim(0, 5.1)
ax.set_xlabel('Semimajor axis (au)')
ax.set_ylabel('Count')
plt.tight_layout()
plt.show()
Figure 1: Histograms of semimajor axes for the 100 objects in the merged
current_identificationsandmpc_orbitstables.
Clean up.
job.delete()
del query, results, result_df, result_df_mpc, merged_df