From 8b7d5e8da639a54a164e24a7b636796745bec762 Mon Sep 17 00:00:00 2001 From: Tim Plummer Date: Wed, 4 Sep 2024 16:43:16 -0600 Subject: [PATCH] SPICE geometry enums and IMAP state function (#791) * Add spice infrastructure code for spice bodies and frames Add geometry functions for computing IMAP spacecraft state (position, velocity) Add IMAP SPK kernel from Nick's 366 day simulation Add test coverage for new geometry functions * Remove _ensured_spkezr funciton. Remove SpiceId(NamedTuple) Parameterize test to cover single and iterable ET input Change typing on ensure_spice to apease mypy Fix up ensure_spice decorator factory typing * Fix typo * Use IntEnum * Back out some of the typing changes not compatible with Python 3.9 * Use spice to define built-in bodies and frames * Tell mypy not to check skip type check --- imap_processing/spice/geometry.py | 90 +++++++++++++++++- imap_processing/spice/kernels.py | 31 +++--- .../tests/spice/test_data/imap_spk_demo.bsp | Bin 0 -> 68608 bytes .../test_data/imap_test_metakernel.template | 3 +- imap_processing/tests/spice/test_geometry.py | 24 +++++ 5 files changed, 135 insertions(+), 13 deletions(-) create mode 100644 imap_processing/tests/spice/test_data/imap_spk_demo.bsp diff --git a/imap_processing/spice/geometry.py b/imap_processing/spice/geometry.py index 0f04d2db6..ca7ab4fe3 100644 --- a/imap_processing/spice/geometry.py +++ b/imap_processing/spice/geometry.py @@ -1 +1,89 @@ -"""Functions for computing geometry using SPICE.""" +""" +Functions for computing geometry, many of which use SPICE. + +Paradigms for developing this module: +* Use @ensure_spice decorator on functions that directly wrap spiceypy functions +* Vectorize everything at the lowest level possible (e.g. the decorated spiceypy + wrapper function) +* Always return numpy arrays for vectorized calls. +""" + +import typing +from enum import IntEnum +from typing import Union + +import numpy as np +import spiceypy as spice + +from imap_processing.spice.kernels import ensure_spice + + +class SpiceBody(IntEnum): + """Enum containing SPICE IDs for bodies that we use.""" + + # A subset of IMAP Specific bodies as defined in imap_wkcp.tf + IMAP = -43 + IMAP_SPACECRAFT = -43000 + # IMAP Pointing Frame (Despun) as defined in iamp_science_0001.tf + IMAP_DPS = -43901 + # Standard NAIF bodies + SOLAR_SYSTEM_BARYCENTER = spice.bodn2c("SOLAR_SYSTEM_BARYCENTER") + SUN = spice.bodn2c("SUN") + EARTH = spice.bodn2c("EARTH") + + +class SpiceFrame(IntEnum): + """Enum containing SPICE IDs for reference frames, defined in imap_wkcp.tf.""" + + # Standard SPICE Frames + J2000 = spice.irfnum("J2000") + ECLIPJ2000 = spice.irfnum("ECLIPJ2000") + # IMAP specific as defined in imap_wkcp.tf + IMAP_SPACECRAFT = -43000 + IMAP_LO_BASE = -43100 + IMAP_LO_STAR_SENSOR = -43103 + IMAP_LO = -43105 + IMAP_HI_45 = -43150 + IMAP_HI_90 = -43160 + IMAP_ULTRA_45 = -43200 + IMAP_ULTRA_90 = -43210 + IMAP_MAG = -43250 + IMAP_SWE = -43300 + IMAP_SWAPI = -43350 + IMAP_CODICE = -43400 + IMAP_HIT = -43500 + IMAP_IDEX = -43700 + IMAP_GLOWS = -43750 + + +@typing.no_type_check +@ensure_spice +def imap_state( + et: Union[np.ndarray, float], + ref_frame: SpiceFrame = SpiceFrame.ECLIPJ2000, + observer: SpiceBody = SpiceBody.SUN, +) -> np.ndarray: + """ + Get the state (position and velocity) of the IMAP spacecraft. + + By default, the state is returned in the ECLIPJ2000 frame as observed by the Sun. + + Parameters + ---------- + et : np.ndarray or float + Epoch time(s) [J2000 seconds] to get the IMAP state for. + ref_frame : SpiceFrame, optional + Reference frame which the IMAP state is expressed in. + observer : SpiceBody, optional + Observing body. + + Returns + ------- + state : np.ndarray + The Cartesian state vector representing the position and velocity of the + IMAP spacecraft. + """ + state, _ = spice.spkezr( + SpiceBody.IMAP.name, et, ref_frame.name, "NONE", observer.name + ) + return np.asarray(state) diff --git a/imap_processing/spice/kernels.py b/imap_processing/spice/kernels.py index 6f7ce1492..0a3f18493 100644 --- a/imap_processing/spice/kernels.py +++ b/imap_processing/spice/kernels.py @@ -6,7 +6,7 @@ from collections.abc import Generator from contextlib import contextmanager from pathlib import Path -from typing import Any, Callable, Optional +from typing import Any, Callable, Optional, Union, overload import numpy as np import spiceypy as spice @@ -16,15 +16,29 @@ logger = logging.getLogger(__name__) +# Declarations to help with typing. Taken from mypy documentation on +# decorator-factories: +# https://mypy.readthedocs.io/en/stable/generics.html#decorator-factories +# Bare decorator usage +@overload def ensure_spice( - f_py: Optional[Callable] = None, time_kernels_only: bool = False -) -> Callable: + __func: Callable[..., Any], +) -> Callable[..., Any]: ... # numpydoc ignore=GL08 +# Decorator with arguments +@overload +def ensure_spice( + *, time_kernels_only: bool = False +) -> Callable[[Callable[..., Any]], Callable[..., Any]]: ... # numpydoc ignore=GL08 +# Implementation +def ensure_spice( + __func: Optional[Callable[..., Any]] = None, *, time_kernels_only: bool = False +) -> Union[Callable[..., Any], Callable[[Callable[..., Any]], Callable[..., Any]]]: """ Decorator/wrapper that automatically furnishes SPICE kernels. Parameters ---------- - f_py : Callable + __func : Callable The function requiring SPICE that we are going to wrap if being used explicitly, otherwise None, in which case ensure_spice is being used, not as a function wrapper (see l2a_processing.py) but as a true @@ -82,11 +96,6 @@ def ensure_spice( >>> wrapped = ensure_spice(spicey_func, time_kernels_only=True) ... result = wrapped(*args, **kwargs) """ - if f_py and not callable(f_py): - raise ValueError( - f"Received a non-callable object {f_py} as the f_py argument to" - f"ensure_spice. f_py must be a callable object." - ) def _decorator(func: Callable[..., Callable]) -> Callable: """ @@ -157,8 +166,8 @@ def wrapper_ensure_spice(*args: Any, **kwargs: Any) -> Any: # Note: This return was originally implemented as a ternary operator, but # this caused mypy to fail due to this bug: # https://github.com/python/mypy/issues/4134 - if callable(f_py): - return _decorator(f_py) + if callable(__func): + return _decorator(__func) else: return _decorator diff --git a/imap_processing/tests/spice/test_data/imap_spk_demo.bsp b/imap_processing/tests/spice/test_data/imap_spk_demo.bsp new file mode 100644 index 0000000000000000000000000000000000000000..e8b7578f6921ff3c618ce8e75609d41f9f769fb2 GIT binary patch literal 68608 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�agyCZ@m0n2kF>ALg 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 literal 0 HcmV?d00001 diff --git a/imap_processing/tests/spice/test_data/imap_test_metakernel.template b/imap_processing/tests/spice/test_data/imap_test_metakernel.template index b4a5d9f82..d727ba318 100644 --- a/imap_processing/tests/spice/test_data/imap_test_metakernel.template +++ b/imap_processing/tests/spice/test_data/imap_test_metakernel.template @@ -1,2 +1,3 @@ {SPICE_TEST_DATA_PATH}/imap_sclk_0000.tsc -{SPICE_TEST_DATA_PATH}/naif0012.tls \ No newline at end of file +{SPICE_TEST_DATA_PATH}/naif0012.tls +{SPICE_TEST_DATA_PATH}/imap_spk_demo.bsp \ No newline at end of file diff --git a/imap_processing/tests/spice/test_geometry.py b/imap_processing/tests/spice/test_geometry.py index 287b3eb28..f1a0ae448 100644 --- a/imap_processing/tests/spice/test_geometry.py +++ b/imap_processing/tests/spice/test_geometry.py @@ -1 +1,25 @@ """Tests coverage for imap_processing/spice/geometry.py""" + +import numpy as np +import pytest + +from imap_processing.spice.geometry import ( + SpiceBody, + imap_state, +) + + +@pytest.mark.parametrize( + "et", + [ + 798033670, + np.linspace(798033670, 798033770), + ], +) +def test_imap_state(et, use_test_metakernel): + """Test coverage for imap_state()""" + state = imap_state(et, observer=SpiceBody.EARTH) + if hasattr(et, "__len__"): + np.testing.assert_array_equal(state.shape, (len(et), 6)) + else: + assert state.shape == (6,)