Skip to content

Commit 1261fed

Browse files
committed
sort needed dates, pull prev/next day for sp3,clk if close to day boundary
1 parent 852b0c1 commit 1261fed

2 files changed

Lines changed: 28 additions & 19 deletions

File tree

gnss_lib_py/utils/ephemeris_downloader.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,10 @@ def _extract_ephemeris_dates(file_type, dt_timestamps):
256256
will also be included. If after 22:00, the next day will also be
257257
included.
258258
259+
To appropriately compute fit satellite position and clock esimates,
260+
sp3 and clk files are also pulled for the previous or next day if
261+
the timestamps are close to the start or end of the day.
262+
259263
Parameters
260264
----------
261265
file_type : string
@@ -265,9 +269,9 @@ def _extract_ephemeris_dates(file_type, dt_timestamps):
265269
266270
Returns
267271
-------
268-
needed_dates : set
269-
Set of datetime.date objects of the days in UTC for which
270-
ephemeris needs to be retrieved.
272+
needed_dates : List
273+
List of datetime.date objects of the days in UTC for which
274+
ephemeris needs to be retrieved in order sorted by date.
271275
272276
"""
273277

@@ -276,7 +280,7 @@ def _extract_ephemeris_dates(file_type, dt_timestamps):
276280

277281
needed_dates = set()
278282

279-
if file_type == "rinex_nav":
283+
if file_type in ("rinex_nav","sp3","clk"):
280284
# add every day for each timestamp
281285
needed_dates.update({dt.date() for dt in dt_timestamps})
282286

@@ -293,13 +297,11 @@ def _extract_ephemeris_dates(file_type, dt_timestamps):
293297
(dt.date() != datetime.utcnow().date()))
294298
})
295299

296-
elif file_type in ("sp3","clk"):
297-
# add every day for each timestamp
298-
needed_dates.update({dt.date() for dt in dt_timestamps})
299-
300300
else:
301301
raise RuntimeError("invalid file_type variable option")
302302

303+
needed_dates = sorted(list(needed_dates))
304+
303305
return needed_dates
304306

305307
def _valid_ephemeris_in_paths(date, possible_types, file_paths=None):

tests/utils/test_ephemeris_downloader.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -275,48 +275,55 @@ def test_extract_ephemeris_dates():
275275
# check basic case
276276
noon_utc = datetime(2023, 7, 27, 12, 0, 0, 0, tzinfo=timezone.utc)
277277
dates = ed._extract_ephemeris_dates("rinex_nav", np.array([noon_utc]))
278-
assert dates == {datetime(2023, 7, 27).date()}
278+
assert dates == [datetime(2023, 7, 27).date()]
279279

280280
# check that timezone conversion is happening
281281
eleven_pt = datetime(2023, 7, 26, 23, 0, 0, 0,
282282
tzinfo=timezone(-timedelta(hours=8)))
283283
dates = ed._extract_ephemeris_dates("rinex_nav", np.array([eleven_pt]))
284-
assert dates == {datetime(2023, 7, 27).date()}
284+
assert dates == [datetime(2023, 7, 27).date()]
285285

286286
# check add prev day if after before 2am
287287
for hour in [0,1,2]:
288288
two_am_utc = datetime(2023, 7, 27, hour, 0, 0, 0, tzinfo=timezone.utc)
289289
dates = ed._extract_ephemeris_dates("rinex_nav", np.array([two_am_utc]))
290-
assert dates == {datetime(2023, 7, 26).date(),
291-
datetime(2023, 7, 27).date()}
290+
assert dates == [datetime(2023, 7, 26).date(),
291+
datetime(2023, 7, 27).date()]
292292

293293
# check add next day if after 10pm
294294
for hour in [22,23]:
295295
ten_pm_utc = datetime(2023, 7, 26, hour, 0, 0, 0, tzinfo=timezone.utc)
296296
dates = ed._extract_ephemeris_dates("rinex_nav", np.array([ten_pm_utc]))
297-
assert dates == {datetime(2023, 7, 26).date(),
298-
datetime(2023, 7, 27).date()}
297+
assert dates == [datetime(2023, 7, 26).date(),
298+
datetime(2023, 7, 27).date()]
299299

300300
# check don't add next day if after 10pm on current day
301301
ten_pm_utc_today = datetime.combine(datetime.utcnow().date(),
302302
time(22,tzinfo=timezone.utc))
303303
dates = ed._extract_ephemeris_dates("rinex_nav", np.array([ten_pm_utc_today]))
304-
assert dates == {datetime.utcnow().date()}
304+
assert dates == [datetime.utcnow().date()]
305305

306306
# check that across multiple days there aren't duplicates
307307
dates = ed._extract_ephemeris_dates("rinex_nav", np.array([noon_utc,
308308
eleven_pt,
309309
two_am_utc,
310310
ten_pm_utc]))
311-
assert dates == {datetime(2023, 7, 26).date(),
312-
datetime(2023, 7, 27).date()}
311+
assert dates == [datetime(2023, 7, 26).date(),
312+
datetime(2023, 7, 27).date()]
313+
314+
# test order is maintained in sorted order
315+
dates = ed._extract_ephemeris_dates("rinex_nav", np.array([noon_utc + timedelta(days=1),
316+
noon_utc,
317+
]))
318+
assert dates == [datetime(2023, 7, 27).date(),
319+
datetime(2023, 7, 28).date()]
313320

314321
# check for two separate days
315322
noon_utc_01 = datetime(2023, 7, 1, 12, 0, 0, 0, tzinfo=timezone.utc)
316323
dates = ed._extract_ephemeris_dates("rinex_nav", np.array([noon_utc,
317324
noon_utc_01]))
318-
assert dates == {datetime(2023, 7, 27).date(),
319-
datetime(2023, 7, 1).date()}
325+
assert dates == [datetime(2023, 7, 1).date(),
326+
datetime(2023, 7, 27).date()]
320327

321328
def test_ftp_errors(ephem_download_path):
322329
"""Test FTP download errors.

0 commit comments

Comments
 (0)