Source code for adam_core.orbits.classification
from typing import Union
import numpy as np
from ..coordinates.cometary import CometaryCoordinates
from ..coordinates.keplerian import KeplerianCoordinates
[docs]
def calc_orbit_class(
elements: Union[KeplerianCoordinates, CometaryCoordinates],
) -> np.ndarray:
"""
Calculate the orbital class for each Keplerian or Cometary orbit.
Based on the classification scheme defined by the Planetary Data System Small
Bodies Node (see: https://pdssbn.astro.umd.edu/data_other/objclass.shtml).
TODO: Classification is currently limited to asteroid dynamical classes. Cometary class
have not yet been implemented.
Parameters
----------
elements : KeplerianCoordinates or CometaryCoordinates
Keplerian orbits for which to find classes.
Returns
-------
orbit_class : `~numpy.ndarray`
Class for each orbit.
"""
if isinstance(elements, CometaryCoordinates):
a = elements.a
e = elements.e.to_numpy(zero_copy_only=False)
q = elements.q.to_numpy(zero_copy_only=False)
Q = elements.Q
elif isinstance(elements, KeplerianCoordinates):
a = elements.a.to_numpy(zero_copy_only=False)
e = elements.e.to_numpy(zero_copy_only=False)
q = elements.q
Q = elements.Q
orbit_class = np.array(["AST" for i in range(len(elements))])
orbit_class_dict = {
"AMO": np.where((a > 1.0) & (q > 1.017) & (q < 1.3)),
"APO": np.where((a > 1.0) & (q < 1.017)),
"ATE": np.where((a < 1.0) & (Q > 0.983)),
"CEN": np.where((a > 5.5) & (a < 30.1)),
"IEO": np.where((Q < 0.983)),
"IMB": np.where((a < 2.0) & (q > 1.666)),
"MBA": np.where((a > 2.0) & (a < 3.2) & (q > 1.666)),
"MCA": np.where((a < 3.2) & (q > 1.3) & (q < 1.666)),
"OMB": np.where((a > 3.2) & (a < 4.6)),
"TJN": np.where((a > 4.6) & (a < 5.5) & (e < 0.3)),
"TNO": np.where((a > 30.1)),
"PAA": np.where((e == 1)),
"HYA": np.where((e > 1)),
}
for c, v in orbit_class_dict.items():
orbit_class[v] = c
return orbit_class