Source code for adam_core.utils.helpers.orbits

from importlib.resources import files
from typing import Optional

import numpy as np

from ...coordinates.covariances import CoordinateCovariances
from ...coordinates.keplerian import KeplerianCoordinates
from ...coordinates.origin import Origin
from ...orbits.orbits import Orbits
from ...time import Timestamp


[docs] def make_real_orbits(num_orbits: Optional[int] = None) -> Orbits: """ Returns an `~adam_core.orbits.orbits.Orbits` object with real orbits drawn from our list of sample objects. Parameters ---------- num_orbits : optional, int The number of orbits to return, which must be less than or equal to the number of sample objects (27). Returns ------- orbits : `~adam_core.orbits.orbits.Orbits` Orbits object containing the sample orbits. """ orbits_file = files("adam_core.utils.helpers.data").joinpath("orbits.parquet") orbits = Orbits.from_parquet(orbits_file) if num_orbits is None: return orbits if num_orbits > len(orbits): raise ValueError( f"num_orbits must be less than or equal to the number of sample orbits ({len(orbits)})." ) return orbits[:num_orbits]
[docs] def make_simple_orbits(num_orbits: int = 10) -> Orbits: """ Returns an `~adam_core.orbits.orbits.Orbits` object with simple orbits. Parameters ---------- num_orbits : int, optional The number of orbits to return. Default is 10. Returns ------- orbits : `~adam_core.orbits.orbits.Orbits` Orbits object containing the sample orbits. """ data = { "a": np.linspace(1, 10, num_orbits), "e": np.linspace(0, 2, num_orbits), "i": np.linspace(0, 180, num_orbits), "raan": np.linspace(0, 360, num_orbits), "ap": np.linspace(0, 360, num_orbits), "M": np.linspace(0, 360, num_orbits), } # Hyperbolic orbits have negative semi-major axes data["a"] = np.where(data["e"] > 1.0, -data["a"], data["a"]) sigmas = np.zeros((num_orbits, 6)) for i, dim in enumerate(["a", "e", "i", "raan", "ap", "M"]): sigmas[:, i] = np.round(0.01 * data[dim], 4) data["covariance"] = CoordinateCovariances.from_sigmas(sigmas) data["time"] = Timestamp.from_mjd( np.round(np.linspace(59000.0, 59000.0 + num_orbits, num_orbits), 3), scale="tdb", ) data["origin"] = Origin.from_kwargs(code=["SUN" for i in range(num_orbits)]) data["frame"] = "ecliptic" coords = KeplerianCoordinates.from_kwargs(**data) object_ids = [f"Object {i:03d}" for i in range(num_orbits)] orbit_ids = [f"Orbit {i:03d}" for i in range(num_orbits)] orbits = Orbits.from_kwargs( coordinates=coords.to_cartesian(), orbit_id=orbit_ids, object_id=object_ids, ) return orbits