Source code for adam_core.orbits.orbits

import logging
import uuid
from typing import TYPE_CHECKING, Iterable, Tuple

import numpy.typing as npt
import pyarrow.compute as pc
import quivr as qv

from ..coordinates.cartesian import CartesianCoordinates
from .classification import calc_orbit_class
from .physical_parameters import PhysicalParameters

if TYPE_CHECKING:
    from ..propagator import Propagator

logger = logging.getLogger(__name__)


[docs] class Orbits(qv.Table): orbit_id = qv.LargeStringColumn(default=lambda: uuid.uuid4().hex) object_id = qv.LargeStringColumn(nullable=True) coordinates = CartesianCoordinates.as_column() physical_parameters = PhysicalParameters.as_column(nullable=True)
[docs] def group_by_orbit_id(self) -> Iterable[Tuple[str, "Orbits"]]: """ Group orbits by orbit ID and yield them. Yields ------ orbit_id : str Orbit ID. orbits : `~adam_core.orbits.orbits.Orbits` Orbits belonging to this orbit ID. """ unique_orbit_ids = self.orbit_id.unique() for orbit_id in unique_orbit_ids: mask = pc.equal(self.orbit_id, orbit_id) yield orbit_id, self.apply_mask(mask)
[docs] def dynamical_class(self) -> npt.NDArray[str]: """ Compute dynamical classes of orbits. Currently limited to asteroid dynamical classes. Returns ------- dynamical_classes : `~numpy.ndarray` Dynamical classes of orbits. """ keplerian = self.coordinates.to_keplerian() return calc_orbit_class(keplerian)
[docs] def preview(self, propagator: "Propagator") -> None: """ For a single orbit, render a plotly plot of the orbit. """ from .plots import plot_orbit fig = plot_orbit(self, propagator) fig.show()