# JPL Horizons original reference orbit data for Juno - how to retrieve now that it's been updated?

Because of the slow helium valve responses, Juno was not instructed to execute the large delta-v maneuver to drop from the ~53 day orbit to the ~14 day orbit originally scheduled for 2016-Oct-19.

I'd originally extracted the planned orbit from JPL Horizons mentioned here months ago. Now it's gone - or at least I can't find it. I'd like to retrieve it again as an exercise to understand it.

Just for one example, for this question I'd like to use Horizons to quickly give me the approximate orbital elements (a and $\epsilon$ at least) for the 14 day orbits around Jupiter. I can figure out how to extract them from the state vectors but it would be great to use this handy system.

   Trajectory name                       Start (TDB)         Stop (TDB)
------------------------------     -----------------   -----------------
rec_110805_111026_120302           2011-Aug-05 17:19   2011 OCT 26 00:00
rec_111026_120308_120726           2011 OCT 26 00:00   2012 MAR 08 12:00
rec_120308_120825_121109           2012 MAR 08 12:00   2012 AUG 25 00:00
rec_120825_130515_130708           2012 AUG 25 00:00   2013 MAY 15 00:00
rec_130515_131005_131031           2013 MAY 15 00:00   2013 OCT 05 12:00
rec_131005_131014_131101_reco      2013 OCT 05 12:00   2013 OCT 14 00:01
rec_131014_131114_140222           2013 OCT 14 00:01   2013 NOV 14 06:00
ref_131114_171017_140311_V0.2      2013 NOV 14 06:00   2015 MAR 26 00:00
ref_150326_180221_150326_V0.1      2015 MAR 26 00:00   2016 FEB 26 00:01
ref_160226_180221_160226_V0.1      2016 FEB 26 00:00   2016 APR 13 18:00
pre_160413_161016_160818_pj01_V0.1 2016 APR 13 18:00   2016 OCT 16 23:00
ref_160226_180221_160226_V0.5      2016 OCT 16 23:00   2018 FEB 21 11:40


Now the last two lines are:

   pre_160413_161016_160818_pj01_V0.1 2016 APR 13 18:00   2016 JUL 29 21:00
nob_160729_170201_161019.V0.1      2016 JUN 29 21:00   2017 FEB 01 00:00


Primary question: I would like to access the original reference orbit before the update. Is there any way I can get it again using Horizions? I'd like to get state vectors with fine granularity using the original ref_160226_180221_160226_V0.5 throughout all of 2017 at least. Is there any way to do this through the web, or telnet, or by e-mail?

Secondary question: If you look at the tables, the trajectories are patched - date/time that one ends matches the date/time the next begins, except sometimes for an overlap of 00:01 (a minute) which could be rounding in the table display.

However, in the last two lines of the updated table, the second-to-last line ends at 2016 JUL 29 21:00 while the last line begins one month earlier at 2016 JUN 29 21:00. Is this a typographical error, or are they somehow averaged together during that month?

above: Calculated distance between Juno Spacecraft and Jupiter Barycenter from JPL Horizons. Thin (blue) line: original reference orbit, Thick (green) line: updated orbit shown until 2016-Dec-10 - roughly when final committment for orbit "lowering" burn must be made. Note - data was downloaded at 2 hour time-point spacing, so uneven minimum distances is due to coarse sampling of the incredibly fast flyby.

It is the data of the thin (blue) line I would like to access again.

• naif.jpl.nasa.gov/pub/naif/JUNO/kernels/spk is this what you need? – oefe Nov 27 '16 at 20:27
• Does my answer to space.stackexchange.com/questions/19181/… answer this as well? – barrycarter Nov 27 '16 at 21:27
• @barrycarter it is interesting and useful, but not an answer to either, thanks! – uhoh Nov 28 '16 at 0:46
• @uhoh you're right: sk = SpiceKernel('spk_ref_160226_180221_160226.bsp') fails with "ValueError: SPK data type 1 not yet supported segment" – oefe Nov 28 '16 at 21:01
• @uhoh apparently it's a known issue in jplephem: github.com/brandon-rhodes/python-jplephem/issues/14 there is a link to some Python code to read this format in the comments – oefe Nov 30 '16 at 21:26

Comments from @oefe pointed me to the solution! I'll post it here. Since I'm not an expert I'll keep the explanations minimal to avoid saying anything misleading.

A good reference is the SPK required reading:

http://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/spk.html

I was pointed to the following folder, which has solutions in kernel form as .bsp files:

http://naif.jpl.nasa.gov/pub/naif/JUNO/kernels/spk/

The one I'm looking for is a reference orbit spk_ref_160226_180221_160226.bps which was calculated in February 2016 before Juno reached Jupiter.

Additional helpful "clues" are found in the same file name with extension .bsp.lbl with information such as dates, center and bodyID codes, which I've used in the Python script below.

I was also pointed to this discussion in the python-jplephem Github which points out that "data type 1 (Modified Difference Arrays)" kernels have a different structure and could not be read by jplephem:

https://github.com/brandon-rhodes/python-jplephem/issues/14

and that discussion pointed to a solution - a Python script spktype01 which has been written by Shushi Uetsuki (whiskie14142). It seems to be a faithful transcription/conversion into Python from the original FORTRAN, and is well - and candidly - commented.

https://github.com/whiskie14142/spktype01

Since I am running Python in an environment where Skyfield is already installed, it seems that the jplephem modules are already available. So I just run this in a folder containing only script below and the spktype01.py file from github. It works! Thank you to everyone involved!

Below I show that coarse sampling displays varying minimum distances between Juno and the Jupiter system barycenter. By finding each of those minima and resampling at sub-minute intervals, one can see that the periJoves are all essentially the same distance.

from spktype01 import SPKType01
import numpy as np
import matplotlib.pyplot as plt

Juno_kernel = SPKType01.open('spk_ref_160226_180221_160226.bsp')

JD_coarse   = np.arange(2457558.5, 2457754.5+1, 0.2)
# print(Juno_kernel)

center, bodyID = 5, -61  # Jupiter barycenter, Juno Spacecraft

coarse_data = []
for JD in JD_coarse:

spkpos, spkvel = Juno_kernel.compute_type01(center, bodyID, JD)

coarse_data.append(spkpos)

coarse_data = np.array(coarse_data)

rc = np.sqrt((coarse_data**2).sum(axis=1))

inflections = (rc[2:] - rc[1:-1]) * (rc[1:-1] - rc[:-2]) <= 0.0
i_inflects  = np.where(inflections)[0] + 1
i_peris     = [i for i in i_inflects if rc[i] < 1E+06]   # I am lazy
JD_peris = JD_coarse[i_peris]

dminutes = np.linspace(-180, 180, 1001)
ddays    = dminutes / (24. * 60.)

periJoves = []
for JD_peri in JD_peris:

JD_fine = JD_peri + ddays

fine_data = []
for JD in JD_fine:

spkpos, spkvel = Juno_kernel.compute_type01(center, bodyID, JD)

fine_data.append(spkpos)

fine_data = np.array(fine_data)

r_fine = np.sqrt((fine_data**2).sum(axis=1))

periJoves.append(r_fine)

if 1 == 1:
plt.figure()

plt.subplot(1,2,1)
plt.plot(JD_coarse - JD_coarse[0], rc)
plt.yscale('log')
plt.ylim(1E+04, 1E+07)
plt.xlabel('days (arb)', fontsize=14)

plt.subplot(1,2,2)
for periJove in periJoves:
plt.plot(dminutes, periJove)
plt.yscale('log')
plt.ylim(1E+04, 1E+07)
plt.xlabel('minutes (arb)', fontsize=14)

plt.show()

• You may also want to check out github.com/AndrewAnnex/SpiceyPy which is a Python interface to NAIF SPICE directly. You can load any SPICE kernel and do any SPICE call you want via this interface. It's quite well done and the maintainer is very responsive to any question. – ChrisR Mar 17 '17 at 4:11