Repository: emolter/pylanetary (language: python)

Issue:
Rings API is not rendering
**Describe the problem**
The entire rings API docs page failed to render when the docs were auto-built.

**Propose a solution**
More investigation is needed into why this happened - check the logs of the docs build on readthedocs.  See if this is happening locally, too.

**Readthedocs page URL**
https://pylanetary.readthedocs.io/en/latest/api/rings_api.html 

API changes to astroquery ring node queries will break rings modules
Problem
--------

RingNode class was changed to RMSNode in astroquery as of Dec 15 2023.  Therefore, any version of astroquery > 0.4.7.dev9008 will fail. see [this page](https://astroquery.readthedocs.io/en/latest/solarsystem/pds/pds.html)

Solution
--------
Two-stage solution. For now, simply pin the dependencies for astroquery to be <= that dev version. Then, once astroquery does the 0.4.7 release, pin astroquery>=0.4.7


Discussion / hints:

Fix patch:
diff --git a/docs/_build/doctrees/api/navigation_api.doctree b/docs/_build/doctrees/api/navigation_api.doctree
index 298cce6..cbd0c04 100644
Binary files a/docs/_build/doctrees/api/navigation_api.doctree and b/docs/_build/doctrees/api/navigation_api.doctree differ
diff --git a/docs/_build/doctrees/api/rings_api.doctree b/docs/_build/doctrees/api/rings_api.doctree
index af5166d..0e4f8f6 100644
Binary files a/docs/_build/doctrees/api/rings_api.doctree and b/docs/_build/doctrees/api/rings_api.doctree differ
diff --git a/docs/_build/doctrees/contributing.doctree b/docs/_build/doctrees/contributing.doctree
index ca67e94..5b44062 100644
Binary files a/docs/_build/doctrees/contributing.doctree and b/docs/_build/doctrees/contributing.doctree differ
diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle
index fdee497..e6b7fc9 100644
Binary files a/docs/_build/doctrees/environment.pickle and b/docs/_build/doctrees/environment.pickle differ
diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree
index 83384dc..260ff7d 100644
Binary files a/docs/_build/doctrees/index.doctree and b/docs/_build/doctrees/index.doctree differ
diff --git a/docs/_build/doctrees/installation.doctree b/docs/_build/doctrees/installation.doctree
index 0c979e5..1d4db12 100644
Binary files a/docs/_build/doctrees/installation.doctree and b/docs/_build/doctrees/installation.doctree differ
diff --git a/docs/_build/doctrees/nbsphinx/tutorials/utils-tutorial.ipynb b/docs/_build/doctrees/nbsphinx/tutorials/utils-tutorial.ipynb
deleted file mode 100644
index d8d8b41..0000000
--- a/docs/_build/doctrees/nbsphinx/tutorials/utils-tutorial.ipynb
+++ /dev/null
@@ -1,253 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "id": "32bbcf29",
-   "metadata": {},
-   "source": [
-    "# Utils Tutorial"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "id": "b0055d49",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# imports\n",
-    "from pylanetary.utils import *\n",
-    "import numpy as np\n",
-    "import matplotlib.pyplot as plt"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "e58e99c7",
-   "metadata": {},
-   "source": [
-    "## unit conversions"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "id": "06662d80",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Result is 0.17426102873442623 Jy/beam\n",
-      "which translates to 40851198324.166 Jy/sr.\n",
-      "The above is using the Rayleigh-Jeans approximation, and could have been done in one step: 40822885793.88541 Jy/sr\n",
-      "Using the full Planck function we get: 39704080358.999504 Jy/sr\n",
-      "The angular area of the beam is 0.18129440567308777 arcsec^2 assuming Gaussian shape\n"
-     ]
-    }
-   ],
-   "source": [
-    "Tb = 100 #K\n",
-    "freq = 115.271 #GHz\n",
-    "beamx = 0.4 #arcsec\n",
-    "beamy = beamx\n",
-    "\n",
-    "jybm = tb_to_jybm(Tb, freq, beamx, beamy)\n",
-    "print(f'Result is {jybm} Jy/beam')\n",
-    "\n",
-    "jysr = jybm_to_jysr(jybm, beamx, beamy)\n",
-    "print(f'which translates to {jysr} Jy/sr.')\n",
-    "\n",
-    "jysr_rj = rayleigh_jeans(Tb, freq)\n",
-    "print(f'The above is using the Rayleigh-Jeans approximation, and could have been done in one step: {jysr_rj} Jy/sr')\n",
-    "\n",
-    "jysr = planck(Tb, freq)\n",
-    "print(f'Using the full Planck function we get: {jysr} Jy/sr')\n",
-    "\n",
-    "beamA = beam_area(beamx, beamy)\n",
-    "print(f'The angular area of the beam is {beamA} arcsec^2 assuming Gaussian shape')\n",
-    "\n"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "ef08acf5",
-   "metadata": {},
-   "source": [
-    "## I/F calculation\n",
-    "\n",
-    "definition from Hammel et al 1989, DOI:10.1016/0019-1035(89)90149-8\n",
-    "\n",
-    "Let's calculate the I/F of Proteus in H-band from a measurement in erg s-1 cm-2 um-1.\n",
-    "\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "id": "960b4d4a",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Proteus solid angle is 6.55e-15 sr = 0.000278 arcsec^2\n"
-     ]
-    },
-    {
-     "data": {
-      "image/png": "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\n",
-      "text/plain": [
-       "<Figure size 432x288 with 1 Axes>"
-      ]
-     },
-     "metadata": {
-      "needs_background": "light"
-     },
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Proteus I/F at 1.60 um = 0.11\n"
-     ]
-    }
-   ],
-   "source": [
-    "observed_flux = 7e-14 #erg s-1 cm-2 um-1\n",
-    "neptune_earth_dist = 4.6e9 #km\n",
-    "neptune_sun_dist = 4.3e9 #km\n",
-    "\n",
-    "r = 210 #km; radius of Proteus\n",
-    "dS = np.pi*r**2\n",
-    "\n",
-    "# find the solid angle of Proteus\n",
-    "Omega = solid_angle(dS, neptune_earth_dist)\n",
-    "print(f'Proteus solid angle is {Omega:.2e} sr = {Omega*4.25e10:.6f} arcsec^2')\n",
-    "\n",
-    "# example transmission curve for roughly H-band\n",
-    "wls = np.linspace(1.2, 2.0, 100) #microns\n",
-    "trans = np.zeros(wls.shape)\n",
-    "trans[wls < 1.75] = 1.0\n",
-    "trans[wls < 1.45] = 0.0\n",
-    "bp = np.array([wls, trans])\n",
-    "\n",
-    "plt.plot(wls, trans)\n",
-    "plt.xlabel(r'Wavelength ($\\mu$m)')\n",
-    "plt.ylabel('Transmission')\n",
-    "plt.show()\n",
-    "\n",
-    "# find I/F in that filter\n",
-    "wl_eff, IoverF = I_over_F(observed_flux, bp, neptune_sun_dist/1.5e8, Omega)\n",
-    "print(f'Proteus I/F at {wl_eff:.2f} um = {IoverF:.2f}')"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "76c07f7b",
-   "metadata": {},
-   "source": [
-    "## The Body utility for planet/moon attributes\n",
-    "\n",
-    "Given the name of a planet or large moon, load static data like mass, equatorial and polar radii, orbital parameters. Also load an ephemeris from Horizons."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "id": "9210d119",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Jupiter has equatorial, polar radii 71492.0 km, 66854.0 km\n",
-      "Jupiter has a 9.925 h sidereal day\n"
-     ]
-    }
-   ],
-   "source": [
-    "jup = Body('Jupiter')\n",
-    "print(f'{jup.name} has equatorial, polar radii {jup.req}, {jup.rpol}')\n",
-    "print(f'{jup.name} has a {jup.t_rot_hrs} sidereal day')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "id": "8c8cbc61",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "  targetname      datetime_str        datetime_jd    solar_presence lunar_presence    RA      DEC     RA_app  DEC_app  RA_rate    DEC_rate   AZ  EL   AZ_rate      EL_rate      sat_X      sat_Y   sat_PANG siderealtime airmass magextinct   V      surfbright  illumination illum_defect sat_sep  sat_vis ang_width  PDObsLon  PDObsLat  PDSunLon  PDSunLat SubSol_ang SubSol_dist NPole_ang NPole_dist  EclLon  EclLat       r          r_rate       delta        delta_rate  lighttime   vel_sun    vel_obs    elong   elongFlag  alpha  lunar_elong lunar_illum sat_alpha sunTargetPA velocityPA OrbPlaneAng constellation   TDB-UT  ObsEclLon ObsEclLat   NPole_RA NPole_DEC   GlxLon     GlxLat   solartime earth_lighttime RA_3sigma DEC_3sigma SMAA_3sigma SMIA_3sigma Theta_3sigma Area_3sigma RSS_3sigma r_3sigma r_rate_3sigma SBand_3sigma XBand_3sigma DoppDelay_3sigma true_anom hour_angle alpha_true  PABLon  PABLat\n",
-      "     ---              ---                  d              ---            ---         deg      deg      deg      deg   arcsec / h arcsec / h deg deg arcsec / min arcsec / min   arcsec     arcsec    deg         h         ---      mag      mag   mag / arcsec2      %          arcsec     arcsec    ---     arcsec     deg       deg       deg       deg       deg        arcsec      deg      arcsec     deg     deg         AU         km / s         AU           km / s       min       km / s     km / s     deg       ---      deg       deg          %         deg        deg        deg         deg          ---          s        deg       deg        deg       deg       deg        deg         h           min         arcsec    arcsec      arcsec      arcsec       deg        arcsec2     arcsec      km        km / s         Hz           Hz             s            deg        h         deg       deg     deg  \n",
-      "------------- -------------------- ----------------- -------------- -------------- -------- -------- -------- ------- ---------- ---------- --- --- ------------ ------------ ---------- --------- -------- ------------ ------- ---------- ------ ------------- ------------ ------------ -------- ------- --------- ---------- -------- ---------- -------- ---------- ----------- --------- ---------- ------- ------- -------------- --------- ---------------- ----------- ----------- ---------- ---------- -------- --------- ------- ----------- ----------- --------- ----------- ---------- ----------- ------------- --------- --------- ---------- --------- --------- ---------- ---------- --------- --------------- --------- ---------- ----------- ----------- ------------ ----------- ---------- -------- ------------- ------------ ------------ ---------------- --------- ---------- ---------- ------- -------\n",
-      "Jupiter (599) 2023-Aug-27 21:16:14 2460184.386273148                               43.08396 15.13178 43.41099 15.2294   3.768455   0.628637  --  --           --           -- -400056.46 19132.599  289.969           --     999         -- -2.556         5.358      99.0638       0.4061 391899.0       *  43.37403 172.679298 3.828957 183.797149 3.470775      73.64        4.18  342.3435     20.235 34.0487 -1.1952 4.964904491942 0.2177477 4.54524552110738 -24.9001155 37.80165431 13.6749375 25.1445703 108.8608        /L 11.1068       115.9     85.2622   60.0323     253.554    252.316     0.23345           Ari 69.182719  45.48364 -1.3033406 268.05805  64.49679 161.353279 -38.556696        --             0.0        --         --          --          --           --          --         --       --            --           --           --               --   19.7846         --     11.105 39.5995 -1.2564\n"
-     ]
-    }
-   ],
-   "source": [
-    "# assumes datetime.now() and center of earth\n",
-    "print(jup.ephem)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "ef5bbca6",
-   "metadata": {},
-   "source": [
-    "This ephemeris assumes we wanted the results right now as observed at the center of mass of Earth.  If we instead wanted to observe from the VLA site at the time of the first SL9 impact, we could say:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "id": "30d6e637",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "  targetname     datetime_str      datetime_jd    solar_presence lunar_presence     RA       DEC      RA_app   DEC_app   RA_rate    DEC_rate      AZ         EL      AZ_rate      EL_rate      sat_X      sat_Y    sat_PANG siderealtime airmass magextinct   V     surfbright  illumination illum_defect sat_sep  sat_vis ang_width  PDObsLon  PDObsLat PDSunLon PDSunLat SubSol_ang SubSol_dist NPole_ang NPole_dist  EclLon  EclLat       r          r_rate        delta       delta_rate  lighttime   vel_sun   vel_obs    elong   elongFlag alpha  lunar_elong lunar_illum sat_alpha sunTargetPA velocityPA OrbPlaneAng constellation   TDB-UT   ObsEclLon  ObsEclLat  NPole_RA NPole_DEC   GlxLon     GlxLat    solartime   earth_lighttime RA_3sigma DEC_3sigma SMAA_3sigma SMIA_3sigma Theta_3sigma Area_3sigma RSS_3sigma r_3sigma r_rate_3sigma SBand_3sigma XBand_3sigma DoppDelay_3sigma true_anom  hour_angle  alpha_true  PABLon PABLat\n",
-      "     ---             ---                d              ---            ---          deg       deg       deg       deg    arcsec / h arcsec / h    deg        deg    arcsec / min arcsec / min   arcsec     arcsec     deg         h         ---      mag      mag  mag / arcsec2      %          arcsec     arcsec    ---     arcsec     deg       deg      deg      deg       deg        arcsec      deg      arcsec     deg     deg         AU         km / s          AU          km / s       min       km / s    km / s     deg       ---     deg       deg          %         deg        deg        deg         deg          ---          s         deg        deg       deg       deg       deg        deg          h             min         arcsec    arcsec      arcsec      arcsec       deg        arcsec2     arcsec      km        km / s         Hz           Hz             s            deg         h          deg       deg    deg  \n",
-      "------------- ----------------- ----------------- -------------- -------------- --------- --------- --------- --------- ---------- ---------- ---------- --------- ------------ ------------ ---------- ---------- -------- ------------ ------- ---------- ----- ------------- ------------ ------------ -------- ------- --------- --------- --------- -------- -------- ---------- ----------- --------- ---------- -------- ------ -------------- ---------- ---------------- ---------- ----------- --------- ---------- -------- --------- ------ ----------- ----------- --------- ----------- ---------- ----------- ------------- --------- ----------- --------- --------- --------- ---------- --------- ------------- --------------- --------- ---------- ----------- ----------- ------------ ----------- ---------- -------- ------------- ------------ ------------ ---------------- --------- ------------ ---------- ------- ------\n",
-      "Jupiter (599) 1994-Jul-16 20:13 2449550.342361111              *                213.25946 -12.18286 213.19106 -12.15803   5.902723   -2.87891 103.892463 -1.205187       501.78       725.51 326174.133 -120437.47   98.876 8.6713333887     999         -- -2.11         5.541     99.14532       0.3284 363714.1       *  38.42845 81.605459 -3.417513 70.98207 -3.56489     289.67        3.54   20.6435    -17.936 225.7758 1.0648 5.417202860036 -0.3161016 5.13020024376608 25.7802051 42.66657439 12.534906 26.6589241 101.0317        /T 10.608       2.924     59.9989   68.3603     109.651     289.99     0.06118           Vir 61.183653 215.0912804  1.124912 268.05799   64.4958 332.296937 45.984193 12.9415708964        0.000354        --         --          --          --           --          --         --       --            --           --           --               --  210.4525 -5.541404253     10.609 220.468 1.0993\n"
-     ]
-    }
-   ],
-   "source": [
-    "jup = Body('Jupiter', epoch='1994-07-16 20:13', location='VLA')\n",
-    "print(jup.ephem)"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.9.7"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_24_1.png b/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_24_1.png
deleted file mode 100644
index 7ad3f80..0000000
Binary files a/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_24_1.png and /dev/null differ
diff --git a/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_26_1.png b/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_26_1.png
deleted file mode 100644
index 0815a7e..0000000
Binary files a/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_26_1.png and /dev/null differ
diff --git a/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_28_1.png b/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_28_1.png
deleted file mode 100644
index 829c7bc..0000000
Binary files a/docs/_build/doctrees/nbsphinx/tutorials_nav-tutorial_28_1.png and /dev/null differ
diff --git a/docs/_build/doctrees/nbsphinx/tutorials_utils-tutorial_5_1.png b/docs/_build/doctrees/nbsphinx/tutorials_utils-tutorial_5_1.png
deleted file mode 100644
index d8fa0a6..0000000
Binary files a/docs/_build/doctrees/nbsphinx/tutorials_utils-tutorial_5_1.png and /dev/null differ
diff --git a/docs/_build/doctrees/tutorials/utils-tutorial.doctree b/docs/_build/doctrees/tutorials/utils-tutorial.doctree
deleted file mode 100644
index 61c7879..0000000
Binary files a/docs/_build/doctrees/tutorials/utils-tutorial.doctree and /dev/null differ
diff --git a/docs/_build/html/_images/tutorials_nav-tutorial_24_1.png b/docs/_build/html/_images/tutorials_nav-tutorial_24_1.png
deleted file mode 100644
index 7ad3f80..0000000
Binary files a/docs/_build/html/_images/tutorials_nav-tutorial_24_1.png and /dev/null differ
diff --git a/docs/_build/html/_images/tutorials_nav-tutorial_26_1.png b/docs/_build/html/_images/tutorials_nav-tutorial_26_1.png
deleted file mode 100644
index 0815a7e..0000000
Binary files a/docs/_build/html/_images/tutorials_nav-tutorial_26_1.png and /dev/null differ
diff --git a/docs/_build/html/_images/tutorials_nav-tutorial_28_1.png b/docs/_build/html/_images/tutorials_nav-tutorial_28_1.png
deleted file mode 100644
index 829c7bc..0000000
Binary files a/docs/_build/html/_images/tutorials_nav-tutorial_28_1.png and /dev/null differ
diff --git a/docs/_build/html/_images/tutorials_utils-tutorial_5_1.png b/docs/_build/html/_images/tutorials_utils-tutorial_5_1.png
deleted file mode 100644
index d8fa0a6..0000000
Binary files a/docs/_build/html/_images/tutorials_utils-tutorial_5_1.png and /dev/null differ
diff --git a/docs/_build/html/_sources/contributing.rst.txt b/docs/_build/html/_sources/contributing.rst.txt
index 32876bb..2837b7b 100644
--- a/docs/_build/html/_sources/contributing.rst.txt
+++ b/docs/_build/html/_sources/contributing.rst.txt
@@ -45,7 +45,7 @@ The minimum requirements for a new feature are:
 	 
  * For any major new functionality or workflow, make an example Jupyter notebook::
  
-     notebooks/feature-tutorial.ipynb
+     docs/tutorials/feature-tutorial.ipynb
 
 Important Guidelines
 --------------------
diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt
index 2d779cf..cc32cf2 100644
--- a/docs/_build/html/_sources/index.rst.txt
+++ b/docs/_build/html/_sources/index.rst.txt
@@ -24,9 +24,9 @@ Features
 Projects using pylanetary
 -------------------------
 
-* [Keck Twilight Zone program](https://www2.keck.hawaii.edu/inst/tda/TwilightZone.html#)
+* `Keck Twilight Zone program <https://www2.keck.hawaii.edu/inst/tda/TwilightZone.html#>`_
 
-* [HST OPAL program](https://archive.stsci.edu/hlsp/opal)
+* `HST OPAL program <https://archive.stsci.edu/hlsp/opal>`_
 
 * Radio observers of giant planets, incl. Goddard, Berkeley, and Caltech groups
 
diff --git a/docs/_build/html/_sources/installation.rst.txt b/docs/_build/html/_sources/installation.rst.txt
index 3c58760..b1cc134 100644
--- a/docs/_build/html/_sources/installation.rst.txt
+++ b/docs/_build/html/_sources/installation.rst.txt
@@ -1,17 +1,17 @@
 Installation
 ************
 
-* download the requirements.txt file using the "download raw" option
+Simple pip install should work, but we recommend to do so in a clean conda environment, as follows:
+
 * ``conda create -n pylanetary-tester python=3.11`` (or any Python from 3.9 to 3.12)
 * ``conda activate pylanetary-tester``
-* ``pip install -r requirements.txt`` in same directory as requirements.txt
-* ``pip install git+https://github.com/emolter/pylanetary.git@main``
+* ``pip install pylanetary``
 	
-Pylanetary relies on as-yet-unreleased versions of the image\_registration and astroquery packages, and pypi does not support installation of unreleased packages. This is the reason that simply pip install pylanetary will not work right.
-
 Troubleshooting
 ~~~~~~~~~~~~~~~
-Here we attempt to document install issues people have had, and their solutions
+Here we attempt to document install issues people have had, and their solutions.
+Note that many of these issues pre-date the current version of pylanetary, and only arose due to the prior need
+to download requirements.txt, which is no longer necessary for installation.
 
 * requirements.txt not found. Most likely, you never downloaded requirements.txt, or you are not running pip install -r requirements.txt in the same folder where you put requirements.txt
 * pip install requirements.txt fails instantly with a crazy-looking error message. Try opening requirements.txt, and check that its just ten or so lines of human-readable text. If it's some huge html soup, that means you didn't use the "download raw" button when downloading
diff --git a/docs/_build/html/_sources/tutorials/utils-tutorial.ipynb.txt b/docs/_build/html/_sources/tutorials/utils-tutorial.ipynb.txt
deleted file mode 100644
index d8d8b41..0000000
--- a/docs/_build/html/_sources/tutorials/utils-tutorial.ipynb.txt
+++ /dev/null
@@ -1,253 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "id": "32bbcf29",
-   "metadata": {},
-   "source": [
-    "# Utils Tutorial"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "id": "b0055d49",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# imports\n",
-    "from pylanetary.utils import *\n",
-    "import numpy as np\n",
-    "import matplotlib.pyplot as plt"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "e58e99c7",
-   "metadata": {},
-   "source": [
-    "## unit conversions"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "id": "06662d80",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Result is 0.17426102873442623 Jy/beam\n",
-      "which translates to 40851198324.166 Jy/sr.\n",
-      "The above is using the Rayleigh-Jeans approximation, and could have been done in one step: 40822885793.88541 Jy/sr\n",
-      "Using the full Planck function we get: 39704080358.999504 Jy/sr\n",
-      "The angular area of the beam is 0.18129440567308777 arcsec^2 assuming Gaussian shape\n"
-     ]
-    }
-   ],
-   "source": [
-    "Tb = 100 #K\n",
-    "freq = 115.271 #GHz\n",
-    "beamx = 0.4 #arcsec\n",
-    "beamy = beamx\n",
-    "\n",
-    "jybm = tb_to_jybm(Tb, freq, beamx, beamy)\n",
-    "print(f'Result is {jybm} Jy/beam')\n",
-    "\n",
-    "jysr = jybm_to_jysr(jybm, beamx, beamy)\n",
-    "print(f'which translates to {jysr} Jy/sr.')\n",
-    "\n",
-    "jysr_rj = rayleigh_jeans(Tb, freq)\n",
-    "print(f'The above is using the Rayleigh-Jeans approximation, and could have been done in one step: {jysr_rj} Jy/sr')\n",
-    "\n",
-    "jysr = planck(Tb, freq)\n",
-    "print(f'Using the full Planck function we get: {jysr} Jy/sr')\n",
-    "\n",
-    "beamA = beam_area(beamx, beamy)\n",
-    "print(f'The angular area of the beam is {beamA} arcsec^2 assuming Gaussian shape')\n",
-    "\n"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "ef08acf5",
-   "metadata": {},
-   "source": [
-    "## I/F calculation\n",
-    "\n",
-    "definition from Hammel et al 1989, DOI:10.1016/0019-1035(89)90149-8\n",
-    "\n",
-    "Let's calculate the I/F of Proteus in H-band from a measurement in erg s-1 cm-2 um-1.\n",
-    "\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "id": "960b4d4a",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Proteus solid angle is 6.55e-15 sr = 0.000278 arcsec^2\n"
-     ]
-    },
-    {
-     "data": {
-      "image/png": "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\n",
-      "text/plain": [
-       "<Figure size 432x288 with 1 Axes>"
-      ]
-     },
-     "metadata": {
-      "needs_background": "light"
-     },
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Proteus I/F at 1.60 um = 0.11\n"
-     ]
-    }
-   ],
-   "source": [
-    "observed_flux = 7e-14 #erg s-1 cm-2 um-1\n",
-    "neptune_earth_dist = 4.6e9 #km\n",
-    "neptune_sun_dist = 4.3e9 #km\n",
-    "\n",
-    "r = 210 #km; radius of Proteus\n",
-    "dS = np.pi*r**2\n",
-    "\n",
-    "# find the solid angle of Proteus\n",
-    "Omega = solid_angle(dS, neptune_earth_dist)\n",
-    "print(f'Proteus solid angle is {Omega:.2e} sr = {Omega*4.25e10:.6f} arcsec^2')\n",
-    "\n",
-    "# example transmission curve for roughly H-band\n",
-    "wls = np.linspace(1.2, 2.0, 100) #microns\n",
-    "trans = np.zeros(wls.shape)\n",
-    "trans[wls < 1.75] = 1.0\n",
-    "trans[wls < 1.45] = 0.0\n",
-    "bp = np.array([wls, trans])\n",
-    "\n",
-    "plt.plot(wls, trans)\n",
-    "plt.xlabel(r'Wavelength ($\\mu$m)')\n",
-    "plt.ylabel('Transmission')\n",
-    "plt.show()\n",
-    "\n",
-    "# find I/F in that filter\n",
-    "wl_eff, IoverF = I_over_F(observed_flux, bp, neptune_sun_dist/1.5e8, Omega)\n",
-    "print(f'Proteus I/F at {wl_eff:.2f} um = {IoverF:.2f}')"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "76c07f7b",
-   "metadata": {},
-   "source": [
-    "## The Body utility for planet/moon attributes\n",
-    "\n",
-    "Given the name of a planet or large moon, load static data like mass, equatorial and polar radii, orbital parameters. Also load an ephemeris from Horizons."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "id": "9210d119",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Jupiter has equatorial, polar radii 71492.0 km, 66854.0 km\n",
-      "Jupiter has a 9.925 h sidereal day\n"
-     ]
-    }
-   ],
-   "source": [
-    "jup = Body('Jupiter')\n",
-    "print(f'{jup.name} has equatorial, polar radii {jup.req}, {jup.rpol}')\n",
-    "print(f'{jup.name} has a {jup.t_rot_hrs} sidereal day')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "id": "8c8cbc61",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "  targetname      datetime_str        datetime_jd    solar_presence lunar_presence    RA      DEC     RA_app  DEC_app  RA_rate    DEC_rate   AZ  EL   AZ_rate      EL_rate      sat_X      sat_Y   sat_PANG siderealtime airmass magextinct   V      surfbright  illumination illum_defect sat_sep  sat_vis ang_width  PDObsLon  PDObsLat  PDSunLon  PDSunLat SubSol_ang SubSol_dist NPole_ang NPole_dist  EclLon  EclLat       r          r_rate       delta        delta_rate  lighttime   vel_sun    vel_obs    elong   elongFlag  alpha  lunar_elong lunar_illum sat_alpha sunTargetPA velocityPA OrbPlaneAng constellation   TDB-UT  ObsEclLon ObsEclLat   NPole_RA NPole_DEC   GlxLon     GlxLat   solartime earth_lighttime RA_3sigma DEC_3sigma SMAA_3sigma SMIA_3sigma Theta_3sigma Area_3sigma RSS_3sigma r_3sigma r_rate_3sigma SBand_3sigma XBand_3sigma DoppDelay_3sigma true_anom hour_angle alpha_true  PABLon  PABLat\n",
-      "     ---              ---                  d              ---            ---         deg      deg      deg      deg   arcsec / h arcsec / h deg deg arcsec / min arcsec / min   arcsec     arcsec    deg         h         ---      mag      mag   mag / arcsec2      %          arcsec     arcsec    ---     arcsec     deg       deg       deg       deg       deg        arcsec      deg      arcsec     deg     deg         AU         km / s         AU           km / s       min       km / s     km / s     deg       ---      deg       deg          %         deg        deg        deg         deg          ---          s        deg       deg        deg       deg       deg        deg         h           min         arcsec    arcsec      arcsec      arcsec       deg        arcsec2     arcsec      km        km / s         Hz           Hz             s            deg        h         deg       deg     deg  \n",
-      "------------- -------------------- ----------------- -------------- -------------- -------- -------- -------- ------- ---------- ---------- --- --- ------------ ------------ ---------- --------- -------- ------------ ------- ---------- ------ ------------- ------------ ------------ -------- ------- --------- ---------- -------- ---------- -------- ---------- ----------- --------- ---------- ------- ------- -------------- --------- ---------------- ----------- ----------- ---------- ---------- -------- --------- ------- ----------- ----------- --------- ----------- ---------- ----------- ------------- --------- --------- ---------- --------- --------- ---------- ---------- --------- --------------- --------- ---------- ----------- ----------- ------------ ----------- ---------- -------- ------------- ------------ ------------ ---------------- --------- ---------- ---------- ------- -------\n",
-      "Jupiter (599) 2023-Aug-27 21:16:14 2460184.386273148                               43.08396 15.13178 43.41099 15.2294   3.768455   0.628637  --  --           --           -- -400056.46 19132.599  289.969           --     999         -- -2.556         5.358      99.0638       0.4061 391899.0       *  43.37403 172.679298 3.828957 183.797149 3.470775      73.64        4.18  342.3435     20.235 34.0487 -1.1952 4.964904491942 0.2177477 4.54524552110738 -24.9001155 37.80165431 13.6749375 25.1445703 108.8608        /L 11.1068       115.9     85.2622   60.0323     253.554    252.316     0.23345           Ari 69.182719  45.48364 -1.3033406 268.05805  64.49679 161.353279 -38.556696        --             0.0        --         --          --          --           --          --         --       --            --           --           --               --   19.7846         --     11.105 39.5995 -1.2564\n"
-     ]
-    }
-   ],
-   "source": [
-    "# assumes datetime.now() and center of earth\n",
-    "print(jup.ephem)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "ef5bbca6",
-   "metadata": {},
-   "source": [
-    "This ephemeris assumes we wanted the results right now as observed at the center of mass of Earth.  If we instead wanted to observe from the VLA site at the time of the first SL9 impact, we could say:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "id": "30d6e637",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "  targetname     datetime_str      datetime_jd    solar_presence lunar_presence     RA       DEC      RA_app   DEC_app   RA_rate    DEC_rate      AZ         EL      AZ_rate      EL_rate      sat_X      sat_Y    sat_PANG siderealtime airmass magextinct   V     surfbright  illumination illum_defect sat_sep  sat_vis ang_width  PDObsLon  PDObsLat PDSunLon PDSunLat SubSol_ang SubSol_dist NPole_ang NPole_dist  EclLon  EclLat       r          r_rate        delta       delta_rate  lighttime   vel_sun   vel_obs    elong   elongFlag alpha  lunar_elong lunar_illum sat_alpha sunTargetPA velocityPA OrbPlaneAng constellation   TDB-UT   ObsEclLon  ObsEclLat  NPole_RA NPole_DEC   GlxLon     GlxLat    solartime   earth_lighttime RA_3sigma DEC_3sigma SMAA_3sigma SMIA_3sigma Theta_3sigma Area_3sigma RSS_3sigma r_3sigma r_rate_3sigma SBand_3sigma XBand_3sigma DoppDelay_3sigma true_anom  hour_angle  alpha_true  PABLon PABLat\n",
-      "     ---             ---                d              ---            ---          deg       deg       deg       deg    arcsec / h arcsec / h    deg        deg    arcsec / min arcsec / min   arcsec     arcsec     deg         h         ---      mag      mag  mag / arcsec2      %          arcsec     arcsec    ---     arcsec     deg       deg      deg      deg       deg        arcsec      deg      arcsec     deg     deg         AU         km / s          AU          km / s       min       km / s    km / s     deg       ---     deg       deg          %         deg        deg        deg         deg          ---          s         deg        deg       deg       deg       deg        deg          h             min         arcsec    arcsec      arcsec      arcsec       deg        arcsec2     arcsec      km        km / s         Hz           Hz             s            deg         h          deg       deg    deg  \n",
-      "------------- ----------------- ----------------- -------------- -------------- --------- --------- --------- --------- ---------- ---------- ---------- --------- ------------ ------------ ---------- ---------- -------- ------------ ------- ---------- ----- ------------- ------------ ------------ -------- ------- --------- --------- --------- -------- -------- ---------- ----------- --------- ---------- -------- ------ -------------- ---------- ---------------- ---------- ----------- --------- ---------- -------- --------- ------ ----------- ----------- --------- ----------- ---------- ----------- ------------- --------- ----------- --------- --------- --------- ---------- --------- ------------- --------------- --------- ---------- ----------- ----------- ------------ ----------- ---------- -------- ------------- ------------ ------------ ---------------- --------- ------------ ---------- ------- ------\n",
-      "Jupiter (599) 1994-Jul-16 20:13 2449550.342361111              *                213.25946 -12.18286 213.19106 -12.15803   5.902723   -2.87891 103.892463 -1.205187       501.78       725.51 326174.133 -120437.47   98.876 8.6713333887     999         -- -2.11         5.541     99.14532       0.3284 363714.1       *  38.42845 81.605459 -3.417513 70.98207 -3.56489     289.67        3.54   20.6435    -17.936 225.7758 1.0648 5.417202860036 -0.3161016 5.13020024376608 25.7802051 42.66657439 12.534906 26.6589241 101.0317        /T 10.608       2.924     59.9989   68.3603     109.651     289.99     0.06118           Vir 61.183653 215.0912804  1.124912 268.05799   64.4958 332.296937 45.984193 12.9415708964        0.000354        --         --          --          --           --          --         --       --            --           --           --               --  210.4525 -5.541404253     10.609 220.468 1.0993\n"
-     ]
-    }
-   ],
-   "source": [
-    "jup = Body('Jupiter', epoch='1994-07-16 20:13', location='VLA')\n",
-    "print(jup.ephem)"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.9.7"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/docs/_build/html/api/index.html b/docs/_build/html/api/index.html
index 2038b45..316e331 100644
--- a/docs/_build/html/api/index.html
+++ b/docs/_build/html/api/index.html
@@ -165,10 +165,11 @@
 <ul class="current">
 <li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 <li class="toctree-l1 has-children"><a class="reference internal" href="../tutorials/index.html">Tutorials</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
+<li class="toctree-l2"><a class="reference internal" href="../tutorials/body-tutorial.html">Planetary Body Attributes &amp; Ephemerides</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/nav-tutorial.html">Navigation Basics</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/nav-examples.html">Navigation Workflow</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/rings-tutorial.html">Rings Tutorial</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../tutorials/utils-tutorial.html">Utils Tutorial</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../tutorials/unit-conversions.html">Unit Conversions</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="../contributing.html">Contributing</a></li>
diff --git a/docs/_build/html/api/navigation_api.html b/docs/_build/html/api/navigation_api.html
index 6540713..843dd91 100644
--- a/docs/_build/html/api/navigation_api.html
+++ b/docs/_build/html/api/navigation_api.html
@@ -165,10 +165,11 @@
 <ul class="current">
 <li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 <li class="toctree-l1 has-children"><a class="reference internal" href="../tutorials/index.html">Tutorials</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
+<li class="toctree-l2"><a class="reference internal" href="../tutorials/body-tutorial.html">Planetary Body Attributes &amp; Ephemerides</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/nav-tutorial.html">Navigation Basics</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/nav-examples.html">Navigation Workflow</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/rings-tutorial.html">Rings Tutorial</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../tutorials/utils-tutorial.html">Utils Tutorial</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../tutorials/unit-conversions.html">Unit Conversions</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="../contributing.html">Contributing</a></li>
@@ -219,12 +220,286 @@
 <dt class="sig sig-object py" id="pylanetary.navigation.core.ModelBody">
 <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">pylanetary.navigation.core.</span></span><span class="sig-name descname"><span class="pre">ModelBody</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">body</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pixscale</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">shape</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pylanetary.navigation.core.ModelBody" title="Link to this definition">#</a></dt>
 <dd><p>Wrapper to ModelEllipsoid that permits passing an ephemeris</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>body</strong> (<em>pylanetary.utils.Body object</em><em>, </em><em>required</em>) – </p></li>
+<li><p><strong>pixscale</strong> (<em>float</em><em> or </em><em>Quantity</em><em>, </em><em>required.</em>) – [arcsec/px] pixel scale of the input image</p></li>
+<li><p><strong>shape</strong> (<em>tuple</em><em>, </em><em>optional.</em>) – shape of output arrays.
+if None, shape is just larger than diameter / pixscale</p></li>
+</ul>
+</dd>
+</dl>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelBody.body">
+<span class="sig-name descname"><span class="pre">body</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelBody.body" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>pylanetary.utils.Body object</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelBody.name">
+<span class="sig-name descname"><span class="pre">name</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelBody.name" title="Link to this definition">#</a></dt>
+<dd><p>Name of input body as read from input Body object</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>str</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelBody.ephem">
+<span class="sig-name descname"><span class="pre">ephem</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelBody.ephem" title="Link to this definition">#</a></dt>
+<dd><p>single line of astroquery.horizons ephemeris
+as read from utils.Body object.
+must have ‘PDObsLon’, ‘PDObsLat’, ‘delta’, and ‘NPole_ang’ fields.
+If you want to modify the ephemeris, modify body.ephem</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Astropy QTable.</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelBody.pixscale_arcsec">
+<span class="sig-name descname"><span class="pre">pixscale_arcsec</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelBody.pixscale_arcsec" title="Link to this definition">#</a></dt>
+<dd><p>[arcsec/px] pixel scale of image; see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelBody.pixscale_km">
+<span class="sig-name descname"><span class="pre">pixscale_km</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelBody.pixscale_km" title="Link to this definition">#</a></dt>
+<dd><p>[km/px] pixel scale of image computed from input pixel scale in arcsec
+and distance from object to body according to body.ephem</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py">
+<span class="sig-name descname"><span class="pre">all</span> <span class="pre">attrs</span> <span class="pre">from</span> <span class="pre">ModelEllipsoid</span></span></dt>
+<dd></dd></dl>
+
 </dd></dl>
 
 <dl class="py class">
 <dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid">
 <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">pylanetary.navigation.core.</span></span><span class="sig-name descname"><span class="pre">ModelEllipsoid</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">ob_lon</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ob_lat</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pixscale_km</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">np_ang</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">req</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rpol</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">center</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0.0,</span> <span class="pre">0.0)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">shape</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sun_lon</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sun_lat</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">longitude_convention</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'w'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid" title="Link to this definition">#</a></dt>
 <dd><p>Projection of an ellipsoid onto a 2-D array with latitude and longitude grid</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>ob_lon</strong> (<em>float</em><em>, </em><em>required.</em>) – [deg] sub-observer planetographic longitude</p></li>
+<li><p><strong>ob_lat</strong> (<em>float</em><em>, </em><em>required.</em>) – [deg] sub-observer planetographic latitude</p></li>
+<li><p><strong>np_ang</strong> (<em>float</em><em>, </em><em>required.</em>) – [deg] north polar angle
+see JPL Horizons ephemeris tool for detailed descriptions
+of ob_lon, ob_lat, np_ang</p></li>
+<li><p><strong>pixscale_km</strong> (<em>float</em><em>, </em><em>required.</em>) – [km] pixel scale</p></li>
+<li><p><strong>req</strong> (<em>float</em><em>, </em><em>required.</em>) – [km] equatorial radius</p></li>
+<li><p><strong>rpol</strong> (<em>float</em><em>, </em><em>required.</em>) – [km] polar radius</p></li>
+<li><p><strong>center</strong> (<em>2-element array-like</em><em>, </em><em>optional</em><em>, </em><em>default</em><em> (</em><em>0</em><em>,</em><em>0</em><em>)</em><em>.</em>) – pixel offset of center of planet from center of image</p></li>
+<li><p><strong>shape</strong> (<em>2-element tuple</em><em>, </em><em>optional.</em>) – shape of output arrays.
+if None, shape is just larger than diameter / pixscale</p></li>
+<li><p><strong>sun_lon</strong> (<em>float</em><em>, </em><em>optional</em><em>, </em><em>default None</em>) – sub-solar longitude. if None, assume same as ob_lon</p></li>
+<li><p><strong>sun_lat</strong> (<em>float</em><em>, </em><em>optional</em><em>, </em><em>default None</em>) – sub_solar latitude. if None, assume same as ob_lat</p></li>
+<li><p><strong>longitude_convention</strong> (<em>str</em><em>, </em><em>optional</em><em>, </em><em>default 'w'</em>) – east or west longitude convention</p></li>
+</ul>
+</dd>
+</dl>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.req">
+<span class="sig-name descname"><span class="pre">req</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.req" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.rpol">
+<span class="sig-name descname"><span class="pre">rpol</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.rpol" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.ob_lon">
+<span class="sig-name descname"><span class="pre">ob_lon</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.ob_lon" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.ob_lat">
+<span class="sig-name descname"><span class="pre">ob_lat</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.ob_lat" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.sun_lon">
+<span class="sig-name descname"><span class="pre">sun_lon</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.sun_lon" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.sun_lat">
+<span class="sig-name descname"><span class="pre">sun_lat</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.sun_lat" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.pixscale_km">
+<span class="sig-name descname"><span class="pre">pixscale_km</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.pixscale_km" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.deg_per_px">
+<span class="sig-name descname"><span class="pre">deg_per_px</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.deg_per_px" title="Link to this definition">#</a></dt>
+<dd><p>approximate size of pixel on planet, in degrees, at sub-observer point</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.lat_g">
+<span class="sig-name descname"><span class="pre">lat_g</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.lat_g" title="Link to this definition">#</a></dt>
+<dd><p>shape is roughly 2*max(req, rpol)/pixscale.
+planetographic latitudes. NaN where off planet disk</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.lon_w">
+<span class="sig-name descname"><span class="pre">lon_w</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.lon_w" title="Link to this definition">#</a></dt>
+<dd><p>same shape as lat_g. west longitudes. NaN where off planet disk</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.mu">
+<span class="sig-name descname"><span class="pre">mu</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.mu" title="Link to this definition">#</a></dt>
+<dd><p>same shape as lat_g. cosines of the emission angle. NaN where off planet disk</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.surf_n">
+<span class="sig-name descname"><span class="pre">surf_n</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.surf_n" title="Link to this definition">#</a></dt>
+<dd><p>shape (3,x,y) CHECK THIS. Normal vector to the surface
+of the planet at each pixel. NaN where off planet disk</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.sun_n">
+<span class="sig-name descname"><span class="pre">sun_n</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.sun_n" title="Link to this definition">#</a></dt>
+<dd><p>shape (3,x,y), solar normal vectors</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.mu0">
+<span class="sig-name descname"><span class="pre">mu0</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.mu0" title="Link to this definition">#</a></dt>
+<dd><p>shape (x,y), cosine of solar incidence angle at each pixel</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.image_grid_km_x">
+<span class="sig-name descname"><span class="pre">image_grid_km_x</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.image_grid_km_x" title="Link to this definition">#</a></dt>
+<dd><p>shape (x,y), x-coordinates of image grid in km, where 0 is center of planet</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.image_grid_km_y">
+<span class="sig-name descname"><span class="pre">image_grid_km_y</span></span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.image_grid_km_y" title="Link to this definition">#</a></dt>
+<dd><p>shape (x,y), y-coordinates of image grid in km, where 0 is center of planet</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<p class="rubric">Examples</p>
+<p>see notebooks/planetnav-tutorial.ipynb</p>
 <dl class="py method">
 <dt class="sig sig-object py" id="pylanetary.navigation.core.ModelEllipsoid.ldmodel">
 <span class="sig-name descname"><span class="pre">ldmodel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">tb</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">a</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">beam</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">law</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'exp'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mu0</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">psf_mode</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'gaussian'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pylanetary.navigation.core.ModelEllipsoid.ldmodel" title="Link to this definition">#</a></dt>
@@ -258,7 +533,40 @@
 <dl class="py class">
 <dt class="sig sig-object py" id="pylanetary.navigation.core.Nav">
 <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">pylanetary.navigation.core.</span></span><span class="sig-name descname"><span class="pre">Nav</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">body</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pixscale</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pylanetary.navigation.core.Nav" title="Link to this definition">#</a></dt>
-<dd><p>functions for comparing a model ellipsoid with observed 2-d imaging data</p>
+<dd><p>Build the model body object,
+and compare a model ellipsoid with observed 2-d imaging data</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>data</strong> (<em>np.array</em><em>, </em><em>required.</em>) – 2-D image data</p></li>
+<li><p><strong>body</strong> (<em>pylanetary.utils.Body object</em><em>, </em><em>required.</em>) – </p></li>
+<li><p><strong>pixscale</strong> (<em>float</em><em> or </em><em>Quantity</em><em>, </em><em>required.</em>) – [arcsec] pixel scale of the input image</p></li>
+</ul>
+</dd>
+</dl>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.Nav.data">
+<span class="sig-name descname"><span class="pre">data</span></span><a class="headerlink" href="#pylanetary.navigation.core.Nav.data" title="Link to this definition">#</a></dt>
+<dd><p>see parameters</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>np.array</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.navigation.core.Nav.parent_attrs">
+<span class="sig-name descname"><span class="pre">parent_attrs</span></span><a class="headerlink" href="#pylanetary.navigation.core.Nav.parent_attrs" title="Link to this definition">#</a></dt>
+<dd><p>all attributes of ModelBody and ModelEllipsoid classes</p>
+</dd></dl>
+
+<p class="rubric">Examples</p>
+<p>see notebooks/nav-tutorial.ipynb</p>
+<p class="rubric">Notes</p>
+<ul class="simple">
+<li><p>Need to test astropy quantity handling, ensure docstring reflects what really happens</p></li>
+</ul>
 <dl class="py method">
 <dt class="sig sig-object py" id="pylanetary.navigation.core.Nav.colocate">
 <span class="sig-name descname"><span class="pre">colocate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mode</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'convolution'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">diagnostic_plot</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">save_plot</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pylanetary.navigation.core.Nav.colocate" title="Link to this definition">#</a></dt>
@@ -682,13 +990,38 @@
           <div class="toc-tree">
             <ul>
 <li><a class="reference internal" href="#">Navigation API</a><ul>
-<li><a class="reference internal" href="#pylanetary.navigation.core.ModelBody"><code class="docutils literal notranslate"><span class="pre">ModelBody</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelBody"><code class="docutils literal notranslate"><span class="pre">ModelBody</span></code></a><ul>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelBody.body"><code class="docutils literal notranslate"><span class="pre">ModelBody.body</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelBody.name"><code class="docutils literal notranslate"><span class="pre">ModelBody.name</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelBody.ephem"><code class="docutils literal notranslate"><span class="pre">ModelBody.ephem</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelBody.pixscale_arcsec"><code class="docutils literal notranslate"><span class="pre">ModelBody.pixscale_arcsec</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelBody.pixscale_km"><code class="docutils literal notranslate"><span class="pre">ModelBody.pixscale_km</span></code></a></li>
+</ul>
+</li>
 <li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid</span></code></a><ul>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.req"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.req</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.rpol"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.rpol</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.ob_lon"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.ob_lon</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.ob_lat"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.ob_lat</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.sun_lon"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.sun_lon</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.sun_lat"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.sun_lat</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.pixscale_km"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.pixscale_km</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.deg_per_px"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.deg_per_px</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.lat_g"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.lat_g</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.lon_w"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.lon_w</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.mu"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.mu</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.surf_n"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.surf_n</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.sun_n"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.sun_n</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.mu0"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.mu0</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.image_grid_km_x"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.image_grid_km_x</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.image_grid_km_y"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.image_grid_km_y</span></code></a></li>
 <li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.ldmodel"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.ldmodel()</span></code></a></li>
 <li><a class="reference internal" href="#pylanetary.navigation.core.ModelEllipsoid.zonalmodel"><code class="docutils literal notranslate"><span class="pre">ModelEllipsoid.zonalmodel()</span></code></a></li>
 </ul>
 </li>
 <li><a class="reference internal" href="#pylanetary.navigation.core.Nav"><code class="docutils literal notranslate"><span class="pre">Nav</span></code></a><ul>
+<li><a class="reference internal" href="#pylanetary.navigation.core.Nav.data"><code class="docutils literal notranslate"><span class="pre">Nav.data</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.navigation.core.Nav.parent_attrs"><code class="docutils literal notranslate"><span class="pre">Nav.parent_attrs</span></code></a></li>
 <li><a class="reference internal" href="#pylanetary.navigation.core.Nav.colocate"><code class="docutils literal notranslate"><span class="pre">Nav.colocate()</span></code></a></li>
 <li><a class="reference internal" href="#pylanetary.navigation.core.Nav.reproject"><code class="docutils literal notranslate"><span class="pre">Nav.reproject()</span></code></a></li>
 <li><a class="reference internal" href="#pylanetary.navigation.core.Nav.write"><code class="docutils literal notranslate"><span class="pre">Nav.write()</span></code></a></li>
diff --git a/docs/_build/html/api/rings_api.html b/docs/_build/html/api/rings_api.html
index 6419160..056ee99 100644
--- a/docs/_build/html/api/rings_api.html
+++ b/docs/_build/html/api/rings_api.html
@@ -165,10 +165,11 @@
 <ul class="current">
 <li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 <li class="toctree-l1 has-children"><a class="reference internal" href="../tutorials/index.html">Tutorials</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
+<li class="toctree-l2"><a class="reference internal" href="../tutorials/body-tutorial.html">Planetary Body Attributes &amp; Ephemerides</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/nav-tutorial.html">Navigation Basics</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/nav-examples.html">Navigation Workflow</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/rings-tutorial.html">Rings Tutorial</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../tutorials/utils-tutorial.html">Utils Tutorial</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../tutorials/unit-conversions.html">Unit Conversions</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="../contributing.html">Contributing</a></li>
@@ -219,6 +220,31 @@
 <dt class="sig sig-object py" id="pylanetary.rings.core.Ring">
 <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">pylanetary.rings.core.</span></span><span class="sig-name descname"><span class="pre">Ring</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">a</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">e</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">w</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">i</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">omega</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">width</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">flux</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">params_sys</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[0.0,</span> <span class="pre">0.0,</span> <span class="pre">0.0]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pylanetary.rings.core.Ring" title="Link to this definition">#</a></dt>
 <dd><p>model of a planetary ring</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>a</strong> (<em>float</em><em> or </em><em>Quantity</em><em>, </em><em>required.</em>) – semimajor axis. assumes km if not an astropy Quantity</p></li>
+<li><p><strong>e</strong> (<em>float</em><em>, </em><em>required.</em>) – eccentricity</p></li>
+<li><p><strong>w</strong> (<em>float</em><em> or </em><em>Quantity</em><em>, </em><em>required.</em>) – argument of periapsis. assumes degrees if not an astropy Quantity</p></li>
+<li><p><strong>i</strong> (<em>float</em><em> or </em><em>Quantity</em><em>, </em><em>required.</em>) – inclination. assumes degrees if not an astropy Quantity</p></li>
+<li><p><strong>omega</strong> (<em>float</em><em> or </em><em>Quantity</em><em>, </em><em>required.</em>) – longitude of ascending node. assumes degrees if not an astropy Quantity</p></li>
+<li><p><strong>width</strong> (<em>float</em><em> or </em><em>Quantity</em><em>, </em><em>optional. default 1 km</em><em> (</em><em>i.e.</em><em>, </em><em>very thin</em><em>)</em><em>.</em>) – full width of ring. assumes km if not an astropy Quantity</p></li>
+<li><p><strong>flux</strong> (<em>float</em><em> or </em><em>Quantity</em><em>, </em><em>optional. default 1.0.</em>) – ring flux density</p></li>
+<li><p><strong>params_sys</strong> (<em>np.array</em><em>, </em><em>optional</em>) – shape (3,).
+[w, i, omega] of ring system plane relative to observer</p></li>
+</ul>
+</dd>
+</dl>
+<dl class="py attribute">
+<dt class="sig sig-object py">
+<span class="sig-name descname"><span class="pre">same</span> <span class="pre">as</span> <span class="pre">parameters</span></span></dt>
+<dd></dd></dl>
+
+<p class="rubric">Examples</p>
+<p class="rubric">Notes</p>
+<ul class="simple">
+<li><p>Passing astropy Quantities is not yet tested</p></li>
+</ul>
 <dl class="py method">
 <dt class="sig sig-object py" id="pylanetary.rings.core.Ring.as_2d_array">
 <span class="sig-name descname"><span class="pre">as_2d_array</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">shape</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pixscale</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">focus</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">width</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">flux</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">beam</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pylanetary.rings.core.Ring.as_2d_array" title="Link to this definition">#</a></dt>
@@ -280,15 +306,16 @@
 </dd>
 </dl>
 <p class="rubric">Notes</p>
-<p>current implementation removes foreshortening correction “magically”
+<ul class="simple">
+<li><p>current implementation removes foreshortening correction “magically”
 by making the angular width of the wedges in the image plane
 see ring-system-modeling-tutorial.ipynb for a more detailed
-explanation and example</p>
-<p class="rubric">Notes</p>
-<p>This is computationally expensive!
+explanation and example.</p></li>
+<li><p>This is computationally expensive!
 a better implementation would be to make a photutils object
 for wedges of an ellipse. but this requires Cython and
-a lot of geometry</p>
+a lot of geometry</p></li>
+</ul>
 </dd></dl>
 
 <dl class="py method">
@@ -328,6 +355,134 @@
 <a class="reference external" href="https://pds-rings.seti.org/uranus/uranus_rings_table.html">https://pds-rings.seti.org/uranus/uranus_rings_table.html</a>
 with Planetary Ring Node ephemeris
 and JPL Horizons ephemeris</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>body</strong> (<em>pylanetary.utils.Body object</em><em>, </em><em>required.</em>) – one of Jupiter, Saturn, Uranus, Neptune</p></li>
+<li><p><strong>location</strong> (str, array-like, or <cite>~astropy.coordinates.EarthLocation</cite>, optional.) – If str, named observeratory supported by the ring node, e.g. JWST.
+If array-like, observer’s location as a
+3-element array of Earth longitude, latitude, altitude
+that istantiates an <cite>~astropy.coordinates.EarthLocation</cite> object.
+Longitude and latitude should be anything that initializes an
+<cite>~astropy.coordinates.Angle</cite> object, and altitude should
+initialize an <cite>~astropy.units.Quantity</cite> object (with units
+of length).
+If <code class="docutils literal notranslate"><span class="pre">None</span></code>, then the geofocus is used.
+Unfortunately, it is not presently possible to get location information
+directly from the Body object, because the JPL Horizons query tool
+that Body uses requires a Horizons obs code, whereas the Planetary
+Ring Node query tool requires the format specified here.
+To prevent weird results, you should ensure that Body.jpl_hor_id
+matches the location you are inputting here!</p></li>
+<li><p><strong>ringnames</strong> (<em>list</em><em>, </em><em>optional.</em>) – names of rings to include in the model
+if no ringnames provided then all rings are assumed.
+Case-sensitive! Typically capitalized, e.g. “Alpha”</p></li>
+<li><p><strong>fluxes</strong> (<em>list</em><em>, </em><em>np.array</em><em>, or </em><em>&quot;default&quot;</em><em>, </em><em>optional. default &quot;default&quot;.</em>) – brightnesses associated with rings specified in ringnames.
+surface brightness units are expected, e.g. brightness temperature
+if fluxes == ‘default’, optical depths are read in from the static table
+and exponentiated to more closely resemble surface brightness units
+so the result is the attenuation, ATT = 1 - exp(ringtable[‘Optical Depth’])
+assuming the emittance is small (violated for thermal observations, obviously)</p></li>
+</ul>
+</dd>
+</dl>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.rings.core.RingSystemModelObservation.planetname">
+<span class="sig-name descname"><span class="pre">planetname</span></span><a class="headerlink" href="#pylanetary.rings.core.RingSystemModelObservation.planetname" title="Link to this definition">#</a></dt>
+<dd><p>name of planet</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>str</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.rings.core.RingSystemModelObservation.rings">
+<span class="sig-name descname"><span class="pre">rings</span></span><a class="headerlink" href="#pylanetary.rings.core.RingSystemModelObservation.rings" title="Link to this definition">#</a></dt>
+<dd><p>dictionary of ringmodel.Ring objects, with ring names as keys
+note ring names are case-sensitive! Typically capitalized, e.g. “Alpha”</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>dict</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.rings.core.RingSystemModelObservation.ringtable">
+<span class="sig-name descname"><span class="pre">ringtable</span></span><a class="headerlink" href="#pylanetary.rings.core.RingSystemModelObservation.ringtable" title="Link to this definition">#</a></dt>
+<dd><p>ephemeris data from ring node query tool
+as well as time-invariant parameters for each ring from static table</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Astropy table</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.rings.core.RingSystemModelObservation.systemtable">
+<span class="sig-name descname"><span class="pre">systemtable</span></span><a class="headerlink" href="#pylanetary.rings.core.RingSystemModelObservation.systemtable" title="Link to this definition">#</a></dt>
+<dd><p>ephemeris data for ring system from ring node query tool</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Astropy table</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.rings.core.RingSystemModelObservation.bodytable">
+<span class="sig-name descname"><span class="pre">bodytable</span></span><a class="headerlink" href="#pylanetary.rings.core.RingSystemModelObservation.bodytable" title="Link to this definition">#</a></dt>
+<dd><p>ephemeris data for satellites from ring node query tool</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Astropy table</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.rings.core.RingSystemModelObservation.ephem">
+<span class="sig-name descname"><span class="pre">ephem</span></span><a class="headerlink" href="#pylanetary.rings.core.RingSystemModelObservation.ephem" title="Link to this definition">#</a></dt>
+<dd><p>JPL Horizons ephemeris</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Astropy table</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="pylanetary.rings.core.RingSystemModelObservation.np_ang">
+<span class="sig-name descname"><span class="pre">np_ang</span></span><a class="headerlink" href="#pylanetary.rings.core.RingSystemModelObservation.np_ang" title="Link to this definition">#</a></dt>
+<dd><p>north polar angle</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>float</p>
+</dd>
+</dl>
+</dd></dl>
+
+<p class="rubric">Examples</p>
+<ul class="simple">
+<li><p>Need an example of how to add a custom ring
+should be possible by just adding a ringmodel.Ring() object
+into the dict self.ring</p></li>
+<li><p>Need an example of how to modify ring data
+should be possible by just changing the ringmodel.Ring() object
+in the dict self.ring</p></li>
+</ul>
+<p class="rubric">Notes</p>
+<ul class="simple">
+<li><p>Not yet understood why omega must equal 0 for individual rings
+relative to ring system in order to make argument of periapsis agree
+with the Planetary Ring Node.</p></li>
+<li><p>Make this work nicely with utils.Body object</p></li>
+<li><p>implement default epoch and location</p></li>
+<li><p>lookup table to avoid needing to specify both location and horizons_loc</p></li>
+</ul>
 <dl class="py method">
 <dt class="sig sig-object py" id="pylanetary.rings.core.RingSystemModelObservation.as_2d_array">
 <span class="sig-name descname"><span class="pre">as_2d_array</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">shape</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pixscale</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">focus</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">beam</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#pylanetary.rings.core.RingSystemModelObservation.as_2d_array" title="Link to this definition">#</a></dt>
@@ -673,6 +828,13 @@
 </ul>
 </li>
 <li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation</span></code></a><ul>
+<li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation.planetname"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation.planetname</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation.rings"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation.rings</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation.ringtable"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation.ringtable</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation.systemtable"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation.systemtable</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation.bodytable"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation.bodytable</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation.ephem"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation.ephem</span></code></a></li>
+<li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation.np_ang"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation.np_ang</span></code></a></li>
 <li><a class="reference internal" href="#pylanetary.rings.core.RingSystemModelObservation.as_2d_array"><code class="docutils literal notranslate"><span class="pre">RingSystemModelObservation.as_2d_array()</span></code></a></li>
 </ul>
 </li>
diff --git a/docs/_build/html/api/utils_api.html b/docs/_build/html/api/utils_api.html
index 306171c..43d5d8d 100644
--- a/docs/_build/html/api/utils_api.html
+++ b/docs/_build/html/api/utils_api.html
@@ -165,10 +165,11 @@
 <ul class="current">
 <li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 <li class="toctree-l1 has-children"><a class="reference internal" href="../tutorials/index.html">Tutorials</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
+<li class="toctree-l2"><a class="reference internal" href="../tutorials/body-tutorial.html">Planetary Body Attributes &amp; Ephemerides</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/nav-tutorial.html">Navigation Basics</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/nav-examples.html">Navigation Workflow</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../tutorials/rings-tutorial.html">Rings Tutorial</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../tutorials/utils-tutorial.html">Utils Tutorial</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../tutorials/unit-conversions.html">Unit Conversions</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="../contributing.html">Contributing</a></li>
diff --git a/docs/_build/html/citing.html b/docs/_build/html/citing.html
index 2d187ca..1d56aef 100644
--- a/docs/_build/html/citing.html
+++ b/docs/_build/html/citing.html
@@ -165,10 +165,11 @@
 <ul class="current">
 <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 <li class="toctree-l1 has-children"><a class="reference internal" href="tutorials/index.html">Tutorials</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
+<li class="toctree-l2"><a class="reference internal" href="tutorials/body-tutorial.html">Planetary Body Attributes &amp; Ephemerides</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/nav-tutorial.html">Navigation Basics</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/nav-examples.html">Navigation Workflow</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/rings-tutorial.html">Rings Tutorial</a></li>
-<li class="toctree-l2"><a class="reference internal" href="tutorials/utils-tutorial.html">Utils Tutorial</a></li>
+<li class="toctree-l2"><a class="reference internal" href="tutorials/unit-conversions.html">Unit Conversions</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="contributing.html">Contributing</a></li>
diff --git a/docs/_build/html/contributing.html b/docs/_build/html/contributing.html
index 7660441..86620fc 100644
--- a/docs/_build/html/contributing.html
+++ b/docs/_build/html/contributing.html
@@ -3,7 +3,7 @@
   <head><meta charset="utf-8"/>
     <meta name="viewport" content="width=device-width,initial-scale=1"/>
     <meta name="color-scheme" content="light dark"><meta name="viewport" content="width=device-width, initial-scale=1" />
-<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Citing" href="citing.html" /><link rel="prev" title="Utils Tutorial" href="tutorials/utils-tutorial.html" />
+<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Citing" href="citing.html" /><link rel="prev" title="Unit Conversions" href="tutorials/unit-conversions.html" />
 
     <!-- Generated with Sphinx 7.2.6 and Furo 2023.09.10 -->
         <title>Contributing - pylanetary documentation</title>
@@ -165,10 +165,11 @@
 <ul class="current">
 <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 <li class="toctree-l1 has-children"><a class="reference internal" href="tutorials/index.html">Tutorials</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
+<li class="toctree-l2"><a class="reference internal" href="tutorials/body-tutorial.html">Planetary Body Attributes &amp; Ephemerides</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/nav-tutorial.html">Navigation Basics</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/nav-examples.html">Navigation Workflow</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/rings-tutorial.html">Rings Tutorial</a></li>
-<li class="toctree-l2"><a class="reference internal" href="tutorials/utils-tutorial.html">Utils Tutorial</a></li>
+<li class="toctree-l2"><a class="reference internal" href="tutorials/unit-conversions.html">Unit Conversions</a></li>
 </ul>
 </li>
 <li class="toctree-l1 current current-page"><a class="current reference internal" href="#">Contributing</a></li>
@@ -255,7 +256,7 @@ <h2>New Features<a class="headerlink" href="#new-features" title="Link to this h
 </li>
 <li><p>Add documentation within the docstring with at least one example. Try to conform to the <a class="reference external" href="https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html">numpy docstyle</a>.</p></li>
 <li><p>For any major new functionality or workflow, make an example Jupyter notebook:</p>
-<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">notebooks</span><span class="o">/</span><span class="n">feature</span><span class="o">-</span><span class="n">tutorial</span><span class="o">.</span><span class="n">ipynb</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">docs</span><span class="o">/</span><span class="n">tutorials</span><span class="o">/</span><span class="n">feature</span><span class="o">-</span><span class="n">tutorial</span><span class="o">.</span><span class="n">ipynb</span>
 </pre></div>
 </div>
 </li>
@@ -327,14 +328,14 @@ <h2>Imposter syndrome disclaimer<a class="headerlink" href="#imposter-syndrome-d
               </div>
               <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
             </a>
-          <a class="prev-page" href="tutorials/utils-tutorial.html">
+          <a class="prev-page" href="tutorials/unit-conversions.html">
               <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
               <div class="page-info">
                 <div class="context">
                   <span>Previous</span>
                 </div>
                 
-                <div class="title">Utils Tutorial</div>
+                <div class="title">Unit Conversions</div>
                 
               </div>
             </a>
diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html
index 0fe7ac1..ebe2b1c 100644
--- a/docs/_build/html/genindex.html
+++ b/docs/_build/html/genindex.html
@@ -214,7 +214,7 @@
           
 <section class="genindex-section">
   <h1 id="index">Index</h1>
-  <div class="genindex-jumpbox"><a href="#A"><strong>A</strong></a> | <a href="#B"><strong>B</strong></a> | <a href="#C"><strong>C</strong></a> | <a href="#D"><strong>D</strong></a> | <a href="#E"><strong>E</strong></a> | <a href="#F"><strong>F</strong></a> | <a href="#I"><strong>I</strong></a> | <a href="#J"><strong>J</strong></a> | <a href="#L"><strong>L</strong></a> | <a href="#M"><strong>M</strong></a> | <a href="#N"><strong>N</strong></a> | <a href="#P"><strong>P</strong></a> | <a href="#R"><strong>R</strong></a> | <a href="#S"><strong>S</strong></a> | <a href="#T"><strong>T</strong></a> | <a href="#V"><strong>V</strong></a> | <a href="#W"><strong>W</strong></a> | <a href="#X"><strong>X</strong></a> | <a href="#Z"><strong>Z</strong></a></div>
+  <div class="genindex-jumpbox"><a href="#A"><strong>A</strong></a> | <a href="#B"><strong>B</strong></a> | <a href="#C"><strong>C</strong></a> | <a href="#D"><strong>D</strong></a> | <a href="#E"><strong>E</strong></a> | <a href="#F"><strong>F</strong></a> | <a href="#I"><strong>I</strong></a> | <a href="#J"><strong>J</strong></a> | <a href="#L"><strong>L</strong></a> | <a href="#M"><strong>M</strong></a> | <a href="#N"><strong>N</strong></a> | <a href="#O"><strong>O</strong></a> | <a href="#P"><strong>P</strong></a> | <a href="#R"><strong>R</strong></a> | <a href="#S"><strong>S</strong></a> | <a href="#T"><strong>T</strong></a> | <a href="#V"><strong>V</strong></a> | <a href="#W"><strong>W</strong></a> | <a href="#X"><strong>X</strong></a> | <a href="#Z"><strong>Z</strong></a></div>
 </section>
 <section id="A" class="genindex-section">
   <h2>A</h2>
@@ -242,11 +242,15 @@ <h2>B</h2>
     <td style="width: 33%; vertical-align: top;"><ul>
         <li><a href="api/rings_api.html#pylanetary.rings.core.b_from_ae">b_from_ae() (in module pylanetary.rings.core)</a>
 </li>
-    </ul></td>
-    <td style="width: 33%; vertical-align: top;"><ul>
         <li><a href="api/utils_api.html#pylanetary.utils.core.beam_area">beam_area() (in module pylanetary.utils.core)</a>
 </li>
+    </ul></td>
+    <td style="width: 33%; vertical-align: top;"><ul>
         <li><a href="api/utils_api.html#pylanetary.utils.core.Body">Body (class in pylanetary.utils.core)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelBody.body">body (pylanetary.navigation.core.ModelBody attribute)</a>
+</li>
+        <li><a href="api/rings_api.html#pylanetary.rings.core.RingSystemModelObservation.bodytable">bodytable (pylanetary.rings.core.RingSystemModelObservation attribute)</a>
 </li>
     </ul></td>
   </tr></table>
@@ -274,6 +278,12 @@ <h2>C</h2>
   <h2>D</h2>
   <table style="width: 100%" class="indextable genindextable"><tr>
     <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.Nav.data">data (pylanetary.navigation.core.Nav attribute)</a>
+</li>
+    </ul></td>
+    <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.deg_per_px">deg_per_px (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
         <li><a href="api/rings_api.html#pylanetary.rings.core.double_rotate">double_rotate() (in module pylanetary.rings.core)</a>
 </li>
     </ul></td>
@@ -287,6 +297,14 @@ <h2>E</h2>
         <li><a href="api/navigation_api.html#pylanetary.navigation.core.emission_angle">emission_angle() (in module pylanetary.navigation.core)</a>
 </li>
     </ul></td>
+    <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelBody.ephem">ephem (pylanetary.navigation.core.ModelBody attribute)</a>
+
+        <ul>
+          <li><a href="api/rings_api.html#pylanetary.rings.core.RingSystemModelObservation.ephem">(pylanetary.rings.core.RingSystemModelObservation attribute)</a>
+</li>
+        </ul></li>
+    </ul></td>
   </tr></table>
 </section>
 
@@ -309,9 +327,13 @@ <h2>I</h2>
   <table style="width: 100%" class="indextable genindextable"><tr>
     <td style="width: 33%; vertical-align: top;"><ul>
         <li><a href="api/utils_api.html#pylanetary.utils.core.I_over_F">I_over_F() (in module pylanetary.utils.core)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.image_grid_km_x">image_grid_km_x (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
 </li>
     </ul></td>
     <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.image_grid_km_y">image_grid_km_y (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
         <li><a href="api/utils_api.html#pylanetary.utils.core.inverse_planck">inverse_planck() (in module pylanetary.utils.core)</a>
 </li>
         <li><a href="api/utils_api.html#pylanetary.utils.core.inverse_rayleigh_jeans">inverse_rayleigh_jeans() (in module pylanetary.utils.core)</a>
@@ -340,6 +362,8 @@ <h2>J</h2>
   <h2>L</h2>
   <table style="width: 100%" class="indextable genindextable"><tr>
     <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.lat_g">lat_g (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
         <li><a href="api/navigation_api.html#pylanetary.navigation.core.lat_lon">lat_lon() (in module pylanetary.navigation.core)</a>
 </li>
     </ul></td>
@@ -347,6 +371,8 @@ <h2>L</h2>
         <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.ldmodel">ldmodel() (pylanetary.navigation.core.ModelEllipsoid method)</a>
 </li>
         <li><a href="api/navigation_api.html#pylanetary.navigation.core.limb_darkening">limb_darkening() (in module pylanetary.navigation.core)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.lon_w">lon_w (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
 </li>
     </ul></td>
   </tr></table>
@@ -372,14 +398,40 @@ <h2>M</h2>
 </li>
         </ul></li>
     </ul></td>
+    <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.mu">mu (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.mu0">mu0 (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
+    </ul></td>
   </tr></table>
 </section>
 
 <section id="N" class="genindex-section">
   <h2>N</h2>
   <table style="width: 100%" class="indextable genindextable"><tr>
+    <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelBody.name">name (pylanetary.navigation.core.ModelBody attribute)</a>
+</li>
+    </ul></td>
     <td style="width: 33%; vertical-align: top;"><ul>
         <li><a href="api/navigation_api.html#pylanetary.navigation.core.Nav">Nav (class in pylanetary.navigation.core)</a>
+</li>
+        <li><a href="api/rings_api.html#pylanetary.rings.core.RingSystemModelObservation.np_ang">np_ang (pylanetary.rings.core.RingSystemModelObservation attribute)</a>
+</li>
+    </ul></td>
+  </tr></table>
+</section>
+
+<section id="O" class="genindex-section">
+  <h2>O</h2>
+  <table style="width: 100%" class="indextable genindextable"><tr>
+    <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.ob_lat">ob_lat (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
+    </ul></td>
+    <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.ob_lon">ob_lon (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
 </li>
     </ul></td>
   </tr></table>
@@ -389,10 +441,24 @@ <h2>N</h2>
   <h2>P</h2>
   <table style="width: 100%" class="indextable genindextable"><tr>
     <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.Nav.parent_attrs">parent_attrs (pylanetary.navigation.core.Nav attribute)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelBody.pixscale_arcsec">pixscale_arcsec (pylanetary.navigation.core.ModelBody attribute)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelBody.pixscale_km">pixscale_km (pylanetary.navigation.core.ModelBody attribute)</a>
+
+        <ul>
+          <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.pixscale_km">(pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
+        </ul></li>
         <li><a href="api/utils_api.html#pylanetary.utils.core.planck">planck() (in module pylanetary.utils.core)</a>
 </li>
         <li><a href="api/rings_api.html#pylanetary.rings.core.plane_project">plane_project() (in module pylanetary.rings.core)</a>
 </li>
+        <li><a href="api/rings_api.html#pylanetary.rings.core.RingSystemModelObservation.planetname">planetname (pylanetary.rings.core.RingSystemModelObservation attribute)</a>
+</li>
+    </ul></td>
+    <td style="width: 33%; vertical-align: top;"><ul>
         <li><a href="api/rings_api.html#pylanetary.rings.core.project_ellipse_double">project_ellipse_double() (in module pylanetary.rings.core)</a>
 </li>
         <li>
@@ -402,8 +468,6 @@ <h2>P</h2>
           <li><a href="api/navigation_api.html#module-pylanetary.navigation.core">module</a>
 </li>
         </ul></li>
-    </ul></td>
-    <td style="width: 33%; vertical-align: top;"><ul>
         <li>
     pylanetary.rings.core
 
@@ -434,15 +498,23 @@ <h2>R</h2>
 </li>
         <li><a href="api/navigation_api.html#pylanetary.navigation.core.Nav.reproject">reproject() (pylanetary.navigation.core.Nav method)</a>
 </li>
-    </ul></td>
-    <td style="width: 33%; vertical-align: top;"><ul>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.req">req (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
         <li><a href="api/rings_api.html#pylanetary.rings.core.Ring">Ring (class in pylanetary.rings.core)</a>
 </li>
+    </ul></td>
+    <td style="width: 33%; vertical-align: top;"><ul>
         <li><a href="api/rings_api.html#pylanetary.rings.core.ring_area">ring_area() (in module pylanetary.rings.core)</a>
+</li>
+        <li><a href="api/rings_api.html#pylanetary.rings.core.RingSystemModelObservation.rings">rings (pylanetary.rings.core.RingSystemModelObservation attribute)</a>
 </li>
         <li><a href="api/rings_api.html#pylanetary.rings.core.RingSystemModelObservation">RingSystemModelObservation (class in pylanetary.rings.core)</a>
+</li>
+        <li><a href="api/rings_api.html#pylanetary.rings.core.RingSystemModelObservation.ringtable">ringtable (pylanetary.rings.core.RingSystemModelObservation attribute)</a>
 </li>
         <li><a href="api/navigation_api.html#pylanetary.navigation.core.rotate_about_pivot">rotate_about_pivot() (in module pylanetary.navigation.core)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.rpol">rpol (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
 </li>
     </ul></td>
   </tr></table>
@@ -453,12 +525,22 @@ <h2>S</h2>
   <table style="width: 100%" class="indextable genindextable"><tr>
     <td style="width: 33%; vertical-align: top;"><ul>
         <li><a href="api/utils_api.html#pylanetary.utils.core.solar_spectrum">solar_spectrum() (in module pylanetary.utils.core)</a>
+</li>
+        <li><a href="api/utils_api.html#pylanetary.utils.core.solid_angle">solid_angle() (in module pylanetary.utils.core)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.sun_lat">sun_lat (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.sun_lon">sun_lon (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
 </li>
     </ul></td>
     <td style="width: 33%; vertical-align: top;"><ul>
-        <li><a href="api/utils_api.html#pylanetary.utils.core.solid_angle">solid_angle() (in module pylanetary.utils.core)</a>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.sun_n">sun_n (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
+</li>
+        <li><a href="api/navigation_api.html#pylanetary.navigation.core.ModelEllipsoid.surf_n">surf_n (pylanetary.navigation.core.ModelEllipsoid attribute)</a>
 </li>
         <li><a href="api/navigation_api.html#pylanetary.navigation.core.surface_normal">surface_normal() (in module pylanetary.navigation.core)</a>
+</li>
+        <li><a href="api/rings_api.html#pylanetary.rings.core.RingSystemModelObservation.systemtable">systemtable (pylanetary.rings.core.RingSystemModelObservation attribute)</a>
 </li>
     </ul></td>
   </tr></table>
diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html
index 64c8cec..9350dc7 100644
--- a/docs/_build/html/index.html
+++ b/docs/_build/html/index.html
@@ -230,8 +230,8 @@ <h2>Features<a class="headerlink" href="#features" title="Link to this heading">
 <section id="projects-using-pylanetary">
 <h2>Projects using pylanetary<a class="headerlink" href="#projects-using-pylanetary" title="Link to this heading">#</a></h2>
 <ul class="simple">
-<li><p>[Keck Twilight Zone program](<a class="reference external" href="https://www2.keck.hawaii.edu/inst/tda/TwilightZone">https://www2.keck.hawaii.edu/inst/tda/TwilightZone</a>.html#)</p></li>
-<li><p>[HST OPAL program](<a class="reference external" href="https://archive.stsci.edu/hlsp/opal">https://archive.stsci.edu/hlsp/opal</a>)</p></li>
+<li><p><a class="reference external" href="https://www2.keck.hawaii.edu/inst/tda/TwilightZone.html#">Keck Twilight Zone program</a></p></li>
+<li><p><a class="reference external" href="https://archive.stsci.edu/hlsp/opal">HST OPAL program</a></p></li>
 <li><p>Radio observers of giant planets, incl. Goddard, Berkeley, and Caltech groups</p></li>
 </ul>
 <div class="toctree-wrapper compound">
diff --git a/docs/_build/html/installation.html b/docs/_build/html/installation.html
index e62ac63..c6e7eb0 100644
--- a/docs/_build/html/installation.html
+++ b/docs/_build/html/installation.html
@@ -165,7 +165,7 @@
 <ul class="current">
 <li class="toctree-l1 current current-page"><a class="current reference internal" href="#">Installation</a></li>
 <li class="toctree-l1 has-children"><a class="reference internal" href="tutorials/index.html">Tutorials</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
-<li class="toctree-l2"><a class="reference internal" href="tutorials/body-tutorial.html">Body: access planet/moon data</a></li>
+<li class="toctree-l2"><a class="reference internal" href="tutorials/body-tutorial.html">Planetary Body Attributes &amp; Ephemerides</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/nav-tutorial.html">Navigation Basics</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/nav-examples.html">Navigation Workflow</a></li>
 <li class="toctree-l2"><a class="reference internal" href="tutorials/rings-tutorial.html">Rings Tutorial</a></li>
@@ -216,17 +216,17 @@
         <article role="main">
           <section id="installation">
 <h1>Installation<a class="headerlink" href="#installation" title="Link to this heading">#</a></h1>
+<p>Simple pip install should work, but we recommend to do so in a clean conda environment, as follows:</p>
 <ul class="simple">
-<li><p>download the requirements.txt file using the “download raw” option</p></li>
 <li><p><code class="docutils literal notranslate"><span class="pre">conda</span> <span class="pre">create</span> <span class="pre">-n</span> <span class="pre">pylanetary-tester</span> <span class="pre">python=3.11</span></code> (or any Python from 3.9 to 3.12)</p></li>
 <li><p><code class="docutils literal notranslate"><span class="pre">conda</span> <span class="pre">activate</span> <span class="pre">pylanetary-tester</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">-r</span> <span class="pre">requirements.txt</span></code> in same directory as requirements.txt</p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">git+https://github.com/emolter/pylanetary.git&#64;main</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">pylanetary</span></code></p></li>
 </ul>
-<p>Pylanetary relies on as-yet-unreleased versions of the image_registration and astroquery packages, and pypi does not support installation of unreleased packages. This is the reason that simply pip install pylanetary will not work right.</p>
 <section id="troubleshooting">
 <h2>Troubleshooting<a class="headerlink" href="#troubleshooting" title="Link to this heading">#</a></h2>
-<p>Here we attempt to document install issues people have had, and their solutions</p>
+<p>Here we attempt to document install issues people have had, and their solutions.
+Note that many of these issues pre-date the current version of pylanetary, and only arose due to the prior need
+to download requirements.txt, which is no longer necessary for installation.</p>
 <ul class="simple">
 <li><p>requirements.txt not found. Most likely, you never downloaded requirements.txt, or you are not running pip install -r requirements.txt in the same folder where you put requirements.txt</p></li>
 <li><p>pip install requirements.txt fails instantly with a crazy-looking error message. Try opening requirements.txt, and check that its just ten or so lines of human-readable text. If it’s some huge html soup, that means you didn’t use the “download raw” button when downloading</p></li>
diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv
index 643d29b..0dcd864 100644
Binary files a/docs/_build/html/objects.inv and b/docs/_build/html/objects.inv differ
diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js
index e637f34..45e13d4 100644
--- a/docs/_build/html/searchindex.js
+++ b/docs/_build/html/searchindex.js
@@ -1,1 +1,1 @@
-Search.setIndex({"docnames": ["api/index", "api/navigation_api", "api/rings_api", "api/utils_api", "citing", "contributing", "index", "installation", "tutorials/body-tutorial", "tutorials/index", "tutorials/nav-examples", "tutorials/nav-tutorial", "tutorials/rings-tutorial", "tutorials/unit-conversions"], "filenames": ["api/index.rst", "api/navigation_api.rst", "api/rings_api.rst", "api/utils_api.rst", "citing.rst", "contributing.rst", "index.rst", "installation.rst", "tutorials/body-tutorial.ipynb", "tutorials/index.rst", "tutorials/nav-examples.ipynb", "tutorials/nav-tutorial.ipynb", "tutorials/rings-tutorial.ipynb", "tutorials/unit-conversions.ipynb"], "titles": ["pylanetary API", "Navigation API", "Rings API", "Utils API", "Citing", "Contributing", "pylanetary", "Installation", "Planetary Body Attributes &amp; Ephemerides", "Tutorials", "Navigation Workflow", "Navigation Basics", "Rings Tutorial", "Unit Conversions"], "terms": {"navig": [0, 6, 9], "ring": [0, 5, 6, 9], "util": [0, 1, 2, 7, 10, 11, 12, 13], "class": [1, 2, 3, 5, 12], "pylanetari": [1, 2, 3, 5, 7, 8, 10, 11, 12, 13], "core": [1, 2, 3, 5, 12], "modelbodi": 1, "bodi": [1, 2, 3, 9, 10, 11, 12], "pixscal": [1, 2, 10, 12], "shape": [1, 2, 3, 10, 11, 12, 13], "none": [1, 2, 3, 11, 12], "wrapper": [1, 8], "modelellipsoid": [1, 11], "permit": 1, "pass": 1, "an": [1, 2, 3, 5, 8, 10, 11, 12], "ephemeri": [1, 2, 8, 10, 11, 12], "ob_lon": [1, 11], "ob_lat": [1, 11], "pixscale_km": [1, 11], "np_ang": [1, 2, 11], "req": [1, 8, 11], "rpol": [1, 8, 11], "center": [1, 2, 8, 10, 11, 12], "0": [1, 2, 3, 8, 10, 11, 12, 13], "sun_lon": [1, 11], "sun_lat": [1, 11], "longitude_convent": 1, "w": [1, 2, 11, 12], "project": [1, 2, 5, 10, 12], "ellipsoid": [1, 11], "onto": 1, "2": [1, 2, 3, 8, 10, 11, 12, 13], "d": [1, 2, 3, 8, 11, 12, 13], "arrai": [1, 2, 3, 10, 11, 12, 13], "latitud": [1, 10, 11], "longitud": [1, 10, 11], "grid": [1, 3], "ldmodel": [1, 10, 11], "tb": [1, 3, 10, 11, 13], "beam": [1, 2, 3, 10, 13], "law": [1, 10, 11], "exp": [1, 10, 11], "mu0": [1, 10, 11], "psf_mode": 1, "gaussian": [1, 2, 3, 11, 13], "make": [1, 2, 5, 10, 11, 12], "limb": [1, 10], "darken": [1, 10], "model": [1, 2, 5, 6], "disk": [1, 3, 10], "convolv": [1, 2, 3], "see": [1, 2, 3, 5, 8, 10, 11, 12], "docstr": [1, 2, 5, 11], "limb_darken": 1, "option": [1, 2, 3, 7], "paramet": [1, 2, 3, 8, 10, 11], "float": [1, 2, 3, 10], "requir": [1, 2, 3, 5, 7, 11, 12], "flux": [1, 2, 3, 10, 11], "bright": [1, 2, 3, 10, 11], "temperatur": [1, 3], "mu": [1, 10, 11, 13], "1": [1, 2, 3, 8, 10, 11, 12, 13], "tupl": [1, 2, 11], "": [1, 3, 5, 7, 8, 10, 11, 12, 13], "np": [1, 2, 3, 8, 10, 11, 12, 13], "unit": [1, 2, 3, 5, 6, 8, 9, 10, 11, 12], "pixel": [1, 2, 3, 10, 11, 12], "convolve_with_beam": [1, 2, 3, 11, 12], "str": [1, 3], "default": [1, 2, 3, 5, 11], "cosin": [1, 11], "solar": [1, 3, 5, 6, 8, 10, 11, 13], "incid": [1, 11], "angl": [1, 2, 3, 8, 11, 12, 13], "code": [1, 2, 5, 10, 12], "check": [1, 7, 8, 11], "self": [1, 10, 11], "i": [1, 2, 3, 5, 6, 7, 8, 10, 11, 12], "defin": [1, 2, 11, 12], "us": [1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13], "ha": [1, 2, 3, 8, 10, 11, 12], "effect": [1, 3, 12], "unless": 1, "minnaert": [1, 10, 11], "undefin": 1, "fail": [1, 7], "mode": [1, 3, 10, 11, 12], "airi": [1, 3], "zonalmodel": 1, "lon": [1, 11, 12], "nav": [1, 6], "data": [1, 2, 3, 5, 6, 8], "function": [1, 3, 5, 10, 11, 12, 13], "compar": [1, 12], "observ": [1, 2, 6, 8], "imag": [1, 2, 3, 6, 10, 11, 12], "coloc": [1, 10], "convolut": [1, 11], "diagnostic_plot": [1, 10], "true": [1, 2, 10, 11, 12], "save_plot": 1, "kwarg": 1, "co": [1, 11, 12], "locat": [1, 2, 3, 8, 11, 12], "planet": [1, 2, 5, 6, 8, 10, 12], "which": [1, 2, 7, 11, 12, 13], "method": [1, 3], "should": [1, 2, 5, 11, 12], "overlai": 1, "choic": [1, 11], "ar": [1, 2, 3, 5, 7, 8, 10, 11, 12], "canni": [1, 11], "edg": [1, 10, 11], "detect": [1, 11], "algorithm": [1, 11], "same": [1, 2, 3, 7, 8, 10, 11], "exponenti": [1, 10, 11], "param": [1, 2, 12], "type": [1, 2, 3, 8, 12], "what": [1, 3, 5, 8, 10], "low_thresh": [1, 11], "document": [1, 5, 7, 11, 12], "skimag": 1, "featur": 1, "high_thresh": [1, 11], "sigma": [1, 11], "int": [1, 2, 3], "To": [1, 11], "find": [1, 2, 11, 12, 13], "typic": [1, 2, 3, 11], "good": [1, 5, 10, 12], "valu": [1, 2, 10, 11, 12], "rm": [1, 11], "nois": [1, 11], "approxim": [1, 3, 10, 11, 13], "background": 1, "e": [1, 2, 3, 7, 11, 12], "cloud": [1, 11], "free": [1, 8, 11], "volcano": 1, "region": [1, 11, 12], "5": [1, 2, 3, 8, 10, 11, 12], "take": [1, 11], "shift": [1, 11], "maxim": 1, "err": [1, 11], "per": [1, 11], "error": [1, 5, 7, 11], "input": [1, 2, 3, 11, 12], "bool": [1, 2], "do": [1, 5, 10, 11], "you": [1, 2, 4, 5, 7, 8, 11, 12], "want": [1, 2, 5, 8, 10, 12], "diagnost": [1, 10, 11, 12], "plot": [1, 11, 12, 13], "shown": 1, "file": [1, 3, 5, 7, 10, 11], "path": 1, "save": [1, 10, 12], "doe": [1, 3, 5, 7, 8, 10, 11, 12], "return": [1, 2, 3, 7, 11, 12], "dx": [1, 10, 11], "best": [1, 5], "fit": [1, 5, 6, 12], "differ": [1, 8, 10, 11, 12], "posit": [1, 10, 11], "between": [1, 3, 10, 11], "appli": [1, 2, 11, 12], "dy": [1, 10, 11], "dxerr": [1, 10, 11], "uncertainti": [1, 11], "base": [1, 5, 11], "cross": [1, 11], "correl": [1, 11], "from": [1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13], "image_registr": [1, 7, 11], "chi2_shift": [1, 11], "These": 1, "treat": 1, "extrem": 1, "caution": 1, "becaus": [1, 5, 11, 12], "thei": [1, 10, 11, 12], "were": [1, 8, 11], "design": 1, "work": [1, 7, 11, 12], "ident": 1, "corrupt": 1, "random": [1, 11], "being": 1, "non": [1, 2, 12], "dyerr": [1, 10, 11], "exampl": [1, 2, 3, 5, 11, 13], "need": [1, 2, 3, 12], "least": [1, 5, 7], "one": [1, 2, 3, 5, 11, 12, 13], "each": [1, 12], "here": [1, 5, 7, 8, 10, 11, 12], "note": [1, 2, 3, 5, 8, 11], "sometim": [1, 12], "give": [1, 5, 12], "unrealist": 1, "behavior": [1, 11, 12], "reproject": 1, "equirectangular": 1, "target": [1, 3, 11], "thi": [1, 2, 3, 4, 5, 7, 8, 10, 11, 12], "onli": [1, 3, 12], "properli": [1, 11, 12], "lat_g": [1, 10, 11], "lon_w": [1, 10, 11], "respect": [1, 11], "instanc": [1, 11, 12], "ONE": 1, "xy_shift_data": [1, 11], "xy_shift_model": [1, 10, 11], "been": [1, 11, 13], "output": [1, 2, 3, 8, 11], "cartopi": [1, 10], "proj": 1, "string": [1, 3, 8], "polar": [1, 8], "aka": 1, "rectilinear": 1, "result": [1, 11, 12, 13], "equal": [1, 2, 11], "space": [1, 2], "whichev": 1, "pole": [1, 8], "closest": 1, "sub": [1, 10, 11], "ani": [1, 2, 5, 7], "object": [1, 2, 3, 11], "also": [1, 2, 3, 5, 8, 11, 12], "accept": [1, 2, 3, 5], "case": [1, 3, 12], "must": [1, 3, 5, 8, 12], "specifi": [1, 2, 8, 12], "list": [1, 2, 8], "guess": 1, "scale": [1, 2, 11, 12], "emiss": [1, 11], "write": [1, 5, 6, 11], "outstem": 1, "header": [1, 11, 12], "flux_unit": 1, "multi": [1, 6, 11], "extens": [1, 6, 11], "stem": 1, "filenam": 1, "dict": [1, 2], "dictionari": [1, 2], "info": 1, "put": [1, 7], "hdul": [1, 10, 11, 12], "contain": [1, 11, 12], "empti": [1, 12], "3": [1, 2, 3, 7, 8, 10, 11, 12, 13], "4": [1, 3, 7, 8, 10, 11, 12, 13], "refer": [1, 2, 3], "format": [1, 5, 6, 10, 12], "origin": [1, 2, 3, 5, 10, 11, 12], "pioneer": 1, "mike": [1, 11], "wong": [1, 11], "g": [1, 2, 7, 11], "http": [1, 2, 3, 6, 7, 11, 12], "doi": [1, 2, 3, 4, 11, 12, 13], "org": [1, 2, 3, 11, 12], "10": [1, 2, 3, 8, 10, 11, 12, 13], "3847": [1, 2, 11], "1538": [1, 2, 11], "4365": 1, "ab775f": 1, "fftshift": 1, "user": [1, 10, 11, 12], "amount": [1, 10], "suggest": [1, 11], "prefer": [1, 5], "instead": [1, 3, 7, 8, 10], "avoid": 1, "touch": 1, "x": [1, 2, 3, 11], "y": [1, 2, 3, 11, 12], "recalcul": 1, "colocate_diagnostic_plot": 1, "assess": 1, "solut": [1, 7, 10, 11], "matplotlib": [1, 8, 10, 11, 12, 13], "figur": 1, "axi": [1, 2], "fig": [1, 10, 11, 12], "ax": [1, 10, 11, 12], "emission_angl": 1, "surf_n": 1, "comput": [1, 2, 11], "surfac": [1, 10, 11, 12], "wrt": 1, "deg": [1, 8, 10, 11, 12], "z": [1, 2, 3, 12], "normal": [1, 2, 3, 12], "vector": [1, 2], "lat_lon": 1, "r_e": 1, "r_p": 1, "planetograph": [1, 10, 11], "planetocentr": 1, "west": [1, 10, 11], "view": [1, 11], "tilt": [1, 12], "perspect": 1, "sky": [1, 11], "For": [1, 5, 11], "now": [1, 8, 10, 12], "reli": [1, 7], "manual": [1, 7, 10, 11], "de": [1, 2, 12], "rotat": [1, 2, 8, 10, 11], "orthograph": [1, 10, 11], "pyproj": 1, "tiltedperspect": 1, "cannot": 1, "handl": [1, 3, 5, 10, 11], "sphere": 1, "km": [1, 2, 3, 8, 11, 12, 13], "px": [1, 2, 11, 12], "north": [1, 8, 10, 11], "equatori": [1, 8, 11], "radiu": [1, 3, 12, 13], "offset": 1, "east": [1, 12], "convent": [1, 2], "coordin": [1, 12], "where": [1, 7, 12], "like": [1, 2, 3, 5, 6, 7, 11, 12], "disc": 1, "ignor": 1, "linear": 1, "have": [1, 3, 5, 7, 10, 12, 13], "length": [1, 2], "quadrat": [1, 11], "squar": [1, 3, 11], "root": 1, "a0": 1, "a1": 1, "first": [1, 5, 8, 10, 12], "second": [1, 10], "term": 1, "ld": 1, "sqrt": [1, 12], "overview": 1, "publish": 1, "www": [1, 3], "astro": 1, "keel": 1, "ac": 1, "uk": 1, "jkt": 1, "jktld": 1, "html": [1, 2, 3, 6, 7, 11], "rotate_about_pivot": 1, "img": [1, 12], "pivot": 1, "counterclockwis": 1, "point": [1, 2, 10, 11], "about": [1, 5, 11], "surface_norm": 1, "dot": 1, "product": 1, "ob": [1, 10, 11, 12], "sun": [1, 3], "omega": [2, 12, 13], "width": 2, "params_si": [2, 12], "planetari": [2, 9, 11, 12], "as_2d_arrai": [2, 12], "focu": [2, 6, 12], "look": [2, 5, 7, 10, 11, 12], "mock": [2, 12], "smear": 2, "over": [2, 5, 10], "astropi": [2, 3, 5, 8, 10, 11, 12], "quantiti": [2, 3, 5], "assum": [2, 3, 8, 11, 13], "around": [2, 10, 11, 12], "orbit": [2, 8], "face": 2, "full": [2, 11, 12, 13], "technic": 2, "specif": [2, 5, 6, 8, 13], "intens": [2, 12], "set": [2, 3, 11, 12], "element": [2, 3], "as_azimuthal_wedg": [2, 12], "nwedg": [2, 12], "60": [2, 12, 13], "n": [2, 7], "1000": [2, 3, 12], "partial": 2, "ellipt": [2, 10, 11, 12], "annulu": [2, 12], "wedg": [2, 12], "azimuth": 2, "profil": 2, "ellips": [2, 11, 12], "number": [2, 10], "as_elliptical_annulu": [2, 12], "detail": [2, 5, 8, 11], "much": [2, 10, 12], "larger": [2, 12], "than": [2, 10, 11, 12], "factor": [2, 3], "ndimag": [2, 3], "zoom": [2, 3], "more": [2, 5, 8, 10, 12], "accur": [2, 12], "area": [2, 3, 12, 13], "radian": [2, 12], "pi": [2, 12, 13], "correspond": 2, "lower": [2, 10, 11, 12], "corner": 2, "len": [2, 12], "mask": 2, "current": [2, 3, 12], "implement": [2, 5, 11, 12, 13], "remov": 2, "foreshorten": 2, "correct": [2, 12], "magic": 2, "angular": [2, 13], "plane": 2, "system": [2, 5, 6, 8, 11, 13], "tutori": [2, 5, 11], "ipynb": [2, 5], "explan": 2, "computation": 2, "expens": 2, "better": [2, 11, 12], "would": [2, 5, 8, 11, 12], "photutil": [2, 12], "cython": 2, "lot": 2, "geometri": [2, 11, 12], "return_param": [2, 12], "fals": [2, 12], "apertur": [2, 3, 12], "photometri": 2, "surround": 2, "foci": 2, "higher": 2, "mean": [2, 5, 7, 11, 12], "estim": [2, 11], "ellipticalannulu": [2, 12], "b": [2, 3, 12], "theta": [2, 12], "If": [2, 3, 5, 7, 8, 10, 11], "project_ellipse_doubl": 2, "ringsystemmodelobserv": [2, 12], "ringnam": [2, 12], "combin": 2, "static": [2, 8, 11, 12], "pd": [2, 12], "seti": 2, "uranu": [2, 11, 12], "uranus_rings_t": 2, "node": [2, 12], "jpl": [2, 8, 11, 12], "horizon": [2, 8, 11, 12], "infinit": 2, "resolut": 2, "b_from_a": 2, "semimajor": [2, 12], "eccentr": [2, 12], "semiminor": 2, "calc_abtheta": 2, "ell": 2, "given": [2, 5, 8, 11, 12], "circumfer": 2, "fact": 2, "max": [2, 12], "min": [2, 8], "along": [2, 5], "degre": [2, 3, 8, 11, 12], "double_rot": 2, "vec": 2, "params_r": 2, "agre": [2, 3], "90": [2, 10, 11], "perimet": 2, "all": [2, 5, 11, 12], "r": [2, 7, 8, 10, 11, 12, 13], "t": [2, 5, 7, 8, 10, 11, 12], "inclin": [2, 12], "fraction": 2, "multipli": [2, 3, 11], "pater": [2, 12], "et": [2, 3, 11, 12, 13], "al": [2, 3, 11, 12, 13], "2006": [2, 12], "1016": [2, 3, 12, 13], "j": [2, 3, 12], "icaru": [2, 12], "2005": [2, 12], "08": [2, 3, 11, 12], "011": [2, 12], "plane_project": 2, "direct": [2, 3, 11], "50": [2, 3, 11, 12], "proj_plan": 2, "repres": [2, 12], "euler": 2, "individu": 2, "rel": [2, 5, 12], "The": [2, 5, 10, 12, 13], "w_sy": 2, "i_si": 2, "omega_si": 2, "two": [2, 3, 12], "gamma": [2, 3, 12], "beta": [2, 12], "alpha": [2, 8, 12], "total": 2, "matrix": [2, 11], "build": [2, 5], "doubl": 2, "those": [2, 3, 5, 10, 12], "re": [2, 5, 6, 11], "simul": [2, 11], "en": [2, 3], "wikipedia": [2, 3], "wiki": [2, 3], "euler_angl": 2, "orbital_el": 2, "euler_angle_transform": 2, "distanc": [2, 3, 11, 12], "unitless": 2, "back": [2, 12], "after": [2, 7, 12], "follow": [2, 5, 11], "kei": [2, 8], "f0": 2, "f1": 2, "other": [2, 5, 8, 11, 12], "ring_area": 2, "delta_width": 2, "open": [2, 5, 6, 7, 10, 11, 12], "peri": [2, 12], "apo": 2, "asymmetri": 2, "averag": [2, 3], "asymmetr": 2, "apoapsis_width": 2, "periapsis_width": 2, "apoapsi": [2, 12], "minu": 2, "periapsi": [2, 12], "molter": 2, "2019": [2, 11, 12], "3881": [2, 11], "ab258c": 2, "vector_ellips": 2, "u": [2, 5, 11, 12], "v": [2, 8, 12], "equat": 2, "dimens": [2, 3, 12], "perpendicular": 2, "math": 2, "stackexchang": 2, "com": [2, 7, 11], "question": [2, 5], "3994666": 2, "parametr": 2, "3d": 2, "text": [2, 5, 7], "In": [2, 3, 12], "20the": 2, "20parametr": 2, "20equat": 2, "20x": 2, "20point": 2, "20with": 2, "20minimum": 2, "20curvatur": 2, "vector_magnitud": 2, "magnitud": 2, "bit": 2, "faster": 2, "linalg": 2, "norm": 2, "vector_norm": 2, "zero": [2, 3, 11, 12, 13], "name": [3, 8, 11], "epoch": [3, 8, 10, 11, 12], "instanti": [3, 11, 12], "attribut": [3, 9, 11], "yaml": [3, 5, 8, 11], "match": 3, "usag": [3, 5], "import": [3, 7, 8, 11, 12, 13], "jup": [3, 8, 10], "jupit": [3, 8, 12], "app_dia_max": 3, "app_dia_min": 3, "arcsec": [3, 8, 11, 12, 13], "30": [3, 7, 10, 11, 12], "print": [3, 8, 11, 12, 13], "au": [3, 8, 12], "earth": [3, 8], "appar": 3, "size": [3, 10, 11, 12], "app_dia": 3, "todai": 3, "epoch_datetim": 3, "93796102228318": 3, "33": [3, 12], "2009": 3, "2023": 3, "04": 3, "26": [3, 8, 12], "16": [3, 8, 12], "32": 3, "54": [3, 8], "i_over_f": [3, 13], "observed_flux": [3, 13], "bp": [3, 13], "target_sun_dist": 3, "target_omega": 3, "definit": [3, 13], "hammel": [3, 13], "1989": [3, 13], "0019": [3, 12, 13], "1035": [3, 13], "89": [3, 13], "90149": [3, 13], "8": [3, 8, 10, 11, 12, 13], "erg": [3, 13], "cm": [3, 12, 13], "um": [3, 13], "wl": [3, 13], "tran": [3, 13], "filter": [3, 11, 13], "transmiss": [3, 13], "matter": 3, "sr": [3, 13], "unresolv": 3, "solid": [3, 13], "resolv": 3, "wavelength": [3, 5, 13], "f": [3, 6, 8, 10, 11, 12], "sun_flux_earth": 3, "arvesen": 3, "1969": 3, "h": [3, 8, 12, 13], "band": [3, 5, 11, 12, 13], "1364": 3, "ao": 3, "002215": 3, "beam_area": [3, 13], "beamx": [3, 13], "beami": [3, 13], "psf": [3, 10, 11, 12], "fwhm": [3, 10, 11], "either": [3, 5, 10, 11, 12], "circular": 3, "depend": [3, 7], "fwhm_x": [3, 11], "fwhm_y": [3, 11], "theta_deg": [3, 11], "support": [3, 7, 11, 12], "simpli": [3, 7, 11, 12], "insensit": 3, "dtype": 3, "fourier_deconvolv": 3, "psf_desir": 3, "0003": 3, "reproduc": 3, "pat": 3, "fry": 3, "fourier": [3, 11], "deconvolut": 3, "cunningham": 3, "anthoni": 3, "odd": 3, "3e": 3, "tikhonov": 3, "regular": 3, "prevent": 3, "denomin": 3, "deconvolv": 3, "inverse_planck": 3, "freq": [3, 13], "jy": [3, 13], "densiti": [3, 12], "ghz": [3, 13], "frequenc": 3, "k": [3, 11, 12, 13], "inverse_rayleigh_jean": 3, "rayleigh": [3, 13], "jean": [3, 13], "jybm_to_jysr": [3, 13], "jybm_to_tb": 3, "scienc": [3, 6, 11], "nrao": 3, "edu": [3, 6], "facil": 3, "vla": [3, 8], "propos": 3, "tbconv": 3, "jysr_to_jybm": 3, "planck": [3, 13], "rayleigh_criterion": 3, "m": [3, 12, 13], "diamet": 3, "telescop": [3, 11], "diffract": 3, "limit": 3, "rayleigh_jean": [3, 13], "rebin": 3, "arr": 3, "simpl": [3, 12], "integ": 3, "bin": 3, "numpi": [3, 5, 8, 10, 11, 12, 13], "solar_spectrum": 3, "load": [3, 8, 12], "gueymard": 3, "standard": [3, 10], "spectrum": 3, "solen": 3, "2003": 3, "039": 3, "access": [3, 8, 11], "nrel": 3, "gov": [3, 11], "resourc": 3, "spectra": 3, "solid_angl": [3, 13], "small": [3, 8, 12], "facet": 3, "dist": [3, 12], "flat": 3, "210": [3, 13], "proteu": [3, 11, 13], "496e8": 3, "neptun": [3, 11, 12], "14": [3, 12, 13], "tb_to_jybm": [3, 13], "bm": 3, "kelvin": 3, "pleas": [4, 5, 11], "softwar": 4, "research": [4, 6], "zenodo": 4, "thank": 5, "consid": [5, 11], "step": [5, 12, 13], "below": [5, 8, 11, 12], "github": [5, 7, 11], "flow": 5, "mai": 5, "help": 5, "git": [5, 7], "issu": [5, 7], "describ": [5, 11], "problem": [5, 10], "intend": 5, "solv": [5, 10], "we": [5, 7, 8, 10, 11, 12, 13], "pretti": 5, "lax": 5, "how": [5, 10, 11, 12], "present": 5, "still": 5, "might": [5, 11], "through": 5, "quickstart": 5, "fork": 5, "main": [5, 7], "branch": 5, "repositori": 5, "recommend": [5, 11], "command": 5, "includ": 5, "setup": 5, "synchron": 5, "upstream": 5, "your": [5, 7, 11], "chang": [5, 10, 11, 12], "develop": 5, "section": 5, "start": [5, 12], "convers": [5, 6, 9], "comment": [5, 12], "submit": [5, 8], "draft": 5, "pull": [5, 8, 11], "request": [5, 8], "strongli": 5, "encourag": 5, "earli": 5, "It": [5, 11, 12], "link": 5, "when": [5, 7, 12], "readi": 5, "review": 5, "understand": [5, 11], "nearli": 5, "alwai": 5, "upon": 5, "welcom": 5, "test": [5, 10, 11, 12], "highli": [5, 11], "can": [5, 10, 11, 12], "built": 5, "up": [5, 10, 11, 12], "time": [5, 8, 10, 11, 12], "At": 5, "necessari": [5, 12], "modul": 5, "minimum": [5, 12], "discuss": [5, 12], "page": [5, 8, 11], "receiv": 5, "feedback": 5, "larg": [5, 8], "doesn": [5, 10, 12], "anywher": 5, "els": [5, 11], "subdirectori": 5, "__init__": 5, "py": [5, 10, 11, 12], "add": [5, 8, 12], "directori": [5, 7], "test_featur": 5, "within": [5, 11, 12], "try": [5, 7, 11], "conform": 5, "docstyl": 5, "major": 5, "jupyt": 5, "notebook": [5, 11, 12], "provid": 5, "gener": 5, "tool": [5, 6, 8, 12], "process": 5, "As": [5, 10, 12], "remain": 5, "agnost": 5, "observatori": [5, 11], "etc": [5, 8, 12], "anoth": 5, "go": [5, 10, 12], "primarili": 5, "relev": 5, "singl": 5, "place": [5, 12], "separ": 5, "portion": 5, "could": [5, 8, 10, 11, 13], "them": [5, 11, 12], "packag": [5, 7, 10, 11], "written": [5, 11], "everi": [5, 11, 12], "adher": 5, "ecosystem": 5, "whenev": 5, "possibl": 5, "tabl": [5, 8, 11, 12], "aspir": 5, "keep": [5, 11], "mind": 5, "bring": 5, "addit": [5, 11], "necess": 5, "well": [5, 11, 12], "justifi": 5, "exist": [5, 11, 12], "approv": 5, "team": 5, "reason": [5, 7, 8, 11], "No": 5, "realli": [5, 12], "There": [5, 10, 11], "littl": 5, "voic": 5, "insid": 5, "head": 5, "tell": 5, "sourc": [5, 6, 11], "contributor": 5, "skill": 5, "aren": 5, "enough": [5, 12], "possibli": 5, "offer": 5, "assur": 5, "wrong": 5, "fantast": 5, "wai": [5, 12], "advanc": 5, "perfect": [5, 12], "isn": 5, "measur": [5, 12, 13], "disqualifi": 5, "creat": [5, 7], "someth": [5, 12], "mistak": 5, "learn": [5, 12], "That": 5, "improv": [5, 10], "happi": [5, 10, 11], "Being": 5, "just": [5, 7, 10, 11, 12], "out": [5, 11], "even": [5, 8, 10], "ye": 5, "some": [5, 7, 8, 10, 11, 12], "most": [5, 7], "valuabl": 5, "whole": 5, "come": [5, 6, 8], "fresh": 5, "ey": 5, "so": [5, 7, 8, 10, 11, 12], "assumpt": 5, "season": 5, "gloss": 5, "wa": [5, 7, 10, 11, 12], "adrienn": 5, "low": 5, "pycon": 5, "talk": 5, "adapt": 5, "its": [5, 7, 11], "readm": 5, "metpi": 5, "read": 6, "backplan": 6, "moon": [6, 8, 12], "comparison": [6, 10], "soon": [6, 8], "doppler": 6, "wind": 6, "cube": [], "download": 7, "txt": 7, "raw": 7, "conda": 7, "tester": 7, "python": [7, 10, 11, 12], "9": [7, 8, 10, 11, 12], "7": [8, 10, 11, 12], "activ": 7, "pip": 7, "emolt": [7, 10, 11, 12], "yet": 7, "unreleas": 7, "version": [7, 12], "astroqueri": [7, 8, 11, 12], "pypi": 7, "right": [7, 10, 11, 12], "attempt": 7, "peopl": 7, "had": 7, "found": [7, 10, 11], "never": 7, "run": [7, 11, 12], "folder": [7, 12], "instantli": 7, "crazi": 7, "messag": 7, "ten": 7, "line": [7, 12], "human": 7, "readabl": [7, 8], "huge": 7, "soup": 7, "didn": [7, 10], "button": 7, "conflict": 7, "forc": 7, "reinstal": 7, "persist": 7, "happen": 7, "colleagu": 7, "thing": [7, 11, 12], "bunch": 7, "bracket": 7, "live": 7, "eventu": 7, "filelock": 7, "jsonschema": 7, "basic": 9, "workflow": [9, 11], "pyplot": [8, 10, 11, 12, 13], "plt": [8, 10, 11, 12, 13], "io": [10, 11, 12], "hlsp_wfcj_hst_wfc3": 10, "uvis_jupit": 10, "2017": 10, "pj07_f631n_v2_0711ut0947": 10, "obs_tim": [10, 11, 12], "date": [10, 11, 12], "orientat": 10, "pixscale_arcsec": [10, 11, 12], "hack": 10, "ephem": [8, 10, 11], "npole_ang": [8, 10, 11], "isnan": 10, "mpl_toolkit": [10, 11], "axes_grid1": [10, 11], "make_axes_locat": [10, 11], "ax1": [10, 11, 12], "subplot": [10, 11, 12], "figsiz": [10, 11, 12], "cim": 10, "imshow": [10, 11, 12], "divid": [10, 11, 12], "cax": [10, 11], "append_ax": [10, 11], "pad": [10, 11], "05": [10, 11], "colorbar": [10, 11, 12], "orient": [10, 11], "vertic": [10, 11], "label": [10, 11, 12], "cim1": 10, "cax1": [10, 11], "show": [10, 11, 12, 13], "anaconda3": [10, 11], "lib": [10, 11], "python3": [10, 11], "11": [7, 10, 11, 12, 13], "site": [8, 10, 11], "cr": [10, 11], "176": [10, 11], "userwarn": [10, 11, 12], "39": [8, 10, 11, 12], "globe": [10, 11], "warn": [10, 11], "__class__": [10, 11], "__name__": [10, 11], "chose": 10, "ad": 10, "hoc": 10, "sinc": 10, "know": 10, "15e4": 10, "whatev": [10, 11], "expon": [10, 11], "spread": [10, 11], "veri": [10, 12], "left": 10, "dark": 10, "neg": [10, 11], "upper": 10, "indic": 10, "let": [10, 11, 12, 13], "side": 10, "both": [10, 12], "ax0": [10, 11, 12], "15": [10, 11, 12, 13], "real": [10, 12], "somewher": [10, 11], "toward": 10, "wherea": 10, "our": [10, 11], "brightest": 10, "6": [8, 10, 11, 12, 13], "again": 10, "minnaert_k": 10, "close": [10, 11], "resembl": 10, "inde": 10, "less": 10, "closer": 10, "represent": 10, "appear": [10, 11], "halo": [10, 11], "entir": 10, "probabl": [10, 11], "due": [10, 11, 12], "improp": 10, "star": 10, "ahead": [10, 12], "onc": 10, "move": 10, "new": [10, 12], "continu": 10, "fudg": 10, "stage": 10, "visual": [10, 12], "bang": 10, "nice": [10, 12], "opal": [6, 10, 11], "program": [6, 10, 11], "isplanet": 10, "copi": 10, "cmap": [10, 12], "cividi": 10, "cs0": 10, "contour": [10, 12], "level": [10, 12], "arang": [10, 12], "color": [10, 12], "white": 10, "clabel": 10, "inlin": 10, "fontsiz": [10, 12], "20": [8, 10, 12], "desktop": 10, "delet": [10, 11], "me": 10, "showcas": [11, 12], "subpackag": [11, 12], "200": 11, "25": [11, 12], "251": [8, 11], "285": 11, "25560": 11, "24970": 11, "call": [11, 12], "deg_per_px": 11, "One": 11, "1f": 11, "lat": [11, 12], "extent": [11, 12], "ax2": [11, 12], "ax3": 11, "im0": 11, "set_titl": 11, "im1": 11, "im2": 11, "im3": 11, "im": [11, 12], "enumer": [11, 12], "set_xlabel": [11, 12], "set_ylabel": [11, 12], "tight_layout": 11, "leverag": 11, "brighten": 11, "sever": 11, "anyth": 11, "doc": [8, 11], "too": [11, 12], "99": [8, 11], "lddisk": 11, "inherit": 11, "everyth": 11, "enabl": 11, "abov": [11, 12, 13], "easi": [11, 12], "inform": [8, 11], "automat": 11, "interest": 11, "radii": [8, 11, 12], "unlik": 11, "plan": 11, "optim": 11, "28": [11, 12], "009971": 11, "keck": [6, 11, 12], "ura": [11, 12], "568": [11, 12], "maunakea": 11, "keyword": [8, 11], "240": 11, "2f": [11, 13], "suit": 11, "later": 11, "misc": 11, "hdf5": 11, "write_table_hdf5": 11, "serialize_meta": 11, "overwrit": 11, "keck_uranu": 11, "npy": [11, 12], "25559": 11, "24973": 11, "386": 11, "97": [8, 11], "261": 11, "0522": 11, "136": 11, "turn": 11, "h_2019oct28": 11, "urh60": [11, 12], "expstart": [11, 12], "100": [11, 12, 13], "easili": [11, 12], "befor": [11, 12], "desir": 11, "ve": 11, "itself": [8, 11], "achiev": 11, "routin": 11, "2000": 11, "fwhm_keck": 11, "rms_nois": 11, "std": [11, 12], "600": [11, 12], "900": 11, "250": [8, 11], "wonder": 11, "truli": 11, "133": 11, "455078125": 11, "943359375": 11, "005859375": 11, "00390625": 11, "accuraci": 11, "obviou": 11, "faint": 11, "imperfect": 11, "particularli": 11, "dx_canni": 11, "dy_canni": 11, "_": 11, "1e": 11, "01": [8, 11, 12, 13], "126": 11, "830078125": 11, "416015625": 11, "align": 11, "somewhat": 11, "NOT": [8, 11], "actual": 11, "intent": 11, "allow": 11, "until": [11, 12], "altern": 11, "final": 11, "pix": [11, 12], "set_ytick": 11, "set_aspect": 11, "lat_g_keck": 11, "souami": 11, "prep": [], "own": 11, "cite": 11, "centroid": 11, "stack": 11, "frame": [11, 12], "24764": 11, "24341": 11, "footnot": [11, 12], "url": 11, "nssdc": 11, "gsfc": 11, "nasa": 11, "factsheet": 11, "neptunefact": 11, "affili": 11, "texttt": 11, "coeffici": 11, "867": 11, "2018": 11, "hst": [6, 11], "blue": [11, 12], "lmk": 11, "anyon": 11, "ir": 11, "aaa6d6": 11, "optic": [11, 12], "field": 11, "registr": 11, "carri": 11, "discret": 11, "transform": 11, "techniqu": 11, "keflavich": 11, "yield": 11, "delta": [8, 11, 12], "chi": 11, "criterion": 11, "vari": 11, "rang": [11, 12], "idl": 11, "mu_project": 11, "mu0_project": 11, "target_x_point": 11, "target_y_point": 11, "axes_divid": 11, "360": [11, 12], "ax0_divid": 11, "cax0": 11, "cb0": 11, "count": 11, "ax1_divid": 11, "cb1": 11, "set_xtick": [11, 12], "structur": 11, "qualiti": 11, "whether": 11, "straight": 11, "incorrect": [11, 12], "curv": [11, 13], "oversampl": 11, "caus": 11, "unusu": 11, "artifact": 11, "On": 11, "hand": 11, "nearest": 11, "neighbor": 11, "interpol": 11, "smoother": 11, "12": [7, 11, 12], "300": [11, 12], "13": [8, 11, 12], "ccr": 11, "img_glob": 11, "semimajor_axi": 11, "semiminor_axi": 11, "custom_project": 11, "robinson": 11, "central_longitud": 11, "custom_shap": 11, "earthloc": 12, "jplhorizon": 12, "datetim": [8, 12], "timedelta": 12, "51149": 12, "80": 12, "imsiz": 12, "500": 12, "ringmodel": 12, "scatter": 12, "cyan": 12, "marker": 12, "savefig": 12, "example_epsilon_r": 12, "png": 12, "infinitesim": 12, "mathemat": 12, "construct": 12, "astronom": 12, "context": 12, "properti": 12, "ringmodel2": 12, "001": 12, "10000": 12, "suppos": 12, "done": [12, 13], "under": 12, "hood": 12, "sai": [8, 12], "ann": 12, "lt": 12, "gt": 12, "cast": 12, "as_2d_array_testarr": 12, "saturn": 12, "interfac": 12, "queri": 12, "proper": 12, "fulli": 12, "edit": 12, "2020": 12, "00": 12, "alma_coord": 12, "67": 12, "755": 12, "23": 12, "029": 12, "5000": 12, "alt": 12, "six": 12, "five": 12, "four": 12, "eta": 12, "epoch_astropi": 12, "iso": 12, "utc": 12, "alma_coords_astropi": 12, "399": 12, "alma": 12, "uranus_r": 12, "ringtabl": 12, "pprint_al": 12, "pericent": 12, "ascend": 12, "middl": 12, "boundari": 12, "depth": 12, "associ": 12, "302": 12, "34": [8, 12], "41838": 12, "53": [8, 12], "00102": 12, "0607": 12, "narrow": 12, "dens": 12, "259": 12, "372": 12, "282": 12, "42234": 12, "0559": 12, "147": 12, "31": 12, "154": 12, "42571": 12, "00106": 12, "032": 12, "69": [8, 12], "61": 12, "44718": 12, "46": 12, "00076": 12, "015": 12, "357": 12, "656": 12, "224": 12, "45661": 12, "49": [8, 12], "000442": 12, "005": 12, "47176": 12, "197": 12, "409": 12, "47627": 12, "001092": 12, "ophelia": 12, "amplitud": 12, "48300": 12, "cordelia": 12, "domin": 12, "330": [8, 12], "071": 12, "58": 12, "00794": 12, "nan": 12, "shepherd": 12, "made": 12, "notic": 12, "decid": 12, "flexibl": 12, "plai": 12, "ephemerid": [9, 12], "directli": 12, "65000": 12, "120": 12, "dusti": 12, "uranus_rings_dusti": 12, "zeta": 12, "ura_system_testarr": 12, "39600": 12, "3500": 12, "weak": 12, "often": 12, "lack": 12, "get": [12, 13], "urk140": 12, "009942": 12, "keck_coord": 12, "155": [8, 12], "4744": 12, "19": 12, "8264": 12, "4145": 12, "start_tim": 12, "strptime": 12, "end_tim": 12, "minut": 12, "stop": 12, "strftime": 12, "1m": 12, "keck_coords_astropi": 12, "convert": 12, "obj": 12, "id": 12, "799": 12, "d_au": 12, "tan": 12, "deg2rad": 12, "3600": 12, "naxis1": 12, "07": [8, 12], "56": 12, "135": 12, "79696138751703": 12, "ura_keck": 12, "model_keck_ob": 12, "sz": 12, "vmin": 12, "vmax": 12, "ep": 12, "4000": 12, "25000": 12, "1500": 12, "avec": 12, "bvec": 12, "ann_patch": 12, "red": 12, "lw": 12, "quiver": 12, "xy": 12, "scale_unit": 12, "argument": 12, "legend": 12, "arbitrari": 12, "aperturestat": 12, "stat": 12, "to_tabl": 12, "median": 12, "var": 12, "sum": 12, "36": [8, 12], "14308731686408": 12, "11417579650879": 12, "811333204522843": 12, "1011": 12, "9609202491774": 12, "1818902": 12, "802280782": 12, "worth": 12, "miss": 12, "sidelob": 12, "practic": 12, "r_in": 12, "35000": 12, "r_out": 12, "r_step": 12, "zeroe_r": 12, "sum_method": 12, "subpixel": 12, "brg": 12, "expect": 12, "single_r": 12, "axvlin": 12, "linestyl": 12, "set_xticklabel": 12, "get_xtick": 12, "tick_param": 12, "labels": 12, "unconvert": 12, "g0": 12, "r491pzqx4kx0tfmpx8970ntm0000gn": 12, "ipykernel_49546": 12, "668933652": 12, "fixedformatt": 12, "togeth": 12, "fixedloc": 12, "17": [8, 12], "thetas_implan": 12, "wedge_sum": 12, "data_sum": 12, "extraction_region": 12, "wedge_data": 12, "append": 12, "nansum": 12, "18": [12, 13], "hot": 12, "peri_angl": 12, "arctan2": 12, "apo_angl": 12, "mid": 12, "green": 12, "rad": 12, "twinx": 12, "fsc": 12, "seen": 12, "roughli": [12, 13], "geometr": 12, "account": 12, "howev": 12, "themselv": 12, "calcul": 12, "accordingli": 12, "experi": 12, "evid": 12, "def": 12, "deal": 12, "ab": 12, "sin": 12, "21": 12, "22": [8, 12], "autumn": 12, "24": 12, "sharex": 12, "black": 12, "orang": 12, "uniform": 12, "wide": 12, "captur": 12, "otherwis": 12, "interact": 12, "fun": 12, "anim": 12, "bump": 12, "initi": 12, "mani": 12, "slightli": 12, "slower": 12, "But": 12, "pre": 12, "solarsystem": 12, "ringnod": 12, "epoch_0": 12, "2022": 12, "09": 12, "wval": 12, "dai": 12, "bodyt": 12, "cach": 12, "loc_indic": 12, "asarrai": 12, "state": 12, "model0": 12, "img0": 12, "sequenti": 12, "progress": 12, "increas": 12, "get_arrai": 12, "set_arrai": 12, "funcanim": 12, "farg": 12, "interv": 12, "blit": 12, "epsilon_precess": 12, "gif": 12, "fp": 12, "27": [8, 12], "ipython": 12, "displai": 12, "height": 12, "wider": 12, "thin": 12, "thick": 12, "act": 12, "especi": 12, "broad": 12, "sort": 12, "radi": 12, "transfer": 12, "eas": 12, "decis": [], "115": 13, "271": 13, "jybm": 13, "jysr": 13, "translat": 13, "jysr_rj": 13, "beama": 13, "17426102873442623": [], "40851198324": [], "166": [], "40822885793": [], "88541": [], "39704080358": [], "999504": [], "18129440567308777": [], "7e": 13, "neptune_earth_dist": 13, "6e9": 13, "neptune_sun_dist": 13, "3e9": 13, "2e": 13, "25e10": 13, "6f": 13, "linspac": 13, "micron": 13, "75": 13, "45": 13, "xlabel": 13, "ylabel": 13, "wl_eff": 13, "ioverf": 13, "5e8": 13, "55e": 13, "000278": 13, "mass": 8, "t_rot_hr": [], "sider": [], "71492": 8, "66854": 8, "925": 8, "targetnam": 8, "datetime_str": 8, "datetime_jd": 8, "solar_pres": 8, "lunar_pres": 8, "ra": 8, "dec": 8, "ra_app": 8, "dec_app": 8, "ra_rat": 8, "dec_rat": 8, "az": 8, "el": 8, "az_rat": 8, "el_rat": 8, "sat_x": 8, "sat_i": 8, "sat_pang": 8, "siderealtim": 8, "airmass": 8, "magextinct": 8, "surfbright": 8, "illumin": 8, "illum_defect": 8, "sat_sep": 8, "sat_vi": 8, "ang_width": 8, "pdobslon": 8, "pdobslat": 8, "pdsunlon": 8, "pdsunlat": 8, "subsol_ang": 8, "subsol_dist": 8, "npole_dist": 8, "ecllon": 8, "ecllat": 8, "r_rate": 8, "delta_r": 8, "lighttim": 8, "vel_sun": 8, "vel_ob": 8, "elong": 8, "elongflag": 8, "lunar_elong": 8, "lunar_illum": 8, "sat_alpha": 8, "suntargetpa": 8, "velocitypa": 8, "orbplaneang": 8, "constel": 8, "tdb": 8, "ut": 8, "obsecllon": 8, "obsecllat": 8, "npole_ra": 8, "npole_dec": 8, "glxlon": 8, "glxlat": 8, "solartim": 8, "earth_lighttim": 8, "ra_3sigma": 8, "dec_3sigma": 8, "smaa_3sigma": 8, "smia_3sigma": 8, "theta_3sigma": 8, "area_3sigma": 8, "rss_3sigma": 8, "r_3sigma": 8, "r_rate_3sigma": 8, "sband_3sigma": 8, "xband_3sigma": 8, "doppdelay_3sigma": 8, "true_anom": 8, "hour_angl": 8, "alpha_tru": 8, "pablon": 8, "pablat": 8, "mag": 8, "arcsec2": 8, "hz": 8, "599": 8, "aug": [], "2460184": [], "386273148": [], "43": 8, "08396": [], "13178": [], "41099": [], "2294": [], "768455": [], "628637": [], "400056": [], "19132": [], "289": [], "969": [], "999": 8, "556": [], "358": [], "0638": [], "4061": [], "391899": [], "37403": [], "172": [], "679298": [], "828957": [], "183": [], "797149": [], "470775": [], "73": [], "64": 8, "342": [], "3435": [], "235": [], "0487": [], "1952": [], "964904491942": [], "2177477": [], "54524552110738": [], "9001155": [], "37": 8, "80165431": [], "6749375": [], "1445703": [], "108": [], "8608": [], "l": [], "1068": [], "85": [], "2622": [], "0323": [], "253": [], "554": [], "252": [], "316": [], "23345": [], "ari": 8, "182719": [], "48364": [], "3033406": [], "268": 8, "05805": [], "49679": [], "161": [], "353279": [], "38": [], "556696": [], "7846": [], "105": [], "5995": [], "2564": [], "sl9": 8, "impact": 8, "1994": 8, "jul": [], "2449550": [], "342361111": [], "213": [], "25946": [], "18286": [], "19106": [], "15803": [], "902723": [], "87891": [], "103": [], "892463": [], "205187": [], "501": [], "78": [], "725": [], "51": [], "326174": [], "120437": [], "47": [], "98": [], "876": [], "6713333887": [], "541": [], "14532": [], "3284": [], "363714": [], "42845": [], "81": [], "605459": [], "417513": [], "70": 8, "98207": [], "56489": [], "6435": 8, "936": [], "225": [], "7758": [], "0648": [], "417202860036": [], "3161016": [], "13020024376608": [], "7802051": [], "42": [], "66657439": [], "534906": [], "6589241": [], "101": [], "0317": [], "608": [], "924": [], "59": [], "9989": [], "68": [], "3603": [], "109": [], "651": [], "06118": [], "vir": [], "183653": [], "215": [], "0912804": [], "124912": [], "05799": [], "4958": [], "332": [], "296937": [], "984193": [], "9415708964": [], "000354": [], "4525": [], "541404253": [], "609": [], "220": [], "468": [], "0993": [], "glibcxx_3": 7, "scipi": 7, "spatial": 7, "fft": 7, "essenti": [], "conveni": 8, "simultan": 8, "A": 8, "complet": 8, "avail": 8, "bodynam": 8, "feel": 8, "think": 8, "period": 8, "t_rot": 8, "89813e": 8, "kg": 8, "2024": 8, "feb": 8, "2460356": [], "445833333": [], "71536": [], "50732": [], "04066": [], "61524": [], "91843": [], "314135": [], "239181": [], "217": [], "94376": [], "726": [], "71": 8, "089": [], "368": [], "10414": [], "3394": [], "260558": [], "8854": [], "199": [], "784459": [], "322853": [], "188": [], "909043": [], "561837": [], "79": [], "57": [], "340": 8, "4068": [], "684": [], "6467": [], "0113": [], "994157410011": [], "3680468": [], "20373668670031": [], "6318561": [], "27815834": [], "5978592": [], "6996747": [], "72": [], "3774": [], "864": [], "856": [], "7719": [], "96": [], "7585": [], "713": [], "757": [], "17774": [], "185102": [], "114384": [], "9681692": [], "05798": 8, "49676": 8, "595835": [], "231789": [], "35": 8, "0437": [], "8624": [], "44": 8, "2121": [], "9953": [], "descript": 8, "short": [8, 11], "74e": 13, "09e": 13, "08e": 13, "97e": 13, "giant": 6, "radio": 6, "twilight": 6, "zone": 6, "www2": 6, "hawaii": 6, "inst": 6, "tda": 6, "twilightzon": 6, "archiv": 6, "stsci": 6, "hlsp": 6, "incl": 6, "goddard": 6, "berkelei": 6, "caltech": 6, "group": 6, "variou": 13, "2460357": 8, "435925926": 8, "85163": 8, "55608": 8, "17703": 8, "6638": 8, "24777": 8, "405086": 8, "236592": 8, "038": 8, "93318": 8, "397": 8, "883": 8, "247": 8, "367": 8, "11266": 8, "3352": 8, "257467": 8, "77511": 8, "341": 8, "477974": 8, "321298": 8, "654615": 8, "5616": 8, "84": 8, "4461": 8, "633": 8, "7359": 8, "994368223878": 8, "3705009": 8, "21892932831983": 8, "5051497": 8, "40451169": 8, "5960881": 8, "8759252": 8, "5187": 8, "8122": 8, "4432": 8, "6692": 8, "762": 8, "787": 8, "1803": 8, "185123": 8, "2554843": 8, "9641561": 8, "720533": 8, "123915": 8, "3806": 8, "8104": 8, "3273": 8, "9926": 8, "20234": 11}, "objects": {"pylanetary.navigation": [[1, 0, 0, "-", "core"]], "pylanetary.navigation.core": [[1, 1, 1, "", "ModelBody"], [1, 1, 1, "", "ModelEllipsoid"], [1, 1, 1, "", "Nav"], [1, 3, 1, "", "colocate_diagnostic_plot"], [1, 3, 1, "", "emission_angle"], [1, 3, 1, "", "lat_lon"], [1, 3, 1, "", "limb_darkening"], [1, 3, 1, "", "rotate_about_pivot"], [1, 3, 1, "", "surface_normal"]], "pylanetary.navigation.core.ModelEllipsoid": [[1, 2, 1, "", "ldmodel"], [1, 2, 1, "", "zonalmodel"]], "pylanetary.navigation.core.Nav": [[1, 2, 1, "", "colocate"], [1, 2, 1, "", "reproject"], [1, 2, 1, "", "write"], [1, 2, 1, "", "xy_shift_data"], [1, 2, 1, "", "xy_shift_model"]], "pylanetary.rings": [[2, 0, 0, "-", "core"]], "pylanetary.rings.core": [[2, 1, 1, "", "Ring"], [2, 1, 1, "", "RingSystemModelObservation"], [2, 3, 1, "", "b_from_ae"], [2, 3, 1, "", "calc_abtheta"], [2, 3, 1, "", "double_rotate"], [2, 3, 1, "", "foreshortening"], [2, 3, 1, "", "plane_project"], [2, 3, 1, "", "project_ellipse_double"], [2, 3, 1, "", "ring_area"], [2, 3, 1, "", "vector_ellipse"], [2, 3, 1, "", "vector_magnitude"], [2, 3, 1, "", "vector_normalize"]], "pylanetary.rings.core.Ring": [[2, 2, 1, "", "as_2d_array"], [2, 2, 1, "", "as_azimuthal_wedges"], [2, 2, 1, "", "as_elliptical_annulus"]], "pylanetary.rings.core.RingSystemModelObservation": [[2, 2, 1, "", "as_2d_array"]], "pylanetary.utils": [[3, 0, 0, "-", "core"]], "pylanetary.utils.core": [[3, 1, 1, "", "Body"], [3, 3, 1, "", "I_over_F"], [3, 3, 1, "", "beam_area"], [3, 3, 1, "", "convolve_with_beam"], [3, 3, 1, "", "fourier_deconvolve"], [3, 3, 1, "", "inverse_planck"], [3, 3, 1, "", "inverse_rayleigh_jeans"], [3, 3, 1, "", "jybm_to_jysr"], [3, 3, 1, "", "jybm_to_tb"], [3, 3, 1, "", "jysr_to_jybm"], [3, 3, 1, "", "planck"], [3, 3, 1, "", "rayleigh_criterion"], [3, 3, 1, "", "rayleigh_jeans"], [3, 3, 1, "", "rebin"], [3, 3, 1, "", "solar_spectrum"], [3, 3, 1, "", "solid_angle"], [3, 3, 1, "", "tb_to_jybm"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"pylanetari": [0, 6], "api": [0, 1, 2, 3], "navig": [1, 10, 11], "ring": [2, 12], "util": [3, 8], "cite": 4, "contribut": 5, "workflow": [5, 10], "new": 5, "featur": [5, 6], "import": [5, 10], "guidelin": 5, "depend": 5, "impost": 5, "syndrom": 5, "disclaim": 5, "instal": 7, "troubleshoot": 7, "tutori": [9, 12], "lat": 10, "lon": 10, "grid": [10, 11], "jupit": 10, "hst": 10, "data": [10, 11, 12, 13], "scrape": 10, "header": 10, "instanti": 10, "nav": [10, 11], "object": [10, 12], "attempt": 10, "co": 10, "locat": 10, "assess": 10, "fit": [10, 11], "qualiti": 10, "re": 10, "try": 10, "better": 10, "model": [10, 11, 12], "appli": 10, "shift": 10, "plot": 10, "write": 10, "basic": [11, 12], "planet": 11, "disk": 11, "beam": [11, 12], "convolv": [11, 12], "limb": 11, "darken": 11, "correspond": 11, "real": 11, "observ": [11, 12], "The": [8, 11], "modelbodi": 11, "class": 11, "compar": 11, "summari": 11, "coloc": 11, "method": 11, "save": 11, "reproject": 11, "onto": 11, "rectilinear": 11, "polar": 11, "project": [6, 11], "custom": 11, "cartopi": 11, "finit": 12, "width": 12, "bright": 12, "mask": 12, "system": 12, "modifi": 12, "default": 12, "minor": 12, "flux": 12, "exampl": 12, "analysi": 12, "extract": 12, "total": 12, "radial": 12, "profil": 12, "azimuth": 12, "A": 12, "note": 12, "foreshorten": 12, "movi": 12, "epsilon": 12, "precess": 12, "loos": 12, "end": 12, "do": 12, "list": 12, "unit": 13, "convers": 13, "i": 13, "f": 13, "calcul": 13, "bodi": 8, "moon": [], "attribut": 8, "access": [], "ephemerid": 8, "learn": 11, "more": 11, "radio": 13, "us": 6, "planetari": 8}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "nbsphinx": 4, "sphinx": 60}, "alltitles": {"pylanetary API": [[0, "pylanetary-api"]], "Navigation API": [[1, "module-pylanetary.navigation.core"]], "Rings API": [[2, "module-pylanetary.rings.core"]], "Utils API": [[3, "module-pylanetary.utils.core"]], "Citing": [[4, "citing"]], "Contributing": [[5, "contributing"]], "Contribution Workflow": [[5, "contribution-workflow"]], "New Features": [[5, "new-features"]], "Important Guidelines": [[5, "important-guidelines"]], "Dependencies": [[5, "dependencies"]], "Imposter syndrome disclaimer": [[5, "imposter-syndrome-disclaimer"]], "Navigation Workflow": [[10, "Navigation-Workflow"]], "lat-lon grid for Jupiter HST data": [[10, "lat-lon-grid-for-Jupiter-HST-data"]], "import the data and scrape header": [[10, "import-the-data-and-scrape-header"]], "instantiate a Nav object": [[10, "instantiate-a-Nav-object"]], "attempt co-locate": [[10, "attempt-co-locate"]], "assess fit quality": [[10, "assess-fit-quality"]], "re-try with better model": [[10, "re-try-with-better-model"]], "applying the shift": [[10, "applying-the-shift"]], "plotting and writing": [[10, "plotting-and-writing"]], "Installation": [[7, "installation"]], "Troubleshooting": [[7, "troubleshooting"]], "Tutorials": [[9, "tutorials"]], "pylanetary": [[6, "pylanetary"]], "Features": [[6, "features"]], "Projects using pylanetary": [[6, "projects-using-pylanetary"]], "Unit Conversions": [[13, "Unit-Conversions"]], "conversions for radio data": [[13, "conversions-for-radio-data"]], "I/F calculation": [[13, "I/F-calculation"]], "Planetary Body Attributes & Ephemerides": [[8, "Planetary-Body-Attributes-&-Ephemerides"]], "The Body utility": [[8, "The-Body-utility"]], "Navigation Basics": [[11, "Navigation-Basics"]], "Basic planet disk model": [[11, "Basic-planet-disk-model"]], "Beam-convolved limb-darkened disk model": [[11, "Beam-convolved-limb-darkened-disk-model"]], "Model corresponding to real observations": [[11, "Model-corresponding-to-real-observations"]], "The ModelBody class": [[11, "The-ModelBody-class"]], "The Nav class": [[11, "The-Nav-class"]], "Comparing models with data": [[11, "Comparing-models-with-data"]], "Learn More": [[11, "Learn-More"]], "Save as fits": [[11, "Save-as-fits"]], "Reproject data onto rectilinear grid": [[11, "Reproject-data-onto-rectilinear-grid"]], "Polar projection": [[11, "Polar-projection"]], "Custom Cartopy projection": [[11, "Custom-Cartopy-projection"]], "summary of nav.colocate methods": [[11, "summary-of-nav.colocate-methods"]], "Rings Tutorial": [[12, "Rings-Tutorial"]], "Basic model ring": [[12, "Basic-model-ring"]], "Finite width and brightness": [[12, "Finite-width-and-brightness"]], "Ring objects as masks": [[12, "Ring-objects-as-masks"]], "convolve model ring with beam": [[12, "convolve-model-ring-with-beam"]], "Model ring system observation": [[12, "Model-ring-system-observation"]], "modifying ring system defaults": [[12, "modifying-ring-system-defaults"]], "minor rings": [[12, "minor-rings"]], "modifying widths and fluxes": [[12, "modifying-widths-and-fluxes"]], "Example Analysis with Observational Data": [[12, "Example-Analysis-with-Observational-Data"]], "Extract total ring flux": [[12, "Extract-total-ring-flux"]], "Radial profile": [[12, "Radial-profile"]], "Azimuthal profile": [[12, "Azimuthal-profile"]], "A note on foreshortening": [[12, "A-note-on-foreshortening"]], "Movie of epsilon ring precession": [[12, "Movie-of-epsilon-ring-precession"]], "Loose ends / to-do list": [[12, "Loose-ends-/-to-do-list"]]}, "indexentries": {}})
\ No newline at end of file
+Search.setIndex({"docnames": ["api/index", "api/navigation_api", "api/rings_api", "api/utils_api", "citing", "contributing", "index", "installation", "tutorials/body-tutorial", "tutorials/index", "tutorials/nav-examples", "tutorials/nav-tutorial", "tutorials/rings-tutorial", "tutorials/unit-conversions"], "filenames": ["api/index.rst", "api/navigation_api.rst", "api/rings_api.rst", "api/utils_api.rst", "citing.rst", "contributing.rst", "index.rst", "installation.rst", "tutorials/body-tutorial.ipynb", "tutorials/index.rst", "tutorials/nav-examples.ipynb", "tutorials/nav-tutorial.ipynb", "tutorials/rings-tutorial.ipynb", "tutorials/unit-conversions.ipynb"], "titles": ["pylanetary API", "Navigation API", "Rings API", "Utils API", "Citing", "Contributing", "pylanetary", "Installation", "Planetary Body Attributes &amp; Ephemerides", "Tutorials", "Navigation Workflow", "Navigation Basics", "Rings Tutorial", "Unit Conversions"], "terms": {"navig": [0, 6, 9], "ring": [0, 5, 6, 9], "util": [0, 1, 2, 7, 10, 11, 12, 13], "class": [1, 2, 3, 5, 12], "pylanetari": [1, 2, 3, 5, 7, 8, 10, 11, 12, 13], "core": [1, 2, 3, 5, 12], "modelbodi": 1, "bodi": [1, 2, 3, 9, 10, 11, 12], "pixscal": [1, 2, 10, 12], "shape": [1, 2, 3, 10, 11, 12, 13], "none": [1, 2, 3, 11, 12], "wrapper": [1, 8], "modelellipsoid": [1, 11], "permit": 1, "pass": [1, 2], "an": [1, 2, 3, 5, 8, 10, 11, 12], "ephemeri": [1, 2, 8, 10, 11, 12], "ob_lon": [1, 11], "ob_lat": [1, 11], "pixscale_km": [1, 11], "np_ang": [1, 2, 11], "req": [1, 8, 11], "rpol": [1, 8, 11], "center": [1, 2, 8, 10, 11, 12], "0": [1, 2, 3, 8, 10, 11, 12, 13], "sun_lon": [1, 11], "sun_lat": [1, 11], "longitude_convent": 1, "w": [1, 2, 11, 12], "project": [1, 2, 5, 10, 12], "ellipsoid": [1, 11], "onto": 1, "2": [1, 2, 3, 8, 10, 11, 12, 13], "d": [1, 2, 3, 8, 11, 12, 13], "arrai": [1, 2, 3, 10, 11, 12, 13], "latitud": [1, 2, 10, 11], "longitud": [1, 2, 10, 11], "grid": [1, 3], "ldmodel": [1, 10, 11], "tb": [1, 3, 10, 11, 13], "beam": [1, 2, 3, 10, 13], "law": [1, 10, 11], "exp": [1, 2, 10, 11], "mu0": [1, 10, 11], "psf_mode": 1, "gaussian": [1, 2, 3, 11, 13], "make": [1, 2, 5, 10, 11, 12], "limb": [1, 10], "darken": [1, 10], "model": [1, 2, 5, 6], "disk": [1, 3, 10], "convolv": [1, 2, 3], "see": [1, 2, 3, 5, 8, 10, 11, 12], "docstr": [1, 2, 5, 11], "limb_darken": 1, "option": [1, 2, 3, 7], "paramet": [1, 2, 3, 8, 10, 11], "float": [1, 2, 3, 10], "requir": [1, 2, 3, 5, 7, 11, 12], "flux": [1, 2, 3, 10, 11], "bright": [1, 2, 3, 10, 11], "temperatur": [1, 2, 3], "mu": [1, 10, 11, 13], "1": [1, 2, 3, 8, 10, 11, 12, 13], "tupl": [1, 2, 11], "": [1, 2, 3, 5, 7, 8, 10, 11, 12, 13], "np": [1, 2, 3, 8, 10, 11, 12, 13], "unit": [1, 2, 3, 5, 6, 8, 9, 10, 11, 12], "pixel": [1, 2, 3, 10, 11, 12], "convolve_with_beam": [1, 2, 3, 11, 12], "str": [1, 2, 3], "default": [1, 2, 3, 5, 11], "cosin": [1, 11], "solar": [1, 3, 5, 6, 8, 10, 11, 13], "incid": [1, 11], "angl": [1, 2, 3, 8, 11, 12, 13], "code": [1, 2, 5, 10, 12], "check": [1, 7, 8, 11], "self": [1, 2, 10, 11], "i": [1, 2, 3, 5, 6, 7, 8, 10, 11, 12], "defin": [1, 2, 11, 12], "us": [1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13], "ha": [1, 2, 3, 8, 10, 11, 12], "effect": [1, 3, 12], "unless": 1, "minnaert": [1, 10, 11], "undefin": 1, "fail": [1, 7], "mode": [1, 3, 10, 11, 12], "airi": [1, 3], "zonalmodel": 1, "lon": [1, 11, 12], "nav": [1, 6], "data": [1, 2, 3, 5, 6, 8], "function": [1, 3, 5, 10, 11, 12, 13], "compar": [1, 12], "observ": [1, 2, 6, 8], "imag": [1, 2, 3, 6, 10, 11, 12], "coloc": [1, 10], "convolut": [1, 11], "diagnostic_plot": [1, 10], "true": [1, 2, 10, 11, 12], "save_plot": 1, "kwarg": 1, "co": [1, 11, 12], "locat": [1, 2, 3, 8, 11, 12], "planet": [1, 2, 5, 6, 8, 10, 12], "which": [1, 2, 7, 11, 12, 13], "method": [1, 3], "should": [1, 2, 5, 7, 11, 12], "overlai": 1, "choic": [1, 11], "ar": [1, 2, 3, 5, 7, 8, 10, 11, 12], "canni": [1, 11], "edg": [1, 10, 11], "detect": [1, 11], "algorithm": [1, 11], "same": [1, 2, 3, 7, 8, 10, 11], "exponenti": [1, 2, 10, 11], "param": [1, 2, 12], "type": [1, 2, 3, 8, 12], "what": [1, 3, 5, 8, 10], "low_thresh": [1, 11], "document": [1, 5, 7, 11, 12], "skimag": 1, "featur": 1, "high_thresh": [1, 11], "sigma": [1, 11], "int": [1, 2, 3], "To": [1, 2, 11], "find": [1, 2, 11, 12, 13], "typic": [1, 2, 3, 11], "good": [1, 5, 10, 12], "valu": [1, 2, 10, 11, 12], "rm": [1, 11], "nois": [1, 11], "approxim": [1, 3, 10, 11, 13], "background": 1, "e": [1, 2, 3, 7, 11, 12], "cloud": [1, 11], "free": [1, 8, 11], "volcano": 1, "region": [1, 11, 12], "5": [1, 2, 3, 8, 10, 11, 12], "take": [1, 11], "shift": [1, 11], "maxim": 1, "err": [1, 11], "per": [1, 11], "error": [1, 5, 7, 11], "input": [1, 2, 3, 11, 12], "bool": [1, 2], "do": [1, 5, 7, 10, 11], "you": [1, 2, 4, 5, 7, 8, 11, 12], "want": [1, 2, 5, 8, 10, 12], "diagnost": [1, 10, 11, 12], "plot": [1, 11, 12, 13], "shown": 1, "file": [1, 3, 5, 10, 11], "path": 1, "save": [1, 10, 12], "doe": [1, 3, 5, 8, 10, 11, 12], "return": [1, 2, 3, 7, 11, 12], "dx": [1, 10, 11], "best": [1, 5], "fit": [1, 5, 6, 12], "differ": [1, 8, 10, 11, 12], "posit": [1, 10, 11], "between": [1, 3, 10, 11], "appli": [1, 2, 11, 12], "dy": [1, 10, 11], "dxerr": [1, 10, 11], "uncertainti": [1, 11], "base": [1, 5, 11], "cross": [1, 11], "correl": [1, 11], "from": [1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13], "image_registr": [1, 11], "chi2_shift": [1, 11], "These": 1, "treat": 1, "extrem": 1, "caution": 1, "becaus": [1, 2, 5, 11, 12], "thei": [1, 10, 11, 12], "were": [1, 8, 11], "design": 1, "work": [1, 2, 7, 11, 12], "ident": 1, "corrupt": 1, "random": [1, 11], "being": 1, "non": [1, 2, 12], "dyerr": [1, 10, 11], "exampl": [1, 2, 3, 5, 11, 13], "need": [1, 2, 3, 7, 12], "least": [1, 5, 7], "one": [1, 2, 3, 5, 11, 12, 13], "each": [1, 2, 12], "here": [1, 2, 5, 7, 8, 10, 11, 12], "note": [1, 2, 3, 5, 7, 8, 11], "sometim": [1, 12], "give": [1, 5, 12], "unrealist": 1, "behavior": [1, 11, 12], "reproject": 1, "equirectangular": 1, "target": [1, 3, 11], "thi": [1, 2, 3, 4, 5, 7, 8, 10, 11, 12], "onli": [1, 3, 7, 12], "properli": [1, 11, 12], "lat_g": [1, 10, 11], "lon_w": [1, 10, 11], "respect": [1, 11], "instanc": [1, 11, 12], "ONE": 1, "xy_shift_data": [1, 11], "xy_shift_model": [1, 10, 11], "been": [1, 11, 13], "output": [1, 2, 3, 8, 11], "cartopi": [1, 10], "proj": 1, "string": [1, 3, 8], "polar": [1, 2, 8], "aka": 1, "rectilinear": 1, "result": [1, 2, 11, 12, 13], "equal": [1, 2, 11], "space": [1, 2], "whichev": 1, "pole": [1, 8], "closest": 1, "sub": [1, 10, 11], "ani": [1, 2, 5, 7], "object": [1, 2, 3, 11], "also": [1, 2, 3, 5, 8, 11, 12], "accept": [1, 2, 3, 5], "case": [1, 2, 3, 12], "must": [1, 2, 3, 5, 8, 12], "specifi": [1, 2, 8, 12], "list": [1, 2, 8], "guess": 1, "scale": [1, 2, 11, 12], "emiss": [1, 11], "write": [1, 5, 6, 11], "outstem": 1, "header": [1, 11, 12], "flux_unit": 1, "multi": [1, 6, 11], "extens": [1, 6, 11], "stem": 1, "filenam": 1, "dict": [1, 2], "dictionari": [1, 2], "info": 1, "put": [1, 7], "hdul": [1, 10, 11, 12], "contain": [1, 11, 12], "empti": [1, 12], "3": [1, 2, 3, 7, 8, 10, 11, 12, 13], "4": [1, 3, 7, 8, 10, 11, 12, 13], "refer": [1, 2, 3], "format": [1, 2, 5, 6, 10, 12], "origin": [1, 2, 3, 5, 10, 11, 12], "pioneer": 1, "mike": [1, 11], "wong": [1, 11], "g": [1, 2, 7, 11], "http": [1, 2, 3, 11, 12], "doi": [1, 2, 3, 4, 11, 12, 13], "org": [1, 2, 3, 11, 12], "10": [1, 2, 3, 8, 10, 11, 12, 13], "3847": [1, 2, 11], "1538": [1, 2, 11], "4365": 1, "ab775f": 1, "fftshift": 1, "user": [1, 10, 11, 12], "amount": [1, 10], "suggest": [1, 11], "prefer": [1, 5], "instead": [1, 3, 7, 8, 10], "avoid": [1, 2], "touch": 1, "x": [1, 2, 3, 11], "y": [1, 2, 3, 11, 12], "recalcul": 1, "colocate_diagnostic_plot": 1, "assess": 1, "solut": [1, 7, 10, 11], "matplotlib": [1, 8, 10, 11, 12, 13], "figur": 1, "axi": [1, 2], "fig": [1, 10, 11, 12], "ax": [1, 10, 11, 12], "emission_angl": 1, "surf_n": 1, "comput": [1, 2, 11], "surfac": [1, 2, 10, 11, 12], "wrt": 1, "deg": [1, 8, 10, 11, 12], "z": [1, 2, 3, 12], "normal": [1, 2, 3, 12], "vector": [1, 2], "lat_lon": 1, "r_e": 1, "r_p": 1, "planetograph": [1, 10, 11], "planetocentr": 1, "west": [1, 10, 11], "view": [1, 11], "tilt": [1, 12], "perspect": 1, "sky": [1, 11], "For": [1, 5, 11], "now": [1, 8, 10, 12], "reli": 1, "manual": [1, 7, 10, 11], "de": [1, 2, 12], "rotat": [1, 2, 8, 10, 11], "orthograph": [1, 10, 11], "pyproj": 1, "tiltedperspect": 1, "cannot": 1, "handl": [1, 3, 5, 10, 11], "sphere": 1, "km": [1, 2, 3, 8, 11, 12, 13], "px": [1, 2, 11, 12], "north": [1, 2, 8, 10, 11], "equatori": [1, 8, 11], "radiu": [1, 3, 12, 13], "offset": 1, "east": [1, 12], "convent": [1, 2], "coordin": [1, 2, 12], "where": [1, 7, 12], "like": [1, 2, 3, 5, 6, 7, 11, 12], "disc": 1, "ignor": 1, "linear": 1, "have": [1, 3, 5, 7, 10, 12, 13], "length": [1, 2], "quadrat": [1, 11], "squar": [1, 3, 11], "root": 1, "a0": 1, "a1": 1, "first": [1, 5, 8, 10, 12], "second": [1, 10], "term": 1, "ld": 1, "sqrt": [1, 12], "overview": 1, "publish": 1, "www": [1, 3], "astro": 1, "keel": 1, "ac": 1, "uk": 1, "jkt": 1, "jktld": 1, "html": [1, 2, 3, 7, 11], "rotate_about_pivot": 1, "img": [1, 12], "pivot": 1, "counterclockwis": 1, "point": [1, 2, 10, 11], "about": [1, 5, 11], "surface_norm": 1, "dot": 1, "product": 1, "ob": [1, 2, 10, 11, 12], "sun": [1, 3], "omega": [2, 12, 13], "width": 2, "params_si": [2, 12], "planetari": [2, 9, 11, 12], "as_2d_arrai": [2, 12], "focu": [2, 6, 12], "look": [2, 5, 7, 10, 11, 12], "mock": [2, 12], "smear": 2, "over": [2, 5, 10], "astropi": [1, 2, 3, 5, 8, 10, 11, 12], "quantiti": [1, 2, 3, 5], "assum": [1, 2, 3, 8, 11, 13], "around": [2, 10, 11, 12], "orbit": [2, 8], "face": 2, "full": [2, 11, 12, 13], "technic": 2, "specif": [2, 5, 6, 8, 13], "intens": [2, 12], "set": [2, 3, 11, 12], "element": [1, 2, 3], "as_azimuthal_wedg": [2, 12], "nwedg": [2, 12], "60": [2, 12, 13], "n": [2, 7], "1000": [2, 3, 12], "partial": 2, "ellipt": [2, 10, 11, 12], "annulu": [2, 12], "wedg": [2, 12], "azimuth": 2, "profil": 2, "ellips": [2, 11, 12], "number": [2, 10], "as_elliptical_annulu": [2, 12], "detail": [1, 2, 5, 8, 11], "much": [2, 10, 12], "larger": [1, 2, 12], "than": [1, 2, 10, 11, 12], "factor": [2, 3], "ndimag": [2, 3], "zoom": [2, 3], "more": [2, 5, 8, 10, 12], "accur": [2, 12], "area": [2, 3, 12, 13], "radian": [2, 12], "pi": [2, 12, 13], "correspond": 2, "lower": [2, 10, 11, 12], "corner": 2, "len": [2, 12], "mask": 2, "current": [2, 3, 7, 12], "implement": [2, 5, 11, 12, 13], "remov": 2, "foreshorten": 2, "correct": [2, 12], "magic": 2, "angular": [2, 13], "plane": 2, "system": [2, 5, 6, 8, 11, 13], "tutori": [1, 2, 5, 11], "ipynb": [1, 2, 5], "explan": 2, "computation": 2, "expens": 2, "better": [2, 11, 12], "would": [2, 5, 8, 11, 12], "photutil": [2, 12], "cython": 2, "lot": 2, "geometri": [2, 11, 12], "return_param": [2, 12], "fals": [2, 12], "apertur": [2, 3, 12], "photometri": 2, "surround": 2, "foci": 2, "higher": 2, "mean": [2, 5, 7, 11, 12], "estim": [2, 11], "ellipticalannulu": [2, 12], "b": [2, 3, 12], "theta": [2, 12], "If": [1, 2, 3, 5, 7, 8, 10, 11], "project_ellipse_doubl": 2, "ringsystemmodelobserv": [2, 12], "ringnam": [2, 12], "combin": 2, "static": [2, 8, 11, 12], "pd": [2, 12], "seti": 2, "uranu": [2, 11, 12], "uranus_rings_t": 2, "node": [2, 12], "jpl": [1, 2, 8, 11, 12], "horizon": [1, 2, 8, 11, 12], "infinit": 2, "resolut": 2, "b_from_a": 2, "semimajor": [2, 12], "eccentr": [2, 12], "semiminor": 2, "calc_abtheta": 2, "ell": 2, "given": [2, 5, 8, 11, 12], "circumfer": 2, "fact": 2, "max": [1, 2, 12], "min": [2, 8], "along": [2, 5], "degre": [1, 2, 3, 8, 11, 12], "double_rot": 2, "vec": 2, "params_r": 2, "agre": [2, 3], "90": [2, 10, 11], "perimet": 2, "all": [1, 2, 5, 11, 12], "r": [2, 7, 8, 10, 11, 12, 13], "t": [2, 5, 7, 8, 10, 11, 12], "inclin": [2, 12], "fraction": 2, "multipli": [2, 3, 11], "pater": [2, 12], "et": [2, 3, 11, 12, 13], "al": [2, 3, 11, 12, 13], "2006": [2, 12], "1016": [2, 3, 12, 13], "j": [2, 3, 12], "icaru": [2, 12], "2005": [2, 12], "08": [2, 3, 11, 12], "011": [2, 12], "plane_project": 2, "direct": [2, 3, 11], "50": [2, 3, 11, 12], "proj_plan": 2, "repres": [2, 12], "euler": 2, "individu": 2, "rel": [2, 5, 12], "The": [2, 5, 10, 12, 13], "w_sy": 2, "i_si": 2, "omega_si": 2, "two": [2, 3, 12], "gamma": [2, 3, 12], "beta": [2, 12], "alpha": [2, 8, 12], "total": 2, "matrix": [2, 11], "build": [1, 2, 5], "doubl": 2, "those": [2, 3, 5, 10, 12], "re": [2, 5, 6, 11], "simul": [2, 11], "en": [2, 3], "wikipedia": [2, 3], "wiki": [2, 3], "euler_angl": 2, "orbital_el": 2, "euler_angle_transform": 2, "distanc": [1, 2, 3, 11, 12], "unitless": 2, "back": [2, 12], "after": [2, 7, 12], "follow": [2, 5, 7, 11], "kei": [2, 8], "f0": 2, "f1": 2, "other": [2, 5, 8, 11, 12], "ring_area": 2, "delta_width": 2, "open": [2, 5, 6, 7, 10, 11, 12], "peri": [2, 12], "apo": 2, "asymmetri": 2, "averag": [2, 3], "asymmetr": 2, "apoapsis_width": 2, "periapsis_width": 2, "apoapsi": [2, 12], "minu": 2, "periapsi": [2, 12], "molter": 2, "2019": [2, 11, 12], "3881": [2, 11], "ab258c": 2, "vector_ellips": 2, "u": [2, 5, 11, 12], "v": [2, 8, 12], "equat": 2, "dimens": [2, 3, 12], "perpendicular": 2, "math": 2, "stackexchang": 2, "com": [2, 11], "question": [2, 5], "3994666": 2, "parametr": 2, "3d": 2, "text": [2, 5, 7], "In": [2, 3, 12], "20the": 2, "20parametr": 2, "20equat": 2, "20x": 2, "20point": 2, "20with": 2, "20minimum": 2, "20curvatur": 2, "vector_magnitud": 2, "magnitud": 2, "bit": 2, "faster": 2, "linalg": 2, "norm": 2, "vector_norm": 2, "zero": [2, 3, 11, 12, 13], "name": [1, 2, 3, 8, 11], "epoch": [2, 3, 8, 10, 11, 12], "instanti": [3, 11, 12], "attribut": [1, 3, 9, 11], "yaml": [3, 5, 8, 11], "match": [2, 3], "usag": [3, 5], "import": [3, 7, 8, 11, 12, 13], "jup": [3, 8, 10], "jupit": [2, 3, 8, 12], "app_dia_max": 3, "app_dia_min": 3, "arcsec": [1, 3, 8, 11, 12, 13], "30": [3, 7, 10, 11, 12], "print": [3, 8, 11, 12, 13], "au": [3, 8, 12], "earth": [2, 3, 8], "appar": 3, "size": [1, 3, 10, 11, 12], "app_dia": 3, "todai": 3, "epoch_datetim": 3, "93796102228318": 3, "33": [3, 12], "2009": 3, "2023": 3, "04": 3, "26": [3, 8, 12], "16": [3, 8, 12], "32": 3, "54": [3, 8], "i_over_f": [3, 13], "observed_flux": [3, 13], "bp": [3, 13], "target_sun_dist": 3, "target_omega": 3, "definit": [3, 13], "hammel": [3, 13], "1989": [3, 13], "0019": [3, 12, 13], "1035": [3, 13], "89": [3, 13], "90149": [3, 13], "8": [3, 8, 10, 11, 12, 13], "erg": [3, 13], "cm": [3, 12, 13], "um": [3, 13], "wl": [3, 13], "tran": [3, 13], "filter": [3, 11, 13], "transmiss": [3, 13], "matter": 3, "sr": [3, 13], "unresolv": 3, "solid": [3, 13], "resolv": 3, "wavelength": [3, 5, 13], "f": [3, 6, 8, 10, 11, 12], "sun_flux_earth": 3, "arvesen": 3, "1969": 3, "h": [3, 8, 12, 13], "band": [3, 5, 11, 12, 13], "1364": 3, "ao": 3, "002215": 3, "beam_area": [3, 13], "beamx": [3, 13], "beami": [3, 13], "psf": [3, 10, 11, 12], "fwhm": [3, 10, 11], "either": [3, 5, 10, 11, 12], "circular": 3, "depend": [3, 7], "fwhm_x": [3, 11], "fwhm_y": [3, 11], "theta_deg": [3, 11], "support": [2, 3, 11, 12], "simpli": [3, 11, 12], "insensit": 3, "dtype": 3, "fourier_deconvolv": 3, "psf_desir": 3, "0003": 3, "reproduc": 3, "pat": 3, "fry": 3, "fourier": [3, 11], "deconvolut": 3, "cunningham": 3, "anthoni": 3, "odd": 3, "3e": 3, "tikhonov": 3, "regular": 3, "prevent": [2, 3], "denomin": 3, "deconvolv": 3, "inverse_planck": 3, "freq": [3, 13], "jy": [3, 13], "densiti": [2, 3, 12], "ghz": [3, 13], "frequenc": 3, "k": [3, 11, 12, 13], "inverse_rayleigh_jean": 3, "rayleigh": [3, 13], "jean": [3, 13], "jybm_to_jysr": [3, 13], "jybm_to_tb": 3, "scienc": [3, 6, 11], "nrao": 3, "edu": 3, "facil": 3, "vla": [3, 8], "propos": 3, "tbconv": 3, "jysr_to_jybm": 3, "planck": [3, 13], "rayleigh_criterion": 3, "m": [3, 12, 13], "diamet": [1, 3], "telescop": [3, 11], "diffract": 3, "limit": 3, "rayleigh_jean": [3, 13], "rebin": 3, "arr": 3, "simpl": [3, 7, 12], "integ": 3, "bin": 3, "numpi": [3, 5, 8, 10, 11, 12, 13], "solar_spectrum": 3, "load": [3, 8, 12], "gueymard": 3, "standard": [3, 10], "spectrum": 3, "solen": 3, "2003": 3, "039": 3, "access": [3, 8, 11], "nrel": 3, "gov": [3, 11], "resourc": 3, "spectra": 3, "solid_angl": [3, 13], "small": [2, 3, 8, 12], "facet": 3, "dist": [3, 12], "flat": 3, "210": [3, 13], "proteu": [3, 11, 13], "496e8": 3, "neptun": [2, 3, 11, 12], "14": [3, 12, 13], "tb_to_jybm": [3, 13], "bm": 3, "kelvin": 3, "pleas": [4, 5, 11], "softwar": 4, "research": [4, 6], "zenodo": 4, "thank": 5, "consid": [5, 11], "step": [5, 12, 13], "below": [5, 8, 11, 12], "github": [5, 11], "flow": 5, "mai": 5, "help": 5, "git": 5, "issu": [5, 7], "describ": [5, 11], "problem": [5, 10], "intend": 5, "solv": [5, 10], "we": [5, 7, 8, 10, 11, 12, 13], "pretti": 5, "lax": 5, "how": [2, 5, 10, 11, 12], "present": [2, 5], "still": 5, "might": [5, 11], "through": 5, "quickstart": 5, "fork": 5, "main": 5, "branch": 5, "repositori": 5, "recommend": [5, 7, 11], "command": 5, "includ": [2, 5], "setup": 5, "synchron": 5, "upstream": 5, "your": [5, 7, 11], "chang": [2, 5, 10, 11, 12], "develop": 5, "section": 5, "start": [5, 12], "convers": [5, 6, 9], "comment": [5, 12], "submit": [5, 8], "draft": 5, "pull": [5, 8, 11], "request": [5, 8], "strongli": 5, "encourag": 5, "earli": 5, "It": [5, 11, 12], "link": 5, "when": [5, 7, 12], "readi": 5, "review": 5, "understand": [5, 11], "nearli": 5, "alwai": 5, "upon": 5, "welcom": 5, "test": [1, 2, 5, 10, 11, 12], "highli": [5, 11], "can": [5, 10, 11, 12], "built": 5, "up": [5, 10, 11, 12], "time": [2, 5, 8, 10, 11, 12], "At": 5, "necessari": [5, 7, 12], "modul": 5, "minimum": [5, 12], "discuss": [5, 12], "page": [5, 8, 11], "receiv": 5, "feedback": 5, "larg": [5, 8], "doesn": [5, 10, 12], "anywher": 5, "els": [5, 11], "subdirectori": 5, "__init__": 5, "py": [5, 10, 11, 12], "add": [2, 5, 8, 12], "directori": [5, 7], "test_featur": 5, "within": [5, 11, 12], "try": [5, 7, 11], "conform": 5, "docstyl": 5, "major": 5, "jupyt": 5, "notebook": [1, 5, 11, 12], "doc": [5, 8, 11], "provid": [2, 5], "gener": 5, "tool": [1, 2, 5, 6, 8, 12], "process": 5, "As": [5, 10, 12], "remain": 5, "agnost": 5, "observatori": [5, 11], "etc": [5, 8, 12], "anoth": 5, "go": [5, 10, 12], "primarili": 5, "relev": 5, "singl": [1, 5], "place": [5, 12], "separ": 5, "portion": 5, "could": [5, 8, 10, 11, 13], "them": [5, 11, 12], "packag": [5, 10, 11], "written": [5, 11], "everi": [5, 11, 12], "adher": 5, "ecosystem": 5, "whenev": 5, "possibl": [2, 5], "tabl": [2, 5, 8, 11, 12], "aspir": 5, "keep": [5, 11], "mind": 5, "bring": 5, "addit": [5, 11], "necess": 5, "well": [2, 5, 11, 12], "justifi": 5, "exist": [5, 11, 12], "approv": 5, "team": 5, "reason": [5, 8, 11], "No": 5, "realli": [1, 5, 12], "There": [5, 10, 11], "littl": 5, "voic": 5, "insid": 5, "head": 5, "tell": 5, "sourc": [5, 6, 11], "contributor": 5, "skill": 5, "aren": 5, "enough": [5, 12], "possibli": 5, "offer": 5, "assur": 5, "wrong": 5, "fantast": 5, "wai": [5, 12], "advanc": 5, "perfect": [5, 12], "isn": 5, "measur": [5, 12, 13], "disqualifi": 5, "creat": [5, 7], "someth": [5, 12], "mistak": 5, "learn": [5, 12], "That": 5, "improv": [5, 10], "happi": [5, 10, 11], "Being": 5, "just": [1, 2, 5, 7, 10, 11, 12], "out": [5, 11], "even": [5, 8, 10], "ye": 5, "some": [5, 7, 8, 10, 11, 12], "most": [5, 7], "valuabl": 5, "whole": 5, "come": [5, 6, 8], "fresh": 5, "ey": 5, "so": [2, 5, 7, 8, 10, 11, 12], "assumpt": 5, "season": 5, "gloss": 5, "wa": [5, 7, 10, 11, 12], "adrienn": 5, "low": 5, "pycon": 5, "talk": 5, "adapt": 5, "its": [5, 7, 11], "readm": 5, "metpi": 5, "giant": 6, "read": [1, 2, 6], "backplan": 6, "moon": [6, 8, 12], "comparison": [6, 10], "soon": [6, 8], "doppler": 6, "wind": 6, "radio": 6, "keck": [6, 11, 12], "twilight": 6, "zone": 6, "program": [6, 10, 11], "hst": [6, 11], "opal": [6, 10, 11], "incl": 6, "goddard": 6, "berkelei": 6, "caltech": 6, "group": 6, "pip": 7, "clean": 7, "conda": 7, "environ": 7, "tester": 7, "python": [7, 10, 11, 12], "11": [7, 10, 11, 12, 13], "9": [7, 8, 10, 11, 12], "12": [7, 11, 12], "activ": 7, "attempt": 7, "peopl": 7, "had": 7, "mani": [7, 12], "pre": [7, 12], "date": [7, 10, 11, 12], "version": [7, 12], "aros": 7, "due": [7, 10, 11, 12], "prior": 7, "download": 7, "txt": 7, "longer": 7, "found": [7, 10, 11], "never": 7, "run": [7, 11, 12], "folder": [7, 12], "instantli": 7, "crazi": 7, "messag": 7, "ten": 7, "line": [1, 7, 12], "human": 7, "readabl": [7, 8], "huge": 7, "soup": 7, "didn": [7, 10], "raw": 7, "button": 7, "conflict": 7, "forc": 7, "reinstal": 7, "persist": 7, "right": [7, 10, 11, 12], "happen": [1, 7], "colleagu": 7, "thing": [7, 11, 12], "bunch": 7, "bracket": 7, "live": 7, "eventu": 7, "filelock": 7, "jsonschema": 7, "glibcxx_3": 7, "scipi": 7, "spatial": 7, "fft": 7, "pyplot": [8, 10, 11, 12, 13], "plt": [8, 10, 11, 12, 13], "conveni": 8, "simultan": 8, "inform": [2, 8, 11], "mass": 8, "radii": [8, 11, 12], "A": 8, "complet": 8, "avail": 8, "bodynam": 8, "feel": 8, "think": 8, "astroqueri": [1, 8, 11, 12], "6": [8, 10, 11, 12, 13], "period": 8, "t_rot": 8, "ephem": [1, 2, 8, 10, 11], "71492": 8, "66854": 8, "89813e": 8, "27": [8, 12], "kg": 8, "925": 8, "targetnam": 8, "datetime_str": 8, "datetime_jd": 8, "solar_pres": 8, "lunar_pres": 8, "ra": 8, "dec": 8, "ra_app": 8, "dec_app": 8, "ra_rat": 8, "dec_rat": 8, "az": 8, "el": 8, "az_rat": 8, "el_rat": 8, "sat_x": 8, "sat_i": 8, "sat_pang": 8, "siderealtim": 8, "airmass": 8, "magextinct": 8, "surfbright": 8, "illumin": 8, "illum_defect": 8, "sat_sep": 8, "sat_vi": 8, "ang_width": 8, "pdobslon": [1, 8], "pdobslat": [1, 8], "pdsunlon": 8, "pdsunlat": 8, "subsol_ang": 8, "subsol_dist": 8, "npole_ang": [1, 8, 10, 11], "npole_dist": 8, "ecllon": 8, "ecllat": 8, "r_rate": 8, "delta": [1, 8, 11, 12], "delta_r": 8, "lighttim": 8, "vel_sun": 8, "vel_ob": 8, "elong": 8, "elongflag": 8, "lunar_elong": 8, "lunar_illum": 8, "sat_alpha": 8, "suntargetpa": 8, "velocitypa": 8, "orbplaneang": 8, "constel": 8, "tdb": 8, "ut": 8, "obsecllon": 8, "obsecllat": 8, "npole_ra": 8, "npole_dec": 8, "glxlon": 8, "glxlat": 8, "solartim": 8, "earth_lighttim": 8, "ra_3sigma": 8, "dec_3sigma": 8, "smaa_3sigma": 8, "smia_3sigma": 8, "theta_3sigma": 8, "area_3sigma": 8, "rss_3sigma": 8, "r_3sigma": 8, "r_rate_3sigma": 8, "sband_3sigma": 8, "xband_3sigma": 8, "doppdelay_3sigma": 8, "true_anom": 8, "hour_angl": 8, "alpha_tru": 8, "pablon": 8, "pablat": 8, "mag": 8, "arcsec2": 8, "hz": 8, "599": 8, "2024": 8, "feb": 8, "22": [8, 12], "44": 8, "2460357": 8, "435925926": 8, "36": [8, 12], "85163": 8, "13": [8, 11, 12], "55608": 8, "37": 8, "17703": 8, "6638": 8, "20": [8, 10, 12], "24777": 8, "7": [8, 10, 11, 12], "405086": 8, "236592": 8, "038": 8, "93318": 8, "397": 8, "70": 8, "883": 8, "999": 8, "247": 8, "367": 8, "99": [8, 11], "11266": 8, "3352": 8, "257467": 8, "77511": 8, "341": 8, "477974": 8, "321298": 8, "330": [8, 12], "654615": 8, "5616": 8, "251": [8, 11], "84": 8, "340": 8, "4461": 8, "17": [8, 12], "633": 8, "49": [8, 12], "7359": 8, "01": [8, 11, 12, 13], "994368223878": 8, "3705009": 8, "21892932831983": 8, "5051497": 8, "43": 8, "40451169": 8, "5960881": 8, "34": [8, 12], "8759252": 8, "71": 8, "5187": 8, "8122": 8, "53": [8, 12], "4432": 8, "97": [8, 11], "6692": 8, "762": 8, "250": [8, 11], "787": 8, "1803": 8, "ari": 8, "69": [8, 12], "185123": 8, "39": [8, 10, 11, 12], "2554843": 8, "9641561": 8, "268": 8, "05798": 8, "64": 8, "49676": 8, "155": [8, 12], "720533": 8, "123915": 8, "35": 8, "3806": 8, "8104": 8, "3273": 8, "9926": 8, "datetim": [8, 12], "site": [8, 10, 11], "sl9": 8, "impact": 8, "sai": [8, 12], "1994": 8, "07": [8, 12], "6435": 8, "descript": [1, 8], "keyword": [8, 11], "NOT": [8, 11], "short": [8, 11], "itself": [8, 11], "ephemerid": [9, 12], "basic": 9, "workflow": [9, 11], "io": [10, 11, 12], "emolt": [10, 11, 12], "hlsp_wfcj_hst_wfc3": 10, "uvis_jupit": 10, "2017": 10, "pj07_f631n_v2_0711ut0947": 10, "obs_tim": [10, 11, 12], "orientat": 10, "pixscale_arcsec": [1, 10, 11, 12], "hack": 10, "isnan": 10, "mpl_toolkit": [10, 11], "axes_grid1": [10, 11], "make_axes_locat": [10, 11], "ax1": [10, 11, 12], "subplot": [10, 11, 12], "figsiz": [10, 11, 12], "cim": 10, "imshow": [10, 11, 12], "divid": [10, 11, 12], "cax": [10, 11], "append_ax": [10, 11], "pad": [10, 11], "05": [10, 11], "colorbar": [10, 11, 12], "orient": [10, 11], "vertic": [10, 11], "label": [10, 11, 12], "cim1": 10, "cax1": [10, 11], "show": [10, 11, 12, 13], "anaconda3": [10, 11], "lib": [10, 11], "python3": [10, 11], "cr": [10, 11], "176": [10, 11], "userwarn": [10, 11, 12], "globe": [10, 11], "warn": [10, 11], "__class__": [10, 11], "__name__": [10, 11], "chose": 10, "ad": [2, 10], "hoc": 10, "sinc": 10, "know": 10, "15e4": 10, "whatev": [10, 11], "expon": [10, 11], "spread": [10, 11], "veri": [2, 10, 12], "left": 10, "dark": 10, "neg": [10, 11], "upper": 10, "indic": 10, "let": [10, 11, 12, 13], "side": 10, "both": [2, 10, 12], "ax0": [10, 11, 12], "15": [10, 11, 12, 13], "real": [10, 12], "somewher": [10, 11], "toward": 10, "wherea": [2, 10], "our": [10, 11], "brightest": 10, "again": 10, "minnaert_k": 10, "close": [2, 10, 11], "resembl": [2, 10], "inde": 10, "less": 10, "closer": 10, "represent": 10, "appear": [10, 11], "halo": [10, 11], "entir": 10, "probabl": [10, 11], "improp": 10, "star": 10, "ahead": [10, 12], "onc": 10, "move": 10, "new": [10, 12], "continu": 10, "fudg": 10, "stage": 10, "visual": [10, 12], "bang": 10, "nice": [2, 10, 12], "isplanet": 10, "copi": 10, "cmap": [10, 12], "cividi": 10, "cs0": 10, "contour": [10, 12], "level": [10, 12], "arang": [10, 12], "color": [10, 12], "white": 10, "clabel": 10, "inlin": 10, "fontsiz": [10, 12], "desktop": 10, "delet": [10, 11], "me": 10, "showcas": [11, 12], "subpackag": [11, 12], "200": 11, "25": [11, 12], "285": 11, "25560": 11, "24970": 11, "call": [11, 12], "deg_per_px": [1, 11], "One": 11, "1f": 11, "lat": [11, 12], "extent": [11, 12], "ax2": [11, 12], "ax3": 11, "im0": 11, "set_titl": 11, "im1": 11, "im2": 11, "im3": 11, "im": [11, 12], "enumer": [11, 12], "set_xlabel": [11, 12], "set_ylabel": [11, 12], "tight_layout": 11, "leverag": 11, "brighten": 11, "sever": 11, "anyth": [2, 11], "too": [11, 12], "lddisk": 11, "inherit": 11, "everyth": 11, "enabl": 11, "abov": [11, 12, 13], "easi": [11, 12], "automat": 11, "interest": 11, "unlik": 11, "plan": 11, "optim": 11, "28": [11, 12], "009971": 11, "ura": [11, 12], "568": [11, 12], "maunakea": 11, "240": 11, "2f": [11, 13], "suit": 11, "later": 11, "misc": 11, "hdf5": 11, "write_table_hdf5": 11, "serialize_meta": 11, "overwrit": 11, "keck_uranu": 11, "npy": [11, 12], "25559": 11, "24973": 11, "386": 11, "261": 11, "0522": 11, "136": 11, "turn": 11, "h_2019oct28": 11, "urh60": [11, 12], "expstart": [11, 12], "100": [11, 12, 13], "easili": [11, 12], "befor": [11, 12], "desir": 11, "ve": 11, "achiev": 11, "routin": 11, "2000": 11, "fwhm_keck": 11, "rms_nois": 11, "std": [11, 12], "600": [11, 12], "900": 11, "wonder": 11, "truli": 11, "133": 11, "455078125": 11, "943359375": 11, "005859375": 11, "00390625": 11, "accuraci": 11, "obviou": 11, "faint": 11, "imperfect": 11, "particularli": 11, "dx_canni": 11, "dy_canni": 11, "_": 11, "1e": 11, "126": 11, "830078125": 11, "416015625": 11, "align": 11, "somewhat": 11, "actual": 11, "intent": 11, "allow": 11, "until": [11, 12], "altern": 11, "final": 11, "pix": [11, 12], "set_ytick": 11, "set_aspect": 11, "lat_g_keck": 11, "idl": 11, "mu_project": 11, "mu0_project": 11, "target_x_point": 11, "target_y_point": 11, "axes_divid": 11, "360": [11, 12], "ax0_divid": 11, "cax0": 11, "cb0": 11, "count": 11, "ax1_divid": 11, "cb1": 11, "set_xtick": [11, 12], "structur": 11, "qualiti": 11, "whether": 11, "straight": 11, "centroid": 11, "incorrect": [11, 12], "curv": [11, 13], "oversampl": 11, "caus": 11, "unusu": 11, "artifact": 11, "On": 11, "hand": 11, "nearest": 11, "neighbor": 11, "interpol": 11, "smoother": 11, "300": [11, 12], "ccr": 11, "img_glob": 11, "semimajor_axi": 11, "semiminor_axi": 11, "custom_project": 11, "robinson": 11, "central_longitud": 11, "custom_shap": 11, "souami": 11, "20234": 11, "own": 11, "cite": 11, "stack": 11, "frame": [11, 12], "24764": 11, "24341": 11, "footnot": [11, 12], "url": 11, "nssdc": 11, "gsfc": 11, "nasa": 11, "factsheet": 11, "neptunefact": 11, "affili": 11, "texttt": 11, "coeffici": 11, "867": 11, "2018": 11, "blue": [11, 12], "lmk": 11, "anyon": 11, "ir": 11, "aaa6d6": 11, "optic": [2, 11, 12], "field": [1, 11], "registr": 11, "carri": 11, "discret": 11, "transform": 11, "techniqu": 11, "keflavich": 11, "yield": 11, "chi": 11, "criterion": 11, "vari": 11, "rang": [11, 12], "earthloc": [2, 12], "jplhorizon": 12, "timedelta": 12, "51149": 12, "80": 12, "imsiz": 12, "500": 12, "ringmodel": [2, 12], "scatter": 12, "cyan": 12, "marker": 12, "savefig": 12, "example_epsilon_r": 12, "png": 12, "infinitesim": 12, "mathemat": 12, "construct": 12, "astronom": 12, "context": 12, "properti": 12, "ringmodel2": 12, "001": 12, "10000": 12, "suppos": 12, "done": [12, 13], "under": 12, "hood": 12, "ann": 12, "lt": 12, "gt": 12, "cast": 12, "as_2d_array_testarr": 12, "saturn": [2, 12], "interfac": 12, "queri": [2, 12], "proper": 12, "fulli": 12, "edit": 12, "2020": 12, "00": 12, "alma_coord": 12, "67": 12, "755": 12, "23": 12, "029": 12, "5000": 12, "alt": 12, "six": 12, "five": 12, "four": 12, "eta": 12, "epoch_astropi": 12, "iso": 12, "utc": 12, "alma_coords_astropi": 12, "399": 12, "alma": 12, "uranus_r": 12, "ringtabl": [2, 12], "pprint_al": 12, "pericent": 12, "ascend": [2, 12], "middl": 12, "boundari": 12, "depth": [2, 12], "associ": [2, 12], "302": 12, "41838": 12, "00102": 12, "0607": 12, "narrow": 12, "dens": 12, "259": 12, "372": 12, "282": 12, "42234": 12, "0559": 12, "147": 12, "31": 12, "154": 12, "42571": 12, "00106": 12, "032": 12, "61": 12, "44718": 12, "46": 12, "00076": 12, "015": 12, "357": 12, "656": 12, "224": 12, "45661": 12, "000442": 12, "005": 12, "47176": 12, "197": 12, "409": 12, "47627": 12, "001092": 12, "ophelia": 12, "amplitud": 12, "48300": 12, "cordelia": 12, "domin": 12, "071": 12, "58": 12, "00794": 12, "nan": [1, 12], "shepherd": 12, "made": 12, "notic": 12, "decid": 12, "flexibl": 12, "plai": 12, "directli": [2, 12], "65000": 12, "120": 12, "dusti": 12, "uranus_rings_dusti": 12, "zeta": 12, "ura_system_testarr": 12, "39600": 12, "3500": 12, "weak": 12, "often": 12, "lack": 12, "get": [2, 12, 13], "urk140": 12, "009942": 12, "keck_coord": 12, "4744": 12, "19": 12, "8264": 12, "4145": 12, "start_tim": 12, "strptime": 12, "end_tim": 12, "minut": 12, "stop": 12, "strftime": 12, "1m": 12, "keck_coords_astropi": 12, "convert": 12, "obj": 12, "id": 12, "799": 12, "d_au": 12, "tan": 12, "deg2rad": 12, "3600": 12, "naxis1": 12, "56": 12, "135": 12, "79696138751703": 12, "ura_keck": 12, "model_keck_ob": 12, "sz": 12, "vmin": 12, "vmax": 12, "ep": 12, "4000": 12, "25000": 12, "1500": 12, "avec": 12, "bvec": 12, "ann_patch": 12, "red": 12, "lw": 12, "quiver": 12, "xy": 12, "scale_unit": 12, "argument": [2, 12], "legend": 12, "arbitrari": 12, "aperturestat": 12, "stat": 12, "to_tabl": 12, "median": 12, "var": 12, "sum": 12, "14308731686408": 12, "11417579650879": 12, "811333204522843": 12, "1011": 12, "9609202491774": 12, "1818902": 12, "802280782": 12, "worth": 12, "miss": 12, "sidelob": 12, "practic": 12, "r_in": 12, "35000": 12, "r_out": 12, "r_step": 12, "zeroe_r": 12, "sum_method": 12, "subpixel": 12, "brg": 12, "expect": [2, 12], "single_r": 12, "axvlin": 12, "linestyl": 12, "set_xticklabel": 12, "get_xtick": 12, "tick_param": 12, "labels": 12, "unconvert": 12, "g0": 12, "r491pzqx4kx0tfmpx8970ntm0000gn": 12, "ipykernel_49546": 12, "668933652": 12, "fixedformatt": 12, "togeth": 12, "fixedloc": 12, "thetas_implan": 12, "wedge_sum": 12, "data_sum": 12, "extraction_region": 12, "wedge_data": 12, "append": 12, "nansum": 12, "18": [12, 13], "hot": 12, "peri_angl": 12, "arctan2": 12, "apo_angl": 12, "mid": 12, "green": 12, "rad": 12, "twinx": 12, "fsc": 12, "seen": 12, "roughli": [1, 12, 13], "geometr": 12, "account": 12, "howev": 12, "themselv": 12, "calcul": 12, "accordingli": 12, "experi": 12, "evid": 12, "def": 12, "deal": 12, "ab": 12, "sin": 12, "21": 12, "autumn": 12, "24": 12, "sharex": 12, "black": 12, "orang": 12, "uniform": 12, "wide": 12, "captur": 12, "otherwis": 12, "interact": 12, "fun": 12, "anim": 12, "bump": 12, "initi": [2, 12], "slightli": 12, "slower": 12, "But": 12, "solarsystem": 12, "ringnod": 12, "epoch_0": 12, "2022": 12, "09": 12, "wval": 12, "dai": 12, "bodyt": [2, 12], "cach": 12, "loc_indic": 12, "asarrai": 12, "state": 12, "model0": 12, "img0": 12, "sequenti": 12, "progress": 12, "increas": 12, "get_arrai": 12, "set_arrai": 12, "funcanim": 12, "farg": 12, "interv": 12, "blit": 12, "epsilon_precess": 12, "gif": 12, "fp": 12, "ipython": 12, "displai": 12, "height": 12, "wider": 12, "thin": [2, 12], "thick": 12, "act": 12, "especi": 12, "broad": 12, "sort": 12, "radi": 12, "transfer": 12, "eas": 12, "variou": 13, "115": 13, "271": 13, "jybm": 13, "2e": 13, "jysr": 13, "translat": 13, "jysr_rj": 13, "beama": 13, "74e": 13, "09e": 13, "08e": 13, "97e": 13, "7e": 13, "neptune_earth_dist": 13, "6e9": 13, "neptune_sun_dist": 13, "3e9": 13, "25e10": 13, "6f": 13, "linspac": 13, "micron": 13, "75": 13, "45": 13, "xlabel": 13, "ylabel": 13, "wl_eff": 13, "ioverf": 13, "5e8": 13, "55e": 13, "000278": 13, "observeratori": 2, "jwst": 2, "altitud": 2, "istanti": 2, "geofocu": 2, "unfortun": 2, "weird": 2, "ensur": [1, 2], "jpl_hor_id": 2, "sensit": 2, "capit": 2, "attenu": 2, "att": 2, "emitt": 2, "violat": 2, "thermal": 2, "obvious": 2, "planetnam": 2, "invari": 2, "systemt": 2, "satellit": 2, "custom": 2, "modifi": [1, 2], "Not": 2, "yet": 2, "understood": 2, "why": 2, "order": 2, "lookup": 2, "horizons_loc": 2, "qtabl": 1, "accord": 1, "attr": 1, "sub_solar": 1, "off": 1, "sun_n": 1, "image_grid_km_x": 1, "image_grid_km_i": 1, "planetnav": 1, "parent_attr": 1, "reflect": 1}, "objects": {"pylanetary.navigation": [[1, 0, 0, "-", "core"]], "pylanetary.navigation.core": [[1, 1, 1, "", "ModelBody"], [1, 1, 1, "", "ModelEllipsoid"], [1, 1, 1, "", "Nav"], [1, 4, 1, "", "colocate_diagnostic_plot"], [1, 4, 1, "", "emission_angle"], [1, 4, 1, "", "lat_lon"], [1, 4, 1, "", "limb_darkening"], [1, 4, 1, "", "rotate_about_pivot"], [1, 4, 1, "", "surface_normal"]], "pylanetary.navigation.core.ModelBody": [[1, 2, 1, "", "body"], [1, 2, 1, "", "ephem"], [1, 2, 1, "", "name"], [1, 2, 1, "", "pixscale_arcsec"], [1, 2, 1, "", "pixscale_km"]], "pylanetary.navigation.core.ModelEllipsoid": [[1, 2, 1, "", "deg_per_px"], [1, 2, 1, "", "image_grid_km_x"], [1, 2, 1, "", "image_grid_km_y"], [1, 2, 1, "", "lat_g"], [1, 3, 1, "", "ldmodel"], [1, 2, 1, "", "lon_w"], [1, 2, 1, "", "mu"], [1, 2, 1, "", "mu0"], [1, 2, 1, "", "ob_lat"], [1, 2, 1, "", "ob_lon"], [1, 2, 1, "", "pixscale_km"], [1, 2, 1, "", "req"], [1, 2, 1, "", "rpol"], [1, 2, 1, "", "sun_lat"], [1, 2, 1, "", "sun_lon"], [1, 2, 1, "", "sun_n"], [1, 2, 1, "", "surf_n"], [1, 3, 1, "", "zonalmodel"]], "pylanetary.navigation.core.Nav": [[1, 3, 1, "", "colocate"], [1, 2, 1, "", "data"], [1, 2, 1, "", "parent_attrs"], [1, 3, 1, "", "reproject"], [1, 3, 1, "", "write"], [1, 3, 1, "", "xy_shift_data"], [1, 3, 1, "", "xy_shift_model"]], "pylanetary.rings": [[2, 0, 0, "-", "core"]], "pylanetary.rings.core": [[2, 1, 1, "", "Ring"], [2, 1, 1, "", "RingSystemModelObservation"], [2, 4, 1, "", "b_from_ae"], [2, 4, 1, "", "calc_abtheta"], [2, 4, 1, "", "double_rotate"], [2, 4, 1, "", "foreshortening"], [2, 4, 1, "", "plane_project"], [2, 4, 1, "", "project_ellipse_double"], [2, 4, 1, "", "ring_area"], [2, 4, 1, "", "vector_ellipse"], [2, 4, 1, "", "vector_magnitude"], [2, 4, 1, "", "vector_normalize"]], "pylanetary.rings.core.Ring": [[2, 3, 1, "", "as_2d_array"], [2, 3, 1, "", "as_azimuthal_wedges"], [2, 3, 1, "", "as_elliptical_annulus"]], "pylanetary.rings.core.RingSystemModelObservation": [[2, 3, 1, "", "as_2d_array"], [2, 2, 1, "", "bodytable"], [2, 2, 1, "", "ephem"], [2, 2, 1, "", "np_ang"], [2, 2, 1, "", "planetname"], [2, 2, 1, "", "rings"], [2, 2, 1, "", "ringtable"], [2, 2, 1, "", "systemtable"]], "pylanetary.utils": [[3, 0, 0, "-", "core"]], "pylanetary.utils.core": [[3, 1, 1, "", "Body"], [3, 4, 1, "", "I_over_F"], [3, 4, 1, "", "beam_area"], [3, 4, 1, "", "convolve_with_beam"], [3, 4, 1, "", "fourier_deconvolve"], [3, 4, 1, "", "inverse_planck"], [3, 4, 1, "", "inverse_rayleigh_jeans"], [3, 4, 1, "", "jybm_to_jysr"], [3, 4, 1, "", "jybm_to_tb"], [3, 4, 1, "", "jysr_to_jybm"], [3, 4, 1, "", "planck"], [3, 4, 1, "", "rayleigh_criterion"], [3, 4, 1, "", "rayleigh_jeans"], [3, 4, 1, "", "rebin"], [3, 4, 1, "", "solar_spectrum"], [3, 4, 1, "", "solid_angle"], [3, 4, 1, "", "tb_to_jybm"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "function", "Python function"]}, "titleterms": {"pylanetari": [0, 6], "api": [0, 1, 2, 3], "navig": [1, 10, 11], "ring": [2, 12], "util": [3, 8], "cite": 4, "contribut": 5, "workflow": [5, 10], "new": 5, "featur": [5, 6], "import": [5, 10], "guidelin": 5, "depend": 5, "impost": 5, "syndrom": 5, "disclaim": 5, "project": [6, 11], "us": 6, "instal": 7, "troubleshoot": 7, "planetari": 8, "bodi": 8, "attribut": 8, "ephemerid": 8, "The": [8, 11], "tutori": [9, 12], "lat": 10, "lon": 10, "grid": [10, 11], "jupit": 10, "hst": 10, "data": [10, 11, 12, 13], "scrape": 10, "header": 10, "instanti": 10, "nav": [10, 11], "object": [10, 12], "attempt": 10, "co": 10, "locat": 10, "assess": 10, "fit": [10, 11], "qualiti": 10, "re": 10, "try": 10, "better": 10, "model": [10, 11, 12], "appli": 10, "shift": 10, "plot": 10, "write": 10, "basic": [11, 12], "planet": 11, "disk": 11, "beam": [11, 12], "convolv": [11, 12], "limb": 11, "darken": 11, "correspond": 11, "real": 11, "observ": [11, 12], "modelbodi": 11, "class": 11, "compar": 11, "learn": 11, "more": 11, "save": 11, "reproject": 11, "onto": 11, "rectilinear": 11, "polar": 11, "custom": 11, "cartopi": 11, "summari": 11, "coloc": 11, "method": 11, "finit": 12, "width": 12, "bright": 12, "mask": 12, "system": 12, "modifi": 12, "default": 12, "minor": 12, "flux": 12, "exampl": 12, "analysi": 12, "extract": 12, "total": 12, "radial": 12, "profil": 12, "azimuth": 12, "A": 12, "note": 12, "foreshorten": 12, "movi": 12, "epsilon": 12, "precess": 12, "loos": 12, "end": 12, "do": 12, "list": 12, "unit": 13, "convers": 13, "radio": 13, "i": 13, "f": 13, "calcul": 13}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "nbsphinx": 4, "sphinx": 60}, "alltitles": {"pylanetary API": [[0, "pylanetary-api"]], "Utils API": [[3, "module-pylanetary.utils.core"]], "Citing": [[4, "citing"]], "Contributing": [[5, "contributing"]], "Contribution Workflow": [[5, "contribution-workflow"]], "New Features": [[5, "new-features"]], "Important Guidelines": [[5, "important-guidelines"]], "Dependencies": [[5, "dependencies"]], "Imposter syndrome disclaimer": [[5, "imposter-syndrome-disclaimer"]], "pylanetary": [[6, "pylanetary"]], "Features": [[6, "features"]], "Projects using pylanetary": [[6, "projects-using-pylanetary"]], "Installation": [[7, "installation"]], "Troubleshooting": [[7, "troubleshooting"]], "Planetary Body Attributes & Ephemerides": [[8, "Planetary-Body-Attributes-&-Ephemerides"]], "The Body utility": [[8, "The-Body-utility"]], "Tutorials": [[9, "tutorials"]], "Navigation Workflow": [[10, "Navigation-Workflow"]], "lat-lon grid for Jupiter HST data": [[10, "lat-lon-grid-for-Jupiter-HST-data"]], "import the data and scrape header": [[10, "import-the-data-and-scrape-header"]], "instantiate a Nav object": [[10, "instantiate-a-Nav-object"]], "attempt co-locate": [[10, "attempt-co-locate"]], "assess fit quality": [[10, "assess-fit-quality"]], "re-try with better model": [[10, "re-try-with-better-model"]], "applying the shift": [[10, "applying-the-shift"]], "plotting and writing": [[10, "plotting-and-writing"]], "Navigation Basics": [[11, "Navigation-Basics"]], "Basic planet disk model": [[11, "Basic-planet-disk-model"]], "Beam-convolved limb-darkened disk model": [[11, "Beam-convolved-limb-darkened-disk-model"]], "Model corresponding to real observations": [[11, "Model-corresponding-to-real-observations"]], "The ModelBody class": [[11, "The-ModelBody-class"]], "The Nav class": [[11, "The-Nav-class"]], "Comparing models with data": [[11, "Comparing-models-with-data"]], "Learn More": [[11, "Learn-More"]], "Save as fits": [[11, "Save-as-fits"]], "Reproject data onto rectilinear grid": [[11, "Reproject-data-onto-rectilinear-grid"]], "Polar projection": [[11, "Polar-projection"]], "Custom Cartopy projection": [[11, "Custom-Cartopy-projection"]], "summary of nav.colocate methods": [[11, "summary-of-nav.colocate-methods"]], "Rings Tutorial": [[12, "Rings-Tutorial"]], "Basic model ring": [[12, "Basic-model-ring"]], "Finite width and brightness": [[12, "Finite-width-and-brightness"]], "Ring objects as masks": [[12, "Ring-objects-as-masks"]], "convolve model ring with beam": [[12, "convolve-model-ring-with-beam"]], "Model ring system observation": [[12, "Model-ring-system-observation"]], "modifying ring system defaults": [[12, "modifying-ring-system-defaults"]], "minor rings": [[12, "minor-rings"]], "modifying widths and fluxes": [[12, "modifying-widths-and-fluxes"]], "Example Analysis with Observational Data": [[12, "Example-Analysis-with-Observational-Data"]], "Extract total ring flux": [[12, "Extract-total-ring-flux"]], "Radial profile": [[12, "Radial-profile"]], "Azimuthal profile": [[12, "Azimuthal-profile"]], "A note on foreshortening": [[12, "A-note-on-foreshortening"]], "Movie of epsilon ring precession": [[12, "Movie-of-epsilon-ring-precession"]], "Loose ends / to-do list": [[12, "Loose-ends-/-to-do-list"]], "Unit Conversions": [[13, "Unit-Conversions"]], "conversions for radio data": [[13, "conversions-for-radio-data"]], "I/F calculation": [[13, "I/F-calculation"]], "Navigation API": [[1, "module-pylanetary.navigation.core"]], "Rings API": [[2, "module-pylanetary.rings.core"]]}, "indexentries": {"ring (class in pylanetary.rings.core)": [[2, "pylanetary.rings.core.Ring"]], "ringsystemmodelobservation (class in pylanetary.rings.core)": [[2, "pylanetary.rings.core.RingSystemModelObservation"]], "as_2d_array() (pylanetary.rings.core.ring method)": [[2, "pylanetary.rings.core.Ring.as_2d_array"]], "as_2d_array() (pylanetary.rings.core.ringsystemmodelobservation method)": [[2, "pylanetary.rings.core.RingSystemModelObservation.as_2d_array"]], "as_azimuthal_wedges() (pylanetary.rings.core.ring method)": [[2, "pylanetary.rings.core.Ring.as_azimuthal_wedges"]], "as_elliptical_annulus() (pylanetary.rings.core.ring method)": [[2, "pylanetary.rings.core.Ring.as_elliptical_annulus"]], "b_from_ae() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.b_from_ae"]], "bodytable (pylanetary.rings.core.ringsystemmodelobservation attribute)": [[2, "pylanetary.rings.core.RingSystemModelObservation.bodytable"]], "calc_abtheta() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.calc_abtheta"]], "double_rotate() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.double_rotate"]], "ephem (pylanetary.rings.core.ringsystemmodelobservation attribute)": [[2, "pylanetary.rings.core.RingSystemModelObservation.ephem"]], "foreshortening() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.foreshortening"]], "module": [[2, "module-pylanetary.rings.core"]], "np_ang (pylanetary.rings.core.ringsystemmodelobservation attribute)": [[2, "pylanetary.rings.core.RingSystemModelObservation.np_ang"]], "plane_project() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.plane_project"]], "planetname (pylanetary.rings.core.ringsystemmodelobservation attribute)": [[2, "pylanetary.rings.core.RingSystemModelObservation.planetname"]], "project_ellipse_double() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.project_ellipse_double"]], "pylanetary.rings.core": [[2, "module-pylanetary.rings.core"]], "ring_area() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.ring_area"]], "rings (pylanetary.rings.core.ringsystemmodelobservation attribute)": [[2, "pylanetary.rings.core.RingSystemModelObservation.rings"]], "ringtable (pylanetary.rings.core.ringsystemmodelobservation attribute)": [[2, "pylanetary.rings.core.RingSystemModelObservation.ringtable"]], "systemtable (pylanetary.rings.core.ringsystemmodelobservation attribute)": [[2, "pylanetary.rings.core.RingSystemModelObservation.systemtable"]], "vector_ellipse() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.vector_ellipse"]], "vector_magnitude() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.vector_magnitude"]], "vector_normalize() (in module pylanetary.rings.core)": [[2, "pylanetary.rings.core.vector_normalize"]]}})
\ No newline at end of file
diff --git a/docs/_build/html/tutorials/body-tutorial.html b/docs/_build/html/tutorials/body-tutorial.html
index 7646cce..3e45367 100644
--- a/docs/_build/html/tutorials/body-tutorial.html
+++ b/docs/_build/html/tutorials/body-tutorial.html
@@ -10,7 +10,7 @@
       <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a746c00c" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=135e06be" />
     <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css?v=2aa19091" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=36a5483c" />
     
     
diff --git a/docs/_build/html/tutorials/nav-examples.html b/docs/_build/html/tutorials/nav-examples.html
index fef0b05..fec8466 100644
--- a/docs/_build/html/tutorials/nav-examples.html
+++ b/docs/_build/html/tutorials/nav-examples.html
@@ -10,7 +10,7 @@
       <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a746c00c" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=135e06be" />
     <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css?v=2aa19091" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=36a5483c" />
     
     
@@ -166,10 +166,11 @@
 <ul class="current">
 <li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 <li class="toctree-l1 current has-children"><a class="reference internal" href="index.html">Tutorials</a><input checked="" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="body-tutorial.html">Planetary Body Attributes &amp; Ephemerides</a></li>
 <li class="toctree-l2"><a class="reference internal" href="nav-tutorial.html">Navigation Basics</a></li>
 <li class="toctree-l2 current current-page"><a class="current reference internal" href="#">Navigation Workflow</a></li>
 <li class="toctree-l2"><a class="reference internal" href="rings-tutorial.html">Rings Tutorial</a></li>
-<li class="toctree-l2"><a class="reference internal" href="utils-tutorial.html">Utils Tutorial</a></li>
+<li class="toctree-l2"><a class="reference internal" href="unit-conversions.html">Unit Conversions</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="../contributing.html">Contributing</a></li>
diff --git a/docs/_build/html/tutorials/nav-tutorial.html b/docs/_build/html/tutorials/nav-tutorial.html
index b1ef03f..f0eb24e 100644
--- a/docs/_build/html/tutorials/nav-tutorial.html
+++ b/docs/_build/html/tutorials/nav-tutorial.html
@@ -10,7 +10,7 @@
       <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a746c00c" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=135e06be" />
     <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css?v=2aa19091" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=36a5483c" />
     
     
diff --git a/docs/_build/html/tutorials/rings-tutorial.html b/docs/_build/html/tutorials/rings-tutorial.html
index f20c345..b06d846 100644
--- a/docs/_build/html/tutorials/rings-tutorial.html
+++ b/docs/_build/html/tutorials/rings-tutorial.html
@@ -10,7 +10,7 @@
       <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a746c00c" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=135e06be" />
     <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css?v=2aa19091" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=36a5483c" />
     
     
diff --git a/docs/_build/html/tutorials/unit-conversions.html b/docs/_build/html/tutorials/unit-conversions.html
index b195f0d..8ad1704 100644
--- a/docs/_build/html/tutorials/unit-conversions.html
+++ b/docs/_build/html/tutorials/unit-conversions.html
@@ -10,7 +10,7 @@
       <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a746c00c" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=135e06be" />
     <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css?v=2aa19091" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=36a5483c" />
     
     
diff --git a/docs/_build/html/tutorials/utils-tutorial.html b/docs/_build/html/tutorials/utils-tutorial.html
deleted file mode 100644
index 8896851..0000000
--- a/docs/_build/html/tutorials/utils-tutorial.html
+++ /dev/null
@@ -1,478 +0,0 @@
-<!doctype html>
-<html class="no-js" lang="en" data-content_root="../">
-  <head><meta charset="utf-8"/>
-    <meta name="viewport" content="width=device-width,initial-scale=1"/>
-    <meta name="color-scheme" content="light dark"><meta name="viewport" content="width=device-width, initial-scale=1" />
-<link rel="index" title="Index" href="../genindex.html" /><link rel="search" title="Search" href="../search.html" /><link rel="next" title="Contributing" href="../contributing.html" /><link rel="prev" title="Rings Tutorial" href="rings-tutorial.html" />
-
-    <!-- Generated with Sphinx 7.2.6 and Furo 2023.09.10 -->
-        <title>Utils Tutorial - pylanetary documentation</title>
-      <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a746c00c" />
-    <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=135e06be" />
-    <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css?v=2aa19091" />
-    <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=36a5483c" />
-    
-    
-
-
-<style>
-  body {
-    --color-code-background: #f8f8f8;
-  --color-code-foreground: black;
-  --color-brand-primary: #002f87;
-  
-  }
-  @media not print {
-    body[data-theme="dark"] {
-      --color-code-background: #202020;
-  --color-code-foreground: #d0d0d0;
-  --color-brand-primary: #00a7e1;
-  
-    }
-    @media (prefers-color-scheme: dark) {
-      body:not([data-theme="light"]) {
-        --color-code-background: #202020;
-  --color-code-foreground: #d0d0d0;
-  --color-brand-primary: #00a7e1;
-  
-      }
-    }
-  }
-</style></head>
-  <body>
-    
-    <script>
-      document.body.dataset.theme = localStorage.getItem("theme") || "auto";
-    </script>
-    
-
-<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
-  <symbol id="svg-toc" viewBox="0 0 24 24">
-    <title>Contents</title>
-    <svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
-      <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
-    </svg>
-  </symbol>
-  <symbol id="svg-menu" viewBox="0 0 24 24">
-    <title>Menu</title>
-    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
-      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
-      <line x1="3" y1="12" x2="21" y2="12"></line>
-      <line x1="3" y1="6" x2="21" y2="6"></line>
-      <line x1="3" y1="18" x2="21" y2="18"></line>
-    </svg>
-  </symbol>
-  <symbol id="svg-arrow-right" viewBox="0 0 24 24">
-    <title>Expand</title>
-    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
-      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
-      <polyline points="9 18 15 12 9 6"></polyline>
-    </svg>
-  </symbol>
-  <symbol id="svg-sun" viewBox="0 0 24 24">
-    <title>Light mode</title>
-    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
-      stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
-      <circle cx="12" cy="12" r="5"></circle>
-      <line x1="12" y1="1" x2="12" y2="3"></line>
-      <line x1="12" y1="21" x2="12" y2="23"></line>
-      <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
-      <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
-      <line x1="1" y1="12" x2="3" y2="12"></line>
-      <line x1="21" y1="12" x2="23" y2="12"></line>
-      <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
-      <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
-    </svg>
-  </symbol>
-  <symbol id="svg-moon" viewBox="0 0 24 24">
-    <title>Dark mode</title>
-    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
-      stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
-      <path stroke="none" d="M0 0h24v24H0z" fill="none" />
-      <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
-    </svg>
-  </symbol>
-  <symbol id="svg-sun-half" viewBox="0 0 24 24">
-    <title>Auto light/dark mode</title>
-    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
-      stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
-      <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
-      <circle cx="12" cy="12" r="9" />
-      <path d="M13 12h5" />
-      <path d="M13 15h4" />
-      <path d="M13 18h1" />
-      <path d="M13 9h4" />
-      <path d="M13 6h1" />
-    </svg>
-  </symbol>
-</svg>
-
-<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
-<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
-<label class="overlay sidebar-overlay" for="__navigation">
-  <div class="visually-hidden">Hide navigation sidebar</div>
-</label>
-<label class="overlay toc-overlay" for="__toc">
-  <div class="visually-hidden">Hide table of contents sidebar</div>
-</label>
-
-
-
-<div class="page">
-  <header class="mobile-header">
-    <div class="header-left">
-      <label class="nav-overlay-icon" for="__navigation">
-        <div class="visually-hidden">Toggle site navigation sidebar</div>
-        <i class="icon"><svg><use href="#svg-menu"></use></svg></i>
-      </label>
-    </div>
-    <div class="header-center">
-      <a href="../index.html"><div class="brand">pylanetary  documentation</div></a>
-    </div>
-    <div class="header-right">
-      <div class="theme-toggle-container theme-toggle-header">
-        <button class="theme-toggle">
-          <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
-          <svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
-          <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
-          <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
-        </button>
-      </div>
-      <label class="toc-overlay-icon toc-header-icon" for="__toc">
-        <div class="visually-hidden">Toggle table of contents sidebar</div>
-        <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
-      </label>
-    </div>
-  </header>
-  <aside class="sidebar-drawer">
-    <div class="sidebar-container">
-      
-      <div class="sidebar-sticky"><a class="sidebar-brand" href="../index.html">
-  
-  <div class="sidebar-logo-container">
-    <img class="sidebar-logo" src="../_static/logo.png" alt="Logo"/>
-  </div>
-  
-  <span class="sidebar-brand-text">pylanetary  documentation</span>
-  
-</a><form class="sidebar-search-container" method="get" action="../search.html" role="search">
-  <input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
-  <input type="hidden" name="check_keywords" value="yes">
-  <input type="hidden" name="area" value="default">
-</form>
-<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
-  <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
-<ul class="current">
-<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
-<li class="toctree-l1 current has-children"><a class="reference internal" href="index.html">Tutorials</a><input checked="" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorials</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul class="current">
-<li class="toctree-l2"><a class="reference internal" href="nav-tutorial.html">Navigation Basics</a></li>
-<li class="toctree-l2"><a class="reference internal" href="nav-examples.html">Navigation Workflow</a></li>
-<li class="toctree-l2"><a class="reference internal" href="rings-tutorial.html">Rings Tutorial</a></li>
-<li class="toctree-l2 current current-page"><a class="current reference internal" href="#">Utils Tutorial</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="../contributing.html">Contributing</a></li>
-<li class="toctree-l1"><a class="reference internal" href="../citing.html">Citing</a></li>
-<li class="toctree-l1 has-children"><a class="reference internal" href="../api/index.html">pylanetary API</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><div class="visually-hidden">Toggle navigation of pylanetary API</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
-<li class="toctree-l2"><a class="reference internal" href="../api/navigation_api.html">Navigation API</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../api/rings_api.html">Rings API</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../api/utils_api.html">Utils API</a></li>
-</ul>
-</li>
-</ul>
-
-</div>
-</div>
-
-      </div>
-      
-    </div>
-  </aside>
-  <div class="main">
-    <div class="content">
-      <div class="article-container">
-        <a href="#" class="back-to-top muted-link">
-          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
-            <path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
-          </svg>
-          <span>Back to top</span>
-        </a>
-        <div class="content-icon-container">
-          
-<div class="theme-toggle-container theme-toggle-content">
-            <button class="theme-toggle">
-              <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
-              <svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
-              <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
-              <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
-            </button>
-          </div>
-          <label class="toc-overlay-icon toc-content-icon" for="__toc">
-            <div class="visually-hidden">Toggle table of contents sidebar</div>
-            <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
-          </label>
-        </div>
-        <article role="main">
-          <section id="Utils-Tutorial">
-<h1>Utils Tutorial<a class="headerlink" href="#Utils-Tutorial" title="Link to this heading">#</a></h1>
-<div class="nbinput nblast docutils container">
-<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
-</pre></div>
-</div>
-<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># imports</span>
-<span class="kn">from</span> <span class="nn">pylanetary.utils</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
-</pre></div>
-</div>
-</div>
-<section id="unit-conversions">
-<h2>unit conversions<a class="headerlink" href="#unit-conversions" title="Link to this heading">#</a></h2>
-<div class="nbinput docutils container">
-<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
-</pre></div>
-</div>
-<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">Tb</span> <span class="o">=</span> <span class="mi">100</span> <span class="c1">#K</span>
-<span class="n">freq</span> <span class="o">=</span> <span class="mf">115.271</span> <span class="c1">#GHz</span>
-<span class="n">beamx</span> <span class="o">=</span> <span class="mf">0.4</span> <span class="c1">#arcsec</span>
-<span class="n">beamy</span> <span class="o">=</span> <span class="n">beamx</span>
-
-<span class="n">jybm</span> <span class="o">=</span> <span class="n">tb_to_jybm</span><span class="p">(</span><span class="n">Tb</span><span class="p">,</span> <span class="n">freq</span><span class="p">,</span> <span class="n">beamx</span><span class="p">,</span> <span class="n">beamy</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Result is </span><span class="si">{</span><span class="n">jybm</span><span class="si">}</span><span class="s1"> Jy/beam&#39;</span><span class="p">)</span>
-
-<span class="n">jysr</span> <span class="o">=</span> <span class="n">jybm_to_jysr</span><span class="p">(</span><span class="n">jybm</span><span class="p">,</span> <span class="n">beamx</span><span class="p">,</span> <span class="n">beamy</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;which translates to </span><span class="si">{</span><span class="n">jysr</span><span class="si">}</span><span class="s1"> Jy/sr.&#39;</span><span class="p">)</span>
-
-<span class="n">jysr_rj</span> <span class="o">=</span> <span class="n">rayleigh_jeans</span><span class="p">(</span><span class="n">Tb</span><span class="p">,</span> <span class="n">freq</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;The above is using the Rayleigh-Jeans approximation, and could have been done in one step: </span><span class="si">{</span><span class="n">jysr_rj</span><span class="si">}</span><span class="s1"> Jy/sr&#39;</span><span class="p">)</span>
-
-<span class="n">jysr</span> <span class="o">=</span> <span class="n">planck</span><span class="p">(</span><span class="n">Tb</span><span class="p">,</span> <span class="n">freq</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Using the full Planck function we get: </span><span class="si">{</span><span class="n">jysr</span><span class="si">}</span><span class="s1"> Jy/sr&#39;</span><span class="p">)</span>
-
-<span class="n">beamA</span> <span class="o">=</span> <span class="n">beam_area</span><span class="p">(</span><span class="n">beamx</span><span class="p">,</span> <span class="n">beamy</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;The angular area of the beam is </span><span class="si">{</span><span class="n">beamA</span><span class="si">}</span><span class="s1"> arcsec^2 assuming Gaussian shape&#39;</span><span class="p">)</span>
-<br/><br/></pre></div>
-</div>
-</div>
-<div class="nboutput nblast docutils container">
-<div class="prompt empty docutils container">
-</div>
-<div class="output_area docutils container">
-<div class="highlight"><pre>
-Result is 0.17426102873442623 Jy/beam
-which translates to 40851198324.166 Jy/sr.
-The above is using the Rayleigh-Jeans approximation, and could have been done in one step: 40822885793.88541 Jy/sr
-Using the full Planck function we get: 39704080358.999504 Jy/sr
-The angular area of the beam is 0.18129440567308777 arcsec^2 assuming Gaussian shape
-</pre></div></div>
-</div>
-</section>
-<section id="I/F-calculation">
-<h2>I/F calculation<a class="headerlink" href="#I/F-calculation" title="Link to this heading">#</a></h2>
-<p>definition from Hammel et al 1989, DOI:10.1016/0019-1035(89)90149-8</p>
-<p>Let’s calculate the I/F of Proteus in H-band from a measurement in erg s-1 cm-2 um-1.</p>
-<div class="nbinput docutils container">
-<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
-</pre></div>
-</div>
-<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">observed_flux</span> <span class="o">=</span> <span class="mf">7e-14</span> <span class="c1">#erg s-1 cm-2 um-1</span>
-<span class="n">neptune_earth_dist</span> <span class="o">=</span> <span class="mf">4.6e9</span> <span class="c1">#km</span>
-<span class="n">neptune_sun_dist</span> <span class="o">=</span> <span class="mf">4.3e9</span> <span class="c1">#km</span>
-
-<span class="n">r</span> <span class="o">=</span> <span class="mi">210</span> <span class="c1">#km; radius of Proteus</span>
-<span class="n">dS</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">r</span><span class="o">**</span><span class="mi">2</span>
-
-<span class="c1"># find the solid angle of Proteus</span>
-<span class="n">Omega</span> <span class="o">=</span> <span class="n">solid_angle</span><span class="p">(</span><span class="n">dS</span><span class="p">,</span> <span class="n">neptune_earth_dist</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Proteus solid angle is </span><span class="si">{</span><span class="n">Omega</span><span class="si">:</span><span class="s1">.2e</span><span class="si">}</span><span class="s1"> sr = </span><span class="si">{</span><span class="n">Omega</span><span class="o">*</span><span class="mf">4.25e10</span><span class="si">:</span><span class="s1">.6f</span><span class="si">}</span><span class="s1"> arcsec^2&#39;</span><span class="p">)</span>
-
-<span class="c1"># example transmission curve for roughly H-band</span>
-<span class="n">wls</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mf">1.2</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span> <span class="c1">#microns</span>
-<span class="n">trans</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">wls</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
-<span class="n">trans</span><span class="p">[</span><span class="n">wls</span> <span class="o">&lt;</span> <span class="mf">1.75</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1.0</span>
-<span class="n">trans</span><span class="p">[</span><span class="n">wls</span> <span class="o">&lt;</span> <span class="mf">1.45</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.0</span>
-<span class="n">bp</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">wls</span><span class="p">,</span> <span class="n">trans</span><span class="p">])</span>
-
-<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">wls</span><span class="p">,</span> <span class="n">trans</span><span class="p">)</span>
-<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;Wavelength ($\mu$m)&#39;</span><span class="p">)</span>
-<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;Transmission&#39;</span><span class="p">)</span>
-<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
-
-<span class="c1"># find I/F in that filter</span>
-<span class="n">wl_eff</span><span class="p">,</span> <span class="n">IoverF</span> <span class="o">=</span> <span class="n">I_over_F</span><span class="p">(</span><span class="n">observed_flux</span><span class="p">,</span> <span class="n">bp</span><span class="p">,</span> <span class="n">neptune_sun_dist</span><span class="o">/</span><span class="mf">1.5e8</span><span class="p">,</span> <span class="n">Omega</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Proteus I/F at </span><span class="si">{</span><span class="n">wl_eff</span><span class="si">:</span><span class="s1">.2f</span><span class="si">}</span><span class="s1"> um = </span><span class="si">{</span><span class="n">IoverF</span><span class="si">:</span><span class="s1">.2f</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
-</pre></div>
-</div>
-</div>
-<div class="nboutput docutils container">
-<div class="prompt empty docutils container">
-</div>
-<div class="output_area docutils container">
-<div class="highlight"><pre>
-Proteus solid angle is 6.55e-15 sr = 0.000278 arcsec^2
-</pre></div></div>
-</div>
-<div class="nboutput docutils container">
-<div class="prompt empty docutils container">
-</div>
-<div class="output_area docutils container">
-<img alt="../_images/tutorials_utils-tutorial_5_1.png" src="../_images/tutorials_utils-tutorial_5_1.png" />
-</div>
-</div>
-<div class="nboutput nblast docutils container">
-<div class="prompt empty docutils container">
-</div>
-<div class="output_area docutils container">
-<div class="highlight"><pre>
-Proteus I/F at 1.60 um = 0.11
-</pre></div></div>
-</div>
-</section>
-<section id="The-Body-utility-for-planet/moon-attributes">
-<h2>The Body utility for planet/moon attributes<a class="headerlink" href="#The-Body-utility-for-planet/moon-attributes" title="Link to this heading">#</a></h2>
-<p>Given the name of a planet or large moon, load static data like mass, equatorial and polar radii, orbital parameters. Also load an ephemeris from Horizons.</p>
-<div class="nbinput docutils container">
-<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
-</pre></div>
-</div>
-<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">jup</span> <span class="o">=</span> <span class="n">Body</span><span class="p">(</span><span class="s1">&#39;Jupiter&#39;</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">jup</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1"> has equatorial, polar radii </span><span class="si">{</span><span class="n">jup</span><span class="o">.</span><span class="n">req</span><span class="si">}</span><span class="s1">, </span><span class="si">{</span><span class="n">jup</span><span class="o">.</span><span class="n">rpol</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">jup</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1"> has a </span><span class="si">{</span><span class="n">jup</span><span class="o">.</span><span class="n">t_rot_hrs</span><span class="si">}</span><span class="s1"> sidereal day&#39;</span><span class="p">)</span>
-</pre></div>
-</div>
-</div>
-<div class="nboutput nblast docutils container">
-<div class="prompt empty docutils container">
-</div>
-<div class="output_area docutils container">
-<div class="highlight"><pre>
-Jupiter has equatorial, polar radii 71492.0 km, 66854.0 km
-Jupiter has a 9.925 h sidereal day
-</pre></div></div>
-</div>
-<div class="nbinput docutils container">
-<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]:
-</pre></div>
-</div>
-<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># assumes datetime.now() and center of earth</span>
-<span class="nb">print</span><span class="p">(</span><span class="n">jup</span><span class="o">.</span><span class="n">ephem</span><span class="p">)</span>
-</pre></div>
-</div>
-</div>
-<div class="nboutput nblast docutils container">
-<div class="prompt empty docutils container">
-</div>
-<div class="output_area docutils container">
-<div class="highlight"><pre>
-  targetname      datetime_str        datetime_jd    solar_presence lunar_presence    RA      DEC     RA_app  DEC_app  RA_rate    DEC_rate   AZ  EL   AZ_rate      EL_rate      sat_X      sat_Y   sat_PANG siderealtime airmass magextinct   V      surfbright  illumination illum_defect sat_sep  sat_vis ang_width  PDObsLon  PDObsLat  PDSunLon  PDSunLat SubSol_ang SubSol_dist NPole_ang NPole_dist  EclLon  EclLat       r          r_rate       delta        delta_rate  lighttime   vel_sun    vel_obs    elong   elongFlag  alpha  lunar_elong lunar_illum sat_alpha sunTargetPA velocityPA OrbPlaneAng constellation   TDB-UT  ObsEclLon ObsEclLat   NPole_RA NPole_DEC   GlxLon     GlxLat   solartime earth_lighttime RA_3sigma DEC_3sigma SMAA_3sigma SMIA_3sigma Theta_3sigma Area_3sigma RSS_3sigma r_3sigma r_rate_3sigma SBand_3sigma XBand_3sigma DoppDelay_3sigma true_anom hour_angle alpha_true  PABLon  PABLat
-     ---              ---                  d              ---            ---         deg      deg      deg      deg   arcsec / h arcsec / h deg deg arcsec / min arcsec / min   arcsec     arcsec    deg         h         ---      mag      mag   mag / arcsec2      %          arcsec     arcsec    ---     arcsec     deg       deg       deg       deg       deg        arcsec      deg      arcsec     deg     deg         AU         km / s         AU           km / s       min       km / s     km / s     deg       ---      deg       deg          %         deg        deg        deg         deg          ---          s        deg       deg        deg       deg       deg        deg         h           min         arcsec    arcsec      arcsec      arcsec       deg        arcsec2     arcsec      km        km / s         Hz           Hz             s            deg        h         deg       deg     deg
-------------- -------------------- ----------------- -------------- -------------- -------- -------- -------- ------- ---------- ---------- --- --- ------------ ------------ ---------- --------- -------- ------------ ------- ---------- ------ ------------- ------------ ------------ -------- ------- --------- ---------- -------- ---------- -------- ---------- ----------- --------- ---------- ------- ------- -------------- --------- ---------------- ----------- ----------- ---------- ---------- -------- --------- ------- ----------- ----------- --------- ----------- ---------- ----------- ------------- --------- --------- ---------- --------- --------- ---------- ---------- --------- --------------- --------- ---------- ----------- ----------- ------------ ----------- ---------- -------- ------------- ------------ ------------ ---------------- --------- ---------- ---------- ------- -------
-Jupiter (599) 2023-Aug-27 21:16:14 2460184.386273148                               43.08396 15.13178 43.41099 15.2294   3.768455   0.628637  --  --           --           -- -400056.46 19132.599  289.969           --     999         -- -2.556         5.358      99.0638       0.4061 391899.0       *  43.37403 172.679298 3.828957 183.797149 3.470775      73.64        4.18  342.3435     20.235 34.0487 -1.1952 4.964904491942 0.2177477 4.54524552110738 -24.9001155 37.80165431 13.6749375 25.1445703 108.8608        /L 11.1068       115.9     85.2622   60.0323     253.554    252.316     0.23345           Ari 69.182719  45.48364 -1.3033406 268.05805  64.49679 161.353279 -38.556696        --             0.0        --         --          --          --           --          --         --       --            --           --           --               --   19.7846         --     11.105 39.5995 -1.2564
-</pre></div></div>
-</div>
-<p>This ephemeris assumes we wanted the results right now as observed at the center of mass of Earth. If we instead wanted to observe from the VLA site at the time of the first SL9 impact, we could say:</p>
-<div class="nbinput docutils container">
-<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
-</pre></div>
-</div>
-<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">jup</span> <span class="o">=</span> <span class="n">Body</span><span class="p">(</span><span class="s1">&#39;Jupiter&#39;</span><span class="p">,</span> <span class="n">epoch</span><span class="o">=</span><span class="s1">&#39;1994-07-16 20:13&#39;</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="s1">&#39;VLA&#39;</span><span class="p">)</span>
-<span class="nb">print</span><span class="p">(</span><span class="n">jup</span><span class="o">.</span><span class="n">ephem</span><span class="p">)</span>
-</pre></div>
-</div>
-</div>
-<div class="nboutput nblast docutils container">
-<div class="prompt empty docutils container">
-</div>
-<div class="output_area docutils container">
-<div class="highlight"><pre>
-  targetname     datetime_str      datetime_jd    solar_presence lunar_presence     RA       DEC      RA_app   DEC_app   RA_rate    DEC_rate      AZ         EL      AZ_rate      EL_rate      sat_X      sat_Y    sat_PANG siderealtime airmass magextinct   V     surfbright  illumination illum_defect sat_sep  sat_vis ang_width  PDObsLon  PDObsLat PDSunLon PDSunLat SubSol_ang SubSol_dist NPole_ang NPole_dist  EclLon  EclLat       r          r_rate        delta       delta_rate  lighttime   vel_sun   vel_obs    elong   elongFlag alpha  lunar_elong lunar_illum sat_alpha sunTargetPA velocityPA OrbPlaneAng constellation   TDB-UT   ObsEclLon  ObsEclLat  NPole_RA NPole_DEC   GlxLon     GlxLat    solartime   earth_lighttime RA_3sigma DEC_3sigma SMAA_3sigma SMIA_3sigma Theta_3sigma Area_3sigma RSS_3sigma r_3sigma r_rate_3sigma SBand_3sigma XBand_3sigma DoppDelay_3sigma true_anom  hour_angle  alpha_true  PABLon PABLat
-     ---             ---                d              ---            ---          deg       deg       deg       deg    arcsec / h arcsec / h    deg        deg    arcsec / min arcsec / min   arcsec     arcsec     deg         h         ---      mag      mag  mag / arcsec2      %          arcsec     arcsec    ---     arcsec     deg       deg      deg      deg       deg        arcsec      deg      arcsec     deg     deg         AU         km / s          AU          km / s       min       km / s    km / s     deg       ---     deg       deg          %         deg        deg        deg         deg          ---          s         deg        deg       deg       deg       deg        deg          h             min         arcsec    arcsec      arcsec      arcsec       deg        arcsec2     arcsec      km        km / s         Hz           Hz             s            deg         h          deg       deg    deg
-------------- ----------------- ----------------- -------------- -------------- --------- --------- --------- --------- ---------- ---------- ---------- --------- ------------ ------------ ---------- ---------- -------- ------------ ------- ---------- ----- ------------- ------------ ------------ -------- ------- --------- --------- --------- -------- -------- ---------- ----------- --------- ---------- -------- ------ -------------- ---------- ---------------- ---------- ----------- --------- ---------- -------- --------- ------ ----------- ----------- --------- ----------- ---------- ----------- ------------- --------- ----------- --------- --------- --------- ---------- --------- ------------- --------------- --------- ---------- ----------- ----------- ------------ ----------- ---------- -------- ------------- ------------ ------------ ---------------- --------- ------------ ---------- ------- ------
-Jupiter (599) 1994-Jul-16 20:13 2449550.342361111              *                213.25946 -12.18286 213.19106 -12.15803   5.902723   -2.87891 103.892463 -1.205187       501.78       725.51 326174.133 -120437.47   98.876 8.6713333887     999         -- -2.11         5.541     99.14532       0.3284 363714.1       *  38.42845 81.605459 -3.417513 70.98207 -3.56489     289.67        3.54   20.6435    -17.936 225.7758 1.0648 5.417202860036 -0.3161016 5.13020024376608 25.7802051 42.66657439 12.534906 26.6589241 101.0317        /T 10.608       2.924     59.9989   68.3603     109.651     289.99     0.06118           Vir 61.183653 215.0912804  1.124912 268.05799   64.4958 332.296937 45.984193 12.9415708964        0.000354        --         --          --          --           --          --         --       --            --           --           --               --  210.4525 -5.541404253     10.609 220.468 1.0993
-</pre></div></div>
-</div>
-</section>
-</section>
-
-        </article>
-      </div>
-      <footer>
-        
-        <div class="related-pages">
-          <a class="next-page" href="../contributing.html">
-              <div class="page-info">
-                <div class="context">
-                  <span>Next</span>
-                </div>
-                <div class="title">Contributing</div>
-              </div>
-              <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
-            </a>
-          <a class="prev-page" href="rings-tutorial.html">
-              <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
-              <div class="page-info">
-                <div class="context">
-                  <span>Previous</span>
-                </div>
-                
-                <div class="title">Rings Tutorial</div>
-                
-              </div>
-            </a>
-        </div>
-        <div class="bottom-of-page">
-          <div class="left-details">
-            <div class="copyright">
-                Copyright &#169; 
-            </div>
-            Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
-            
-            <a href="https://github.com/pradyunsg/furo">Furo</a>
-            
-          </div>
-          <div class="right-details">
-            
-          </div>
-        </div>
-        
-      </footer>
-    </div>
-    <aside class="toc-drawer">
-      
-      
-      <div class="toc-sticky toc-scroll">
-        <div class="toc-title-container">
-          <span class="toc-title">
-            On this page
-          </span>
-        </div>
-        <div class="toc-tree-container">
-          <div class="toc-tree">
-            <ul>
-<li><a class="reference internal" href="#">Utils Tutorial</a><ul>
-<li><a class="reference internal" href="#unit-conversions">unit conversions</a></li>
-<li><a class="reference internal" href="#I/F-calculation">I/F calculation</a></li>
-<li><a class="reference internal" href="#The-Body-utility-for-planet/moon-attributes">The Body utility for planet/moon attributes</a></li>
-</ul>
-</li>
-</ul>
-
-          </div>
-        </div>
-      </div>
-      
-      
-    </aside>
-  </div>
-</div><script src="../_static/documentation_options.js?v=5929fcd5"></script>
-    <script src="../_static/doctools.js?v=888ff710"></script>
-    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
-    <script src="../_static/scripts/furo.js?v=32e29ea5"></script>
-    <script src="../_static/clipboard.min.js?v=a7894cd8"></script>
-    <script src="../_static/copybutton.js?v=f281be69"></script>
-    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
-    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
-    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
-    </body>
-</html>
\ No newline at end of file
diff --git a/docs/_build/html/tutorials/utils-tutorial.ipynb b/docs/_build/html/tutorials/utils-tutorial.ipynb
deleted file mode 100644
index d8d8b41..0000000
--- a/docs/_build/html/tutorials/utils-tutorial.ipynb
+++ /dev/null
@@ -1,253 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "id": "32bbcf29",
-   "metadata": {},
-   "source": [
-    "# Utils Tutorial"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "id": "b0055d49",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# imports\n",
-    "from pylanetary.utils import *\n",
-    "import numpy as np\n",
-    "import matplotlib.pyplot as plt"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "e58e99c7",
-   "metadata": {},
-   "source": [
-    "## unit conversions"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "id": "06662d80",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Result is 0.17426102873442623 Jy/beam\n",
-      "which translates to 40851198324.166 Jy/sr.\n",
-      "The above is using the Rayleigh-Jeans approximation, and could have been done in one step: 40822885793.88541 Jy/sr\n",
-      "Using the full Planck function we get: 39704080358.999504 Jy/sr\n",
-      "The angular area of the beam is 0.18129440567308777 arcsec^2 assuming Gaussian shape\n"
-     ]
-    }
-   ],
-   "source": [
-    "Tb = 100 #K\n",
-    "freq = 115.271 #GHz\n",
-    "beamx = 0.4 #arcsec\n",
-    "beamy = beamx\n",
-    "\n",
-    "jybm = tb_to_jybm(Tb, freq, beamx, beamy)\n",
-    "print(f'Result is {jybm} Jy/beam')\n",
-    "\n",
-    "jysr = jybm_to_jysr(jybm, beamx, beamy)\n",
-    "print(f'which translates to {jysr} Jy/sr.')\n",
-    "\n",
-    "jysr_rj = rayleigh_jeans(Tb, freq)\n",
-    "print(f'The above is using the Rayleigh-Jeans approximation, and could have been done in one step: {jysr_rj} Jy/sr')\n",
-    "\n",
-    "jysr = planck(Tb, freq)\n",
-    "print(f'Using the full Planck function we get: {jysr} Jy/sr')\n",
-    "\n",
-    "beamA = beam_area(beamx, beamy)\n",
-    "print(f'The angular area of the beam is {beamA} arcsec^2 assuming Gaussian shape')\n",
-    "\n"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "ef08acf5",
-   "metadata": {},
-   "source": [
-    "## I/F calculation\n",
-    "\n",
-    "definition from Hammel et al 1989, DOI:10.1016/0019-1035(89)90149-8\n",
-    "\n",
-    "Let's calculate the I/F of Proteus in H-band from a measurement in erg s-1 cm-2 um-1.\n",
-    "\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "id": "960b4d4a",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Proteus solid angle is 6.55e-15 sr = 0.000278 arcsec^2\n"
-     ]
-    },
-    {
-     "data": {
-      "image/png": "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\n",
-      "text/plain": [
-       "<Figure size 432x288 with 1 Axes>"
-      ]
-     },
-     "metadata": {
-      "needs_background": "light"
-     },
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Proteus I/F at 1.60 um = 0.11\n"
-     ]
-    }
-   ],
-   "source": [
-    "observed_flux = 7e-14 #erg s-1 cm-2 um-1\n",
-    "neptune_earth_dist = 4.6e9 #km\n",
-    "neptune_sun_dist = 4.3e9 #km\n",
-    "\n",
-    "r = 210 #km; radius of Proteus\n",
-    "dS = np.pi*r**2\n",
-    "\n",
-    "# find the solid angle of Proteus\n",
-    "Omega = solid_angle(dS, neptune_earth_dist)\n",
-    "print(f'Proteus solid angle is {Omega:.2e} sr = {Omega*4.25e10:.6f} arcsec^2')\n",
-    "\n",
-    "# example transmission curve for roughly H-band\n",
-    "wls = np.linspace(1.2, 2.0, 100) #microns\n",
-    "trans = np.zeros(wls.shape)\n",
-    "trans[wls < 1.75] = 1.0\n",
-    "trans[wls < 1.45] = 0.0\n",
-    "bp = np.array([wls, trans])\n",
-    "\n",
-    "plt.plot(wls, trans)\n",
-    "plt.xlabel(r'Wavelength ($\\mu$m)')\n",
-    "plt.ylabel('Transmission')\n",
-    "plt.show()\n",
-    "\n",
-    "# find I/F in that filter\n",
-    "wl_eff, IoverF = I_over_F(observed_flux, bp, neptune_sun_dist/1.5e8, Omega)\n",
-    "print(f'Proteus I/F at {wl_eff:.2f} um = {IoverF:.2f}')"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "76c07f7b",
-   "metadata": {},
-   "source": [
-    "## The Body utility for planet/moon attributes\n",
-    "\n",
-    "Given the name of a planet or large moon, load static data like mass, equatorial and polar radii, orbital parameters. Also load an ephemeris from Horizons."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "id": "9210d119",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Jupiter has equatorial, polar radii 71492.0 km, 66854.0 km\n",
-      "Jupiter has a 9.925 h sidereal day\n"
-     ]
-    }
-   ],
-   "source": [
-    "jup = Body('Jupiter')\n",
-    "print(f'{jup.name} has equatorial, polar radii {jup.req}, {jup.rpol}')\n",
-    "print(f'{jup.name} has a {jup.t_rot_hrs} sidereal day')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "id": "8c8cbc61",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "  targetname      datetime_str        datetime_jd    solar_presence lunar_presence    RA      DEC     RA_app  DEC_app  RA_rate    DEC_rate   AZ  EL   AZ_rate      EL_rate      sat_X      sat_Y   sat_PANG siderealtime airmass magextinct   V      surfbright  illumination illum_defect sat_sep  sat_vis ang_width  PDObsLon  PDObsLat  PDSunLon  PDSunLat SubSol_ang SubSol_dist NPole_ang NPole_dist  EclLon  EclLat       r          r_rate       delta        delta_rate  lighttime   vel_sun    vel_obs    elong   elongFlag  alpha  lunar_elong lunar_illum sat_alpha sunTargetPA velocityPA OrbPlaneAng constellation   TDB-UT  ObsEclLon ObsEclLat   NPole_RA NPole_DEC   GlxLon     GlxLat   solartime earth_lighttime RA_3sigma DEC_3sigma SMAA_3sigma SMIA_3sigma Theta_3sigma Area_3sigma RSS_3sigma r_3sigma r_rate_3sigma SBand_3sigma XBand_3sigma DoppDelay_3sigma true_anom hour_angle alpha_true  PABLon  PABLat\n",
-      "     ---              ---                  d              ---            ---         deg      deg      deg      deg   arcsec / h arcsec / h deg deg arcsec / min arcsec / min   arcsec     arcsec    deg         h         ---      mag      mag   mag / arcsec2      %          arcsec     arcsec    ---     arcsec     deg       deg       deg       deg       deg        arcsec      deg      arcsec     deg     deg         AU         km / s         AU           km / s       min       km / s     km / s     deg       ---      deg       deg          %         deg        deg        deg         deg          ---          s        deg       deg        deg       deg       deg        deg         h           min         arcsec    arcsec      arcsec      arcsec       deg        arcsec2     arcsec      km        km / s         Hz           Hz             s            deg        h         deg       deg     deg  \n",
-      "------------- -------------------- ----------------- -------------- -------------- -------- -------- -------- ------- ---------- ---------- --- --- ------------ ------------ ---------- --------- -------- ------------ ------- ---------- ------ ------------- ------------ ------------ -------- ------- --------- ---------- -------- ---------- -------- ---------- ----------- --------- ---------- ------- ------- -------------- --------- ---------------- ----------- ----------- ---------- ---------- -------- --------- ------- ----------- ----------- --------- ----------- ---------- ----------- ------------- --------- --------- ---------- --------- --------- ---------- ---------- --------- --------------- --------- ---------- ----------- ----------- ------------ ----------- ---------- -------- ------------- ------------ ------------ ---------------- --------- ---------- ---------- ------- -------\n",
-      "Jupiter (599) 2023-Aug-27 21:16:14 2460184.386273148                               43.08396 15.13178 43.41099 15.2294   3.768455   0.628637  --  --           --           -- -400056.46 19132.599  289.969           --     999         -- -2.556         5.358      99.0638       0.4061 391899.0       *  43.37403 172.679298 3.828957 183.797149 3.470775      73.64        4.18  342.3435     20.235 34.0487 -1.1952 4.964904491942 0.2177477 4.54524552110738 -24.9001155 37.80165431 13.6749375 25.1445703 108.8608        /L 11.1068       115.9     85.2622   60.0323     253.554    252.316     0.23345           Ari 69.182719  45.48364 -1.3033406 268.05805  64.49679 161.353279 -38.556696        --             0.0        --         --          --          --           --          --         --       --            --           --           --               --   19.7846         --     11.105 39.5995 -1.2564\n"
-     ]
-    }
-   ],
-   "source": [
-    "# assumes datetime.now() and center of earth\n",
-    "print(jup.ephem)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "ef5bbca6",
-   "metadata": {},
-   "source": [
-    "This ephemeris assumes we wanted the results right now as observed at the center of mass of Earth.  If we instead wanted to observe from the VLA site at the time of the first SL9 impact, we could say:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "id": "30d6e637",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "  targetname     datetime_str      datetime_jd    solar_presence lunar_presence     RA       DEC      RA_app   DEC_app   RA_rate    DEC_rate      AZ         EL      AZ_rate      EL_rate      sat_X      sat_Y    sat_PANG siderealtime airmass magextinct   V     surfbright  illumination illum_defect sat_sep  sat_vis ang_width  PDObsLon  PDObsLat PDSunLon PDSunLat SubSol_ang SubSol_dist NPole_ang NPole_dist  EclLon  EclLat       r          r_rate        delta       delta_rate  lighttime   vel_sun   vel_obs    elong   elongFlag alpha  lunar_elong lunar_illum sat_alpha sunTargetPA velocityPA OrbPlaneAng constellation   TDB-UT   ObsEclLon  ObsEclLat  NPole_RA NPole_DEC   GlxLon     GlxLat    solartime   earth_lighttime RA_3sigma DEC_3sigma SMAA_3sigma SMIA_3sigma Theta_3sigma Area_3sigma RSS_3sigma r_3sigma r_rate_3sigma SBand_3sigma XBand_3sigma DoppDelay_3sigma true_anom  hour_angle  alpha_true  PABLon PABLat\n",
-      "     ---             ---                d              ---            ---          deg       deg       deg       deg    arcsec / h arcsec / h    deg        deg    arcsec / min arcsec / min   arcsec     arcsec     deg         h         ---      mag      mag  mag / arcsec2      %          arcsec     arcsec    ---     arcsec     deg       deg      deg      deg       deg        arcsec      deg      arcsec     deg     deg         AU         km / s          AU          km / s       min       km / s    km / s     deg       ---     deg       deg          %         deg        deg        deg         deg          ---          s         deg        deg       deg       deg       deg        deg          h             min         arcsec    arcsec      arcsec      arcsec       deg        arcsec2     arcsec      km        km / s         Hz           Hz             s            deg         h          deg       deg    deg  \n",
-      "------------- ----------------- ----------------- -------------- -------------- --------- --------- --------- --------- ---------- ---------- ---------- --------- ------------ ------------ ---------- ---------- -------- ------------ ------- ---------- ----- ------------- ------------ ------------ -------- ------- --------- --------- --------- -------- -------- ---------- ----------- --------- ---------- -------- ------ -------------- ---------- ---------------- ---------- ----------- --------- ---------- -------- --------- ------ ----------- ----------- --------- ----------- ---------- ----------- ------------- --------- ----------- --------- --------- --------- ---------- --------- ------------- --------------- --------- ---------- ----------- ----------- ------------ ----------- ---------- -------- ------------- ------------ ------------ ---------------- --------- ------------ ---------- ------- ------\n",
-      "Jupiter (599) 1994-Jul-16 20:13 2449550.342361111              *                213.25946 -12.18286 213.19106 -12.15803   5.902723   -2.87891 103.892463 -1.205187       501.78       725.51 326174.133 -120437.47   98.876 8.6713333887     999         -- -2.11         5.541     99.14532       0.3284 363714.1       *  38.42845 81.605459 -3.417513 70.98207 -3.56489     289.67        3.54   20.6435    -17.936 225.7758 1.0648 5.417202860036 -0.3161016 5.13020024376608 25.7802051 42.66657439 12.534906 26.6589241 101.0317        /T 10.608       2.924     59.9989   68.3603     109.651     289.99     0.06118           Vir 61.183653 215.0912804  1.124912 268.05799   64.4958 332.296937 45.984193 12.9415708964        0.000354        --         --          --          --           --          --         --       --            --           --           --               --  210.4525 -5.541404253     10.609 220.468 1.0993\n"
-     ]
-    }
-   ],
-   "source": [
-    "jup = Body('Jupiter', epoch='1994-07-16 20:13', location='VLA')\n",
-    "print(jup.ephem)"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.9.7"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/docs/index.rst b/docs/index.rst
index 2d779cf..cc32cf2 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -24,9 +24,9 @@ Features
 Projects using pylanetary
 -------------------------
 
-* [Keck Twilight Zone program](https://www2.keck.hawaii.edu/inst/tda/TwilightZone.html#)
+* `Keck Twilight Zone program <https://www2.keck.hawaii.edu/inst/tda/TwilightZone.html#>`_
 
-* [HST OPAL program](https://archive.stsci.edu/hlsp/opal)
+* `HST OPAL program <https://archive.stsci.edu/hlsp/opal>`_
 
 * Radio observers of giant planets, incl. Goddard, Berkeley, and Caltech groups
 
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 7111e8b..9ad9e5a 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -8,7 +8,7 @@ furo
 docutils>=0.18.
 markupsafe==2.0.1
 astropy>=4.3.0
-astroquery>=0.4.7.dev8893
+astroquery<=0.4.7.dev8893,>=0.4.7.dev8479
 beautifulsoup4==4.11.1
 cartopy
 extension_helpers==1.0.0
diff --git a/pylanetary/navigation/core.py b/pylanetary/navigation/core.py
index 690a7c9..a1a30f7 100755
--- a/pylanetary/navigation/core.py
+++ b/pylanetary/navigation/core.py
@@ -326,6 +326,75 @@ def limb_darkening(mu, a, law='exp', mu0=None):
 class ModelEllipsoid:
     '''
     Projection of an ellipsoid onto a 2-D array with latitude and longitude grid
+
+    Parameters
+    ----------
+    ob_lon : float, required.
+        [deg] sub-observer planetographic longitude
+    ob_lat : float, required.
+        [deg] sub-observer planetographic latitude
+    np_ang : float, required.
+        [deg] north polar angle
+        see JPL Horizons ephemeris tool for detailed descriptions
+        of ob_lon, ob_lat, np_ang
+    pixscale_km : float, required.
+        [km] pixel scale
+    req : float, required.
+        [km] equatorial radius
+    rpol : float, required.
+        [km] polar radius
+    center : 2-element array-like, optional, default (0,0).
+        pixel offset of center of planet from center of image
+    shape : 2-element tuple, optional.
+        shape of output arrays.
+        if None, shape is just larger than diameter / pixscale
+    sun_lon : float, optional, default None
+        sub-solar longitude. if None, assume same as ob_lon
+    sun_lat : float, optional, default None
+        sub_solar latitude. if None, assume same as ob_lat
+    longitude_convention : str, optional, default 'w'
+        east or west longitude convention
+
+    Attributes
+    ----------
+    req : float
+        see parameters
+    rpol : float
+        see parameters
+    ob_lon : float
+        see parameters
+    ob_lat : float
+        see parameters
+    sun_lon : float
+        see parameters
+    sun_lat : float
+        see parameters
+    pixscale_km : float
+        see parameters
+    deg_per_px : float
+        approximate size of pixel on planet, in degrees, at sub-observer point
+    lat_g : np.array
+        shape is roughly 2*max(req, rpol)/pixscale.
+        planetographic latitudes. NaN where off planet disk
+    lon_w : np.array
+        same shape as lat_g. west longitudes. NaN where off planet disk
+    mu : np.array
+        same shape as lat_g. cosines of the emission angle. NaN where off planet disk
+    surf_n : np.array
+        shape (3,x,y) CHECK THIS. Normal vector to the surface
+        of the planet at each pixel. NaN where off planet disk
+    sun_n : np.array
+        shape (3,x,y), solar normal vectors
+    mu0 : np.array
+        shape (x,y), cosine of solar incidence angle at each pixel
+    image_grid_km_x : np.array
+        shape (x,y), x-coordinates of image grid in km, where 0 is center of planet
+    image_grid_km_y : np.array
+        shape (x,y), y-coordinates of image grid in km, where 0 is center of planet
+
+    Examples
+    --------
+    see notebooks/planetnav-tutorial.ipynb
     '''
 
     def __init__(
@@ -343,76 +412,6 @@ def __init__(
             sun_lon=None,
             sun_lat=None,
             longitude_convention='w'):
-        '''
-        Parameters
-        ----------
-        ob_lon : float, required.
-            [deg] sub-observer planetographic longitude
-        ob_lat : float, required.
-            [deg] sub-observer planetographic latitude
-        np_ang : float, required.
-            [deg] north polar angle
-            see JPL Horizons ephemeris tool for detailed descriptions
-            of ob_lon, ob_lat, np_ang
-        pixscale_km : float, required.
-            [km] pixel scale
-        req : float, required.
-            [km] equatorial radius
-        rpol : float, required.
-            [km] polar radius
-        center : 2-element array-like, optional, default (0,0).
-            pixel offset of center of planet from center of image
-        shape : 2-element tuple, optional.
-            shape of output arrays.
-            if None, shape is just larger than diameter / pixscale
-        sun_lon : float, optional, default None
-            sub-solar longitude. if None, assume same as ob_lon
-        sun_lat : float, optional, default None
-            sub_solar latitude. if None, assume same as ob_lat
-        longitude_convention : str, optional, default 'w'
-            east or west longitude convention
-
-        Attributes
-        ----------
-        req : float
-            see parameters
-        rpol : float
-            see parameters
-        ob_lon : float
-            see parameters
-        ob_lat : float
-            see parameters
-        sun_lon : float
-            see parameters
-        sun_lat : float
-            see parameters
-        pixscale_km : float
-            see parameters
-        deg_per_px : float
-            approximate size of pixel on planet, in degrees, at sub-observer point
-        lat_g : np.array
-            shape is roughly 2*max(req, rpol)/pixscale.
-            planetographic latitudes. NaN where off planet disk
-        lon_w : np.array
-            same shape as lat_g. west longitudes. NaN where off planet disk
-        mu : np.array
-            same shape as lat_g. cosines of the emission angle. NaN where off planet disk
-        surf_n : np.array
-            shape (3,x,y) CHECK THIS. Normal vector to the surface
-            of the planet at each pixel. NaN where off planet disk
-        sun_n : np.array
-            shape (3,x,y), solar normal vectors
-        mu0 : np.array
-            shape (x,y), cosine of solar incidence angle at each pixel
-        image_grid_km_x : np.array
-            shape (x,y), x-coordinates of image grid in km, where 0 is center of planet
-        image_grid_km_y : np.array
-            shape (x,y), y-coordinates of image grid in km, where 0 is center of planet
-
-        Examples
-        --------
-        see notebooks/planetnav-tutorial.ipynb
-        '''
 
         self.req, self.rpol = req, rpol
         self.pixscale_km = pixscale_km
@@ -514,38 +513,36 @@ class ModelBody(ModelEllipsoid):
 
     '''
     Wrapper to ModelEllipsoid that permits passing an ephemeris
+
+    Parameters
+    ----------
+    body : pylanetary.utils.Body object, required
+    pixscale : float or Quantity, required.
+        [arcsec/px] pixel scale of the input image
+    shape : tuple, optional.
+        shape of output arrays.
+        if None, shape is just larger than diameter / pixscale
+
+    Attributes
+    ----------
+    body : pylanetary.utils.Body object
+        see parameters
+    name : str
+        Name of input body as read from input Body object
+    ephem : Astropy QTable.
+        single line of astroquery.horizons ephemeris
+        as read from utils.Body object.
+        must have 'PDObsLon', 'PDObsLat', 'delta', and 'NPole_ang' fields.
+        If you want to modify the ephemeris, modify body.ephem
+    pixscale_arcsec : float
+        [arcsec/px] pixel scale of image; see parameters
+    pixscale_km : float
+        [km/px] pixel scale of image computed from input pixel scale in arcsec
+        and distance from object to body according to body.ephem
+    all attrs from ModelEllipsoid
     '''
 
     def __init__(self, body, pixscale, shape=None):
-        '''
-        Parameters
-        ----------
-        body : pylanetary.utils.Body object, required
-        pixscale : float or Quantity, required.
-            [arcsec/px] pixel scale of the input image
-        shape : tuple, optional.
-            shape of output arrays.
-            if None, shape is just larger than diameter / pixscale
-
-        Attributes
-        ----------
-        body : pylanetary.utils.Body object
-            see parameters
-        name : str
-            Name of input body as read from input Body object
-        ephem : Astropy QTable.
-            single line of astroquery.horizons ephemeris
-            as read from utils.Body object.
-            must have 'PDObsLon', 'PDObsLat', 'delta', and 'NPole_ang' fields.
-            If you want to modify the ephemeris, modify body.ephem
-        pixscale_arcsec : float
-            [arcsec/px] pixel scale of image; see parameters
-        pixscale_km : float
-            [km/px] pixel scale of image computed from input pixel scale in arcsec
-            and distance from object to body according to body.ephem
-        parent_attrs :
-            all attributes of ModelEllipsoid
-        '''
 
         self.body = body
         self.name = body.name
@@ -571,36 +568,34 @@ def __str__(self):
 
 class Nav(ModelBody):
     '''
-    functions for comparing a model ellipsoid with observed 2-d imaging data
-    '''
-
-    def __init__(self, data, body, pixscale):
-        '''
-        Build the model body according to the input ephemeris
-
-        Parameters
-        ----------
-        data : np.array, required.
-            2-D image data
-        body : pylanetary.utils.Body object, required.
-        pixscale: float or Quantity, required.
-            [arcsec] pixel scale of the input image
+    Build the model body object,
+    and compare a model ellipsoid with observed 2-d imaging data
 
-        Attributes
-        ----------
-        data : np.array
-            see parameters
-        parent_attrs :
-            all attributes of ModelBody and ModelEllipsoid classes
+    Parameters
+    ----------
+    data : np.array, required.
+        2-D image data
+    body : pylanetary.utils.Body object, required.
+    pixscale: float or Quantity, required.
+        [arcsec] pixel scale of the input image
 
-        Examples
-        --------
-        see notebooks/nav-tutorial.ipynb
+    Attributes
+    ----------
+    data : np.array
+        see parameters
+    parent_attrs :
+        all attributes of ModelBody and ModelEllipsoid classes
+
+    Examples
+    --------
+    see notebooks/nav-tutorial.ipynb
+
+    Notes
+    -----
+    - Need to test astropy quantity handling, ensure docstring reflects what really happens
+    '''
 
-        Notes
-        -----
-        - Need to test astropy quantity handling, ensure docstring reflects what really happens
-        '''
+    def __init__(self, data, body, pixscale):
 
         # TO DO: fix these all to accept Astropy quantities
         self.data = data
diff --git a/pylanetary/rings/__init__.py b/pylanetary/rings/__init__.py
index 13af827..8cdda4e 100644
--- a/pylanetary/rings/__init__.py
+++ b/pylanetary/rings/__init__.py
@@ -1,6 +1,6 @@
 from .core import *
 
-#__all__ = [
+# __all__ = [
 #    "Ring",
 #    "RingSystemModelObservation"
-#]
\ No newline at end of file
+# ]
diff --git a/pylanetary/rings/core.py b/pylanetary/rings/core.py
index 623a8c2..86e277d 100644
--- a/pylanetary/rings/core.py
+++ b/pylanetary/rings/core.py
@@ -38,13 +38,13 @@ def vector_magnitude(a):
     '''
     magnitude of a vector
     this is a bit faster than using np.linalg.norm
-    
+
     Parameters
     ----------
     a : np.array, required
         shape (n, 3) or (n, 2)
         corresponding to n vectors
-    
+
     Returns
     -------
     np.array
@@ -54,18 +54,18 @@ def vector_magnitude(a):
     if len(a.shape) == 1:
         return np.sqrt(np.sum(a * a))
     return np.sqrt((a * a).sum(axis=1))
-    
-    
+
+
 def vector_normalize(v):
     '''
     returns the original vector if it has length zero
-    
+
     Parameters
     ----------
-    v : np.array, required 
+    v : np.array, required
         shape (n, 3) or (n, 2)
         corresponding to n vectors
-    
+
     Returns
     -------
     np.array
@@ -73,26 +73,26 @@ def vector_normalize(v):
     '''
     norm = vector_magnitude(v)
     if norm.size > 1:
-        norm[norm == 0] = 1.0 #hack to handle zero-length vectors
-        return v / norm[:,np.newaxis]
+        norm[norm == 0] = 1.0  # hack to handle zero-length vectors
+        return v / norm[:, np.newaxis]
     elif norm.size == 1:
         if norm == 0:
             return v
         else:
-            return v/norm
+            return v / norm
 
 
 def plane_project(X, Z):
     '''
     projects vectors X into plane normal to vector Z
-    
+
     Parameters
     ----------
     X : np.array, required
         shape (n,3). vectors to project
     Z : np.array, required
         shape (3,). direction to project in.
-    
+
     Returns
     -------
     np.array
@@ -108,18 +108,18 @@ def double_rotate(vec, params_ring, params_sys):
     same convention as planetary ring node
     to agree with planetary ring node, params_sys = [90, B - 90, np_ang]
     and params_ring = [w, i, 0]
-    
+
     Parameters
     ----------
     vec : np.array, required
-        shape (n, 3). 
-        3-element [x, y, 0] vectors on the perimeter of the ring 
+        shape (n, 3).
+        3-element [x, y, 0] vectors on the perimeter of the ring
         i.e. semimajor axis is [a, 0, 0] and semiminor axis is [0, b, 0]
     params_ring : np.array, required
         params_ring = [w, i, omega] all in degrees w.r.t the ring plane
     params_sys : np.array, required
         params_sys = [w, i, omega] in degrees for the ring plane w.r.t. observer
-    
+
     Returns
     -------
     np.array
@@ -140,7 +140,7 @@ def b_from_ae(a, e):
         semimajor axis of ellipse
     e : float, required.
         eccentricity of ellipse
-    
+
     Returns
     -------
     float
@@ -152,7 +152,7 @@ def b_from_ae(a, e):
 def vector_ellipse(u, v, n, origin=np.array([0, 0, 0])):
     '''
     Vector equation of an ellipse in two dimensions
-    
+
     Parameters
     ----------
     u : np.array, required
@@ -167,45 +167,46 @@ def vector_ellipse(u, v, n, origin=np.array([0, 0, 0])):
     origin : np.array, required
         shape (3,)
         vector pointing to the center of the ellipse
-    
+
     Returns
     -------
     np.array
         shape (n, 3)
         vectors pointing to the circumference of the ellipse
-        
-    
+
+
     References
     ----------
     https://math.stackexchange.com/questions/3994666/parametric-equation-of-an-ellipse-in-the-3d-space#:~:text=In%20the%20parametric%20equation%20x,a%20point%20with%20minimum%20curvature.
     '''
-    t = np.linspace(0, 2*np.pi, n+1)[:-1]
+    t = np.linspace(0, 2 * np.pi, n + 1)[:-1]
     u = u[np.newaxis, :]
     v = v[np.newaxis, :]
     t = t[:, np.newaxis]
 
     return origin + u * np.cos(t) + v * np.sin(t)
-    
 
-def project_ellipse_double(a, e, params_ring, params_sys, origin = np.array([0,0,0]), n=50, proj_plane = [0,0,1]):
+
+def project_ellipse_double(a, e, params_ring, params_sys, origin=np.array([
+                           0, 0, 0]), n=50, proj_plane=[0, 0, 1]):
     '''
     make a projection of an ellipse representing a ring
     with ring system parameters as Euler angles [w, i, omega]
-    and individual ring parameters relative to the system 
+    and individual ring parameters relative to the system
     also as Euler angles [w, i, omega].
-    The angles params=[w, i, omega] and params_sys=[w_sys, i_sys, omega_sys] 
+    The angles params=[w, i, omega] and params_sys=[w_sys, i_sys, omega_sys]
     represent two sets of Euler angles [gamma, beta, alpha]
     such that the total rotation is given by
     (params_sys rotation matrix) x (params rotation matrix)
-    This code builds an ellipse in the x,y plane represented by vectors, 
+    This code builds an ellipse in the x,y plane represented by vectors,
     applies the double rotation to those vectors, then re-projects the
-    ellipse into the x,y plane. This simulates an observation of a ring. 
-    
+    ellipse into the x,y plane. This simulates an observation of a ring.
+
     References
     ~~~~~~~~~~
     https://en.wikipedia.org/wiki/Euler_angles
     https://en.wikipedia.org/wiki/Orbital_elements#Euler_angle_transformations
-    
+
     Parameters
     ----------
     a : float, required.
@@ -217,7 +218,7 @@ def project_ellipse_double(a, e, params_ring, params_sys, origin = np.array([0,0
         [w, i, omega] of ring relative to ring system.
     params_sys : np.array, required
         shape (3,).
-        [w, i, omega] of ring plane relative to observer.  
+        [w, i, omega] of ring plane relative to observer.
     n : int, required.
         number of equally-spaced points in ellipse circumference to compute
     origin : np.array, required
@@ -227,7 +228,7 @@ def project_ellipse_double(a, e, params_ring, params_sys, origin = np.array([0,0
         shape (3,).
         normal vector to plane that you want to re-project back to after rotation
         typically this will be [0, 0, 1], i.e., re-project to x,y plane
-    
+
     Returns
     -------
     dict
@@ -237,52 +238,54 @@ def project_ellipse_double(a, e, params_ring, params_sys, origin = np.array([0,0
         f0: np.array, shape (3,), vector to one focus
         f1: np.array, shape (3,), vector to the other focus
         ell: np.array, shape (n,3), vectors along circumference of ring
-    
+
     '''
-    b = a*np.sqrt(1-e**2)
-    c = a*e
-    f0 = np.array([origin[0] + c, origin[1], 0]) # foci
+    b = a * np.sqrt(1 - e**2)
+    c = a * e
+    f0 = np.array([origin[0] + c, origin[1], 0])  # foci
     f1 = np.array([origin[0] - c, origin[1], 0])
-    a_vec = np.array([a,0,0])
-    b_vec = np.array([0,b,0])
-    
+    a_vec = np.array([a, 0, 0])
+    b_vec = np.array([0, b, 0])
+
     # apply double rotation to a, b, f0, f1
     a_rot = double_rotate(a_vec, params_ring, params_sys)
     b_rot = double_rotate(b_vec, params_ring, params_sys)
     f0_rot = double_rotate(f0, params_ring, params_sys)
     f1_rot = double_rotate(f1, params_ring, params_sys)
-    
+
     # project these
-    a_proj, b_proj = plane_project(a_rot, proj_plane), plane_project(b_rot, proj_plane)
+    a_proj, b_proj = plane_project(
+        a_rot, proj_plane), plane_project(
+        b_rot, proj_plane)
     f0_proj = plane_project(f0_rot, proj_plane)
     f1_proj = plane_project(f1_rot, proj_plane)
-    
+
     # make and project ellipse circumference
     ell = vector_ellipse(a_vec, b_vec, n, origin=origin)
     ell_rot = double_rotate(ell, params_ring, params_sys)
     ell_p = plane_project(ell_rot, proj_plane)
-    
+
     # dict of outputs
-    output = {'a':a_proj,
-             'b':b_proj,
-             'f0':f0_proj,
-             'f1':f1_proj,
-             'ell':ell_p}
-    
+    output = {'a': a_proj,
+              'b': b_proj,
+              'f0': f0_proj,
+              'f1': f1_proj,
+              'ell': ell_p}
+
     return output
 
 
 def calc_abtheta(ell):
     '''
-    given vectors defining the circumference of an ellipse, 
+    given vectors defining the circumference of an ellipse,
     find corresponding values of a, b, and theta
     using the fact that locations of a, b are max, min of ellipse vectors
-    
+
     Parameters
     ----------
     ell : np.array, required
         shape (n, 3), vectors along circumference of ring
-        
+
     Returns
     -------
     float
@@ -298,15 +301,15 @@ def calc_abtheta(ell):
     whereb = np.argmin(mag)
     xa, ya, _ = ell[wherea]
     #xb, yb, _ = ell_proj[whereb]
-    theta = np.rad2deg(np.arctan(ya/xa))
-    
+    theta = np.rad2deg(np.arctan(ya / xa))
+
     return a, b, theta
 
 
 def foreshortening(theta, i):
-    ''' 
+    '''
     corrects for foreshortening of inclined rings
-    
+
     Parameters
     ----------
     theta : float, required.
@@ -319,11 +322,11 @@ def foreshortening(theta, i):
     float
         fraction by which to multiply ring brightness at azimuth
         angle theta to correct foreshortening.
-    
+
     References
     ----------
     de Pater et al 2006, doi:10.1016/j.icarus.2005.08.011
-    
+
     Notes
     -----
     needs to accept Astropy angles
@@ -336,40 +339,41 @@ def ring_area(a, e, width, delta_width=0.0, B=90.0):
     '''
     Compute projected area of an eccentric ring at a given opening angle
     and peri-apo width asymmetry
-    
+
     Parameters
     ----------
-    a : float, required. 
-        [distance] semimajor axis 
-    e : float, required. 
+    a : float, required.
+        [distance] semimajor axis
+    e : float, required.
         eccentricity
     width : float, required.
-        [distance] average width of ring 
+        [distance] average width of ring
         for an asymmetric ring, use (apoapsis_width + periapsis_width)/2
     delta_width : float, optional. default 0.0
         [distance] apoapsis width minus periapsis width
     B : float, optional. default 90 (i.e., open)
         [degrees] ring opening angle
-    
+
     Returns
     -------
     float
         projected area in [distance unit]^2
-    
+
     References
     ----------
     Molter et al. 2019, doi:10.3847/1538-3881/ab258c
     '''
-    w_p = width - delta_width/2.
-    w_a = width + delta_width/2.
-    c = a*e
-    a_i = a - (w_p + w_a)/4
-    a_o = a + (w_p + w_a)/4
-    c_i = c - (w_a - w_p)/4
-    c_o = c + (w_a - w_p)/4
+    w_p = width - delta_width / 2.
+    w_a = width + delta_width / 2.
+    c = a * e
+    a_i = a - (w_p + w_a) / 4
+    a_o = a + (w_p + w_a) / 4
+    c_i = c - (w_a - w_p) / 4
+    c_o = c + (w_a - w_p) / 4
     e_i = c_i / a_i
     e_o = c_o / a_o
-    A = np.pi * a_o**2 * np.sqrt(1 - e_o**2) - np.pi * a_i**2 * np.sqrt(1 - e_i**2)
+    A = np.pi * a_o**2 * np.sqrt(1 - e_o**2) - \
+        np.pi * a_i**2 * np.sqrt(1 - e_i**2)
     Ab = A * np.sin(np.radians(B))
     return Ab
 
@@ -377,40 +381,52 @@ def ring_area(a, e, width, delta_width=0.0, B=90.0):
 class Ring:
     '''
     model of a planetary ring
-    '''
 
-    def __init__(self, a, e, w, i, omega, width=1.0, flux=1.0, params_sys=[0.0, 0.0, 0.0]):
-        '''
-        Parameters
-        ----------
-        a : float or Quantity, required.
-            semimajor axis. assumes km if not an astropy Quantity
-        e : float, required.
-            eccentricity
-        w : float or Quantity, required.
-            argument of periapsis. assumes degrees if not an astropy Quantity
-        i : float or Quantity, required.
-            inclination. assumes degrees if not an astropy Quantity
-        omega : float or Quantity, required.
-            longitude of ascending node. assumes degrees if not an astropy Quantity
-        width : float or Quantity, optional. default 1 km (i.e., very thin).
-            full width of ring. assumes km if not an astropy Quantity
-        flux : float or Quantity, optional. default 1.0.
-            ring flux density
-        params_sys : np.array, optional
-            shape (3,).
-            [w, i, omega] of ring system plane relative to observer
-
-        Attributes
-        ----------
-        same as parameters
+    Parameters
+    ----------
+    a : float or Quantity, required.
+        semimajor axis. assumes km if not an astropy Quantity
+    e : float, required.
+        eccentricity
+    w : float or Quantity, required.
+        argument of periapsis. assumes degrees if not an astropy Quantity
+    i : float or Quantity, required.
+        inclination. assumes degrees if not an astropy Quantity
+    omega : float or Quantity, required.
+        longitude of ascending node. assumes degrees if not an astropy Quantity
+    width : float or Quantity, optional. default 1 km (i.e., very thin).
+        full width of ring. assumes km if not an astropy Quantity
+    flux : float or Quantity, optional. default 1.0.
+        ring flux density
+    params_sys : np.array, optional
+        shape (3,).
+        [w, i, omega] of ring system plane relative to observer
 
-        Examples
-        --------
-        
-        '''
-        # to do: write tests that pass astropy Quantities with units other than
-        # km and deg
+    Attributes
+    ----------
+    same as parameters
+
+    Examples
+    --------
+
+    Notes
+    -----
+    * Passing astropy Quantities is not yet tested
+    '''
+
+    def __init__(
+        self,
+        a,
+        e,
+        w,
+        i,
+        omega,
+        width=1.0,
+        flux=1.0,
+        params_sys=[
+            0.0,
+            0.0,
+            0.0]):
 
         self.a = u.Quantity(a, unit=u.km)
         self.e = e
@@ -427,7 +443,6 @@ def __str__(self):
         '''
         return f'Ring instance; a={self.a}, e={self.e}, i={self.i}, omega={self.omega}, w={self.w}, width={self.width}'
 
-
     def as_elliptical_annulus(
             self,
             focus,
@@ -441,9 +456,9 @@ def as_elliptical_annulus(
 
         Parameters
         ----------
-        focus : tuple, required. 
+        focus : tuple, required.
             location of planet (one of the foci of the ellipse) in pixels
-        pixscale : float or Quantity, required. 
+        pixscale : float or Quantity, required.
             pixel scale of observations. assumes km/px if not Quantity
         width : float or Quantity, required.
             true (non-projected) full width of ring. assumes km if not Quantity
@@ -451,13 +466,13 @@ def as_elliptical_annulus(
             number of data points to rotate and project
             higher n means more accurate estimation
             of aperture.EllipticalAnnulus projected a, b, theta values
-        return_params : bool, optional. default False. 
+        return_params : bool, optional. default False.
             If True, return model ellipse dict
             see docstring of project_ellipse_double()
-            
+
         Returns
         -------
-        photutils.EllipticalAnnulus object. 
+        photutils.EllipticalAnnulus object.
             if return_params == True,
             also returns the dictionary from project_ellipse_double
         '''
@@ -465,7 +480,10 @@ def as_elliptical_annulus(
         # convert to simple floats instead of astropy unit quantities
         b = b_from_ae(self.a, self.e)
         a, b = self.a.to(u.km).value, b.to(u.km).value
-        omega, i, w = self.omega.to(u.deg).value, self.i.to(u.deg).value, self.w.to(u.deg).value
+        omega, i, w = self.omega.to(
+            u.deg).value, self.i.to(
+            u.deg).value, self.w.to(
+            u.deg).value
         if width is None:
             width = self.width
         width = width.to(u.km).value
@@ -473,13 +491,13 @@ def as_elliptical_annulus(
 
         # rotate and project the ellipse
         true_params = project_ellipse_double(
-                            a, 
-                            self.e, 
-                            np.array([w, i, omega]), 
-                            n=int(n), 
-                            origin=np.array([0, 0, 0]), 
-                            proj_plane=[0, 0, 1], 
-                            params_sys=self.params_sys)
+            a,
+            self.e,
+            np.array([w, i, omega]),
+            n=int(n),
+            origin=np.array([0, 0, 0]),
+            proj_plane=[0, 0, 1],
+            params_sys=self.params_sys)
         a_f, b_f, theta_f = calc_abtheta(true_params['ell'])
         a_f, b_f = np.abs(a_f), np.abs(b_f)
 
@@ -511,7 +529,6 @@ def as_elliptical_annulus(
             return ann, true_params
         return ann
 
-
     def as_azimuthal_wedges(
             self,
             shape,
@@ -527,9 +544,9 @@ def as_azimuthal_wedges(
 
         Parameters
         ----------
-        shape : tuple, required. 
+        shape : tuple, required.
             shape of image in pixels
-        focus : tuple, required. 
+        focus : tuple, required.
             location of planet (one ellipse focus) in pixels
         pixscale : astropy Quantity or float, required
             pixel scale of image. assumes km/px if not Quantity
@@ -537,7 +554,7 @@ def as_azimuthal_wedges(
             number of wedges to compute
         width : astropy quantity required
         n : int, optional. default 1000.
-            number of points for as_elliptical_annulus to compute. 
+            number of points for as_elliptical_annulus to compute.
             see that docstring for details.
             should be much larger than nwedges
         z : int, optional. default 5
@@ -547,24 +564,22 @@ def as_azimuthal_wedges(
         Returns
         -------
         np.array
-            shape (nwedges,). 
+            shape (nwedges,).
             angles in radians from 0 to 2*pi corresponding to lower corner of wedge
         list
             len nwedges. list of wedge masks
 
         Notes
         -----
-        current implementation removes foreshortening correction "magically"
-        by making the angular width of the wedges in the image plane
-        see ring-system-modeling-tutorial.ipynb for a more detailed
-        explanation and example
+        * current implementation removes foreshortening correction "magically"
+          by making the angular width of the wedges in the image plane
+          see ring-system-modeling-tutorial.ipynb for a more detailed
+          explanation and example.
+        * This is computationally expensive!
+          a better implementation would be to make a photutils object
+          for wedges of an ellipse. but this requires Cython and
+          a lot of geometry
 
-        Notes
-        -----
-        This is computationally expensive!
-        a better implementation would be to make a photutils object
-        for wedges of an ellipse. but this requires Cython and
-        a lot of geometry
         '''
 
         # handle input params
@@ -584,7 +599,6 @@ def as_azimuthal_wedges(
         ann = ann.to_mask().to_image(zshape)
         width = z * width.to(u.km).value
 
-        
         # # use ellipse params to find ring-plane azimuth angles
         # x = ringplane_params['ell'].T[0]
         # y = ringplane_params['ell'].T[1]
@@ -594,7 +608,7 @@ def as_azimuthal_wedges(
         # dtheta_list = theta_list[1:] - theta_list[:-1]
         # last_element = 2*np.pi - (theta_list[-1] - theta_list[0]) # handle circle wrapping
         # dtheta_list = np.concatenate([dtheta_list, np.array([last_element])])
-        
+
         # image plane azimuth angles
         theta_list = np.linspace(0, 2 * np.pi - 2 * np.pi / nwedges, nwedges)
         dtheta_list = 2 * np.pi / nwedges * np.ones(theta_list.shape)
@@ -627,8 +641,8 @@ def as_azimuthal_wedges(
 
             wedge_ann = wedge * ann  # this is only an approximation; zooming image recommended
 
-            ## diagnostic plot
-            #if theta <0.5:
+            # diagnostic plot
+            # if theta <0.5:
             #
             #    fig, (ax0, ax1, ax2) = plt.subplots(1,3,figsize = (15,6))
             #    ax0.imshow(ann, origin = 'lower')
@@ -641,7 +655,6 @@ def as_azimuthal_wedges(
 
         return theta_list, ann_list
 
-
     def as_2d_array(
             self,
             shape,
@@ -656,9 +669,9 @@ def as_2d_array(
 
         Parameters
         ----------
-        shape : tuple, required. 
+        shape : tuple, required.
             output image shape
-        pixscale : float or astropy Quantity, required. 
+        pixscale : float or astropy Quantity, required.
             pixel scale of the output image. assumes km/px if not Quantity
         focus : tuple, optional, default None.
             pixel location of planet around which ring orbits.
@@ -693,8 +706,9 @@ def as_2d_array(
         if focus is None:
             focus = (shape[0] / 2.0, shape[1] / 2.0)
 
-        ann, params_out = self.as_elliptical_annulus(focus, pixscale, width, return_params=True)
-        arr_sharp = flux*ann.to_mask(method='exact').to_image(shape)
+        ann, params_out = self.as_elliptical_annulus(
+            focus, pixscale, width, return_params=True)
+        arr_sharp = flux * ann.to_mask(method='exact').to_image(shape)
         # since flux is simple multiply by mask, its really a specific intensity
         # e.g. Jy/sr
 
@@ -710,85 +724,83 @@ class RingSystemModelObservation():
     https://pds-rings.seti.org/uranus/uranus_rings_table.html
     with Planetary Ring Node ephemeris
     and JPL Horizons ephemeris
-    '''
-
-    def __init__(self,
-            body,
-            location,
-            ringnames=None,
-            fluxes='default'):
-        '''
-        Parameters
-        ----------
-        body : pylanetary.utils.Body object, required.
-            one of Jupiter, Saturn, Uranus, Neptune
-        location : str, array-like, or `~astropy.coordinates.EarthLocation`, optional.
-            If str, named observeratory supported by the ring node, e.g. JWST.
-            If array-like, observer's location as a
-            3-element array of Earth longitude, latitude, altitude
-            that istantiates an `~astropy.coordinates.EarthLocation` object. 
-            Longitude and latitude should be anything that initializes an
-            `~astropy.coordinates.Angle` object, and altitude should
-            initialize an `~astropy.units.Quantity` object (with units
-            of length).  
-            If ``None``, then the geofocus is used.
-            Unfortunately, it is not presently possible to get location information
-            directly from the Body object, because the JPL Horizons query tool
-            that Body uses requires a Horizons obs code, whereas the Planetary
-            Ring Node query tool requires the format specified here.
-            To prevent weird results, you should ensure that Body.jpl_hor_id
-            matches the location you are inputting here!
-        ringnames : list, optional. 
-            names of rings to include in the model
-            if no ringnames provided then all rings are assumed.
-            Case-sensitive! Typically capitalized, e.g. "Alpha"
-        fluxes : list, np.array, or "default", optional. default "default".
-            brightnesses associated with rings specified in ringnames.
-            surface brightness units are expected, e.g. brightness temperature
-            if fluxes == 'default', optical depths are read in from the static table
-            and exponentiated to more closely resemble surface brightness units
-            so the result is the attenuation, ATT = 1 - exp(ringtable['Optical Depth'])
-            assuming the emittance is small (violated for thermal observations, obviously)
-
-        Attributes
-        ----------
-        planetname : str
-            name of planet
-        rings : dict 
-            dictionary of ringmodel.Ring objects, with ring names as keys
-            note ring names are case-sensitive! Typically capitalized, e.g. "Alpha"
-        ringtable : Astropy table 
-            ephemeris data from ring node query tool
-            as well as time-invariant parameters for each ring from static table
-        systemtable : Astropy table 
-            ephemeris data for ring system from ring node query tool
-        bodytable : Astropy table
-            ephemeris data for satellites from ring node query tool
-        ephem : Astropy table
-            JPL Horizons ephemeris
-        np_ang : float
-            north polar angle
 
+    Parameters
+    ----------
+    body : pylanetary.utils.Body object, required.
+        one of Jupiter, Saturn, Uranus, Neptune
+    location : str, array-like, or `~astropy.coordinates.EarthLocation`, optional.
+        If str, named observeratory supported by the ring node, e.g. JWST.
+        If array-like, observer's location as a
+        3-element array of Earth longitude, latitude, altitude
+        that istantiates an `~astropy.coordinates.EarthLocation` object.
+        Longitude and latitude should be anything that initializes an
+        `~astropy.coordinates.Angle` object, and altitude should
+        initialize an `~astropy.units.Quantity` object (with units
+        of length).
+        If ``None``, then the geofocus is used.
+        Unfortunately, it is not presently possible to get location information
+        directly from the Body object, because the JPL Horizons query tool
+        that Body uses requires a Horizons obs code, whereas the Planetary
+        Ring Node query tool requires the format specified here.
+        To prevent weird results, you should ensure that Body.jpl_hor_id
+        matches the location you are inputting here!
+    ringnames : list, optional.
+        names of rings to include in the model
+        if no ringnames provided then all rings are assumed.
+        Case-sensitive! Typically capitalized, e.g. "Alpha"
+    fluxes : list, np.array, or "default", optional. default "default".
+        brightnesses associated with rings specified in ringnames.
+        surface brightness units are expected, e.g. brightness temperature
+        if fluxes == 'default', optical depths are read in from the static table
+        and exponentiated to more closely resemble surface brightness units
+        so the result is the attenuation, ATT = 1 - exp(ringtable['Optical Depth'])
+        assuming the emittance is small (violated for thermal observations, obviously)
+
+    Attributes
+    ----------
+    planetname : str
+        name of planet
+    rings : dict
+        dictionary of ringmodel.Ring objects, with ring names as keys
+        note ring names are case-sensitive! Typically capitalized, e.g. "Alpha"
+    ringtable : Astropy table
+        ephemeris data from ring node query tool
+        as well as time-invariant parameters for each ring from static table
+    systemtable : Astropy table
+        ephemeris data for ring system from ring node query tool
+    bodytable : Astropy table
+        ephemeris data for satellites from ring node query tool
+    ephem : Astropy table
+        JPL Horizons ephemeris
+    np_ang : float
+        north polar angle
+
+    Examples
+    --------
+    * Need an example of how to add a custom ring
+      should be possible by just adding a ringmodel.Ring() object
+      into the dict self.ring
+    * Need an example of how to modify ring data
+      should be possible by just changing the ringmodel.Ring() object
+      in the dict self.ring
 
-        Examples
-        --------
-        Need an example of how to add a custom ring
-        should be possible by just adding a ringmodel.Ring() object
-        into the dict self.ring
+    Notes
+    -----
+    * Not yet understood why omega must equal 0 for individual rings
+      relative to ring system in order to make argument of periapsis agree
+      with the Planetary Ring Node.
+    * Make this work nicely with utils.Body object
+    * implement default epoch and location
+    * lookup table to avoid needing to specify both location and horizons_loc
+    '''
 
-        Need an example of how to modify ring data
-        should be possible by just changing the ringmodel.Ring() object
-        in the dict self.ring
+    def __init__(self,
+                 body,
+                 location,
+                 ringnames=None,
+                 fluxes='default'):
 
-        Notes
-        -----
-        * Not yet understood why omega must equal 0 for individual rings
-        relative to ring system in order to make argument of periapsis agree
-        with the Planetary Ring Node.
-        * Make this work nicely with utils.Body object
-        * implement default epoch and location
-        * lookup table to avoid needing to specify both location and horizons_loc
-        '''
         self.body = body
         self.planetname = body.name
 
@@ -797,7 +809,7 @@ def __init__(self,
         self.bodytable, self.ringtable = node.ephemeris(
             planet=self.planetname, epoch=self.body.epoch, location=location, cache=False)
         self.systemtable = self.bodytable.meta
-        
+
         # query static data table
         ring_data_source = importlib.resources.open_binary(
             'pylanetary.rings.data', f'{self.planetname}_ring_data.hdf5')
@@ -826,17 +838,21 @@ def __init__(self,
 
         # make self.ringtable and fluxes contain only the rings in ringnames
         self.ringtable = self.ringtable.loc[ringnames]
-        
+
         # compute fluxes from optical depth (very approximate)
         if fluxes == 'default':
             taus = np.array(self.ringtable['Optical Depth'])
             # optical depth to 1 - transmittance
-            taus[np.isnan(taus)] = 1.0 # lazy fix of bad table data, re-think this later
+            # lazy fix of bad table data, re-think this later
+            taus[np.isnan(taus)] = 1.0
             fluxes = 1 - np.exp(-taus)
-            
 
         # instantiate ring objects for all the rings
-        params_sys = [90.0, self.systemtable['opening_angle'].value - 90.0, self.np_ang] #[w, i, omega]
+        params_sys = [
+            90.0,
+            self.systemtable['opening_angle'].value -
+            90.0,
+            self.np_ang]  # [w, i, omega]
         self.rings = {}
         for i in range(len(ringnames)):
             ringname = ringnames[i]
@@ -863,8 +879,8 @@ def __init__(self,
             # to an unmasked array. the fill value is not used
             # many of the less-well-observed rings have masked values
             # for many of these quantities, particularly omega, i, w
-            # these go to zero when made into floats, 
-            # so the filled() hack is ok   
+            # these go to zero when made into floats,
+            # so the filled() hack is ok
 
             # find semimajor axis
             # handling the fact that half the static ring tables have middle boundary and width,
@@ -881,7 +897,7 @@ def __init__(self,
                 raise ValueError(
                     'Neither "Middle Boundary (km)" nor "Inner Boundary (km)" found in static ring data')
 
-            omega = 0.0 #this is required to get argument of periapsis correct, but I don't know why
+            omega = 0.0  # this is required to get argument of periapsis correct, but I don't know why
             thisring = Ring(a,
                             e,
                             w,
@@ -899,9 +915,9 @@ def as_2d_array(self, shape, pixscale, focus=None, beam=None):
 
         Parameters
         ----------
-        shape : tuple, required. 
+        shape : tuple, required.
             output image shape in number of pixels
-        pixscale : float or Quantity, required. 
+        pixscale : float or Quantity, required.
             pixel scale of the output image. if not Quantity, assumes units of km/px
         focus : tuple, optional.
             pixel location of planet center
diff --git a/pylanetary/utils/core.py b/pylanetary/utils/core.py
index 630cb37..9d7fcf2 100644
--- a/pylanetary/utils/core.py
+++ b/pylanetary/utils/core.py
@@ -484,25 +484,21 @@ class Body:
     jup.epoch_datetime)
     output> Jupiter is currently 5.93796102228318 AU  AU from the Earth with apparent size  33.2009 arcsec
     today = 2023-04-26 16:32:54
+
+    Parameters
+    ----------
+    name : str, required.
+        Body name string, example "Jupiter" will load Jupiter.yaml
+    epoch : astropy.time.Time, optional.
+        The epoch at which to retrieve the ephemeris of the body.
+        If not set, the current time will be used.
+    location : str, optional.
+        JPL Horizons observatory code.
+        If not set, center of Earth will be used.
     """
 
     def __init__(self, name, epoch=None, location=None):
-        """
-        Input string instantiates object using file name of string to
-        populate attributes. Astropy quantity objects utilized for data
-        with astropy units.
-
-        Parameters
-        ----------
-        name : str, required.
-            Body name string, example "Jupiter" will load Jupiter.yaml
-        epoch : astropy.time.Time, optional.
-            The epoch at which to retrieve the ephemeris of the body.
-            If not set, the current time will be used.
-        location : str, optional.
-            JPL Horizons observatory code.
-            If not set, center of Earth will be used.
-        """
+
         self.name = name.lower().capitalize()
         with importlib.resources.open_binary(body_info, f"{self.name}.yaml") as file:
             yaml_bytes = file.read()
diff --git a/pyproject.toml b/pyproject.toml
index a5626b3..d740e49 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -37,7 +37,7 @@ classifiers = [
 
 dependencies = [
   "astropy>=4.3.0",
-  "astroquery>=0.4.7.dev8893",
+  "astroquery<=0.4.7.dev8893,>=0.4.7.dev8479",
   "beautifulsoup4>=4.11.1",
   "cartopy",
   "extension_helpers>=1.0.0",
diff --git a/requirements.txt b/requirements.txt
index 2f5ee2d..b2ed4eb 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
 astropy>=4.3.0
-astroquery>=0.4.7.dev8893,<=0.4.7.dev9008
+astroquery<=0.4.7.dev8893,>=0.4.7.dev8479
 beautifulsoup4==4.11.1
 cartopy
 extension_helpers==1.0.0


Test patch:
diff --git a/pylanetary/conftest.py b/pylanetary/conftest.py
index 2803ca5..151470b 100644
--- a/pylanetary/conftest.py
+++ b/pylanetary/conftest.py
@@ -29,7 +29,8 @@ def pytest_configure(config):
         config.option.astropy_header = True
 
         # Customize the following lines to add/remove entries from the list of
-        # packages for which version numbers are displayed when running the tests.
+        # packages for which version numbers are displayed when running the
+        # tests.
         PYTEST_HEADER_MODULES.pop('Pandas', None)
         PYTEST_HEADER_MODULES['scikit-image'] = 'skimage'
 
diff --git a/pylanetary/rings/tests/test_ellipse_math.py b/pylanetary/rings/tests/test_ellipse_math.py
index 4cfe9e0..f68fdd7 100644
--- a/pylanetary/rings/tests/test_ellipse_math.py
+++ b/pylanetary/rings/tests/test_ellipse_math.py
@@ -4,23 +4,23 @@
 
 
 def test_b_from_ae():
-    
-    assert np.isclose(rings.b_from_ae(10, np.sqrt(2)/2), 5*np.sqrt(2))
-    
-    
+
+    assert np.isclose(rings.b_from_ae(10, np.sqrt(2) / 2), 5 * np.sqrt(2))
+
+
 def test_vector_ellipse():
-    
+
     origin = np.array([10, 10, 10])
     n = 4
     a = np.array([1, 0, 0])
     b = np.array([0, 0.5, 0])
     result = rings.vector_ellipse(a, b, n, origin=origin)
     expected_result = np.array([[11, 10, 10],
-                    [10, 10.5, 10],
-                    [9, 10, 10],
-                    [10, 9.5, 10]])
+                                [10, 10.5, 10],
+                                [9, 10, 10],
+                                [10, 9.5, 10]])
     assert np.allclose(result, expected_result, rtol=1e-3)
-    
+
 
 def test_project_ellipse():
     '''
@@ -32,22 +32,22 @@ def test_project_ellipse():
     e = 0.0079
     params_ring = [350.078, 0.0, 0.0]
     params_sys = [90., 90 + 24.04446, 255.1941]
-    origin = np.array([0,0,0])
-    ell = rings.project_ellipse_double(a, e, params_ring, params_sys, 
-                origin=origin, 
-                n=50, 
-                proj_plane = [0,0,1])
-
-    expected_a = np.array([-22099.31625149,  -3274.70117637,      0.        ])
-    expected_b = np.array([ 9403.36772809, 49627.18523954,    -0.        ])
-    expected_f0 = np.array([-174.58459839,  -25.87013929,    0.        ])
-    expected_f1 = np.array([174.58459839,  25.87013929,  -0.        ])
-    expected_ell5 = np.array([-12351.56153907,  26520.8386934,       0.        ])
-    assert np.allclose(expected_a , ell['a'], rtol=1e-3)
-    assert np.allclose(expected_b , ell['b'], rtol=1e-3)
-    assert np.allclose(expected_f0 , ell['f0'], rtol=1e-3)
-    assert np.allclose(expected_f1 , ell['f1'], rtol=1e-3)
-    assert np.allclose(expected_ell5 , ell['ell'][5], rtol=1e-3)
+    origin = np.array([0, 0, 0])
+    ell = rings.project_ellipse_double(a, e, params_ring, params_sys,
+                                       origin=origin,
+                                       n=50,
+                                       proj_plane=[0, 0, 1])
+
+    expected_a = np.array([-22099.31625149, -3274.70117637, 0.])
+    expected_b = np.array([9403.36772809, 49627.18523954, -0.])
+    expected_f0 = np.array([-174.58459839, -25.87013929, 0.])
+    expected_f1 = np.array([174.58459839, 25.87013929, -0.])
+    expected_ell5 = np.array([-12351.56153907, 26520.8386934, 0.])
+    assert np.allclose(expected_a, ell['a'], rtol=1e-3)
+    assert np.allclose(expected_b, ell['b'], rtol=1e-3)
+    assert np.allclose(expected_f0, ell['f0'], rtol=1e-3)
+    assert np.allclose(expected_f1, ell['f1'], rtol=1e-3)
+    assert np.allclose(expected_ell5, ell['ell'][5], rtol=1e-3)
 
 
 def test_calc_abtheta():
@@ -57,32 +57,30 @@ def test_calc_abtheta():
     a = np.array([1.2, 0.0, 0.0])
     b = np.array([0.0, 0.8, 0.0])
     n = 100
-    ell = rings.vector_ellipse(a, b, n, origin=np.array([0,0,0]))
+    ell = rings.vector_ellipse(a, b, n, origin=np.array([0, 0, 0]))
     ai, bi, thetai = rings.calc_abtheta(ell)
-    
+
     assert np.isclose(ai, a[0], rtol=1e-2)
     assert np.isclose(bi, b[1], rtol=1e-2)
     assert np.isclose(thetai, 0.0, rtol=1e-2)
-    
-    
+
+
 def test_ring_area():
     '''
     epsilon ring area from Molter et al 2019 doi:10.3847/1538-3881/ab258c
     using B, d_au at 1.3 mm from that paper
     '''
-    a = 51149 #km
+    a = 51149  # km
     e = 0.0079
     wp = 19.7
     wa = 96.4
-    width = (wp + wa)/2
+    width = (wp + wa) / 2
     delta_width = wa - wp
     B = 43.7
     d_au = 19.1
     d_km = d_au * 1.496e8
     A = rings.ring_area(a, e, width, delta_width=delta_width, B=B)
-    
-    published_A = 1.57e-12 * d_km**2 #publication lists only steradians
-    
-    assert np.isclose(A , published_A, rtol=1e-2)
-    
-    
\ No newline at end of file
+
+    published_A = 1.57e-12 * d_km**2  # publication lists only steradians
+
+    assert np.isclose(A, published_A, rtol=1e-2)
diff --git a/pylanetary/rings/tests/test_ringmodel.py b/pylanetary/rings/tests/test_ringmodel.py
index 237f2b5..481d134 100644
--- a/pylanetary/rings/tests/test_ringmodel.py
+++ b/pylanetary/rings/tests/test_ringmodel.py
@@ -45,65 +45,67 @@ def test_ring_as_array():
     this also implicitly tests as_elliptical_annulus()
     but should probably write an explicit test eventually
     '''
-    
-    a = 51149 #km
+
+    a = 51149  # km
     e = 0.4
     i = 80.0
     omega = 60.0
     w = 30.
-    imsize = 300 #px
-    pixscale = 500 #km/px
-    ringmodel2 = Ring(a, 0.4, w, i, omega, flux = 0.001, width = 10000*u.km)
-    arr = ringmodel2.as_2d_array((imsize, imsize), pixscale, beam = (10,6,30))
+    imsize = 300  # px
+    pixscale = 500  # km/px
+    ringmodel2 = Ring(a, 0.4, w, i, omega, flux=0.001, width=10000 * u.km)
+    arr = ringmodel2.as_2d_array((imsize, imsize), pixscale, beam=(10, 6, 30))
     arr_expected = np.load(data_path('as_2d_array_testarr.npy'))
     assert np.allclose(arr, arr_expected, rtol=1e-3)
-    
-    
+
+
 def test_change_params_preserve_flux():
     '''
     discovered a bug in testing that if e is changed dynamically like this,
     then b will not be re-computed, and this ruins the elliptical annulus
     solved by removing self.b and self.c inside __init__
     '''
-    a = 51149 #km
+    a = 51149  # km
     e = 0.4
     i = 80.0
     omega = 60.0
     w = 30.
-    imsize = 300 #px
-    pixscale = 500 #km/px    
-    ringmodel = Ring(a, 0.4, w, i, omega, flux = 0.001, width = 10000*u.km)
-    arr = ringmodel.as_2d_array((imsize, imsize), pixscale, beam = (10,6,30))
-    
-    ringmodel2 = Ring(a, 0.01, w, i, omega, flux = 0.001, width = 10000*u.km)
+    imsize = 300  # px
+    pixscale = 500  # km/px
+    ringmodel = Ring(a, 0.4, w, i, omega, flux=0.001, width=10000 * u.km)
+    arr = ringmodel.as_2d_array((imsize, imsize), pixscale, beam=(10, 6, 30))
+
+    ringmodel2 = Ring(a, 0.01, w, i, omega, flux=0.001, width=10000 * u.km)
     ringmodel2.e = 0.4
-    arr2 = ringmodel2.as_2d_array((imsize, imsize), pixscale, beam = (10,6,30))
-    
-    assert np.allclose(arr, arr2, rtol = 1e-3)
+    arr2 = ringmodel2.as_2d_array((imsize, imsize), pixscale, beam=(10, 6, 30))
+
+    assert np.allclose(arr, arr2, rtol=1e-3)
 
 
 def test_ring_as_wedges():
-    
-    a = 51149 #km
+
+    a = 51149  # km
     e = 0.4
     i = 80.0
     omega = 60.0
     w = 30.
-    imsize = 300 #px
-    pixscale = 500 #km/px
-    width = 10000*u.km
+    imsize = 300  # px
+    pixscale = 500  # km/px
+    width = 10000 * u.km
     nwedges = 12
     ringmodel = Ring(a, e, omega, i, w)
-    
+
     thetas, wedges = ringmodel.as_azimuthal_wedges(
-                        [imsize,imsize], 
-                        pixscale,  
-                        nwedges=nwedges, 
-                        z=1, 
-                        width = width)
+        [imsize, imsize],
+        pixscale,
+        nwedges=nwedges,
+        z=1,
+        width=width)
     wedges = np.array(wedges)
     wedges_expected = np.load(data_path('wedges_testarr.npy'))
 
-    assert np.allclose(thetas, np.linspace(0, 2*np.pi, nwedges+1)[:-1], rtol = 1e-3)
-    assert np.round(np.max(np.sum(wedges, axis = 0)), 6) == 1.0 #rounding to deal with machine precision
-    assert np.allclose(wedges, wedges_expected, rtol = 1e-3)
+    assert np.allclose(thetas, np.linspace(
+        0, 2 * np.pi, nwedges + 1)[:-1], rtol=1e-3)
+    # rounding to deal with machine precision
+    assert np.round(np.max(np.sum(wedges, axis=0)), 6) == 1.0
+    assert np.allclose(wedges, wedges_expected, rtol=1e-3)
diff --git a/pylanetary/rings/tests/test_ringmodel_remote.py b/pylanetary/rings/tests/test_ringmodel_remote.py
index 5405167..fd3bf00 100644
--- a/pylanetary/rings/tests/test_ringmodel_remote.py
+++ b/pylanetary/rings/tests/test_ringmodel_remote.py
@@ -11,20 +11,21 @@
 def data_path(filename):
     data_dir = os.path.join(os.path.dirname(__file__), "data")
     return os.path.join(data_dir, filename)
-    
+
 
 def test_uranus():
-    
-    imsize = 300 #px
-    pixscale = 500 #km/px
-    alma_coords = ( -67.755 * u.deg, -23.029 * u.deg, 5000 * u.m) #lon, lat, alt(m)
+
+    imsize = 300  # px
+    pixscale = 500  # km/px
+    alma_coords = (-67.755 * u.deg, -23.029 * u.deg,
+                   5000 * u.m)  # lon, lat, alt(m)
     epoch = '2020-01-30 00:00'
-    
-    epoch_astropy = Time(epoch, format = 'iso', scale = 'utc')
+
+    epoch_astropy = Time(epoch, format='iso', scale='utc')
     ura = Body('uranus', epoch=epoch_astropy, location='399')
-    uranus_rings = RingSystemModelObservation(ura, alma_coords, ringnames = None)
-    arr = uranus_rings.as_2d_array((imsize, imsize), pixscale, beam = (5,4,30)) 
-    
+    uranus_rings = RingSystemModelObservation(ura, alma_coords, ringnames=None)
+    arr = uranus_rings.as_2d_array((imsize, imsize), pixscale, beam=(5, 4, 30))
+
     arr_expected = np.load(data_path('ura_system_testarr.npy'))
-    
-    assert np.allclose(arr, arr_expected, rtol=1e-3)
\ No newline at end of file
+
+    assert np.allclose(arr, arr_expected, rtol=1e-3)
diff --git a/pylanetary/rings/tests/test_vector_math.py b/pylanetary/rings/tests/test_vector_math.py
index a60ef83..e666c84 100644
--- a/pylanetary/rings/tests/test_vector_math.py
+++ b/pylanetary/rings/tests/test_vector_math.py
@@ -4,57 +4,77 @@
 
 # look in ellipse projection play Jupyter notebook
 
+
 def test_vector_normalize():
     '''also tests vector_magnitude'''
-    
+
     # n vectors
     v = np.array([[3, 0, 0],
-                    [0, 5, 5],
-                    [1, 0, 9],
-                    [0, 0, 0]])
+                  [0, 5, 5],
+                  [1, 0, 9],
+                  [0, 0, 0]])
     expected_result = np.array([[1, 0, 0],
-                        [0, np.sqrt(2)/2, np.sqrt(2)/2],
-                        [1/np.sqrt(82), 0, 9/np.sqrt(82)],
-                        [0, 0, 0]])
-    
+                                [0, np.sqrt(2) / 2, np.sqrt(2) / 2],
+                                [1 / np.sqrt(82), 0, 9 / np.sqrt(82)],
+                                [0, 0, 0]])
+
     assert np.allclose(rings.vector_normalize(v), expected_result, rtol=1e-3)
-    
+
     # one vector
     v2 = np.array([0, 0, 0])
     assert np.all(rings.vector_normalize(v2) == v2)
-    
-    v3 = np.array([2,0,2])
-    expected_result_3 = np.array([np.sqrt(2)/2, 0, np.sqrt(2)/2])
-    assert np.allclose(rings.vector_normalize(v3), expected_result_3, rtol = 1e-3)
+
+    v3 = np.array([2, 0, 2])
+    expected_result_3 = np.array([np.sqrt(2) / 2, 0, np.sqrt(2) / 2])
+    assert np.allclose(
+        rings.vector_normalize(v3),
+        expected_result_3,
+        rtol=1e-3)
 
 
 def test_plane_project():
-    
+
     X = np.array([[2, 0, 0],
-        [0, 3, 0],
-        [0, 0, 1.1],
-        [3, 4, 2]])
+                  [0, 3, 0],
+                  [0, 0, 1.1],
+                  [3, 4, 2]])
     Z = np.array([3, 0, 0])
     expected_result = np.array([[0, 0, 0],
-                    [0, 3, 0],
-                    [0, 0, 1.1],
-                    [0, 4, 2]])
-    
+                                [0, 3, 0],
+                                [0, 0, 1.1],
+                                [0, 4, 2]])
+
     assert np.allclose(rings.plane_project(X, Z), expected_result, rtol=1e-3)
 
 
 def test_double_rotate():
-    
+
     params_ring = [90, 90, 90]
     params_sys = [45, 45, 45]
     v = np.array([[1, 0, 0],
-                    [0, 1, 0],
-                    [0, 0, 1],
-                    [0, 0, 0]])
+                  [0, 1, 0],
+                  [0, 0, 1],
+                  [0, 0, 0]])
     result = rings.double_rotate(v, params_ring, params_sys)
-    expected_result = np.asarray([[1/2, -1/2, np.sqrt(2)/2],
-                    [1/2 + np.sqrt(2)/4, 1/2 - np.sqrt(2)/4, -1/2],
-                    [1/2 - np.sqrt(2)/4, 1/2 + np.sqrt(2)/4, 1/2],
-                    [0, 0, 0]])
-    
+    expected_result = np.asarray([[1 /
+                                   2, -
+                                   1 /
+                                   2, np.sqrt(2) /
+                                   2], [1 /
+                                        2 +
+                                        np.sqrt(2) /
+                                        4, 1 /
+                                        2 -
+                                        np.sqrt(2) /
+                                        4, -
+                                        1 /
+                                        2], [1 /
+                                             2 -
+                                             np.sqrt(2) /
+                                             4, 1 /
+                                             2 +
+                                             np.sqrt(2) /
+                                             4, 1 /
+                                             2], [0, 0, 0]])
+
     assert np.allclose(result, expected_result, rtol=1e-3)