Skip to content

Commit 03234fe

Browse files
authored
ENH: repoint mid-time utils function (#2167)
1 parent 4a6bb28 commit 03234fe

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

imap_processing/spice/repoint.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from numpy import typing as npt
1010

1111
from imap_processing.spice import config
12+
from imap_processing.spice.geometry import imap_state
13+
from imap_processing.spice.time import met_to_sclkticks, sct_to_et
1214

1315
logger = logging.getLogger(__name__)
1416

@@ -221,3 +223,50 @@ def get_pointing_times(met_time: float) -> tuple[float, float]:
221223
][0]
222224
pointing_end_met = repoint_df["repoint_start_met"].iloc[pointing_idx + 1].item()
223225
return pointing_start_met, pointing_end_met
226+
227+
228+
def get_pointing_mid_time(met_time: float) -> float:
229+
"""
230+
Get mid-point of the pointing for the given MET time.
231+
232+
Get the mid-point time between the end of one repoint and
233+
start of the next. Input could be a MET time.
234+
235+
Parameters
236+
----------
237+
met_time : float
238+
The MET time in a repoint.
239+
240+
Returns
241+
-------
242+
repoint_mid_time : float
243+
The mid MET time of the repoint maneuver.
244+
"""
245+
pointing_start_met, pointing_end_met = get_pointing_times(met_time)
246+
return (pointing_start_met + pointing_end_met) / 2
247+
248+
249+
def get_mid_point_state(met_time: float) -> npt.NDArray:
250+
"""
251+
Get IMAP state for the mid-point.
252+
253+
Get IMAP state for the mid-point of the pointing in
254+
reference frame, ECLIPJ2000 and observer, SUN.
255+
256+
Parameters
257+
----------
258+
met_time : float
259+
The MET time in a pointing.
260+
261+
Returns
262+
-------
263+
mid_point_state : numpy.ndarray
264+
The mid state of the pointing maneuver.
265+
"""
266+
# Get mid point time in ET
267+
mid_point_time = get_pointing_mid_time(met_time)
268+
mid_point_time_et = sct_to_et(met_to_sclkticks(mid_point_time))
269+
270+
# Convert mid point time to state
271+
pointing_state = imap_state(mid_point_time_et)
272+
return pointing_state

imap_processing/tests/spice/test_repoint.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Test coverage for imap_processing.spice.repoint.py"""
22

33
from pathlib import Path
4+
from unittest import mock
45

56
import numpy as np
67
import pandas as pd
@@ -81,6 +82,38 @@ def test_get_pointing_times(fake_repoint_data):
8182
assert pointing_end_time == expected_times[1]
8283

8384

85+
def test_get_pointing_mid_time(fake_repoint_data, monkeypatch):
86+
"""Test coverage for get_pointing_mid_time function."""
87+
times = 6
88+
expected_times = (5.1, 15.2)
89+
90+
expected_mid_time = np.mean(expected_times)
91+
92+
mid_time = repoint.get_pointing_mid_time(times)
93+
94+
assert mid_time == expected_mid_time
95+
96+
97+
@pytest.mark.external_kernel
98+
@mock.patch("imap_processing.spice.repoint.imap_state")
99+
@mock.patch("imap_processing.spice.repoint.get_pointing_times")
100+
def test_mid_point_state(mock_get_pointing_times, mock_imap_state, furnish_kernels):
101+
"""Test coverage for imap_state()"""
102+
met = 5
103+
mock_get_pointing_times.return_value = (5.1, 15.2)
104+
# Mock the imap_state function
105+
mock_imap_state.return_value = np.array(
106+
[1.0, 2.0, 3.0, 0.1, 0.2, 0.3], # Example position and velocity data
107+
)
108+
kernels = [
109+
"naif0012.tls",
110+
"imap_sclk_0000.tsc",
111+
]
112+
with furnish_kernels(kernels):
113+
state = repoint.get_mid_point_state(met)
114+
assert state.shape == (6,)
115+
116+
84117
@pytest.mark.parametrize(
85118
"query_times, match_str",
86119
[

0 commit comments

Comments
 (0)