Repository: PetroFit/petrofit (language: python)

Issue:
Documentation demonstrating how to run on an image
A third notebook is needed to show all the properties can be measured for all galaxies in an image and how the photometry can be run iteratively to improve the measurements


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index 4abc163..1758af6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,6 +38,7 @@ pip-delete-this-directory.txt
 # Unit test / coverage reports
 htmlcov/
 .tox/
+.tmp/
 .coverage
 .coverage.*
 .cache
@@ -61,9 +62,6 @@ instance/
 # Scrapy stuff:
 .scrapy
 
-# Sphinx documentation
-docs/_build/
-
 # PyBuilder
 target/
 
@@ -123,6 +121,7 @@ MANIFEST
 # Sphinx
 docs/api
 docs/_build
+docs/temp
 
 # Eclipse editor project files
 .project
@@ -158,6 +157,7 @@ distribute-*.tar.gz
 .project
 .pydevproject
 .settings
+.package
 pip-wheel-metadata/
 
 # Mac OSX
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..6ba2bc2
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,76 @@
+#FROM jupyter/scipy-notebook:db3ee82ad08a
+FROM jupyter/scipy-notebook:4d9c9bd9ced0
+#FROM continuumio/miniconda3
+
+#########
+# Setup #
+#########
+
+ENV HOME /home/jovyan
+WORKDIR $HOME
+
+# Clone PetroFit repo
+# RUN git clone https://github.com/PetroFit/petrofit.git
+
+USER root
+COPY --chown=$NB_USER:users . $HOME/petrofit/
+USER $NB_USER
+
+ENV PETROFITDIR $HOME/petrofit
+
+# Clone kcorrect @ dcad853
+RUN git clone https://github.com/blanton144/kcorrect.git
+ENV KCORRECT_DIR $HOME/kcorrect
+
+# Clone kcorrect_python @ 8ea0c62
+RUN git clone https://github.com/nirinA/kcorrect_python.git
+ENV KCORRECT_PYTHON_DIR $HOME/kcorrect_python
+
+
+########################################
+# Setup Conda and Install Requirements #
+########################################
+
+RUN conda env create -f $PETROFITDIR/environment.yml
+ENV PATH /opt/conda/envs/petrofit/bin:$PATH
+RUN echo "source activate petrofit" >> $HOME/.bashrc
+
+ENV CONDA_DEFAULT_ENV petrofit
+
+
+####################
+# Install kcorrect #
+####################
+
+ENV PATH $KCORRECT_DIR/bin:$PATH
+ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:$KCORRECT_DIR/lib
+ENV IDL_PATH $KCORRECT_DIR/pro
+
+WORKDIR $KCORRECT_DIR
+
+RUN kevilmake -k
+
+WORKDIR $HOME
+
+
+###########################
+# Install kcorrect_python #
+###########################
+
+WORKDIR $KCORRECT_PYTHON_DIR
+
+RUN python setup.py install
+
+WORKDIR $HOME
+
+
+####################
+# Install PetroFit #
+####################
+
+WORKDIR $PETROFITDIR
+
+RUN python setup.py develop
+
+WORKDIR $HOME
+
diff --git a/MANIFEST.in b/MANIFEST.in
index ad0c40b..b29cd81 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -8,6 +8,7 @@ recursive-include petrofit *.pyx *.c *.pxd
 recursive-include docs *
 recursive-include licenses *
 recursive-include scripts *
+recursive-include petrofit/tests *yaml *yml
 
 prune build
 prune docs/_build
diff --git a/README.rst b/README.rst
index c0e186f..ef9b29f 100644
--- a/README.rst
+++ b/README.rst
@@ -4,7 +4,12 @@
 Petrosian Fitter (PetroFit)
 ---------------------------
 
-Package for calculating Petrosian properties and fitting galaxy light profiles.
+PetroFit is a package for calculating Petrosian properties, such as radii and concentration indices, as well as fitting
+galaxy light profiles. This package includes tools for preforming accurate photometry, segmentations, Petrosian properties
+and fitting. This documentation is intended to serve as a description and guide to the `petrofit` module.
+
+.. image:: docs/images/multi_fit.png
+    :width: 100%
 
 License
 -------
diff --git a/docker.py b/docker.py
new file mode 100644
index 0000000..822f456
--- /dev/null
+++ b/docker.py
@@ -0,0 +1,56 @@
+import os
+from sys import argv
+
+def mount_bind_command(src, dst):
+    return "--mount type=bind,src={},dst={}".format(src, dst)
+
+if __name__ == '__main__':
+    if len(argv) < 2:
+        print('Command not supplied')
+        print('python docker.py build')
+        print('python docker.py run [extra_mount_paths]')
+        print('python docker.py run_safe # (does not mount the host copy of petrofit dir)')
+
+    # Build
+    # -----
+    # Command to build the Dockerfile
+    elif argv[1] == 'build' or argv[1].replace("-", "") == "b":
+        os.system('docker build -t petrofit .')
+
+    # Mount and Run
+    # -------------
+    # Command to run the docker image in a container.
+    # This will mount the host version of the repo so any changes to the code
+    # in the host repo will be available in the docker container and the environment.
+    # Thus the docker container will use the host's version of petrofit module since the
+    # environment in the container is installed using `python setup.py develop`.
+    # (you are able to update code on host without having to reinstall in the container)
+    elif argv[1] == 'run' or argv[1].replace("-", "") == "r":
+        path_to_this_dir = os.path.dirname(os.path.abspath(__file__))
+        command = "docker run"
+        command += " " + mount_bind_command(path_to_this_dir, "/home/jovyan/petrofit")
+
+        # This section mounts (bind) any number of volumes on the host into the docker container.
+        # The volumes are mounted into the `mount` folder inside the container.
+        # Any edits there will also apply to the host version of the files.
+        mounted_list = []
+        if len(argv) > 2:
+            for path in argv[2:]:
+                src = os.path.abspath(path)
+                dst = "/home/jovyan/mount/{}".format(os.path.basename(path))
+                if dst in mounted_list:
+                    raise Exception("Mount request includes multiple files or folders with the same name")
+                mounted_list.append(dst)
+                command += " " + mount_bind_command(src, dst)
+
+        command += " " + "-it -p 8888:8888 petrofit"
+
+        print(">>>", command, "\n")
+
+        os.system(command)
+
+    # Regular Run
+    # -----------
+    # Nothing is mounted on to the container.
+    elif argv[1] == 'run_safe':
+        os.system('docker run -it -p 8888:8888 petrofit')
diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css
new file mode 100644
index 0000000..8a95803
--- /dev/null
+++ b/docs/_static/css/custom.css
@@ -0,0 +1,60 @@
+@import url("theme.css");
+
+.wy-nav-content {
+    padding: 1.618em 3.236em;
+    height: 100%;
+    max-width: 90%;
+    /*max-width: 800px;*/
+    margin: auto;
+    background-color: #ffffff;
+}
+
+.document{
+    margin: auto;
+    max-width: 850px;
+}
+
+.wy-side-nav-search {
+    /*background color of the top search bar*/
+    background-color: #43B02A;
+}
+
+.section h1 {
+    /*header 1 text color */
+    /*color: #3061f3;*/
+    color: #333333;
+    /*color: #55a5d9;*/
+    font-size: 240%;
+ }
+
+.rst-content .toctree-wrapper p.caption, h2, h3, h4, h5, h6, legend {
+    /*text color of rst content and subheads*/
+    color: #414042;
+}
+
+.wy-nav-content-wrap {
+    /* background color of wrap around main content*/
+    background-color: white;
+}
+
+.section-title {
+    /*text color of section titles*/
+    color: #3061f3;
+}
+
+.rst-content pre.literal-block, .rst-content div[class^='highlight'] pre, .rst-content .linenodiv pre {
+    /*color of code blocks*/
+    background-color: #f8f8f8
+}
+
+h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend {
+    /*font formats*/
+    /*font-family: "Proxima Nova","Helvetica","Arial",sans-serif;*/
+    font-family: Georgia, serif;
+}
+
+.wy-nav-top {
+    /*color of nav at top when the window is narrow*/
+    background: linear-gradient(90deg, #00B0F0 0%, #8D00ED 100%);
+}
+
diff --git a/docs/api_reference.rst b/docs/api_reference.rst
new file mode 100644
index 0000000..8e01863
--- /dev/null
+++ b/docs/api_reference.rst
@@ -0,0 +1,32 @@
+.. _detailed_api:
+
+===
+API
+===
+
+.. automodapi:: petrofit.correction
+    :no-inheritance-diagram:
+
+.. automodapi:: petrofit.fitting
+    :no-inheritance-diagram:
+
+.. automodapi:: petrofit.models
+    :no-inheritance-diagram:
+    :skip: Nuker2D
+    :skip: Moffat2D
+    :skip: EllipMoffat2D
+    :skip: sersic_enclosed_model
+    :skip: petrosian_model
+
+.. automodapi:: petrofit.petrosian
+    :no-inheritance-diagram:
+
+.. automodapi:: petrofit.photometry
+    :no-inheritance-diagram:
+
+.. automodapi:: petrofit.segmentation
+    :no-inheritance-diagram:
+
+.. automodapi:: petrofit.utils
+    :no-inheritance-diagram:
+
diff --git a/docs/conf.py b/docs/conf.py
index c93acc6..7e3d776 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -58,16 +58,25 @@
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
 exclude_patterns.append('_templates')
+exclude_patterns.append('images/*ipynb')
 
 # This is added to the end of RST files - a good place to put substitutions to
 # be used globally.
 rst_epilog += """
 """
 
+extensions += [
+    'nbsphinx',
+    'sphinx_automodapi.automodapi',
+    'sphinx_automodapi.smart_resolver'
+]
+
+nbsphinx_execute = 'auto'
+
 # -- Project information ------------------------------------------------------
 
 # This does not *have* to match the package name, but typically does
-project = setup_cfg['name']
+project = "PetroFit" #setup_cfg['name']
 author = setup_cfg['author']
 copyright = '{0}, {1}'.format(
     datetime.datetime.now().year, setup_cfg['author'])
@@ -102,14 +111,21 @@
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes. To override the custom theme, set this to the
 # name of a builtin theme or the name of a custom theme in html_theme_path.
-#html_theme = None
-
+html_theme = "sphinx_rtd_theme"
 
+html_logo = "./images/petrofit_logo_no_bg.png"
+html_favicon = './images/petrofit_logo.ico'
 html_theme_options = {
-    'logotext1': 'petrofit',  # white,  semi-bold
-    'logotext2': '',  # orange, light
-    'logotext3': ':docs'   # white,  light
-    }
+    'style_nav_header_background': 'linear-gradient(90deg, #00B0F0 0%, #8D00ED 100%)',
+}
+
+html_static_path = ['_static']
+html_css_files = ["css/custom.css"]
+
+#     'logotext1': 'petrofit',  # white,  semi-bold
+#     'logotext2': '',  # orange, light
+#     'logotext3': ':docs'   # white,  light
+#     }
 
 
 # Custom sidebar templates, maps document names to template names.
diff --git a/docs/correction_grids.ipynb b/docs/correction_grids.ipynb
new file mode 100644
index 0000000..cf05cfc
--- /dev/null
+++ b/docs/correction_grids.ipynb
@@ -0,0 +1,193 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "09eb9c87",
+   "metadata": {},
+   "source": [
+    "# Correction Girds"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "cb595677",
+   "metadata": {
+    "nbsphinx": "hidden"
+   },
+   "outputs": [],
+   "source": [
+    "# Hidden cell\n",
+    "\n",
+    "%matplotlib inline"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8c20bce2",
+   "metadata": {},
+   "source": [
+    "## Define Sampling Points \n",
+    "\n",
+    "The correction grid is generated along a set of half-light radii and Sersic indices. The generator loops through the Sersic indices for each half-light radius in the radius list. For this documentation we define a small set of values, with the Sersic indices of a Gaussian and de Vaucouleurs’ profile.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fcec33cc",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "\n",
+    "r_eff_list = np.array([15, 20, 25])\n",
+    "n_list = np.array([1, 2, 4])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8f5cf7ae",
+   "metadata": {},
+   "source": [
+    "## Correction Grid\n",
+    "\n",
+    "We do a simple API call to generate the correction grid. We provide a PSF and oversampling rule as well. Oversampling becomes important for small half-light radii since the model needs to be sampled well in the center. \n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ef5216be",
+   "metadata": {},
+   "source": [
+    "### Load PSF \n",
+    "\n",
+    "We load an HST `F105W` PSF:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "potential-princeton",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.io import fits\n",
+    "\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "# Load PSF image (2D array)\n",
+    "PSF = fits.getdata('data/f105w_psf.fits.gz')\n",
+    "\n",
+    "# Normalize PSF \n",
+    "PSF = PSF / PSF.sum()\n",
+    "\n",
+    "# Note that the PSF shape is odd on all sides\n",
+    "print(\"PSF Shape = {}\".format(PSF.shape))\n",
+    "\n",
+    "# Plot PSF and use vmax and vmin to show difraction spikes\n",
+    "plt.imshow(PSF, vmin=0, vmax=5e-4)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "562ba847",
+   "metadata": {},
+   "source": [
+    "### Generate Correction Grid\n",
+    "\n",
+    "The `generate_petrosian_sersic_correction` grid follows the following steps to generate the correction grid:\n",
+    "\n",
+    "- Computes the total flux (`total_flux`) of an ideal Sersic profile with the sampling points using the ` petrofit.models. sersic_enclosed` function and setting the radius to `np.inf`.\n",
+    "- Computes the radius equal to `total_flux * 0.99`.\n",
+    "- Makes a PSF convolved Sersic Model image and measures the photometry. \n",
+    "- Measures the uncorrected Petrosian radius (). \n",
+    "- Computes the correct `epsilon` value as ` corrected_epsilon = r_total_flux / r_petrosian`.\n",
+    "- It also saves other values, such as the uncorrected `C2080` which can be used to mapto the Sersic index."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "dedicated-helen",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.correction import generate_petrosian_sersic_correction\n",
+    "\n",
+    "petrosian_grid = generate_petrosian_sersic_correction(\n",
+    "    output_yaml_name='temp/example_correction_gid.yaml',\n",
+    "    psf=PSF,\n",
+    "    r_eff_list=r_eff_list,\n",
+    "    n_list=n_list,\n",
+    "    oversample=('x_0', 'y_0', 10, 5),\n",
+    "    plot=False,\n",
+    "\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "85317016",
+   "metadata": {},
+   "source": [
+    "## Test Grid\n",
+    "\n",
+    "We test the correction gird by loading it into a ` PetrosianCorrection` and using it estimate values.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "222dde66",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.petrosian import PetrosianCorrection\n",
+    "\n",
+    "pc = PetrosianCorrection('temp/example_correction_gid.yaml')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "aecb98d8",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [],
+   "source": [
+    "corrected_epsilon = pc.estimate_epsilon(\n",
+    "    r_hl_pet=15, \n",
+    "    c2080pet=3,  \n",
+    "    verbose=True\n",
+    ")\n",
+    "\n",
+    "print(corrected_epsilon)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/data/abell_2744_cd_galaxy_f105w.fits.gz b/docs/data/abell_2744_cd_galaxy_f105w.fits.gz
new file mode 100644
index 0000000..3054dfb
Binary files /dev/null and b/docs/data/abell_2744_cd_galaxy_f105w.fits.gz differ
diff --git a/docs/data/abell_2744_dwarf_galaxy_f105w.fits.gz b/docs/data/abell_2744_dwarf_galaxy_f105w.fits.gz
new file mode 100644
index 0000000..f3547dd
Binary files /dev/null and b/docs/data/abell_2744_dwarf_galaxy_f105w.fits.gz differ
diff --git a/docs/data/abell_2744_group_of_galaxies_f105w.fits.gz b/docs/data/abell_2744_group_of_galaxies_f105w.fits.gz
new file mode 100644
index 0000000..6716943
Binary files /dev/null and b/docs/data/abell_2744_group_of_galaxies_f105w.fits.gz differ
diff --git a/docs/data/abell_2744_spiral_galaxy_f105w.fits.gz b/docs/data/abell_2744_spiral_galaxy_f105w.fits.gz
new file mode 100644
index 0000000..7a68fbe
Binary files /dev/null and b/docs/data/abell_2744_spiral_galaxy_f105w.fits.gz differ
diff --git a/docs/data/concentration_index_grid_f105w_60mas.yaml b/docs/data/concentration_index_grid_f105w_60mas.yaml
new file mode 100644
index 0000000..fe2180e
--- /dev/null
+++ b/docs/data/concentration_index_grid_f105w_60mas.yaml
@@ -0,0 +1,4377 @@
+? !!python/object/apply:numpy.core.multiarray.scalar
+- &id002 !!python/object/apply:numpy.dtype
+  args:
+  - i8
+  - false
+  - true
+  state: !!python/tuple
+  - 3
+  - <
+  - null
+  - null
+  - null
+  - -1
+  - -1
+  - 0
+- !!binary |
+  BQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - &id001 !!python/object/apply:numpy.dtype
+      args:
+      - f8
+      - false
+      - true
+      state: !!python/tuple
+      - 3
+      - <
+      - null
+      - null
+      - null
+      - -1
+      - -1
+      - 0
+    - !!binary |
+      IE1n54HABUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IhuCtAF/CEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LnrlcNiGCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6JV6POkUDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dNZZOtg2DUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +8iu1rIgDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      V/pAKZT1DkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oIksG1l1D0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FoB5mVjXD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CCHA0DsxEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      V2NZRdQvEEA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ymjk0k0o/T8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IU3m+Gvu/z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      C7dT8AIyA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      m6oZVL37B0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +uTfL7oYDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tRUahrHkEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      R1cn3im+F0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iapLf7LsHUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ivnk3yr5IkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UnaB0IRiKEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bAYsJlrNMEA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5TawufogGEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ezqmnmqyGEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      E+4xh9AoGUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ftfwl4+UGUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SCWYs4voGUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      b2+ALE07GkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Z8/idW6VGkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pp5qsnzbGkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nW7wT6E+G0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      C5ghEFOGG0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Xxz6tL7sG0A=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nmqyfNsuLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Jsu37bJWL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nLoceeVJMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZgjElOGdMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7kIz8RbAMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BvAHs+jAMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZVTwvSWpMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gGUuWqmDMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      m+JRd2pXMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /BrHsFwiMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NN7LtU7JL0A=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  CgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9EiEZ/DQBUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      slmLQy/4CEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cIGImCFIC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      j9w6HpwPDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      T3XjFQdpDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7NbS76ZoD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      i2b6MXMoEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VC8xN8GDEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      M4Is3PPFEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CnBd61gOEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      f2lA/hIaEUA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4e/eosZJ+j8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hzmjbawXAUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JpfDJFVaBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EU1ECrf3DEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xA5m1RqUEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5B6pJF6aF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Y73wJVe7HUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rZYm/XLEI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aExqK9umJ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FoZ5Q2nVLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4UV8K51kMkA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Hyl7TfGoJUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MHpi25zvJUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Kz4u/28jJkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hCIyq8dTJkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DPG7hr98JkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lE8iDrScJkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kBPuMYfQJkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      09ha3ibvJkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FlbZNEgSJ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +44o2CU7J0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bBzDcolcJ0A=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hGogAUZPOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rXmIcbGROkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oQVejB0JO0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ogVejB0JO0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wDIXrdTBOkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +JQFlc5SOkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1uMpQmzSOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KGxAup1IOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2YB0O5G0OEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RZ03rhoROEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      U1HUQqF1N0A=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  DwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mLqKSYDFBUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TNW57I4kCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gb1TCVGTC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      klPAahh/DUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0HruuMYKD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mcd9aMUcEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DjOFuzuXEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kRWk4NP0EEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TcnIWhEUEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OeeF/7JPEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dhZE3TvGEUA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CTRQHoQ9+z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      i2ROtytQAkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UuwnWHViCEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BOUXrukLEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZMRb6PXfFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rg0VGW+lHEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xf5Y1thvIUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      D8vT7hE5JkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      o60fnbmMK0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gx24k6MEMUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aohof4AjNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tEFbJhVFL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3TvZosx8L0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      H9/tDZClL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kSSaUnXLL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      d6M4Yu7nL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XbRSB0cDMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ioC+yNAVMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0GGm+aMSMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FDi/xjEsMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Kvp9fLc3MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tuBECR0vMEA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bt+jgFDEQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SMpeUzxqQkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LrXi4/J/QkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1wPjmWVAQkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      p4mAvsjQQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SkOyIaJOQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Bt28qBe+QEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZWc7yPYrQEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oMNM80clP0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ckMNWwIePkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cY2ammMhPUA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  FAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      apeTPz7cBUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hLr+/mVHCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oD8Is/PgC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      b/Aw+Y7iDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      htU5h5JjD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9yjFwkhWEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Rum9WuXPEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4dXiWbBKEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wS9uW79zEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oQc+cRDWEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Xx1fJnMPEkA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FsqKXFHU+z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      q4zbMVThAkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uK6SbvBICUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jL4xxqa6EEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SEVnU5RsF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CcNM0kjRHEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LWqsbLiFIkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pFgL0SmjJ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      b2Ai2Yq/LUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6La6M5OgMkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3YNop09JN0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9cB4ZhlwNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      r5lByap/NEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lhSiBV6MNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8l6udUqeNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      k8HkS5qtNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CVYQd32iNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8eEc1B6qNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NF38QF3FNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZLNn8Tq3NEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YcyPuLTRNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      M6eJgL7INEA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gNET2+b8RkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Hq6Ilai8R0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bl7UC1/AR0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      s/sLunlRR0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IVx/r7uZRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NF38QF3FRUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yb3Kb//cREA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9ixe51bpQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Rr+P7/YGQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QtpWoFMpQkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BSnp0VtJQUA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  GQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oJyrgQ35BUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rjkiV0VzCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      90M7cNkaDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4HTqOSEnDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tGp4VPzFD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FBh1v4F1EEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zF4KUSUTEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      q6Y35GiAEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aL4CLgbbEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Q2tvx1wvEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cMPZKoteEkA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mFllhrgq/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      adqhXNgqA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WUyoCfDBCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Uaky+uBoEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EmiGvyHUFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aPpGNg6KHUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mM1c4xoYI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SzvCHfJYKEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      m9mPAkW+LkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      r8m9n/qLM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /UzfXBqUOEA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Pj+rkBFPOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ys52kO1XOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ys52kO1XOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      azGtZj1nOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bWSxyAdYOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VTiseydbOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PsB6BQNTOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +TnMNH9UOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bvLuiiFHOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JeCh4WZhOUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      x5+wAel2OUA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HMNyiVxHTEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iL3dugkuTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5lqn5LkeTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Rk9sm/N9TEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oiv0oL+OS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jZw5TQR0SkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fPAYXwkvSUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pdnqutLrR0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2O74pbG1RkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RnNjxrJ7RUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tPls0JZJREA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  HgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SirLCeQHBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      y2DsPPiUCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kYaMJQJTDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QNf4l0VnDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xoivfwEIEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hHDmuL6sEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IuyJoKs6EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AlbG2pl7EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8GRl+qLtEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lkWbtF1EEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      m3OZ0pSdEkA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OSzrq3Rh/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      S/RMriVeA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kd5HzBA1DEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iB2k15qNEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hjUdVVpSF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ae/Ynkg2HkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pjXaeORlI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Va/zCka1KEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JKSgsxCzL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QINrcmcHNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1tVNEgk/OUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5QOsVzAwPkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Qw/66wAiPkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hmbiLYA/PkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Qw/66wAiPkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /WRU8L0lPkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ckMNWwIePkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cwosPI8VPkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t+9RQCgiPkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Fxm6Qg/6PUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XZBb3IcFPkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      c0FucR8WPkA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HCBL047NUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nOCyjYdPUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gJxwjzlEUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JgSZDCbfUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4opYicpLUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fBQQisgsT0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Zq8pHnWnTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uCT1i9UaTEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6ZoZlKx6SkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      x5+wAen2SEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      51gI+9aWR0A=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  IwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Grd5z4YcBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XqH0KIKyCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dS2pDd5kDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nEhJCHiGDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eN8oLAQOEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WDb0F07DEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gIgnfChSEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jnGua8G8EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2zuLPhMXEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      m+L5zodSEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gEQ4y9prEkA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CYVtBVuG/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1un/8aV7A0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qdZI1afqC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XKiEpx8jEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YOcNGZSCF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Oi1v7pxzHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SEq7pB6cI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      w84TltoTKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5Wdmo88TMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +QnU1+t6NEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      i3Jgb23NOUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gJxwjzmEQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Rit1cDSAQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      f/lI2WuKQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9LMKGfGEQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      U+NP2IB0QUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aZLDgzV9QUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jYnuQjNxQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      saQQLfBiQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9/UbssZoQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9huyxmhuQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +JQFlc5SQUA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2N1MhcN6U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      C3bJznYQVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mNkh/Qf8U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      44i5n+eDU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Yjh1OfLKUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XtaqSCP5UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xCZdM4MSUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      98+FnSQjUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yoaIOm9cTkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      F/XCF1B8TEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      puZYCPvWSkA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  KAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9r3fEeEZBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      At/JKAzACUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6z5JLimSDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MFmJaeeoDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pM00HmshEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UMkeQ0jSEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ypxWRSFUEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BOjZg9/aEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      53iGNGRHEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YTv03WdrEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Xm6EEDOoEkA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /B5ep7Ci/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      f3iViRprBUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fclRt+1rCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wagiCR3CEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mzKqANdCF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pa1EdyCFHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZS29rTvOI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HHs5t/BgKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6d2fz1pCMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GSFG54quNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      syfE2sQ0OkA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JB3B05/5Q0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rQsEB5EQREA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      607tamjvQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SMpeUzzqQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9ixe51bpQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PkFKevTWQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      grjrE23iQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vyMKdsnOQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JwBbOWDPQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vm82nw3aQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VfC9JanfQ0A=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yEA5ztMoVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      liftDy/PVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zaBk1b+yVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      37bLWhUpVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FQ7r3slWVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4LKNh09ZVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qIfh1OVIU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Xld6vRQ9UkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TyStnX8cUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EOeg9lAVUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CeiLDF0hTkA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  LQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WApqXPEmBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AmO8y8LlCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YNSVHXykDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iHxaLV2/DkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Di5ghAw6EEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6prnY6rgEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BysLnoqOEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0KOOfbL6EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PA5WHpRmEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LqQDihnREkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dp4S6Tn2EkA=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AIYT4w+7/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZFBmZpZYBUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cdPw+lGgC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XEXxhXEVEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vBPNDzWdF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aS4LmsqJHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UOoglZDjI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      J0n1xYGdKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nrh3BCBsMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rntjgK3gNEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      J1LnCeB5OkA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ag8NNwtzRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      r4b2vtl8RkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      37bLWhVpRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mnZs9ixeRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1gchbStQRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ynM9MJ5ZRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BgNTvblDRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vhJeVdtTRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +2oxrWY9RkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hsO6d7JFRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hfr8rEJGRkA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xDmoPVTVWEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      58TtexSQWUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AiC5V/ltWUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YlxsZLHIWEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fsjjYIThV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hvr8rELGVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      s6DSWSqTVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YToUI9VSVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0LzfWfMQU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8t996jviUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0tyYsey+UEA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  MgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UZ7C9HI1BkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FUeoriXmCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /8Ki5LypDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Rp1NQ8fiDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Nlkpgy5NEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4bLx6GPrEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XjSQguyTEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pYAS+boPEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qOfE9YFTEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      18fTNxDeEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TOFXjt4oE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KDcvYZXJ/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      l1wTkDmCBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EsAcEd4+C0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FVgxDI7hEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kqiaKFqZF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      p8GbPizMHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EuEZVXb/I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      saUMhT/FKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2ErtjGJ7MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gm8f9DAeNUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      O/cali3JOkA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pjKFMT/iSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Sci/aVniSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VTiseyfbSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PsB6BQPTSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VjRuqGHLSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eWR6htLHSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zTR/VIK5SEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2Le2cCG1SEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Q9i3tnChSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TRc/UFexSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HXdGYBi8SEA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3RmBYfCGW0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vjZVgJpRXEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QiTk37QsXEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KkJs0jVzW0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CB/OQe1hWkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WQj71hYuWUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nE43+KfQV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6qkmy7dtVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rUJGPCERVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MWV45+ikU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PdVk+bZdUkA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  NwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TR8RFt86BkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SFtCUc36CUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      65q1Igu/DEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GzioINPeDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TOudWOBXEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yqrFmxcUEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vyqDUlKREUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fI04iwoCEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1V4p4aOGEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tEBqvcrmEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pKB6cNhJE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Phacw/rw/z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RCdtUEAaBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4/gL7ucGC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OsPe5XoNEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yKiRQHOjF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7cwgr4PyHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WmruqXsZJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GRyllMDcKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5x+AqWWTMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KS7KOc05NUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NYvC4fIEO0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Uma+NlWAS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HGx3/NJYS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      y7mMnDlNS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Kcd5Gu1GS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      E3Gg5aQ0S0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KlW33AY2S0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cfseBYQiS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WNNXi2k1S0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fuo7omAXS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FWvDKPwcS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xZCjyt0DS0A=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qkxhzI84XkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KCbxTQIVX0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8fLI9AzlXkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4SAS8m8aXkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5ZUn7Q/vXEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XNyHBcyQW0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3GMOoVEKWkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hGogAUaPWEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ke1XHeUKV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GOJ3DX95VUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      egeiPKABVEA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  PAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DYu8TgMzBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gOuE5ZYACkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TCf0KZnEDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TX1k0p/9DkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UivlreJcEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      76DCHkAaEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jG7mDzCyEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +1jQoo8LEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gSllbnaLEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MWGoqkbsEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hBTQUHMnE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +MYLrMckAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      u6Squ3u5BEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OqPWZY9iC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Qq7+B4jzEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LbjEv367F0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fPmAveT3HkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8GhFWBQoJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NnHo9tzyKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nKiyCCuzMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8g7o93lWNUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8zjUJYEkO0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6VIrPi7/TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Pp4ixCbdTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kFvchwXMTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WVQnAFu5TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t+9RQCiiTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2kX0MjukTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iW8SqOKaTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IUeVuwePTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ackFucV9TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3L5HAaGITUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0dyYsex+TUA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5PL/NkJ1YEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zgxKVv3rYEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JD8ZFXzPYEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dU7cvkdhYEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      r2L/kxp/X0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TNHv47v9XUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vuzHQDlOXEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qsnybbusWkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MB8pe03xWEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LiUGOPZIV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      r4RX1fa0VUA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  QQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wNmAeHU7BkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      brwgPloCCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fB+CtKnSDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      d3NjK6YDD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4kwFU1daEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2E2h3GojEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aSSvnaKmEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GFAjFEU+EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K971iax2EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AUMB9qb6EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lAp7GM5RE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CCob6TGK/z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4lGkDPKNBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gMAZQWz/CkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FYdWzzwNEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +V07JjalF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BlKuEcTyHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JXVTGbwtJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wkOhUTMJKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      r/bpIkS1MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XE2aGGRaNUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Oxun2vwkO0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qt7cYW83UEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      azGtZj0nUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lc5SmcIYUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kO/2BsgSUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SlReQpAJUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RZuYxDcJUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3gSXbTz8T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      L6KX2SH9T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pNuJpLXzT0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oxLM2UX0T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NM0flWDOT0A=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zUOMi43MYUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      U4Z3jk5OYkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EPhMFz8wYkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Z5igQN60YUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      saQQLfACYUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qpRPIg40YEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ROlj116cXkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tEFbJhXFXEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XtaqSCP5WkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jNN7gpQ0WUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2JVeL0V/V0A=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  RgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FlJbA9A7BkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EJ6G3mIMCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      epajf7DWDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dl4xSwUWD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      asOjmEdgEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +pw/vJAjEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dJn8tIbEEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ummz5XE/EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WhPjd5usEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eMFnOREHE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fT8QU/RrE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BWAEcl1m/j8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kkLDH0UNBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EXWLxzcrC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5fx1NGsBEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Lx5q12fHF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WZhzxpUUH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CUB1at44JEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uhsI+2MqKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      d4lqaxvKMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dz4JI4l2NUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UaecnAhIO0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dn9BNy9qUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Qw1bAh5aUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1gnAVg5YUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4uWR6RlKUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      C+KuT7RJUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CyqdpTJFUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eZu8u2JIUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IwwVs7E+UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TYMk0ZQqUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NjMoWfUvUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      42Iji0U+UUA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tHidW6UlY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WXZ/QTevY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mR9xaaOPY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QHRO3L4HY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /92nviNKYkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      184/TrhnYUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bWIS3yRwYEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cq/y2z/XXkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      R6ZnKH3sXEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6T/gM138WkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WVDpLJUpWUA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  SwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OHwb2ihEBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      R0YDQbsCCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5Nm575fhDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DJXCYAAcD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CGHaActvEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      sAAZxfUdEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tq2OttO3EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hhL5LBQ2EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WKGVdxakEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HO5j9XEGE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      auDDIJNPE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ar12yPcq/T8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jL20FP9JBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      56b6f3Q6C0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      j/ZrOlMQEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ewa0+S/OF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UJ5fYo8wH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      An2HhSxAJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wTwQVKo0KkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Jg/Uj6PYMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PUl66OyUNUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eXmsUBtXO0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QyCmDO+cUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +INZdOCXUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bdCWSUWRUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lhSiBV6MUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Fx34FdWJUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XH0Q0raCUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ojq56XSDUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      03uClPRoUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7BNtYhJfUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Gl1qxcdlUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6qkmy7dtUkA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mq2uK71+ZEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cwiNUqwNZUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FzBDIKbsZEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BspxnkZbZEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PNmizHyNY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UmQfTXKYYkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AX2RoSuUYUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      sZHFIh+AYEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      suz+gm7eXkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dHLT6Qa/XEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IAPlOE/jWkA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  UAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      viZ2EJBABkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      L0djom7/CUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IXeP0rDnDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ri9Fk58aD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kR7U3G9wEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CaMCUrQ2EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7RVNtqXUEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aqiViZ06EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      E6R3moLhEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EMJoFvgPE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6k1QK6R1E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TzK75ixR/j8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      p8zFU1NwBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DfsVNMHeCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xeb7fwAGEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XydGkwfEF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NG2w4qI4H0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0rbI1WBOJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YsnjGE1KKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BGvwzRfZMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tcX4ykGXNUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zhT5Vf5xO0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cQ5qD1XlU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rLJpkCTaU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4uWR6RnKU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BfKmnMvIU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +zPvd9a8U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xjPLgKu9U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QXAQCfm3U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /J01DzGuU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DQDJvcqvU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /YasMZqbU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MeSocvegU0A=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      apAkmlLVZUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TYXDundyZkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JGMQQDtNZkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      T1lQ6Sy1ZUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PniMr4TXZEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      C2N+xKXNY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /LCAGQKxYkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      i2vU1ByLYUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RB4HIwx1YEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AufXOIalXkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FgxM9eaOXEA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  VQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JssKUANIBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dgkm5gQDCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AgPLws7dDEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AjZsg2ElD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SBAUixN7EEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vOqQ8akzEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      95UAgYS+EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4GbRGcNjEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dTeWxSXPEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qn6VMWoYE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PkLw0CKME0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XTgul4a8/j8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BkE4kTI/BEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gvt7HW81C0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NCS8W+oOEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +2YQ3CXZF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      F+YcMd89H0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xAwn/AhXJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fHCIw/dWKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fijWOUziMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QscZ1vOzNUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1dht702FO0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      g6c/834nVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xDmoPVQVVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qOIaNTUHVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      F76A4r/7VEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XtaqSCP5VEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      R03NsRD2VEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GODYI5zxVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ToGF57HiVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5iHGxUbWVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4rDunWzRVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SlicFVbZVEA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qzd32NstZ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      W11Xer3UZ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      s8IqmwapZ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +X8boRoIZ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vbnD3m4dZkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZnZI/wH/ZEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      U9AEzq/RY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0u1E0tqZYkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      de9kizJzYUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aqHQukAwYEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3k4krZ0/XkA=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  WgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yiJqpkdIBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2tZD4j8TCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WbNm1/n0DEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xSswoBUnD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jNScw8WIEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      o4Vxn+0vEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QnsSyCfUEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZkzZpqxQEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Q3xCsNGxEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zer/pvQfE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      awfcRyZrE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      a2yqxlR8/j8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UtbRPDvqA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PlxoA4QcC0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Koj2RMANEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RNjqMF3SF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UA7JuZ5CH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /hGuoQVbJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7Rif27xYKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mboYg1zsMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UAPyrvW1NUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XLPF+WypO0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      N0I1kABjVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eUCDWxNKVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UTEb66dHVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LzQTbwE8VkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9cIXUPw3VkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      38kWZeYrVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wYkSOl4wVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Wzv/OOEeVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DiIh/6YlVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xdowCj8HVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9VST5dv2VUA=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      H5f/txGKaEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vfAFFP89aUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ecFS0AQOaUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GCwFTeBcaEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iKjzxlVjZ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5o9KMGc3ZkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BtsdvzT2ZEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      X/gCiv+uY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BTw03CxsYkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PY12ozgiYUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vaZ41J3aX0A=
+? !!python/object/apply:numpy.core.multiarray.scalar
+- *id002
+- !!binary |
+  XwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +kyn/d48BkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rWklxuszCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      BsGW4C4GDkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4/vFCesxD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EJ6YqumBEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      E8lpn7NLEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jF+wdETpEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HlLbSIdhEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      M+aTYwDtEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OhMZkDIbE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JXzyrS2AE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      C6K8XAe8/T8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      muQk6HZCA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Cr36EzbCAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4ft+bY3qEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Rj5IMeLiF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hadDCPZQH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lVrTJg5bJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8FZIbjlWKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      S0TlSu32MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ioKKima3NUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      F9SbuRK3O0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAGEA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Dx7jK+GVV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KFuUma+NV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      o/BzmGl+V0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JC5t9I10V0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ap/p4gdqV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      j6mnmixfV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8gHWKxhYV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      D7BewcBUV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /6ZliZNJV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qQRzdhE9V0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      arQbxREzV0A=
+  r_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZHqG0scOakA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Q1foQX/9a0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IBSRWT1OdUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KGxAup3oaUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      74zAMHijaEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fwyU4zxtZ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GNHL7JAeZkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DpClacfGZEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      E0lr5x9nY0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      D3kcjDAUYkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /ZuWJU7GYEA=
diff --git a/docs/data/concentration_index_grid_no_psf.yaml b/docs/data/concentration_index_grid_no_psf.yaml
new file mode 100644
index 0000000..01955de
--- /dev/null
+++ b/docs/data/concentration_index_grid_no_psf.yaml
@@ -0,0 +1,3248 @@
+? &id002 !!python/object/apply:numpy.core.multiarray.scalar
+- &id003 !!python/object/apply:numpy.dtype
+  args:
+  - i8
+  - false
+  - true
+  state: !!python/tuple
+  - 3
+  - <
+  - null
+  - null
+  - null
+  - -1
+  - -1
+  - 0
+- !!binary |
+  CgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - &id001 !!python/object/apply:numpy.dtype
+      args:
+      - f8
+      - false
+      - true
+      state: !!python/tuple
+      - 3
+      - <
+      - null
+      - null
+      - null
+      - -1
+      - -1
+      - 0
+    - !!binary |
+      mLKCEnBPBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oNS8HDQxCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      O2PloJUpDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      P0BnlCiMD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tDy2c1/FEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      I4qlsB2aEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SfiCeyQ0EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HtCvRQnaEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JHBpO7huE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MmFj75TaE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ub0mquND+z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dH1q1X+ZAkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6M0b3ob2CEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      D9jlhueGEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      169/izesFUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      y0CwRRQeHEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pFPnprckIkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Kpe/ufEvJ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gVR6gp/ULUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      b41egcMwM0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7CQZgwDaI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YToUI9XSI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Yu7n+ZDHI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wOooV1bGI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7ozAMHjDI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TNHv47u9I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TPXmDnu7I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wQrirk+0I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      74ohR5W7I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TatZzxm4I0A=
+  r_petrosian:
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+? &id004 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  DwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wSwY/XBOBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      piskq1IwCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      V41BR1cxDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t4BxTRWXD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DH1Le+rEEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OHIXIcOBEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      P5pHrg9VEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5Jb01qDqEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      v0B4O68+E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AeBpnejpE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FdJ6uzzd+z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      26RpMPwJA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qDNCPqilCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DkYA0RoMEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YaqhxKBpFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SMnf7D4CHUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CUzXCKnjIkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MhQYLWVNKEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lb5TIRsxL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      G1J0m/PnM0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ewUDU725LUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2ZEgXH+vLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NtZPD8OpLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      N0I1kACjLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Z+ItgD+YLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ojq56XSDLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aUrVLbeBLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xo4E4fp7LUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xQDHHuGMLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Z3IKLDyPLUA=
+  r_petrosian:
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+? &id005 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  FAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ouHjwe5QBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jn3wAt0pCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +CbyyzIcDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pgBnTVtwD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xolswsaxEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MXTLXKCJEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      y//KbHIsEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5KKVNC7zEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +GR4Yuo3E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JldOsQC9E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      I5dT2D4x/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      e7hvGSJIA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uTfpxRcACkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DGk+/ZZQEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pzQeV5XUFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5JbPPkaoHUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kVLKh+dfI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      s2tVf0LxKEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RW6CiaLqL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1VI5qgNdNEA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SsSBlpPSM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SwrRAi/GM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qJiN9dPDM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wWe6+IG6M0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      e5d+6Jy4M0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qwA1o0utM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ToMk0ZSqM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fMwhNEqxM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OGSN0dyYM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZDKYfEmzM0A=
+  r_petrosian:
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+? &id006 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  GQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +ZA1rslRBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RZ+c8ewrCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zM91+WoXDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DMxxmhF3D0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      e098KxakEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      exfFCCeLEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JFJ+d1Y1EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2TZ0PPvCEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eFIGytVuE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4wfKojy0E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      obRefoNl/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      x0WqqsdvA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8QlMloE8CkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kJnmXxRwEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      osfrdW74FkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      do98W089HkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eanyRL2WI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gNI8HGVFKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aS7fafQzMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Jn5e/H20NEA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HedptBvFOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      B6TbiaS1OEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      B6TbiaS1OEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2ZEgXH+vOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZuTMaSKgOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fVz+30aoOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      w18+UvaaOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fsjjYIShOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TrYoM1+bOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xAJmCMSUOEA=
+  r_petrosian:
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+? &id007 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  HgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +3LLXXxPBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vuqpv1kkCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uS5Bam0VDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IO4eQ8V0D0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WurPu9ylEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FweHWEBvEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lE9WGc1BEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hmLtg0PkEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6BnH6cAvE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0ZTuIiPvE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0+9RBQqN/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6/HVweGJA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aJWCE4XJCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pQATm7mREUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      A1qijLU2F0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      h/TS2mJ/HkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FbGCD0LAI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bBdz8KeGKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iP5hsttiMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9QRHHc/7NEA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NTXHQti3PUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZdW/MhetPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lSmM+RGXPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      f0PWGM2NPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Cj+HmeaPPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      C/NacKKEPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3eI+LGCGPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UGhdIDiIPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DjPNH5VgPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aLr4gbqKPUA=
+  r_petrosian:
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+? &id008 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  IwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lCbBrx5PBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      A723TywtCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9twEgygUDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PQVyRn5mD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bdh0BmqtEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Og7tPMV7EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9GuL0mosEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pch8GnK6EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6VW7oqIkE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CKcr4j2xE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LqtI8gmm/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ur8aYJadA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9Gm1s0cZCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uKw/zNu+EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hxdP4YtiF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1eW8fD6dHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8gixmDnsI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jMgpOny4KUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Bkarq3iDMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      A6uAACESNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Sg4P1vRVQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bSvQqZRPQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Y5EPsF5BQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zMiZ00RAQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tBvFEXM/QUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eiuZZ18/QUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +8PLI9MzQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Wa3BdscvQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /IrqBGArQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WT2eIsQmQUA=
+  r_petrosian:
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+? &id009 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  KAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JrXgGtpPBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +hS5L8AnCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3Jsg7QMfDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HYsH+rR4D0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7CIuASGrEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VAtvVvqCEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      sOXupSUtEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EtEiF+PIEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iusMS71YE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QrvdZNHRE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4lFVRGq6/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      weRmJQoEA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DVl+zCGXCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EYYmvbvJEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tMG/tZl2F0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /Qnwo4O8HkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      I8ivu4//I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t0a6miTmKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      91+sT86iMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      T+jc571FNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4gso/rvPQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2N1MhcO6Q0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zEfKXlO8Q0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wR0tuSC3Q0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zgxKVv2rQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /Gbz2aCtQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Kq5RU3OsQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2Dbn+y+xQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5ThPo92oQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fx1ABCuIQ0A=
+  r_petrosian:
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+? &id010 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  LQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      agx2wSlQBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WOUEQ9ggCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3A4fNfEODUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4k/+E/ZuD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vgFxHzafEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TUi6EfliEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VZoMZVs1EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bm/CZBqoEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yuMOz288E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Bv+GlvSGE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VzSkZ9HK/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8K5JeqW8A0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K3m0bUbeCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RvmGMrvQEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /vS4qtWMF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WdjHqL/dHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TVQsxQ0cJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      25hwVVv3KUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vNjhe+W0MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SudXzHNfNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tGfxOrdKRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WAw5qtw9RkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Bjj2CGc8RkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cFqWOJkwRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8b0lqV8sRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K7/9c2EnRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IaYM7xwdRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LKoTgK0cRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xN5u3QQXRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lmDOLqIXRkA=
+  r_petrosian:
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+? &id011 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  MgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XcVfWhxQBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      viViXXcgCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GY9fxYEHDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HMf2e+5xD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0FjTZKmaEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OcgY9j5nEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3Ttt88UHEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tjEtgNupEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4BoOSBUjE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ewQ5NmuWE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1C/DPxra/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      b1ATvVeQA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0UBAwa2sCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YZnGhA3YEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FbxcKfGdF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      apZJXqHtHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wo+13u8nJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kCVhfUkXKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1kzPhqvIMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3EGeWhJ6NUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +iJDV+jBSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TeD8GsewSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      n0QcaDmpSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IKir2P+kSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iSckUmSfSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      id2WEgOcSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UR7Q4NaESEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      isisHk+RSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OxKE6+91SEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jHrhCyh+SEA=
+  r_petrosian:
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+? &id012 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  NwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rGgNrfxSBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      U9iof2UhCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      u1AAWYsZDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4gTGnwdiD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TB8kkmaXEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      u9qrKDpoEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /Grmg1krEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uDI28kuuEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6IsrOOZPE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VCOHrTihE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zhcJ6yLb+j8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      x70p+uStA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      P/yoOtK8CkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LgqWoSXiEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QYtRAUWjF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fsn4m1oHH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pcQ4AiM0JEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xUgj594sKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uHDvbnbTMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SuMaM2eVNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      w3KJXMcdS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      n+uB8cwyS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZXjn6OQmS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lIZkQ0QdS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LHEyYToUS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      F8K+tYULS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9UPnxO37SkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LhAcREL+SkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GBcbWSzySkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      g5T06K3kSkA=
+  r_petrosian:
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+? &id013 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  PAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RRMvJG9NBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      33mt+3gkCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8T8GDgcFDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Gv4PcG5qD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qIeyln+ZEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SFi6OCxrEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kw04F93+EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UzmfFnivEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IrqA76oVE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZTAY9ly/E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hN+QIdZg/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XO+a62odBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      egjBA3LJCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qWXxta7nEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CGtMTXyyF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bL6NIiMYH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /LcW1wZGJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yfD1CPQ0KkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      56PFB8DoMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eRTZxJKUNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5QOsVzCwTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      h9AoxdqwTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iTjQclKaTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cwosPI+VTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9BDjYiOLTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0mx1Xel1TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OoAIVhB3TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GoFh8IZjTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ackFucV9TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ea4HxjNLTUA=
+  r_petrosian:
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+? &id014 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  QQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nEQtvzZRBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GnhY1/8gCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rRWfa5ULDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8F9PlwtbD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      N5mh/I2YEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZIWFBD5sEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MYgvfVIkEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aPSYLO6lEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      S3EHY+NUE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wEA7MOzDE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jVbLC0sU/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IBjpJJHKA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aX+qBkLXCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      v9Gmb1bqEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pkx3//u5F0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      S0PpVmAtH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Op1aeX1MJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mzlLHxxOKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vfpVXvDtMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0NBxHrSwNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nBf1whcQUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kG4nktYOUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      i8YNNWwJUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      os4bV40IUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6SyVKYz5T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      r+EvHyn7T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3gSXbTz8T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      L6KX2SH9T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pNuJpLXzT0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oxLM2UX0T0A=
+  r_petrosian:
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+? &id015 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  RgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pXWDigZQBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LKnvWfEoCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vJUtQUgUDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Xll7ceBeD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      At2KjaKlEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qUyuArhZEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XYBIUXYQEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dqpRMzSjEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YaLqIpUeE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ifaw+rzRE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9eFxatpi/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MH5V+QTsA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      sKZRJMreCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MC+ZhDTxEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      c9/IWb7GF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Nfqy1asxH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Y8V3gGtYJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HxZ5u6lRKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /0IYBpLtMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K4aJBjSwNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UA/DqctRUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      helQjFRLUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      szCvBSdKUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      F76A4r87UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jOhldkg/UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2IB0O5E0UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6gb/FOozUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JJzxXq41UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MYsO/IoqUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NjMoWfUvUUA=
+  r_petrosian:
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+? &id016 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  SwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +EqUnj1RBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SEukQh8oCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LiKP7UcFDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      sHXC2t9WD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0azOEB2VEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +SCjOaVYEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      omkxniAbEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      o+1KzfGlEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +DaUH/85E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fpVZIUnSE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uUwshtBE/T8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zH1vEAIBBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RLqP/E3kCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TAshaLj1EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      U7HkRyLIF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4wWsPG43H0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      H4PYJFpVJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K7TyaupaKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      acgHt6b6MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bE8OfuvMNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xKcsqHSWUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HGg5KQ2JUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eyuZZ19/UkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NKXqltuAUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DMslch13UkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tYULqc1wUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WVKIFnhxUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      03uClPRoUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7BNtYhJfUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Gl1qxcdlUkA=
+  r_petrosian:
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+? &id017 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  UAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MpkbgStMBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      h0Pu4yEeCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gHOIEjkPDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AiTHUyFOD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PjXzzFuaEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MbY96nxyEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      h9xbGAcFEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vpeyPDSgEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Yb0yy7YpE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      O2+moApuE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZABQcJil/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xDuf0AXmA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Jh9JMULnCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AbPUBVT+EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vCBj5uvRF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TlODFYxCH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JQtrJo1dJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      W29lv9loKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dloER4b6MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      E2YDp5vMNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lrlopQ7OU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      y7ftslbFU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mDRbXVe6U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0jUzKFm1U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PNmizHytU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      q+3pmHqqU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MMJQMRurU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JnB+jWOYU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fwyU4zyNU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /YasMZqbU0A=
+  r_petrosian:
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+? &id018 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  VQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VAWbT3ZNBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mw5PqL4mCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fnW8wQYGDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MQTXez5fD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xcI6YJSiEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      snNJO59vEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Lv9pSkMbEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ugFMhE6MEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      q0tipAQ6E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QqQa5fF2E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ycvxExGm/T8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YrXFSdHwA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hf243KnoCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WTaXyd8BEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rA5ExYfZF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cOUYsCxSH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fEp7+LxtJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XEoGNrhwKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ek/S5BYFMUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EL1KyFrMNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IexbW7gQVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3WFvt24CVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      usE/hfr8VEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QQDttPXuVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ky2C3oHoVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t7gPC5jhVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2WuKR93pVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KMkYBNDOVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IzKrx1PEVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4rDunWzRVEA=
+  r_petrosian:
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+? &id019 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  WgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cM1V8MJOBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t2sckl8kCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      no0r1BcADUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8aZYJstKD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Gk2jdGyjEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tmBLCApsEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xIdH/1YEEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2W385cfBEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xq/WpZhJE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6KBxXuV+E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IM6LVtjv/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lU0SVfjjA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EohPJPjoCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KgL/0CUGEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iA87iJXcF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pBALmTVWH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ooxcw+JsJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QjLnCnB8KkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XpWdeMEMMUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0OKBepzpNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bvLuiiFHVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gIklhWhBVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Qbj+XnczVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ggQYPbEtVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WZp2bPYsVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2+Z8/yUWVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uVmY14ITVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Wzv/OOEeVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      I0NX6EH/VUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xdowCj8HVkA=
+  r_petrosian:
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+? &id020 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  XwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OtqAJ3hOBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Hu2nxASBCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RfYFYwa/DUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pPQyMPA0EEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      q+vsYAuaEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wj8WsNlnEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      44kShk8QEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XnWKBNfAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5uzf6gY2E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2OKNMAqGE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6jmB2Uwi/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ep0bCD5Z/z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      54jR3haqBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MDKYEo7dCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Vsjd/n7eF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wm2+NEJdH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      j8tVPbRxJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rEJNBjB2KkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hJa2ZVMVMUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      l084knPpNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EQdaTkqDV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4/SeICV9V0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QYG8KedyV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jhnL7i9oV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pnpzh71dV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      j6mnmixfV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8gHWKxhYV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OeEecwhNV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /6ZliZNJV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qQRzdhE9V0A=
+  r_petrosian:
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
diff --git a/docs/data/f105w_psf.fits.gz b/docs/data/f105w_psf.fits.gz
new file mode 100644
index 0000000..8377251
Binary files /dev/null and b/docs/data/f105w_psf.fits.gz differ
diff --git a/docs/fitting.ipynb b/docs/fitting.ipynb
new file mode 100644
index 0000000..b87ca8b
--- /dev/null
+++ b/docs/fitting.ipynb
@@ -0,0 +1,1239 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "3e52c34d",
+   "metadata": {},
+   "source": [
+    "# Fitting\n",
+    "\n",
+    "\n",
+    "Most galaxy light profiles can be well described by PSF convolved models like the Sersic profile. PetroFit uses the `astropy` `modeling` and `fitting` sub-modules to provide tools to preform two dimensional fits of galaxy light profiles.  To this end, we use the PetroFit ` PSFModel` class, which applies PSF convolution to and handles oversampling for `astropy` based models.  \n",
+    "\n",
+    "In this section, we demonstrate the basics of light profile modeling on a galaxy using a single component Sersic profile. We also demonstrate how the `photometry` and `petrosian` PetroFit sub-models can be used to improve the initial guesses of the Sersic parameters."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a68cbd8e",
+   "metadata": {},
+   "source": [
+    "## Loading Example Data\n",
+    "\n",
+    "The following data is a cutout of a group of bright galaxies in Abell 2744. The original data was aquired by the [Hubble Frontier Fields](https://frontierfields.org) team via the WFC3 instrument in the `F105W` filter and can be dirctly downloaded from the [Mikulski Archive for Space Telescopes](https://archive.stsci.edu/pub/hlsp/frontier/abell2744/images/hst/v1.0/hlsp_frontier_hst_wfc3-60mas_abell2744_f105w_v1.0_drz.fits). \n",
+    "\n",
+    "### Loading Image \n",
+    "We first use `astropy`'s ``CCDData`` to load the example data and visualize it through `matplotlib`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "91575418",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.nddata import CCDData\n",
+    "\n",
+    "image = CCDData.read('data/abell_2744_dwarf_galaxy_f105w.fits.gz')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "7c75fd46",
+   "metadata": {
+    "nbsphinx": "hidden"
+   },
+   "outputs": [],
+   "source": [
+    "# Hidden cell\n",
+    "\n",
+    "%matplotlib inline"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ffb27660",
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [],
+   "source": [
+    "import numpy as np\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "vmax = 0.05 # Use the image std as max and min of all plots \n",
+    "vmin = - vmax \n",
+    "\n",
+    "plt.imshow(image.data, vmin=vmin, vmax=vmax)\n",
+    "plt.title(\"Galaxy in Abell 2744\")\n",
+    "plt.xlabel(\"Pixels\")\n",
+    "plt.ylabel(\"Pixels\")\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2b76dbf6",
+   "metadata": {},
+   "source": [
+    "## Make Source Catalog \n",
+    "\n",
+    "We will use the sigma clipped std as a threshold at the segmentation and deblending steps.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b5d8bba9",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.stats import sigma_clipped_stats\n",
+    "image_mean, image_median, image_stddev = sigma_clipped_stats(image.data, sigma=3)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "14f99306",
+   "metadata": {},
+   "source": [
+    "Here we identity sources in the input image."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "648a41a2",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import make_catalog, plot_segments\n",
+    "\n",
+    "threshold = image_stddev\n",
+    "\n",
+    "# Define smoothing kernel\n",
+    "kernel_size = 3\n",
+    "fwhm = 3\n",
+    "\n",
+    "# Min Source size (area)\n",
+    "npixels = 4**2\n",
+    "\n",
+    "\n",
+    "cat, segm, segm_deblend = make_catalog(    \n",
+    "    image.data, \n",
+    "    threshold=threshold, \n",
+    "    deblend=True,                 \n",
+    "    kernel_size=kernel_size,                  \n",
+    "    fwhm=fwhm, \n",
+    "    npixels=npixels,\n",
+    "    contrast=0.00,\n",
+    "    plot=True, vmax=vmax, vmin=vmin\n",
+    ")\n",
+    "\n",
+    "plt.show()\n",
+    "\n",
+    "# Display source properties\n",
+    "print(\"Num of Targets:\", len(cat))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8d1050fc",
+   "metadata": {},
+   "source": [
+    "## Single Source Photometry \n",
+    "\n",
+    "\n",
+    "Here we pick a galaxy that can be modeled using a single Sersic model, the galaxy in the middle looks like an elliptical galaxy that can be well described by such a profile. To make sure we selected the right galaxy, we use the `plot_target` function to plot a cutout of the source. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5c2384e9",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import order_cat\n",
+    "from petrofit.utils import plot_target\n",
+    "\n",
+    "# Sort and select object of interest in the catalog\n",
+    "sorted_idx_list = order_cat(cat, key='area', reverse=True)\n",
+    "idx = sorted_idx_list[2] # index 0 is largest \n",
+    "source = cat[idx]  # get source from the catalog \n",
+    "\n",
+    "plot_target(\n",
+    "    position=(source.maxval_xindex, source.maxval_yindex), \n",
+    "    image=image.data, \n",
+    "    size=100, \n",
+    "    vmax=vmax, \n",
+    "    vmin=vmin\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9d172029",
+   "metadata": {},
+   "source": [
+    "After selecting the source, we define a radius list for the aperture photometry. Once `r_list` is defined, we run the `source_photometry` step."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "2c1a6837",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import make_radius_list\n",
+    "from petrofit.photometry import source_photometry\n",
+    "\n",
+    "max_pix = 70\n",
+    "\n",
+    "r_list = make_radius_list(\n",
+    "    max_pix=max_pix, # Max pixel to go up to\n",
+    "    n=max_pix # the number of radii to produce \n",
+    ")\n",
+    "\n",
+    "print(\"len(r_list) = {}\".format(len(r_list)))\n",
+    "\n",
+    "\n",
+    "# Photomerty \n",
+    "flux_arr, area_arr, error_arr = source_photometry(\n",
+    "    \n",
+    "    # Inputs \n",
+    "    source, # Source (`photutils.segmentation.catalog.SourceCatalog`)\n",
+    "    image.data, # Image as 2D array \n",
+    "    segm_deblend, # Deblended segmentation map of image\n",
+    "    r_list, # list of aperture radii  \n",
+    "    \n",
+    "    # Options \n",
+    "    cutout_size=max(r_list)*2, # Cutout out size, set to double the max radius  \n",
+    "    bkg_sub=True, # Subtract background  \n",
+    "    sigma=1, sigma_type='clip', # Fit a 2D plane to pixels within 1 sigma of the mean\n",
+    "    plot=True, vmax=vmax, vmin=vmin, # Show plot with max and min defined above\n",
+    ")\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d167e5fa",
+   "metadata": {},
+   "source": [
+    "## Petrosian Profile \n",
+    "\n",
+    " \n",
+    "We use the photometry that we obtained to construct a `Petrosian` profile of the galaxy. This will allow us to estimate the parameters of the galaxies Sersic profile. We also initialize a `PetrosianCorrection` which we can use to estimate the Sersic index (`n`) and `r_eff` (half light radius). The correction grid we use for `PetrosianCorrection` was created specifically for this dataset using the PSF above. \n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e2161ce6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.petrosian import Petrosian, PetrosianCorrection\n",
+    "\n",
+    "p = Petrosian(r_list, area_arr, flux_arr)\n",
+    "\n",
+    "pc = PetrosianCorrection(\"data/concentration_index_grid_f105w_60mas.yaml\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bdcaebb5",
+   "metadata": {},
+   "source": [
+    "Next we compute and apply the epsilon that produces the correct `r_total_flux` and create a new corrected Petrosian profile (`corrected_p`). To compute `corrected_epsilon` we use the uncorrected ` r_half_light` and `C2080`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "42ff7344",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "corrected_epsilon = pc.estimate_epsilon(\n",
+    "    p.r_half_light,\n",
+    "    p.concentration_index()[-1]\n",
+    "\n",
+    ")\n",
+    "\n",
+    "corrected_p = Petrosian(r_list, area_arr, flux_arr, \n",
+    "                        epsilon=corrected_epsilon)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8cb7fca8",
+   "metadata": {},
+   "source": [
+    "Galaxies with a high Sersic index (high concentration) have `r_total_flux`s that extend much further than we can possibly measure. If the corrected `r_total_flux` is out of the photometric range (i.e ` r_total_flux > max_pix `), we would be unable to measure the flux at `r_total_flux` (the total flux), which also means that we would be unable to measure the Petrosian radius (`np.nan` is returned). If the corrected ` r_total_flux` is out of range and we feel like the photometry data range goes far out enough to estimate the total flux, we can set `epsilon` to a value that will result in a ` r_total_flux`  equal to the last photometry radius."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6f0d4ee3",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "max_photometry_r =  max(corrected_p.r_list)\n",
+    "\n",
+    "if corrected_p.total_flux > max_photometry_r:\n",
+    "    print(\"Truncation was applied\")\n",
+    "    truncated_epsilon = max_photometry_r / corrected_p.r_petrosian\n",
+    "    corrected_p.epsilon = truncated_epsilon\n",
+    "else:\n",
+    "    print(\"Truncation was not needed\")\n",
+    "\n",
+    "# Print Radii\n",
+    "print('total_flux = ', corrected_p.total_flux)\n",
+    "print('max_photometry_r = ', max_photometry_r)\n",
+    "\n",
+    "# Plot Petrosian \n",
+    "corrected_p.plot(plot_r=True, plot_normalized_flux=True)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ab39545f",
+   "metadata": {},
+   "source": [
+    "## Estimating  Sersic Parameters \n",
+    "\n",
+    "`astropy`’s `Sersic2D` implements this model and allows us to provide initial guesses for the Sersic parameters. Getting good estimates of these parameters is very important because the Levenberg-Marquardt algorithm is sensitive and may return parameters that correspond to a local minium. Because of this, we follow the steps below to estimate the Sersic parameters.\n",
+    "\n",
+    "The `Sersic2D` model has the following parameters:\n",
+    "\n",
+    "- [**amplitude**: Surface brightness at r_eff.](#Amplitude-at-r_eff)\n",
+    "- [**r_eff**: Effective (half-light) radius.](#Half-Light-Radius-(r_eff))\n",
+    "- [**n**: Sersic Index.](#Sersic-Index)\n",
+    "- [**x_0 and y_0**: x and y position of the center.](#Center-Pixel)\n",
+    "- [**ellip**:  Ellipticity of the profile.](#Ellipticity-and-Elongation)\n",
+    "- [**theta**: Rotation angle in radians, counterclockwise from the positive x-axis.](#Source-Orientation)\n",
+    "\n",
+    "\n",
+    "\n",
+    "### Center Pixel\n",
+    "\n",
+    "We can use the `get_source_position` to find the max pixel position of the sourec in the image using the `SourceCatalog` object. Since this center is relative to the image, we save the result in `image_x_0` and `image_y_0`."
+   ]
+  },
+  {
+   "cell_type": "raw",
+   "id": "cb0c268a",
+   "metadata": {},
+   "source": [
+    "<div class=\"admonition note\">\n",
+    "<p class=\"admonition-title\">Note</p>\n",
+    "<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">x_0</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">y_0</span></code> vlaues we use in the model in this example are defined in the <a class=\"reference external\" href=\"#Zoom-and-Mask-Image\">Zoom and Mask Image section</a>. This is because we make a cutout of the target at <code class=\"docutils literal notranslate\"><span class=\"pre\">(image_x_0,</span> <span class=\"pre\">image_y_0)</span></code> which shifts the coordinate space. If no cutouts are made, then we can use <code class=\"docutils literal notranslate\"><span class=\"pre\">(image_x_0,</span> <span class=\"pre\">image_y_0)</span></code> as the center of the <code class=\"docutils literal notranslate\"><span class=\"pre\">astropy</span></code> model.</p>\n",
+    "</div>"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "508cb6a9",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import get_source_position\n",
+    "image_x_0, image_y_0 = get_source_position(source)\n",
+    "\n",
+    "print(image_x_0, image_y_0)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "29805c6d",
+   "metadata": {},
+   "source": [
+    "###  Ellipticity and Elongation\n",
+    "\n",
+    "We pass the source's `SourceCatalog` object to the `get_source_ellip` and `get_source_elong` functions to find the source's light profile ellipticity and elongation respectively. These values are drived from the segmentation footprint of the source. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4c3178e0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import get_source_ellip\n",
+    "ellip = get_source_ellip(source)\n",
+    "\n",
+    "from petrofit.segmentation import get_source_elong\n",
+    "elong = get_source_elong(source)\n",
+    "\n",
+    "print(ellip)\n",
+    "print(elong)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2655cec5",
+   "metadata": {},
+   "source": [
+    "### Source Orientation\n",
+    "\n",
+    "We pass the source's `SourceCatalog` object to the `get_source_theta` funciton to find the orientation of the light profile in radians, counterclockwise from the positive x-axis.. In some catalogs, this value is known as the position angle."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "2c98ec68",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import get_source_theta\n",
+    "theta = get_source_theta(source)\n",
+    "\n",
+    "print(theta)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6dfa5518",
+   "metadata": {},
+   "source": [
+    "### Sersic Index\n",
+    "\n",
+    "The PetroFit `PetrosianCorrection` contains a gird that maps the uncorrected (PSF convolved) Petrosian half-light radius and concentration index to an epsilon value that gives the correct Petrosian radii. This gird can also be used to map the uncorrected half-light radius and concentration index to a Sersic index. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "57ef0d9c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "n = pc.estimate_n(\n",
+    "    p.r_half_light,\n",
+    "    p.concentration_index()[-1]\n",
+    ")\n",
+    "\n",
+    "print(n)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "881f2ffe",
+   "metadata": {},
+   "source": [
+    "### Half Light Radius (r_eff)\n",
+    "\n",
+    "We use the corrected Petrosian to estimate the half light radius (`r_eff`)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b0dec7fc",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "r_eff = corrected_p.r_half_light\n",
+    "\n",
+    "print(r_eff)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f1189983",
+   "metadata": {},
+   "source": [
+    "### Amplitude at r_eff\n",
+    "\n",
+    "To find the flux at the half-light radius, we fit an elliptical isophot at `r_eff` using `photutils`’s `Ellipse` model. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ffd2861a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from photutils.isophote import EllipseGeometry, Ellipse\n",
+    "\n",
+    "# Define EllipseGeometry using ellip and theta\n",
+    "g = EllipseGeometry(image_x_0, image_y_0, 1., ellip, theta)\n",
+    "\n",
+    "# Create Ellipse model \n",
+    "ellipse = Ellipse(image.data, geometry=g)\n",
+    "\n",
+    "# Fit isophote at r_eff\n",
+    "iso = ellipse.fit_isophote(r_eff)\n",
+    "\n",
+    "# Get flux at r_eff\n",
+    "amplitude = iso.intens\n",
+    "\n",
+    "print(amplitude)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f9e59d78",
+   "metadata": {},
+   "source": [
+    "## Zoom and Mask Image\n",
+    "\n",
+    "Before we fit the image, it is important to mask all nearby sources to avoid interference and zoom in to avoid fitting irrelevant pixels (especially those outside of `r_total_flux`). For this example, we will mask nearby sources using the `masked_segm_image` function that masks pixels using source segmentation footprints and make a zoomed cutout using `astropy`’s `Cutout2D` function. We also make a second cutout (`fitting_image_unmasked`) of the same dimensions as the fitting image, but without masking nearby sources. We will subtract the fitted model from this unmasked image once the fitting is complete. \n",
+    "\n",
+    "We make a cutout of size `cutout_size` centered at he source, as we identified in the [finding center section](#Center-Pixel), and define a new center (`x_0` and `y_0`) that we will use in the `astropy` model. \n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "dbe30014",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.nddata import Cutout2D\n",
+    "from petrofit.segmentation import masked_segm_image\n",
+    "\n",
+    "# Define cutout size \n",
+    "cutout_size = 120\n",
+    "\n",
+    "# Make an image with all sources masked except `source`\n",
+    "masked_image = masked_segm_image(source, image.data, segm_deblend, fill=None, mask_background=False)\n",
+    "\n",
+    "# Make cutouts \n",
+    "fitting_image = Cutout2D(masked_image, (image_x_0, image_y_0), cutout_size, mode='partial', copy=True)\n",
+    "fitting_image_unmasked = Cutout2D(image.data, (image_x_0, image_y_0), cutout_size, mode='partial', copy=True)\n",
+    "\n",
+    "# Define new center \n",
+    "x_0 = y_0 = cutout_size / 2\n",
+    "\n",
+    "# Plot cutout that will be fit \n",
+    "plt.imshow(fitting_image.data, vmin=vmin, vmax=vmax)\n",
+    "plt.title(\"Galaxy in Abell 2744\")\n",
+    "plt.xlabel(\"Pixels\")\n",
+    "plt.ylabel(\"Pixels\")\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "33f984f4",
+   "metadata": {},
+   "source": [
+    "## AstroPy Sersic Model\n",
+    "\n",
+    "We also define a set of `bounds`,  a dictionary of lower and upper bounds of parameters. Keys are parameter names. The values are a list or a tuple of length 2 giving the desired range for the parameter and a value of `None` means no bounds. For example, we restrain the fitter from exploring half-light radii that are negative by adding  `'r_eff': (0, None)`. We also restrict the center of the model to be within a range (`center_slack`) from the initial guess."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3cb0021c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.modeling import models \n",
+    "\n",
+    "center_slack = 4\n",
+    "\n",
+    "sersic_model = models.Sersic2D(\n",
+    "    \n",
+    "        amplitude=amplitude,\n",
+    "        r_eff=r_eff,\n",
+    "        n=n,\n",
+    "        x_0=x_0,\n",
+    "        y_0=y_0,\n",
+    "        ellip=ellip, \n",
+    "        theta=theta,\n",
+    "    \n",
+    "        bounds = {\n",
+    "            'amplitude': (0., None),\n",
+    "            'r_eff': (0, None),\n",
+    "            'n': (0, 10),\n",
+    "            'ellip': (0, 1),\n",
+    "            'theta': (-2*np.pi, 2*np.pi),\n",
+    "            'x_0': (x_0 - center_slack/2, x_0 + center_slack/2),\n",
+    "            'y_0': (y_0 - center_slack/2, y_0 + center_slack/2),\n",
+    "        },\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "efbbdd0e",
+   "metadata": {},
+   "source": [
+    "## PSFModel\n",
+    "\n",
+    "The `petrofit` `PSFModel` is a `Fittable2DModel` that adds PSF convolution and model to image sampling to `astropy` core models. `PSFModel` makes an image of the underlying model and samples it onto a grid. The model image is then convolved with a PSF if one is provided. Since `PSFModel` is a `Fittable2DModel`, it can be used to fit model images to data images. For example, we wrap an `astropy` `Sersic2D` model in this doc with  `PSFModel`, which produces an oversampled and PSF convolved version of the Sersic profile at each iteration of the Levenberg-Marquardt fitting algorithm."
+   ]
+  },
+  {
+   "cell_type": "raw",
+   "id": "3653d689",
+   "metadata": {},
+   "source": [
+    "<div class=\"admonition note\">\n",
+    "<p class=\"admonition-title\">Note</p>\n",
+    "<p><code class=\"docutils literal notranslate\"><span class=\"pre\">PSFModel</span></code> is agnostic to the models it wraps and can handle complex multi-component <code class=\"docutils literal notranslate\"><span class=\"pre\">astropy</span></code> models.</p>\n",
+    "</div>"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "84dec3c3",
+   "metadata": {},
+   "source": [
+    "### PSF \n",
+    "\n",
+    "A Point Spread Function (PSF) describes how light from a point source is distributed on detector due to optical effects such as diffraction. Images or cutouts of stars are good approximations of PSFs because stars are single point sources and their images describe how their light is distributed on the detector. To make cutouts of stars in an image, use the ` astropy.nddata.Cutout2D` function.\n",
+    "\n",
+    "The following PSF is a cutout of a star in the Hubble Frontier Fields image of Abell 2744 (same dataset as the example image). Since we will be using the PSF image as a convolution kernel, it is **very important** that following requirements are satisfied:\n",
+    "\n",
+    "- The image of the PSF should be at the same resolution as the data.\n",
+    "- The star or PSF is centered in the image.\n",
+    "- The PSF image does not contain other sources. \n",
+    "- The image is normalized so that the sum of the PSF image near or equal to 1.0. \n",
+    "- The PSF image should have odd dimensions on each side (because it is a convolution kernel). \n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8dc9f08a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.io import fits\n",
+    "\n",
+    "# Load PSF image (2D array)\n",
+    "PSF = fits.getdata('data/f105w_psf.fits.gz')\n",
+    "\n",
+    "# Normalize PSF \n",
+    "PSF = PSF / PSF.sum()\n",
+    "\n",
+    "# Note that the PSF shape is odd on all sides\n",
+    "print(\"PSF Shape = {}\".format(PSF.shape))\n",
+    "\n",
+    "# Plot PSF and use vmax and vmin to show difraction spikes\n",
+    "plt.imshow(PSF, vmin=0, vmax=PSF.std()/10)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "817344e0",
+   "metadata": {},
+   "source": [
+    "### Oversampling \n",
+    "\n",
+    "One of the advantages of using `PSFModel` is its ability to sample models onto model images. Sometimes the models have regions that have to be oversampled to produce better estimates of the data.  `PSFModel` can oversample the entire model image or a specific pixel region of the image. The oversampling factor and region can be specified in the `oversample` key word argument when wrapping an `astropy` model or during run time by setting the `PSFModel.oversample` attribute. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "09315692",
+   "metadata": {},
+   "source": [
+    "**Disable Oversampling (Defailt)**\n",
+    "\n",
+    "To disable oversampling, set the `oversampling` argument or attribute to `None`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5b1918ae",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Disable Oversampling\n",
+    "oversample = None "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "70d6d88a",
+   "metadata": {},
+   "source": [
+    "**Oversample Entire Model Image**\n",
+    "\n",
+    "To oversample the image by a factor, you can pass a single integer value. For example:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f7d7d660",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Oversample the entire image by a factor of 4\n",
+    "oversample = 4 "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a3565e79",
+   "metadata": {},
+   "source": [
+    "**Oversample a Fixed Region**\n",
+    "\n",
+    "To oversample a fixed region of finite size, specify the center pixel, the length of the square region and thee oversampling factor. This means passing a tuple of `(center_x, center_y, box_length, oversample_factor)`. For example:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1980fae8",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Replace the pixel values in a box of \n",
+    "# length 20 cented at (x=50, y=60) with a box of \n",
+    "# the same size that has been oversampled by a factor of 5 \n",
+    "# i.e (x=50 y=60, box_length=20, oversample_factor=5)\n",
+    "\n",
+    "oversample = (50, 60, 20, 5)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ceac6bad",
+   "metadata": {},
+   "source": [
+    "**Oversample a Moving Region**\n",
+    "\n",
+    "If the model is being fit, the center of the model is likely to move around. To account for this, we can specify the names of the model parameters that define the center of the box that we are interested in oversampling as strings. This means passing a tuple of `(model_param_x, model_param_y, box_length, oversample_factor)`. For example:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b7a45dc2",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Replace the pixel values in a box of \n",
+    "# length 20 cented at (x=model.x_0, y=model.y_0) with a box of \n",
+    "# the same size that has been oversampled by a factor of 5 \n",
+    "# i.e (model.x_0, model.y_0, box_length=20, oversample_factor=5)\n",
+    "\n",
+    "oversample = ('x_0', 'y_0', 20, 5)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f8a178f5",
+   "metadata": {},
+   "source": [
+    "### Create PetroFit Model\n",
+    "\n",
+    "Now that we have an `astropy` model, PSF and oversampling rule, we can create a `PSFModel` model as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ef24ad08",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.models import PSFModel\n",
+    "\n",
+    "psf_sersic_model = PSFModel.wrap(sersic_model, psf=PSF, oversample=oversample)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1fe26506",
+   "metadata": {},
+   "source": [
+    " The `PSFModel` etherates all of the parameters, fixed parameter rules and parameter bounds from the input `astropy` model. Notice that a new parameter, `psf_pa` is added to enable PSF rotation. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "31e610be",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(psf_sersic_model.param_names)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6e4bd2a9",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(psf_sersic_model.bounds)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a98e6f6e",
+   "metadata": {},
+   "source": [
+    "### PSF Rotation \n",
+    "\n",
+    "`PSFModel` has the ability to rotate the PSF image until an optimal rotation angle is found. This is useful for when the PSF comes from a dataset where the orientation of the diffraction spikes are not the same as the image being fit. `psf_pa` is in degrees.\n",
+    "\n",
+    "To restrict the bounds of the rotation or disable the PSF rotation, you can set the psf_pa to fixed:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8014d5a1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Limit PSF rotation to -5 to 5 degrees\n",
+    "psf_sersic_model.bounds['psf_pa'] = (-5, 5)\n",
+    "\n",
+    "# To disable the PSF rotation, \n",
+    "# you can set the psf_pa to fixed.\n",
+    "psf_sersic_model.fixed['psf_pa'] = True"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "63e5eaf2",
+   "metadata": {},
+   "source": [
+    "### Accessing the Underlying Model \n",
+    "\n",
+    "At any point, a copy of the input model with the same parameter values as the corrosponding `PSFModel` can be accessed using the `PSFModel.model` attribute:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "68426b46",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "psf_sersic_model.model"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f53b0ee0",
+   "metadata": {},
+   "source": [
+    "## Fitting Models\n",
+    "\n",
+    "PetroFit uses the Levenberg-Marquardt algorithm to fit parametrized models. To achieve this, it uses `astropy` fitting and provides wrappers to fit models to images. One such function is `fit_model`, which takes any `Fittable2DModel` model and an image to fit, and returns a fitted copy of the model and the `fit_info` dictionary. If the image to be fit contains pixels that are set to `np.nan`, those pixels are ignored by the fitter. The `fit_model` function also allows us to define parameters, such as ` maxiter`, for the `astropy` fitter.\n",
+    "\n",
+    "To fit the galaxy we prepared with the `PSFModel` we constructed, we call the `fit_model` as follows: \n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "990fe9a4",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%time\n",
+    "\n",
+    "from petrofit.fitting import fit_model\n",
+    "\n",
+    "fitted_model, fit_info = fit_model(\n",
+    "    fitting_image.data, psf_sersic_model,\n",
+    "    maxiter=10000,\n",
+    "    epsilon=1.4901161193847656e-08,\n",
+    "    acc=1e-09,\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "58e7d19c",
+   "metadata": {},
+   "source": [
+    "That’s it! The retuned `fitted_model` is a copy of the input model (`psf_sersic_model`) but with the optimized parameter values. We can inspect the parameters of any `astropy` model using the  `print_model_params`:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "544b714d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.fitting import print_model_params\n",
+    "\n",
+    "print_model_params(fitted_model)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "92341da0",
+   "metadata": {},
+   "source": [
+    "## Generate Model Image\n",
+    "\n",
+    "To generate a model image we use the `model_to_image` utility function. This function allows us to define the center of the model image and the side length of the image. \n",
+    "\n",
+    "In this case we will first create a model image that has the same size as the fitted image and subtract the model image from the unmasked fitting image."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "0366378d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.fitting import model_to_image\n",
+    "\n",
+    "# Make Model Image \n",
+    "# ----------------\n",
+    "\n",
+    "# Set the size of the model image equal to the fitted image\n",
+    "fitted_image_size = fitting_image.data.shape[0]\n",
+    "\n",
+    "# Center the model image at the center of the fitted image\n",
+    "# so the two images cover the same window \n",
+    "fitted_image_center = fitted_image_size // 2 \n",
+    "\n",
+    "# Generate a model image from the model\n",
+    "fitted_model_image = model_to_image(\n",
+    "    x=fitted_image_center, \n",
+    "    y=fitted_image_center, \n",
+    "    size=fitted_image_size,\n",
+    "    model=fitted_model\n",
+    ")\n",
+    "\n",
+    "# Plot Model Image\n",
+    "# ----------------\n",
+    "\n",
+    "fig, ax = plt.subplots(1, 3, figsize=[24, 12])\n",
+    "\n",
+    "ax[0].imshow(fitting_image_unmasked.data, vmin=vmin, vmax=vmax)\n",
+    "ax[0].set_title(\"Data\")\n",
+    "\n",
+    "ax[1].imshow(fitted_model_image, vmin=vmin, vmax=vmax)\n",
+    "ax[1].set_title(\"Model\")\n",
+    "\n",
+    "ax[2].imshow(fitting_image_unmasked.data - fitted_model_image, vmin=vmin, vmax=vmax)\n",
+    "ax[2].set_title(\"Residual\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d5d03654",
+   "metadata": {},
+   "source": [
+    "If we want to make a model image that we can subtract from the original data image, we just update the center of the model and generate a model image the same dimensions as the original image."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a09353ca",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from copy import deepcopy \n",
+    "\n",
+    "# Reposition the Model\n",
+    "# --------------------\n",
+    "\n",
+    "# Copy the model before changing the parameters\n",
+    "fitted_model_copy = deepcopy(fitted_model)\n",
+    "\n",
+    "# Change the frame of reference from the fitting \n",
+    "# image to the original data coordinates. \n",
+    "# Remember that (x_0, y_0) -> (image_x_0, image_y_0) \n",
+    "fitted_model_copy.x_0 =  image_x_0 + (fitted_model.x_0 - x_0)\n",
+    "fitted_model_copy.y_0 =  image_y_0 + (fitted_model.y_0 - y_0)\n",
+    "\n",
+    "# Make Model Image \n",
+    "# ----------------\n",
+    "\n",
+    "# Set the size of the model image equal to the original image\n",
+    "full_fitted_image_size = image.data.shape[0]\n",
+    "\n",
+    "# Center the model image at the center of the original image\n",
+    "# so the two images cover the same window \n",
+    "full_fitted_image_center = full_fitted_image_size // 2 \n",
+    "\n",
+    "# Generate a model image from the model\n",
+    "full_fitted_model_image = model_to_image(\n",
+    "    full_fitted_image_center, \n",
+    "    full_fitted_image_center, \n",
+    "    full_fitted_image_size, \n",
+    "    fitted_model_copy\n",
+    ")\n",
+    "\n",
+    "# Plot Model Image\n",
+    "# ----------------\n",
+    "\n",
+    "fig, ax = plt.subplots(1, 3, figsize=[24, 12])\n",
+    "\n",
+    "ax[0].imshow(image.data, vmin=vmin, vmax=vmax)\n",
+    "ax[0].set_title(\"Data\")\n",
+    "\n",
+    "ax[1].imshow(full_fitted_model_image, vmin=vmin, vmax=vmax)\n",
+    "ax[1].set_title(\"Model\")\n",
+    "\n",
+    "ax[2].imshow(image.data - full_fitted_model_image, vmin=vmin, vmax=vmax)\n",
+    "ax[2].set_title(\"Residual\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "be820294",
+   "metadata": {},
+   "source": [
+    "## Estimated vs. Fitted Parameters\n",
+    "\n",
+    "In this section we compare the initial estimates that we derived purely from photometry vs. the parameters that were fit to the data. In the printout below, we see the fitted values in the first column and our initial guesses in the second column for each parameter."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "029e4ac4",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "assumptions = [\n",
+    "    amplitude,\n",
+    "    r_eff,\n",
+    "    n,\n",
+    "    x_0,\n",
+    "    y_0,\n",
+    "    ellip,\n",
+    "    theta,\n",
+    "    0 # psf_pa\n",
+    "]\n",
+    "\n",
+    "print(\"fit\\tassum\\tparam_name\")\n",
+    "for param_name, param_val, assumption in zip(fitted_model.param_names, fitted_model.parameters, assumptions):\n",
+    "    print(\"{:0.2f}\\t{:0.2f}\\t{}\".format(param_val, assumption, param_name))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "49ef8b94",
+   "metadata": {},
+   "source": [
+    "## Galaxy vs. Model Profiles \n",
+    "\n",
+    "Now that we have a model image, we can do photometry and compare the Petrosian measurements of the model to that of the original galaxy image. Since we know the exact postion of the target in the model image and because there are no intruding sourced, we can preform direct photometry using `photometry_step` function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "765cdcc6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import photometry_step\n",
+    "\n",
+    "model_position = (\n",
+    "    fitted_model_copy.x_0.value,\n",
+    "    fitted_model_copy.y_0.value)\n",
+    "\n",
+    "model_elong = 1 / (1 - fitted_model_copy.ellip.value)\n",
+    "\n",
+    "model_theta = fitted_model_copy.theta.value\n",
+    "\n",
+    "model_flux_arr, model_area_arr, model_error_arr = photometry_step(\n",
+    "    position=model_position,\n",
+    "    r_list=r_list, # from the original \n",
+    "    image=full_fitted_model_image, # Same saize as original image\n",
+    "    elong=model_elong,\n",
+    "    theta=model_theta,\n",
+    "    plot=True, vmin=vmin, vmax=vmax,\n",
+    "\n",
+    ")\n",
+    "\n",
+    "plt.title(\"Model Image\")\n",
+    "plt.xlabel(\"Pixels\")\n",
+    "plt.ylabel(\"Pixels\")\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "70f0a018",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Plot Light profile \n",
+    "plt.plot(r_list, flux_arr, label='Data')\n",
+    "plt.plot(r_list, model_flux_arr, label='Model')\n",
+    "\n",
+    "plt.title(\"Light Profiles\")\n",
+    "plt.xlabel(\"Aperture Radius [Pixels]\")\n",
+    "plt.ylabel(\"Cumulative Flux  [{}]\".format(image.unit))\n",
+    "plt.legend()\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0d874013",
+   "metadata": {},
+   "source": [
+    "### Petrosian Radii Comparison\n",
+    "\n",
+    "We compare the Pertrosian profiles and radii of the two images."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "350d3197",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model_p = Petrosian(r_list, model_area_arr, model_flux_arr)\n",
+    "\n",
+    "model_corrected_epsilon = pc.estimate_epsilon(\n",
+    "    model_p.r_half_light,\n",
+    "    model_p.concentration_index()[-1]\n",
+    "\n",
+    ")\n",
+    "\n",
+    "model_corrected_p = Petrosian(\n",
+    "    r_list, model_area_arr, model_flux_arr, \n",
+    "    epsilon=model_corrected_epsilon\n",
+    ")\n",
+    "\n",
+    "\n",
+    "# Plot Image \n",
+    "plt.imshow(full_fitted_model_image, vmax=vmax, vmin=vmin)\n",
+    "\n",
+    "model_corrected_p.imshow(\n",
+    "    position=model_position,\n",
+    "    elong=model_elong, \n",
+    "    theta=model_theta\n",
+    ")\n",
+    "\n",
+    "plt.title(\"Model Image\")\n",
+    "plt.xlabel(\"Pixels\")\n",
+    "plt.ylabel(\"Pixels\")\n",
+    "plt.legend()\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ce40f7bf",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "corrected_p.plot(plot_r=True, plot_normalized_flux=True)\n",
+    "model_corrected_p.plot(plot_r=True, plot_normalized_flux=True)\n",
+    "\n",
+    "plt.gca().get_legend().remove()\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a443d341",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(\"Data r_total_flux = {}\".format(corrected_p.r_total_flux))\n",
+    "print(\"Model r_total_flux= {}\".format(model_corrected_p.r_total_flux))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b865eade",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(\"Data r_half_light = {}\".format(corrected_p.r_half_light))\n",
+    "print(\"Model r_half_light= {}\".format(model_corrected_p.r_half_light))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "556d1281",
+   "metadata": {},
+   "source": [
+    "### Total Flux Comparison\n",
+    "\n",
+    "Finally we compare the total Petrosian flux of the data vs the model:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8ccf7c61",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(\"Data Corrected Total Flux = {}\".format(corrected_p.total_flux * image.unit))\n",
+    "print(\"Model Corrected Total Flux = {}\".format(model_corrected_p.total_flux * image.unit))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8ad7946b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import flux_to_abmag\n",
+    "print(\"Data Corrected AB mag = {}\".format(flux_to_abmag(corrected_p.total_flux, image.header) ))\n",
+    "print(\"Model Corrected AB mag = {}\".format(flux_to_abmag(model_corrected_p.total_flux, image.header) ))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/images/concentration_index_vs_epsilon.png b/docs/images/concentration_index_vs_epsilon.png
new file mode 100644
index 0000000..0e4ec86
Binary files /dev/null and b/docs/images/concentration_index_vs_epsilon.png differ
diff --git a/docs/images/concentration_index_vs_n.png b/docs/images/concentration_index_vs_n.png
new file mode 100644
index 0000000..4afd5fa
Binary files /dev/null and b/docs/images/concentration_index_vs_n.png differ
diff --git a/docs/images/doc_image_gen.ipynb b/docs/images/doc_image_gen.ipynb
new file mode 100644
index 0000000..57d776d
--- /dev/null
+++ b/docs/images/doc_image_gen.ipynb
@@ -0,0 +1,474 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "77d5d5c1",
+   "metadata": {},
+   "source": [
+    "# Effective Radius and Intensity ($r_e$  and $I_{e}$)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "615df618",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "from astropy.modeling import models \n",
+    "\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "r_eff=25\n",
+    "n = 1 \n",
+    "model = models.Sersic1D(r_eff=r_eff, n=n)\n",
+    "\n",
+    "r_list = np.arange(0, 101, 1)\n",
+    "\n",
+    "\n",
+    "plt.plot(r_list, model(r_list), c='b', linewidth=3, label=\"Sersic Profile with n={}\".format(n))\n",
+    "plt.plot(-r_list, model(r_list), c='b', linewidth=3)\n",
+    "\n",
+    "\n",
+    "plt.fill_between(r_list,model(r_list), color='honeydew', hatch='/', edgecolor='green')\n",
+    "plt.fill_between(-r_list,model(r_list), color='honeydew', hatch='/', edgecolor='green')\n",
+    "\n",
+    "r_eff_list = np.arange(0, r_eff+1, 1)\n",
+    "plt.fill_between(r_eff_list,model(r_eff_list), color='aliceblue', hatch='.', edgecolor='blue')\n",
+    "plt.fill_between(-r_eff_list,model(r_eff_list), color='aliceblue', hatch='.', edgecolor='blue')\n",
+    "\n",
+    "\n",
+    "plt.axvline(r_eff, c='green', label='r_e ({} and -{})'.format(r_eff, r_eff), linestyle='--')\n",
+    "plt.axvline(-r_eff, c='green', linestyle='--')\n",
+    "plt.axvline(c='black')\n",
+    "\n",
+    "plt.axhline(1, c='gray', linestyle='--', label='I_e = {}'.format(model.amplitude.value))\n",
+    "\n",
+    "\n",
+    "plt.title(\"Sersic Profile\")\n",
+    "plt.xlabel(\"Radius r\")\n",
+    "plt.ylabel(\"I(r)\")\n",
+    "plt.legend()\n",
+    "plt.ylim(0, None)\n",
+    "plt.xlim(-100, 100)\n",
+    "\n",
+    "plt.savefig(\"sersic_radii.png\", dpi=70, bbox_inches = 'tight', pad_inches = 0)\n",
+    "plt.show()\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3bb02ad8",
+   "metadata": {},
+   "source": [
+    "# Curve of Growth"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f59f0578",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "from petrofit.models import sersic_enclosed, sersic_enclosed_inv\n",
+    "\n",
+    "\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "r_list = np.arange(0, 201, 1)\n",
+    "\n",
+    "amplitude, r_eff, n = [1, 25, 1]\n",
+    "\n",
+    "flux_list = sersic_enclosed(r_list, amplitude, r_eff, n)\n",
+    "total_flux = sersic_enclosed(np.inf, amplitude, r_eff, n)\n",
+    "\n",
+    "f, ax = plt.subplots(1,2, figsize=[20,10])\n",
+    "for i in range(2):\n",
+    "    plt.sca(ax[i])\n",
+    "    plt.plot(r_list, flux_list, c='Blue', linewidth=3, label='Curve of Growth')\n",
+    "\n",
+    "    plt.axhline(total_flux, c='black', linestyle='-.', linewidth=2, label='Total Flux')\n",
+    "    plt.axhline(total_flux/2, c='green', linestyle='--', linewidth=2,)\n",
+    "\n",
+    "    plt.axvline(r_eff, c='green', linestyle='--', linewidth=2, label='Half Total Flux and Half Light Radius $r_e = {}$'.format(r_eff))\n",
+    "\n",
+    "    eff = flux_list.copy()\n",
+    "    eff[r_eff:] = total_flux/2\n",
+    "    \n",
+    "    if i == 1:\n",
+    "        plt.fill_between(r_list, eff, color='aliceblue', hatch='.', edgecolor='blue')\n",
+    "        plt.fill_between(r_list, flux_list, eff, color='honeydew', hatch='/', edgecolor='green')\n",
+    "\n",
+    "\n",
+    "    leg = plt.legend()\n",
+    "    for lh in leg.legendHandles: \n",
+    "        lh._legmarker.set_alpha(1)\n",
+    "        lh.set_alpha(1)\n",
+    "\n",
+    "    plt.title(\"Curve of Growth (COG)\")\n",
+    "    plt.xlabel(\"Radius r\")\n",
+    "    plt.ylabel(\"L($\\leq$r)\")\n",
+    "    legend = plt.legend()\n",
+    "    legend.get_frame().set_alpha(None)\n",
+    "    plt.ylim(0, None)\n",
+    "    plt.xlim(0, max(r_list))\n",
+    "\n",
+    "\n",
+    "\n",
+    "plt.savefig(\"sersic_cog.png\", dpi=70, bbox_inches = 'tight', pad_inches = 0)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "29feea04",
+   "metadata": {},
+   "source": [
+    "# Sersic Index ($n$)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fd946899",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "from astropy.modeling import models \n",
+    "from scipy.special import gammaincinv\n",
+    "\n",
+    "\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "r_eff=25\n",
+    "n = 1 \n",
+    "\n",
+    "\n",
+    "r_list = np.arange(0, 101, 1)\n",
+    "\n",
+    "\n",
+    "for c, n in zip(['g', 'b', 'purple'],[0.5, 1, 4]):\n",
+    "    \n",
+    "    b_n = gammaincinv(2. * n, 0.5)\n",
+    "    model = models.Sersic1D(amplitude=1/np.exp(b_n),  r_eff=r_eff, n=n)\n",
+    "    \n",
+    "    plt.plot(r_list, model(r_list), c=c, linewidth=2, label=\"n = {}\".format(n))\n",
+    "    plt.plot(-r_list, model(r_list), c=c, linewidth=2)\n",
+    "\n",
+    "\n",
+    "plt.title(\"Sersic Profiles\")\n",
+    "plt.xlabel(\"Radius r\")\n",
+    "plt.ylabel(\"I(r)\")\n",
+    "plt.legend()\n",
+    "plt.ylim(0, None)\n",
+    "plt.xlim(-100, 100)\n",
+    "\n",
+    "plt.savefig(\"sersic_index.png\", dpi=70, bbox_inches = 'tight', pad_inches = 0)\n",
+    "plt.show()\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a0fe9707",
+   "metadata": {},
+   "source": [
+    "# Petrosian Profiles "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9fb4474b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "from petrofit.models import petrosian_profile, sersic_enclosed\n",
+    "from petrofit.petrosian import Petrosian\n",
+    "\n",
+    "\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "r_list = np.arange(0, 201, 1)\n",
+    "\n",
+    "amplitude, r_eff, n = [1, 25, 1]\n",
+    "\n",
+    "petro_list = petrosian_profile(r_list, r_eff, n)\n",
+    "petro_list[0] = 1\n",
+    "\n",
+    "plt.plot(r_list, petro_list, color=\"#ff9d48\", linewidth=4, label='Petrosian Profile')\n",
+    "\n",
+    "\n",
+    "plt.title(\"Petrosian Profile\")\n",
+    "plt.xlabel(\"Radius r\")\n",
+    "plt.ylabel(\"Petrosian Value\")\n",
+    "plt.legend()\n",
+    "plt.ylim(0, 1)\n",
+    "plt.xlim(0, max(r_list))\n",
+    "\n",
+    "\n",
+    "plt.savefig(\"sersic_petrosian.png\", dpi=70, bbox_inches = 'tight', pad_inches = 0)\n",
+    "\n",
+    "\n",
+    "plt.show()\n",
+    "flux_list = sersic_enclosed(r_list, amplitude, r_eff, n)\n",
+    "area_list = np.pi * r_list**2 \n",
+    "\n",
+    "p = Petrosian(r_list[1:], area_list[1:], flux_list[1:],)\n",
+    "\n",
+    "p.plot()\n",
+    "\n",
+    "plt.title(\"Petrosian Profile\")\n",
+    "plt.xlabel(\"Radius r\")\n",
+    "plt.ylabel(\"Petrosian Value\")\n",
+    "plt.legend()\n",
+    "plt.ylim(0, 1)\n",
+    "plt.xlim(0, max(r_list))\n",
+    "\n",
+    "plt.savefig(\"sersic_petrosian_eta.png\", dpi=70, bbox_inches = 'tight', pad_inches = 0)\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3058a339",
+   "metadata": {},
+   "source": [
+    "# Petrosian Corrections "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "aaa5f9ba",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "from petrofit.petrosian import PetrosianCorrection\n",
+    "from astropy.modeling import models, fitting\n",
+    "\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from matplotlib import pyplot as plt\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "pc = PetrosianCorrection(\"../data/concentration_index_grid_no_psf.yaml\")\n",
+    "\n",
+    "keyx = 'c_index'\n",
+    "keyy = 'epsilon'\n",
+    "\n",
+    "x = []\n",
+    "y = []\n",
+    "\n",
+    "for i, key in enumerate(list(pc.grid.keys())[:]):\n",
+    "    if key < 10 or key > 90:\n",
+    "        continue\n",
+    "    a = (i+2) / len(pc.grid)\n",
+    "    data = pc.grid[key]\n",
+    "    plt.scatter(data[keyx], np.array(data[keyy]), c='black', alpha=a, label='r_eff={}'.format(key))\n",
+    "\n",
+    "    x += data[keyx]\n",
+    "    y += data[keyy]\n",
+    "\n",
+    "x = np.array(x)\n",
+    "y = np.array(y)\n",
+    "\n",
+    "#plt.plot(data[keyx], 10.0**(-1.7) * np.array(data[keyx])**3.5)\n",
+    "\n",
+    "# initialize a linear fitter\n",
+    "fit = fitting.LinearLSQFitter()\n",
+    "#fit = fitting.LevMarLSQFitter()\n",
+    "# initialize a linear model\n",
+    "line_init = models.Polynomial1D(4)\n",
+    "#line_init = models.Exponential1D() + models.Const1D()\n",
+    "fitted_line = fit(line_init, x, y)\n",
+    "\n",
+    "print(fitted_line.param_names)\n",
+    "print(fitted_line.parameters)\n",
+    "\n",
+    "arr = np.arange(x.min()*0.99, x.max()*1.01, 0.1)\n",
+    "#line_init = models.Exponential1D() + models.Const1D()\n",
+    "plt.plot(arr, fitted_line(arr), c='red', label='Fitted 4th degree polynomial')\n",
+    "#plt.plot(arr, 0.1102*np.exp(arr/1.25))\n",
+    "\n",
+    "plt.title(\"Relationship b/w Concentration and Epsilon\")\n",
+    "plt.xlabel(\"C2080\")\n",
+    "plt.ylabel(\"Epsilon\")\n",
+    "plt.legend()\n",
+    "\n",
+    "plt.savefig(\"concentration_index_vs_epsilon.png\", dpi=70, bbox_inches = 'tight')#, pad_inches = 0)\n",
+    "\n",
+    "print(\"range_c2080 = ({:.2f}, {:.2f})\".format(x.min(), x.max()))\n",
+    "\n",
+    "plt.show()\n",
+    "\n",
+    "#########################################################\n",
+    "\n",
+    "pc = PetrosianCorrection(\"../data/concentration_index_grid_f105w_60mas.yaml\")\n",
+    "\n",
+    "x = []\n",
+    "y = []\n",
+    "\n",
+    "for i, key in enumerate(list(pc.grid.keys())[:]):\n",
+    "    if key < 10 or key > 90:\n",
+    "        continue\n",
+    "    a = (i+2) / len(pc.grid)\n",
+    "    data = pc.grid[key]\n",
+    "    plt.scatter(data[keyx], np.array(data[keyy]), c='black', alpha=a, label='r_eff={}'.format(key))\n",
+    "\n",
+    "    x += data[keyx]\n",
+    "    y += data[keyy]\n",
+    "\n",
+    "x = np.array(x)\n",
+    "y = np.array(y)\n",
+    "\n",
+    "plt.plot(arr, fitted_line(arr), c='red', label='Fitted 4th degree polynomial (No PSF)')\n",
+    "\n",
+    "plt.title(\"F105W Relationship b/w Concentration and Epsilon\")\n",
+    "plt.xlabel(\"C2080\")\n",
+    "plt.ylabel(\"Epsilon\")\n",
+    "plt.legend()\n",
+    "\n",
+    "plt.savefig(\"f105w_concentration_index_vs_epsilon.png\", dpi=70, bbox_inches = 'tight')#, pad_inches = 0)\n",
+    "\n",
+    "print(\"range_c2080 = ({:.2f}, {:.2f})\".format(x.min(), x.max()))\n",
+    "\n",
+    "plt.show()\n",
+    "    "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d6469a60",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "from petrofit.petrosian import PetrosianCorrection\n",
+    "from astropy.modeling import models, fitting\n",
+    "\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from matplotlib import pyplot as plt\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "pc = PetrosianCorrection(\"../data/concentration_index_grid_no_psf.yaml\")\n",
+    "\n",
+    "keyx = 'c_index'\n",
+    "keyy = 'n'\n",
+    "\n",
+    "x = []\n",
+    "y = []\n",
+    "\n",
+    "for i, key in enumerate(list(pc.grid.keys())[:]):\n",
+    "    if key < 10 or key > 90:\n",
+    "        continue\n",
+    "    a = (i+2) / len(pc.grid)\n",
+    "    data = pc.grid[key]\n",
+    "    plt.scatter(data[keyx], np.array(data[keyy]), c='black', alpha=a, label='r_eff={}'.format(key))\n",
+    "\n",
+    "    x += data[keyx]\n",
+    "    y += data[keyy]\n",
+    "\n",
+    "x = np.array(x)\n",
+    "y = np.array(y)\n",
+    "\n",
+    "#plt.plot(data[keyx], 10.0**(-1.7) * np.array(data[keyx])**3.5)\n",
+    "\n",
+    "# initialize a linear fitter\n",
+    "fit = fitting.LevMarLSQFitter()\n",
+    "# initialize a linear model\n",
+    "line_init = models.Exponential1D() + models.Const1D()\n",
+    "fitted_line = fit(line_init, x, y)\n",
+    "\n",
+    "print(fitted_line.param_names)\n",
+    "print(fitted_line.parameters)\n",
+    "\n",
+    "arr = np.arange(x.min()*0.99, x.max()*1.01, 0.1)\n",
+    "#line_init = models.Exponential1D() + models.Const1D()\n",
+    "plt.plot(arr, fitted_line(arr), c='red', label='Fitted Exponential'.format(*fitted_line.parameters))\n",
+    "#plt.plot(arr, 0.1102*np.exp(arr/1.25))\n",
+    "\n",
+    "plt.title(\"Relationship b/w Concentration Index and Sersic Index\")\n",
+    "plt.xlabel(\"C2080\")\n",
+    "plt.ylabel(\"Sersic Index n\")\n",
+    "plt.legend()\n",
+    "\n",
+    "plt.savefig(\"concentration_index_vs_n.png\", dpi=70, bbox_inches = 'tight')#, pad_inches = 0)\n",
+    "\n",
+    "print(\"range_c2080 = ({:.2f}, {:.2f})\".format(x.min(), x.max()))\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8d2bbb1c",
+   "metadata": {},
+   "source": [
+    "# multi_fit"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5af289fe",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Saved for doc notebook, no code to run see multi_object.ipynb\n",
+    "#plt.savefig(\"./images/multi_fit.png\", dpi=100, bbox_inches = 'tight', pad_inches = 0)\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/images/f105w_concentration_index_vs_epsilon.png b/docs/images/f105w_concentration_index_vs_epsilon.png
new file mode 100644
index 0000000..a12ea5e
Binary files /dev/null and b/docs/images/f105w_concentration_index_vs_epsilon.png differ
diff --git a/docs/images/multi_fit.png b/docs/images/multi_fit.png
new file mode 100644
index 0000000..8a48623
Binary files /dev/null and b/docs/images/multi_fit.png differ
diff --git a/docs/images/sersic_cog.png b/docs/images/sersic_cog.png
new file mode 100644
index 0000000..7e7efc7
Binary files /dev/null and b/docs/images/sersic_cog.png differ
diff --git a/docs/images/sersic_index.png b/docs/images/sersic_index.png
new file mode 100644
index 0000000..93e1b22
Binary files /dev/null and b/docs/images/sersic_index.png differ
diff --git a/docs/images/sersic_petrosian.png b/docs/images/sersic_petrosian.png
new file mode 100644
index 0000000..c51dfcb
Binary files /dev/null and b/docs/images/sersic_petrosian.png differ
diff --git a/docs/images/sersic_petrosian_eta.png b/docs/images/sersic_petrosian_eta.png
new file mode 100644
index 0000000..31d22ad
Binary files /dev/null and b/docs/images/sersic_petrosian_eta.png differ
diff --git a/docs/images/sersic_radii.png b/docs/images/sersic_radii.png
new file mode 100644
index 0000000..4cd8f2d
Binary files /dev/null and b/docs/images/sersic_radii.png differ
diff --git a/docs/index.rst b/docs/index.rst
index 347504c..1529365 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,14 +1,37 @@
-Documentation
-=============
 
-This is the documentation for petrofit.
+##########################
+PetroFit: Petrosian Fitter
+##########################
 
+PetroFit is a package for calculating Petrosian properties, such as radii and concentration indices, as well as fitting
+galaxy light profiles. This package includes tools for preforming accurate photometry, segmentations, Petrosian properties
+and fitting. This documentation is intended to serve as a description and guide to the `petrofit` module.
+
+.. image:: ./images/multi_fit.png
+    :width: 100%
+    :align: center
+
+PetroFit is built on the `Photutils packge <https://photutils.readthedocs.io/en/stable/>`.
+    
+    
 .. toctree::
-  :maxdepth: 2
+    :caption: Fundamentals
+    :maxdepth: 3
 
-  petrofit/index.rst
+    installation
+    introduction
+    photometry_and_petrosian
+    fitting
+
+.. toctree::
+    :caption: Advanced
+    :maxdepth: 3
+
+    multi_object
+
+.. toctree::
+    :caption: Developer
+    :maxdepth: 1
 
-.. note:: The layout of this directory is simply a suggestion.  To follow
-          traditional practice, do *not* edit this page, but instead place
-          all documentation for the package inside ``petrofit/``.
-          You can follow this practice or choose your own layout.
+    api_reference
+    correction_grids
diff --git a/docs/installation.rst b/docs/installation.rst
new file mode 100644
index 0000000..c93cb6c
--- /dev/null
+++ b/docs/installation.rst
@@ -0,0 +1,111 @@
+############
+Installation
+############
+
+To install the latest dev version of `PetroFit`, please clone the `PetroFit repo <https://github.com/PetroFit/petrofit>`_
+and install the package. There are two recommended ways to install the requirements needed to run the PetroFit package, through
+`Conda <https://docs.conda.io/projects/conda/en/latest/user-guide/getting-started.html>`_ and
+`Docker <https://docs.docker.com/get-docker/>`_.
+
+
+Conda
+*****
+
+We have included a ``environment.yml`` file for creating a
+`Conda <https://docs.conda.io/projects/conda/en/latest/user-guide/getting-started.html>`_ environment. You can create an
+environment as follows:
+
+**Step 1:** Clone the PetroFit repo and ``cd`` into the cloned repo.
+
+.. code-block:: bash
+
+    git clone https://github.com/PetroFit/petrofit.git
+
+    cd petrofit
+
+
+**Step 2:** Create the conda environment.
+
+.. code-block:: bash
+
+    conda env create -f environment.yml
+
+**Step 3:** Activate the `petrofit` environment.
+
+.. code-block:: bash
+
+    source activate petrofit
+
+**Step 4:** Install PetroFit.
+
+.. code-block:: bash
+
+    python setup.py install
+
+Docker
+******
+
+We have included a Docker file as well as a helper script to make installation of the package as easy as possible.
+The docker file will create a Jupyter Notebook image which makes creating and running Notebooks possible.
+The Docker file also installs kcorrection software that might be useful. To install using the helper script, please
+follow the instructions below.
+
+
+**Step 1:** Clone the PetroFit repo and ``cd`` into the cloned repo.
+
+.. code-block:: bash
+
+    git clone https://github.com/PetroFit/petrofit.git
+
+    cd petrofit
+
+**Step 2:** Use the helper script to create the new docker image.
+
+.. code-block:: bash
+
+    python docker.py build
+
+
+.. Note::
+
+    The cloned repo will be mounted when running using the helper script and any changes to the host code will
+    become available in the docker image (notebook restart may be required to import changed version).
+
+**Step 3:** Start the notebook using the helper script. You can mount a host directory or a list of directories
+(separated by space) by adding their paths at the end of the command. The host directories will be mounted under
+the `mount` directory in the docker image.
+
+.. code-block:: bash
+
+    python docker.py run [extra_mount_paths]
+
+.. important::
+
+    Please note that this type of mounting is calling a ``bind`` which means the changes you make to the mounted directory
+    will also apply in the host directory.
+
+**Step 4:** Copy and paste the notebook URL into your internet browser. The link to the notebook home should look like:
+
+.. code-block:: bash
+
+    http://127.0.0.1:8888/?token=d020c13d029013c20d0329e6913c5df076d0a4a14e63dc77
+
+**Step 5:** You can close the server like any other Jupyter notebook server by hitting ``Ctrl + C``
+(make sure to have saved your notebook before shutting down the server).
+
+For Developers
+**************
+
+For developers, we recommend setting up a conda environment and then using the following to install the developer version:
+
+.. code-block:: bash
+
+    git clone https://github.com/PetroFit/petrofit.git
+
+    cd petrofit
+
+    pip install -e .
+
+
+If you will be contributing to the software, we recommend forking the repository on GitHub first, cloning your forked repository,
+and then installing the developer version.  
diff --git a/docs/introduction.ipynb b/docs/introduction.ipynb
new file mode 100644
index 0000000..03723c8
--- /dev/null
+++ b/docs/introduction.ipynb
@@ -0,0 +1,368 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "2aff1272",
+   "metadata": {},
+   "source": [
+    "# Introduction \n",
+    "\n",
+    "The `petrofit` a package for calculating the Petrosian profiles of galaxies and fitting light profiles. It offers tools necessary to measure and fit images of galaxies from end to end. In this section, we will be defining the morphological properties that can be measured and discussing the methods `petrofit` uses to compute them. This package is based on Crawford (2006) and motivated by the need for an open source package to compute Petrosian radii and magnitudes."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "244d5142",
+   "metadata": {},
+   "source": [
+    "## Sersic Profiles\n",
+    "\n",
+    "The Sersic profile is a mathematical function that describes how the intensity of a galaxy varies with distance R from its center. The profile can be described using the following formulation:\n",
+    "\n",
+    "<center>$I(x,y) = I(r) = I_e\\exp\\left\\{-b_n\\left[\\left(\\frac{r}{r_{e}}\\right)^{(1/n)}-1\\right]\\right\\}$</center>\n",
+    "\n",
+    "The total flux within a radius $r$ is giving by the following integral:\n",
+    "\n",
+    "<center>$L(\\leq r) = 2 \\pi \\int_{0}^{r} I(r^\\prime) r^\\prime \\,dr^\\prime$</center>\n",
+    "\n",
+    "Where:\n",
+    "\n",
+    "- $I$ is the intensity or flux at position `(x, y)`.\n",
+    "- $r$ is the radius from the center that corresponds to `(x, y)`.\n",
+    "- $r_{e}$ is the effective radius which is equal to the half-light radius.\n",
+    "- $I_e$ is the flux at the half light radius or $I_e = I(r_{e})$. \n",
+    "- $n$ is the Sersic index which determines the “steepness” of the profile. `n = 4` corresponds to a de Vaucouleurs' profile while `n = 1` gives the exponential profile.\n",
+    "\n",
+    "\n",
+    "The constant $b_n$ is defined such that $r_e$ contains half the total flux, and can be solved for numerically using:\n",
+    "\n",
+    "$\\Gamma(2n) = 2\\gamma (2n,b_n)$\n",
+    "\n",
+    "In `python`, $b_n$ can be calculated as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f1ae3b32",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from scipy.special import gammaincinv\n",
+    "n = 4 # Sersic index \n",
+    "b_n = gammaincinv(2. * n, 0.5)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d98e3a65",
+   "metadata": {},
+   "source": [
+    "###  Ellipticity and Elongation\n",
+    "\n",
+    "Galaxies that can be described with a Sersic profile are usually not perfectly symmetrical and often display an elliptical distribution. We define two quantities that can be used to describe the elliptical components of galaxies. Ellipticity and elongation are defined as follows:\n",
+    "\n",
+    "<center>$ellip =  1  -  \\frac{b}{a} = \\frac{elong - 1}{elong}$</center>\n",
+    "\n",
+    "<center>$elong = \\frac{a}{b} = \\frac{1}{1 - ellip}$</center>\n",
+    "\n",
+    "Where $a$ is the unit length of the semi-major axis and $b$ is the corresponding semi-minor axis. Both ellipticity and elongation range from 0 to 1. A circle correspondences to an $ellip = 0$ and an $elong = 1$ (elongation is analogues to eccentricity). The `photutils` package uses elongations for apertures while the `astropy-modeling` sub-module uses ellipticity for Sersic models.   "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4ba1eede",
+   "metadata": {},
+   "source": [
+    "### Input Raidus \n",
+    "\n",
+    "Elliptical Sersic profiles can be described using $ellip$ (ellipticity) and $\\theta$ (rotation angle). In such cases, the radius is given by the following expression:\n",
+    "\n",
+    "<center>$r(x, y, ellip,\\theta) = \\sqrt{\\left(\\frac{r_{maj}}{r_e}\\right)^2 - \\left(\\frac{r_{min}}{(1 - ellip) \\cdot r_e}\\right)^2}$</center>\n",
+    "\n",
+    "Where:\n",
+    "\n",
+    "- $r_{maj} = (x - x_0)\\cdot{cos(\\theta)} + {(y - y_0)}\\cdot sin(\\theta)$  \n",
+    "- $r_{min} = -(x - x_0)\\cdot{sin(\\theta)} + {(y - y_0)}\\cdot cos(\\theta)$"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ad3f5b36",
+   "metadata": {},
+   "source": [
+    "### Sersic Index\n",
+    "\n",
+    "A Sersic index determines the degree of curvature of the profile. The larger values of $n$ get, the more concentrated the profile is at smaller radii. As $n$ gets larger, the Sersic model tends to a power-law with a slope equal to 5. `n = 4` corresponds to a de Vaucouleurs' profile which describes elliptical galaxies and the cores of spirals well; while `n = 1` gives the exponential profile, which models the spiral disks well. `n = 0.5` gives a low concentration profile (Gaussian) that can be used to model inter-cluster glow in galaxy clusters (assuming an elliptical shape), and can be used as an alternative to a  Ferrer  Profile.   \n",
+    "\n",
+    "\n",
+    "![Sersic index](images/sersic_index.png)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7c778c55",
+   "metadata": {},
+   "source": [
+    "### Effective Radius and Intensity\n",
+    "\n",
+    "$r_{e}$ is the effective radius or half-light radius which encloses half of the total flux of the galaxy and can be defined by the following expression:\n",
+    "\n",
+    "$L(\\leq r_e) = \\frac{1}{2}L(\\leq \\infty)$. \n",
+    "\n",
+    "$I_e$ is the intensity or flux exactly at $r_{e}$ and can be defined as $I_e = I(r_{e})$ and determines the amplitude of the profile. $I_e$ can be related to the intensity at the center of the Sersic profile ($I_0 = I(r_0)$) as follows:\n",
+    "\n",
+    "$I_e = \\frac{I_0}{\\exp\\left\\{b_n\\right\\}}$\n",
+    "\n",
+    "\n",
+    "\n",
+    "![Sersic Radii](images/sersic_radii.png)\n",
+    "\n",
+    "In this plot we see a one dimensional corsection of a  Sersic Profile with $r_e = 25$ and $I_e = 1$. Notice how $I_0$ is equal to 5.3 and not 1. The dotted blue area under the curve contains half of the total flux and is equal to the striped green area in value (the green area extends to infinity)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "427565d0",
+   "metadata": {},
+   "source": [
+    "### Curve of Growth\n",
+    "\n",
+    "The curve of growth (COG) of a galaxy is the relationship between radius (from the galaxy center) and the total flux within that radius. It represents the cumulative flux enclosed at a given radius. The COG is very sensitive to background noise and fluctuations from the galaxy's stochastic components. For a galaxy well described by a Sersic profile, the curve of growth is given by $L(\\leq r)$.\n",
+    "\n",
+    "Below is a plot of the COG of a Sersic profile with $(I_e=1, r_e=25,  n=1)$:\n",
+    "\n",
+    "![cog plot](images/sersic_cog.png)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f185ac4b",
+   "metadata": {},
+   "source": [
+    "## Petrosian Profiles \n",
+    "\n",
+    "In `petrofit`, the Petrosian profile or Petrosian index $\\eta$ is defined as the inverse of the original formulation by Petrosian (1976), and has the property where $\\eta(0) = 1$ at the center of the galaxy and drops to zero at the edge:\n",
+    "\n",
+    "<center>$\\eta (r) = \\frac{I(r)}{\\langle I(r) \\rangle} = I(r) \\frac{A(r)}{L(\\leq r)}$</center>\n",
+    "\n",
+    "Where:\n",
+    "\n",
+    "- $\\eta (r)$ is the Petrosian at $r$.\n",
+    "- $I(r)$ is the surface brightness at $r$.\n",
+    "- $\\langle I (r) \\rangle$ is the average surface brightness within $r$.\n",
+    "- $L(\\leq r)$ is the total flux within $r$.\n",
+    "- $A(r)$ is the aperture area. For elliptical apertures: $A(r) = \\pi \\cdot (1 - ellip) \\cdot r^2$  \n",
+    "\n",
+    " \n",
+    "\n",
+    " \n",
+    "\n",
+    "Below is a plot Petrosian profile of a Sersic model with $(I_e=1, r_e=25,  n=1)$:\n",
+    "\n",
+    "![sersic_petrosian](images/sersic_petrosian.png)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ec77cdef",
+   "metadata": {},
+   "source": [
+    "### Discrete Computation\n",
+    "\n",
+    "Given an array of fluxs (\"$L$\") and corresponding aperture areas (\"$A$\"), the Petrosian profile can be computed discretely as follows:\n",
+    "\n",
+    "1. Estimate the surface brightness by finding the average flux between the current index ($i$) and the last index ($i-1$). Note that the gap between apertures affects the accuracy of the surface brightness at $i$, thus it is recommended to use apertures with radii that are incremented by a small number of pixels:\n",
+    "\n",
+    "\n",
+    "<center>$I[i] \\approx \\frac {L[i] - L[i-1]} {A[i] - A[i-1]}$</center>\n",
+    "    \n",
+    "2. Estimate the average surface brightness by taking the flux at $i$ and dividing it by the corresponding area:\n",
+    "<center>${\\langle I[i] \\rangle} = \\frac {L[i]} {A[i]}$</center>\n",
+    "\n",
+    "3. Compute the Petrosian by plugging in the estimated values:\n",
+    "\n",
+    "<center>$\\eta [i] = \\frac{I[i]}{\\langle I[i] \\rangle} = \\left(\\frac {L[i] - L[i-1]} {A[i] - A[i-1]}\\right) \\cdot \\frac {A[i]} {L[i]}$</center>\n",
+    "\n",
+    "In discrete computations, the Petrosian can **not** be computed at the first index even if it corresponds to the center pixel ($r[i_0]=0$). This is because in real images, the surface brightness of a galaxy is binned into pixels and to get $I_0$, one would need to infinitely oversample (infinite resolution). In other words, each pixel corresponds to a total surface brightness integrated within the area of the pixel as opposed to the surface brightness at that “location”. As such, `petrofit` sets the first Petrosian value to `np.nan` when returning a discretely computed array of Petrosian indices.  Nevertheless, it is known by definition that the Petrosian index at the center of a galaxy is 1 and `petrofit` takes advantage of this fact and uses interpolation when computing radii internally. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "696d9a74",
+   "metadata": {},
+   "source": [
+    "### Petrosian Radius and Eta \n",
+    "\n",
+    "The Petrosian radius is the radius at which the Petrosian profile is equal to a special Petrosian index $\\eta_{petro}$. In `petrofit`, the Petrosian radius is defined as the radius where $\\eta = 0.2$. Thus the Petrosian radius and $\\eta_{petro}$ (\"eta\") can be defined as:\n",
+    "\n",
+    "<center>$\\eta( r_{petro} ) = \\eta_{petro} = 0.2$</center>\n",
+    "\n",
+    "\n",
+    "Here is a plot of the Petrosian radius and $\\eta=0.2$ for a Sersic profile with $(I_e=1, r_e=25,  n=1)$:\n",
+    "\n",
+    "![sersic_petrosian_eta](images/sersic_petrosian_eta.png)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "aa3ce2c9",
+   "metadata": {},
+   "source": [
+    "### Petrosian Total Flux Radius and Epsilon\n",
+    "\n",
+    "The Petrosian total flux radius is, as the name implies, the radius which encloses the total flux of the galaxy. Since Sersic profiles extend to infinity, it is not possible to define a radius that contains 100% of the total flux (that would equate to a radius at infinity). It is also not practical to consider minute flux values at very large radii because real iages of galaxies contain noise. For these reasons `petrofit` considers the radius that contains 99% of the galaxy’s light to be the total flux radius. To attain this radius, we must multiply the Petrosian radius with a constant. This constant is called epsilon and is set to 2 by default. Thus we can define the Petrosian total flux radius as follows:\n",
+    "\n",
+    "<center>$r_{total} = \\epsilon \\cdot r_{petro}$</center>"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "30743a13",
+   "metadata": {},
+   "source": [
+    "### Petrosian Half Light Radius\n",
+    "\n",
+    "The Petrosian half-light radius is the radius which contains half of the total flux. This quaintly is especially important because the half-light radius is equal to the Sersic effective radius. The half-light radius can be computed by numerically finding the radius that encloses half of the total flux. Consequently the Petrosian half-light radius can be defined as the radius which satisfies the following expression:\n",
+    "\n",
+    "<center>$L(\\leq r_{hl}) = \\frac{1}{2} L(\\leq r_{total} )$</center>"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "05d88f4b",
+   "metadata": {},
+   "source": [
+    "### Concentration Index\n",
+    "\n",
+    "The concertation index is the ratio of the radii containing a specified fraction of the total flux and can be generalized as follows:  \n",
+    "\n",
+    "<center>$C_{r_{n_1}, r_{n_2}} = 5 \\cdot log\\left(\\frac{r_{n_1}}{r_{n_2}}\\right)$</center>\n",
+    "\n",
+    "wherer $n$ is the radius in which $n\\%$ of the light is enclosed. The concentration index is related to the profile shape and can be used as a proxy for morphology. Some commonly used concertation indices are the following:\n",
+    "\n",
+    "$C_{2080} = 5 \\cdot log\\left(\\frac{r_{20}}{r_{80}}\\right)$ | Bershady et al.(2000), Kent (1984).\n",
+    "\n",
+    "$C_{5090} = 5 \\cdot log\\left(\\frac{r_{50}}{r_{90}}\\right)$\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "64390488",
+   "metadata": {},
+   "source": [
+    "### Petrosian Corrections \n",
+    "\n",
+    "To first order, the Petrosian magnitude is independent of redshift as it depends on the ratio of two surface brightnesses, but because it is based on profile shape, changes in the profile due to morphological K-corrections still apply. However, the real strength of Petrosian magnitudes vs. other variable aperture photometry such as Kron magnitudes (Kron 1980) is that the Petrosian radius only depends on light interior to this radius. This aspect leads to small random errors in the measurement of $r_{petro}$. Nonetheless, the magnitude within $2 \\cdot r_{petro}$, relative to a true, total magnitude, is still profile dependent. Although 99% of the light from an exponential profile ($n=1$) is recovered within $2 \\cdot r_{petro}$, only 82% of the light for an $r^{1/4}$ profile is measured within $2 \\cdot r_{petro}$ (Graham et al. 2005).\n",
+    "\n",
+    "Because of this, we need to adjust $r_{total}$ by finding the appropriate epsilon ($\\epsilon$) value. Both the consternation index and \"correct\" $r_{total}$ are related, thus a relationship between the consternation index and $\\epsilon$ can be derive by simulating Sersic profiles. For ideal images of Sersic models (no noise and no PSF), we can make a plot of $C2080$ vs Epsilon of simulated profiles with different half-light radii:\n",
+    "\n",
+    "![concentration_index_vs_epsilon](images/concentration_index_vs_epsilon.png)\n",
+    "\n",
+    "The scatter that is seen in higher concentration is due to sampling of the model onto a pixel grid. Profiles with small half-light radii and high concentrations are especially affected because they require a large oversampling factor. The relation in this plot (`C2080_range = (2.79, 4.98)`) can be described well by the following 4th degree polynomial:\n",
+    "\n",
+    "\n",
+    "<center>$\\epsilon (C_{2080}) = 2.32 C_{2080}^4 - 31.47 C_{2080}^3 + 160.73 C_{2080}^2 - 363.67 C_{2080} + 308.22$</center>\n",
+    "\n",
+    "Real images of galaxies contain noise and light from a source is smeared according to the PSF of the instrument. The smearing of light results in the reduction of concentration, causing a skew in the relationship we derived above. To illustrate this, the plot bellow shows concentration indices for the same profiles as above, but convolved with a Hubble Space Telescope `F105W` PSF, sampled at `60 mas`. It also shows the same polynomial as above for reference:\n",
+    "\n",
+    "![f105w_concentration_index_vs_epsilon](images/f105w_concentration_index_vs_epsilon.png)\n",
+    "\n",
+    "Notice how profiles with smaller half-light radii are affected (skewed) the most by the PSF convolution. For this reason, we must make corrections that account for half-light radius and the shape of the PSF. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2af4a5f9",
+   "metadata": {},
+   "source": [
+    "### Concentration Index and Sersic Index\n",
+    "\n",
+    "As mentioned before, concentration indices can be used as a proxy to  Sersic  indices. Since both properties measure the concentration of light, they are intimately related. Below we plot the relationship b/w the two quantities for ideal images (no noise and no PSF) of Sersic models, with different half-light radii:\n",
+    "\n",
+    "\n",
+    "![concentration_index_vs_n](images/concentration_index_vs_n.png)\n",
+    "\n",
+    "This relationship can be well described by the exponential function below, but as discussed in the [Petrosian Corrections section](#Petrosian-Corrections), this relationship is impacted by PSFs and a correction grid is needed to account for such effects.\n",
+    "\n",
+    "<center>$n (C_{2080}) = 0.12255 \\exp\\left\\{ \\frac{C_{2080}}{1.29494}\\right\\} - 0.04285$</center>\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "59bb24c5",
+   "metadata": {},
+   "source": [
+    "## List of Galaxy Properties\n",
+    "\n",
+    "The following galaxy properties can be computed using `petrofit` as described in this section:\n",
+    "\n",
+    "\n",
+    "**Sersic Parameters**\n",
+    "\n",
+    "- [**amplitude**: Surface brightness at r_eff.](./fitting.ipynb#Amplitude-at-r_eff)\n",
+    "- [**r_eff**: Effective (half-light) radius.](./fitting.ipynb#Half-Light-Radius-(r_eff))\n",
+    "- [**n**: Sersic Index.](./fitting.ipynb#Sersic-Index)\n",
+    "- [**x_0 and y_0**: x and y position of the center.](./fitting.ipynb#Center-Pixel)\n",
+    "- [**ellip**:  Ellipticity of the profile.](./fitting.ipynb#Ellipticity-and-Elongation)\n",
+    "- [**elong**:  Elongation of the profile.](./fitting.ipynb#Ellipticity-and-Elongation)\n",
+    "- [**theta**: Rotation angle.](./fitting.ipynb#Source-Orientation)\n",
+    "\n",
+    "**Petrosian Parameters**\n",
+    "\n",
+    "- [**r_petrosian**: Petrosian Radius.](./photometry_and_petrosian.ipynb#Petrosian-Radius)\n",
+    "- [**r_total_flux**: Petrosian Total Flux Radius.](./photometry_and_petrosian.ipynb#Petrosian-Total-Flux-Radius)\n",
+    "- [**r_half_light**: Petrosian Half Light Radius.](./photometry_and_petrosian.ipynb#Petrosian-Half-Light-Radius)\n",
+    "- [**total_flux**: Total Petrosian Flux](./photometry_and_petrosian.ipynb#Total-Petrosian-Flux)\n",
+    "- [**concentration_index**: Concentration Index.](./photometry_and_petrosian.ipynb#Concentration-Index)\n",
+    "- [**epsilon**: Estimated Corrected Epsilon.](./photometry_and_petrosian.ipynb#Estimate-corrected-epsilon)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ed229df9",
+   "metadata": {},
+   "source": [
+    "## References \n",
+    "\n",
+    "\n",
+    "Bershady, M. A., Jangren, A., and Conselice, C. J., “Structural and Photometric Classification of Galaxies. I. Calibration Based on a Nearby Galaxy Sample”, <i>The Astronomical Journal</i>, vol. 119, no. 6, pp. 2645–2663, 2000. doi:10.1086/301386.\n",
+    "\n",
+    "Crawford, S. M., “The distribution of star-forming galaxies in intermediate redshift galaxy clusters”, PhDT, 2006.\n",
+    "\n",
+    "Graham, A. W., “Total Galaxy Magnitudes and Effective Radii from Petrosian Magnitudes and Radii”, <i>The Astronomical Journal</i>, vol. 130, no. 4, pp. 1535–1544, 2005. doi:10.1086/444475.\n",
+    "\n",
+    "Graham, A. W. and Driver, S. P., “A Concise Reference to (Projected) Sérsic R<SUP>1/n</SUP> Quantities, Including Concentration, Profile Slopes, Petrosian Indices, and Kron Magnitudes”, <i>Publications of the Astronomical Society of Australia</i>, vol. 22, no. 2, pp. 118–127, 2005. doi:10.1071/AS05001.\n",
+    "\n",
+    "Kent, S. M., “CCD Surface photometry of field galaxies.I. Observations.”, <i>The Astrophysical Journal Supplement Series</i>, vol. 56, pp. 105–141, 1984. doi:10.1086/190978.\n",
+    "\n",
+    "Kron, R. G., “Photometry of a complete sample of faint galaxies.”, <i>The Astrophysical Journal Supplement Series</i>, vol. 43, pp. 305–325, 1980. doi:10.1086/190669.\n",
+    "\n",
+    "Petrosian, V., “Surface Brightness and Evolution of Galaxies”, <i>The Astrophysical Journal</i>, vol. 210, p. L53, 1976. doi:10.1086/182301.\n",
+    "\n",
+    "\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/multi_object.ipynb b/docs/multi_object.ipynb
new file mode 100644
index 0000000..6923e37
--- /dev/null
+++ b/docs/multi_object.ipynb
@@ -0,0 +1,633 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "5d6541c4",
+   "metadata": {},
+   "source": [
+    "# Multi-object Photometry\n",
+    "\n",
+    "In this section we demonstrate how to preform photometry on multiple objects in an image. We choose a faint group of galaxies and run the photometry steps as described in the [Photometry](./photometry_and_petrosian.ipynb#Photometry) section."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f0d11bba",
+   "metadata": {},
+   "source": [
+    "## Loading Example Data\n",
+    "\n",
+    "The following data is a cutout of a group of faint galaxies in Abell 2744. The original data was aquired by the [Hubble Frontier Fields](https://frontierfields.org) team via the WFC3 instrument in the `F105W` filter and can be dirctly downloaded from the [Mikulski Archive for Space Telescopes](https://archive.stsci.edu/pub/hlsp/frontier/abell2744/images/hst/v1.0/hlsp_frontier_hst_wfc3-60mas_abell2744_f105w_v1.0_drz.fits). \n",
+    "\n",
+    "We first use `astropy`'s ``CCDData`` to load the example data and visualize it through `matplotlib`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1c73113d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.nddata import CCDData\n",
+    "\n",
+    "image = CCDData.read('data/abell_2744_group_of_galaxies_f105w.fits.gz')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e867d428",
+   "metadata": {
+    "nbsphinx": "hidden"
+   },
+   "outputs": [],
+   "source": [
+    "# Hidden cell\n",
+    "\n",
+    "%matplotlib inline\n",
+    "\n",
+    "# Stop Fit Model to Data section warnings\n",
+    "import warnings\n",
+    "warnings.filterwarnings('ignore', append=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1de6d092",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "vmax =  0.01 # Use the image std as max and min of all plots \n",
+    "vmin = - vmax \n",
+    "\n",
+    "plt.imshow(image.data, vmin=vmin, vmax=vmax)\n",
+    "plt.title(\"Galaxy Group in Abell 2744 Frontier Field\")\n",
+    "plt.xlabel(\"Pixels\")\n",
+    "plt.ylabel(\"Pixels\")\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3abd847f",
+   "metadata": {},
+   "source": [
+    "## Make Source Catalog \n",
+    "\n",
+    "We will use the sigma clipped std as a threshold at the segmentation and deblending steps.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "205cf01e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import make_catalog, plot_segments\n",
+    "from astropy.stats import sigma_clipped_stats\n",
+    "\n",
+    "# Compute stats for threshold\n",
+    "image_mean, image_median, image_stddev = sigma_clipped_stats(image.data, sigma=3)\n",
+    "\n",
+    "# Define threshold\n",
+    "threshold = image_stddev \n",
+    "\n",
+    "# Define smoothing kernel\n",
+    "kernel_size = 3\n",
+    "fwhm = 3\n",
+    "\n",
+    "# Min Source size (area)\n",
+    "npixels = 5**2\n",
+    "\n",
+    "\n",
+    "cat, segm, segm_deblend = make_catalog(    \n",
+    "    image.data, \n",
+    "    threshold=threshold,\n",
+    "    wcs=image.wcs,\n",
+    "    deblend=True,                 \n",
+    "    kernel_size=kernel_size,                  \n",
+    "    fwhm=fwhm, \n",
+    "    npixels=npixels,\n",
+    "    contrast=0.00,\n",
+    "    plot=True, vmax=vmax, vmin=vmin\n",
+    ")\n",
+    "\n",
+    "plt.show()\n",
+    "\n",
+    "# Display source properties\n",
+    "print(\"Num of Targets:\", len(cat))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6d8493b8",
+   "metadata": {},
+   "source": [
+    "## Photometry Loop\n",
+    "\n",
+    "We define the list of aperture radii and proceed to the photometry step. In this case, instead of selecting a source, we loop through the source catalog and preform photometry on each object. After constructing the photometry we create a ` Petrosian` object for the source. We save the `Petrosian` in a python dictionary (`petrosian_properties`) for later use."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e31fff82",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import source_photometry\n",
+    "from petrofit.petrosian import Petrosian, PetrosianCorrection\n",
+    "from petrofit.photometry import make_radius_list\n",
+    "\n",
+    "max_pix=35\n",
+    "\n",
+    "r_list = make_radius_list(\n",
+    "    max_pix=max_pix, # Max pixel to go up to\n",
+    "    n=max_pix # the number of radii to produce \n",
+    ")\n",
+    "\n",
+    "\n",
+    "petrosian_properties = {}\n",
+    "\n",
+    "for idx, source in enumerate(cat):\n",
+    "    \n",
+    "    # Photomerty \n",
+    "    flux_arr, area_arr, error_arr = source_photometry(\n",
+    "\n",
+    "        # Inputs \n",
+    "        source, # Source (`photutils.segmentation.catalog.SourceCatalog`)\n",
+    "        image.data, # Image as 2D array \n",
+    "        segm_deblend, # Deblended segmentation map of image\n",
+    "        r_list, # list of aperture radii  \n",
+    "\n",
+    "        # Options \n",
+    "        cutout_size=max(r_list)*2, # Cutout out size, set to double the max radius  \n",
+    "        bkg_sub=True, # Subtract background  \n",
+    "        sigma=1, sigma_type='clip', # Fit a 2D plane to pixels within 1 sigma of the mean\n",
+    "        plot=False, vmax=vmax, vmin=vmin, # Show plot with max and min defined above\n",
+    "    )\n",
+    "    plt.show()\n",
+    "    \n",
+    "    p = Petrosian(r_list, area_arr, flux_arr)\n",
+    "    \n",
+    "    petrosian_properties[source] = p\n",
+    "    \n",
+    "print(\"Completed for {} Sources\".format(len(petrosian_properties)))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7646c36d",
+   "metadata": {},
+   "source": [
+    "## Compute Total Mags \n",
+    "\n",
+    "We compute the total magnitudes of the sources by looping through their ` Petrosian` objects. We use the ` flux_to_abmag` function to convert the total flux to AB mags of each object."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e6dfa0ff",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np \n",
+    "from petrofit.photometry import flux_to_abmag\n",
+    "\n",
+    "mag_list = []\n",
+    "\n",
+    "for source in petrosian_properties:\n",
+    "    \n",
+    "    # Get Petrosian\n",
+    "    p = petrosian_properties[source]\n",
+    "    \n",
+    "    # Compute HST Flux -> mags for total_flux\n",
+    "    mag = flux_to_abmag(p.total_flux, image.header)\n",
+    "    \n",
+    "    # Add to mag list\n",
+    "    mag_list.append(mag)\n",
+    "\n",
+    "# Convert mag_list to array \n",
+    "mag_list = np.array(mag_list)\n",
+    "\n",
+    "mag_list"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a29a8bc9",
+   "metadata": {},
+   "source": [
+    "## Photometry Catalog\n",
+    "\n",
+    "We construct and save a photometry catalog with the magnitudes we computed. To construct the table, we first use the `SourceCatalog.to_table()` function that returns an `astropy` `table`. This will include important info about each source. We then add a new column (`MAG_F105W`) with the total mags we computed. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b2d71dd2",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Segmentation catalog to astropy table.\n",
+    "photo_cat = cat.to_table()\n",
+    "\n",
+    "# Add new column with mags.\n",
+    "photo_cat.add_column(mag_list, index=4, name='MAG_F105W')\n",
+    "\n",
+    "# Save to file.\n",
+    "photo_cat.write('temp/example_photo_cat.csv', overwrite=True)\n",
+    "\n",
+    "photo_cat"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "06535ee7",
+   "metadata": {},
+   "source": [
+    "# Simultaneous Fitting\n",
+    "\n",
+    "In this section we explore how to make compound models that can be used to describe multiple objects in an image. We use the same dataset as the [Multi-object Photometry section](#Multi-object-Photometry) to fit the nine faint sources with Sersic profiles. \n",
+    "\n",
+    "## Make Individual Models\n",
+    "\n",
+    "To do this we loop through the sources and construct `astropy` ` Sersic2D` models for source as described in the [AstroPy Sersic Model sction](./fitting.ipynb#AstroPy-Sersic-Model). We also make initial guesses of the paramters as described in the [Estimating Sersic Parameters](./fitting.ipynb#Estimating-Sersic-Parameters) section. At the end of each iteration, we add the newly constructed model in a list `model_list`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "031f39c1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import get_source_ellip, get_source_elong, get_source_position, get_source_theta\n",
+    "from photutils.isophote import EllipseGeometry, Ellipse\n",
+    "from astropy.modeling import models \n",
+    "\n",
+    "# AstroPy Model List\n",
+    "model_list = []\n",
+    "\n",
+    "# For each source\n",
+    "for source in list(petrosian_properties.keys()):\n",
+    "    \n",
+    "    # Get Petrosian\n",
+    "    p = petrosian_properties[source]\n",
+    "    \n",
+    "    # Estimate center \n",
+    "    position = get_source_position(source)    \n",
+    "    x_0, y_0 = position\n",
+    "    \n",
+    "    # Estimate shape \n",
+    "    elong = get_source_elong(source)\n",
+    "    ellip = get_source_ellip(source)\n",
+    "    theta = get_source_theta(source)\n",
+    "    \n",
+    "    # Estimate Sersic index\n",
+    "    n = 1\n",
+    "    \n",
+    "    # Estimate r_half_light\n",
+    "    r_eff = p.r_half_light\n",
+    "    \n",
+    "    # Estimate amplitude\n",
+    "    g = EllipseGeometry(x_0, y_0, 1., ellip, theta)\n",
+    "    ellipse = Ellipse(image.data, geometry=g)\n",
+    "    iso = ellipse.fit_isophote(r_eff)\n",
+    "    amplitude = iso.intens\n",
+    "    \n",
+    "    # Allow for 4 pixel center slack \n",
+    "    center_slack = 4\n",
+    "    \n",
+    "    # Make astropy model\n",
+    "    sersic_model = models.Sersic2D(\n",
+    "\n",
+    "            amplitude=amplitude,\n",
+    "            r_eff=r_eff,\n",
+    "            n=n,\n",
+    "            x_0=x_0,\n",
+    "            y_0=y_0,\n",
+    "            ellip=ellip, \n",
+    "            theta=theta,\n",
+    "\n",
+    "            bounds = {\n",
+    "                'amplitude': (0., None),\n",
+    "                'r_eff': (0, None),\n",
+    "                'n': (0, 10),\n",
+    "                'ellip': (0, 1),\n",
+    "                'theta': (-2*np.pi, 2*np.pi),\n",
+    "                'x_0': (x_0 - center_slack/2, x_0 + center_slack/2),\n",
+    "                'y_0': (y_0 - center_slack/2, y_0 + center_slack/2),\n",
+    "            },\n",
+    "    )\n",
+    "    \n",
+    "    # Add to model list \n",
+    "    model_list.append(sersic_model)\n",
+    "    \n",
+    "    # Over-plot Petrosian radii \n",
+    "    p.imshow(position=position, elong=elong, theta=theta, lw=1.25)\n",
+    "\n",
+    "# Plot image of sources \n",
+    "plt.imshow(image.data, vmax=vmax, vmin=vmin)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "dd6fba37",
+   "metadata": {},
+   "source": [
+    "## Make Compound Model\n",
+    "\n",
+    "To make a single compound model that represents all the sources of interest, we add up all the models. `astropy` models can be added like numbers or arrays, so we convert the model list to a `numpy` array and sum it. \n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "62a78c7e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "compound_model = np.array(model_list).sum()\n",
+    "\n",
+    "compound_model"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "caa7f1f8",
+   "metadata": {},
+   "source": [
+    "## Make PSFModel\n",
+    "\n",
+    "Now that we have a single model that represents all the sources, we can create a `PSFModel` with the appropriate parameters. We load a PSF as described in the [PSF section](./fitting.ipynb#Estimating-Sersic-Parameters) of the fitting documentation. We then wrap the compound model and PSF using `PSFModel`. We specify an oversampling factor 4 to account for poor CCD sampling.\n",
+    "\n",
+    "**Load and Normalize PSF**\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "2f37cac9",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.io import fits\n",
+    "\n",
+    "PSF = fits.getdata('data/f105w_psf.fits.gz')\n",
+    "PSF = PSF / PSF.sum()\n",
+    "\n",
+    "plt.imshow(PSF, vmin=0, vmax=PSF.std()/10)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d813bcc4",
+   "metadata": {},
+   "source": [
+    "**PSFModel**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5dede573",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.models import PSFModel\n",
+    "\n",
+    "psf_sersic_model = PSFModel.wrap(compound_model, psf=PSF, oversample=4)\n",
+    "\n",
+    "psf_sersic_model.fixed['psf_pa'] = True"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2a51a810",
+   "metadata": {},
+   "source": [
+    "## Fit Model to Data\n",
+    "\n",
+    "We fit the compound model using a Levenberg-Marquardt algorithm and save the returned optimized copy of the fitted model in  `fitted_model`. Since this the compound model is composed of many parameters, we may see `astropy` warnings when the fitter explores parameters that cause issues, such as division by zero."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "2ae27f14",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%time\n",
+    "\n",
+    "from petrofit.fitting import fit_model\n",
+    "\n",
+    "fitted_model, _ = fit_model(\n",
+    "    image.data, psf_sersic_model,\n",
+    "    maxiter=10000,\n",
+    "    epsilon=1.4901161193847656e-08,\n",
+    "    acc=1e-09,\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c25efce0",
+   "metadata": {},
+   "source": [
+    "## Generate Model Image\n",
+    "\n",
+    "To generate a model image we use the `model_to_image` utility function. This function allows us to define the center of the model image and the side length of the image."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "13ec334d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.fitting import model_to_image\n",
+    "\n",
+    "# Make Model Image\n",
+    "# ----------------\n",
+    "\n",
+    "# Set the size of the model image equal to the original image\n",
+    "full_fitted_image_size = image.data.shape[0]\n",
+    "\n",
+    "# Center the model image at the center of the original image\n",
+    "# so the two images cover the same window\n",
+    "full_fitted_image_center = full_fitted_image_size // 2\n",
+    "\n",
+    "# Generate a model image from the model\n",
+    "fitted_model_image = model_to_image(\n",
+    "    full_fitted_image_center,\n",
+    "    full_fitted_image_center,\n",
+    "    full_fitted_image_size,\n",
+    "    fitted_model\n",
+    ")\n",
+    "\n",
+    "# Plot Model Image\n",
+    "# ----------------\n",
+    "\n",
+    "fig, ax = plt.subplots(2, 2)\n",
+    "\n",
+    "# Plot raw data\n",
+    "ax[0, 0].imshow(image.data, vmin=vmin, vmax=vmax)\n",
+    "ax[0, 0].set_title(\"Data\")\n",
+    "\n",
+    "# Plot Petrosian radii\n",
+    "plt.sca(ax[0, 1])\n",
+    "for i, source in enumerate(petrosian_properties):\n",
+    "    p = petrosian_properties[source]\n",
+    "    \n",
+    "    position = get_source_position(source)    \n",
+    "    x_0, y_0 = position\n",
+    "    \n",
+    "    elong = get_source_elong(source)\n",
+    "    ellip = get_source_ellip(source)\n",
+    "    theta = get_source_theta(source)\n",
+    "    \n",
+    "    p.imshow(position=position, elong=elong, theta=theta, lw=1.25)\n",
+    "    if i == 0:\n",
+    "        plt.legend()\n",
+    "ax[0, 1].imshow(image.data, vmin=vmin, vmax=vmax)\n",
+    "ax[0, 1].set_title(\"Petrosian Radii\")\n",
+    "\n",
+    "# Plot Model Image\n",
+    "ax[1, 0].imshow(fitted_model_image, vmin=vmin, vmax=vmax)\n",
+    "ax[1, 0].set_title(\"Fitted Sersic Model\")\n",
+    "\n",
+    "# Plot Residual\n",
+    "ax[1, 1].imshow(image.data - fitted_model_image, vmin=vmin, vmax=vmax)\n",
+    "ax[1,1].set_title(\"Residual\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "cf62ad6f",
+   "metadata": {},
+   "source": [
+    "## Analysis of Background\n",
+    "\n",
+    "We can now create a background image using the residual and preform some statistical  analysis on it."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "deba9c81",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Define background image\n",
+    "background_image = image.data - fitted_model_image\n",
+    "\n",
+    "# Compute stats\n",
+    "# -------------\n",
+    "\n",
+    "noise_mean = background_image.mean()\n",
+    "noise_sigma = background_image.std()\n",
+    "noise_3_sigma = noise_sigma * 3.\n",
+    "noise_8_sigma = noise_sigma * 8.\n",
+    "\n",
+    "print(\"noise_mean = {}\".format(noise_mean))\n",
+    "print(\"noise_sigma = {}\".format(noise_sigma))\n",
+    "print(\"noise_3_sigma = {}\".format(noise_3_sigma))\n",
+    "\n",
+    "# Plots\n",
+    "# -----\n",
+    "\n",
+    "plt.imshow(image.data - fitted_model_image, vmin=vmin, vmax=vmax)\n",
+    "plt.title('Residual Image')\n",
+    "plt.show()\n",
+    "\n",
+    "n, bins, patches = plt.hist(background_image.flatten(), bins=35, align='left', \n",
+    "                            color='black', label=\"Binned Residual Image Pixel Values\")\n",
+    "plt.plot(bins[:-1], n, c='r', linewidth=3)\n",
+    "plt.axvline(image.data.mean(), label=\"Raw Input Image Mean\", c='g',linestyle=\"--\")\n",
+    "plt.axvline(noise_mean, label=\"Residual Image Mean\", linestyle=\"--\")\n",
+    "\n",
+    "\n",
+    "plt.xlabel('Flux Bins [{}]'.format(str(image.unit)))\n",
+    "plt.ylabel('Count')\n",
+    "plt.title('Residual Image Pixel Value Histogram')\n",
+    "plt.legend()\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5bb1e3ce",
+   "metadata": {},
+   "source": [
+    "\n",
+    "\n",
+    "Now we see the residual image mean is near that is near the mean of the noise distribution, we can make a segmentation map using the residual image 3-sigma as the detection threshold. Notice how some of the sources we were able to fit were below the 3-sigma estimate of the background (residual image). "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8a50d96b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "new_threshold = noise_3_sigma\n",
+    "\n",
+    "new_cat, new_segm, new_segm_deblend = make_catalog(    \n",
+    "    image.data, \n",
+    "    threshold=new_threshold,\n",
+    "    wcs=image.wcs,\n",
+    "    deblend=True,                 \n",
+    "    kernel_size=kernel_size,                  \n",
+    "    fwhm=fwhm, \n",
+    "    npixels=npixels,\n",
+    "    contrast=0.00,\n",
+    "    plot=True, vmax=vmax, vmin=vmin\n",
+    ")\n",
+    "\n",
+    "plt.show()\n",
+    "\n",
+    "# Display source properties\n",
+    "print(\"Num of Targets:\", len(new_cat))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/photometry_and_petrosian.ipynb b/docs/photometry_and_petrosian.ipynb
new file mode 100644
index 0000000..51899b4
--- /dev/null
+++ b/docs/photometry_and_petrosian.ipynb
@@ -0,0 +1,1076 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "fa820f90",
+   "metadata": {},
+   "source": [
+    "# Photometry\n",
+    "\n",
+    "In order to measure Petrosian properties of galaxies, we construct a photometric curve of growth using a set of concentric apertures with varying radii to measure the flux. From this curve of growth, we will measure different properties of the galaxy including the total flux, characteristic radii such as the Petroscian radius and half light radius, and the concentration index. \n",
+    "\n",
+    "To achieve an accurate measurement, we must remove the signature of any background flux and minimize the effects of neighboring sources by masking or removing them.  "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b2f32b9c",
+   "metadata": {},
+   "source": [
+    "## Loading Example Data\n",
+    "\n",
+    "The following data is a cutout of a group of bright galaxies in Abell 2744. The original data was aquired by the [Hubble Frontier Fields](https://frontierfields.org) team via the WFC3 instrument in the `F105W` filter and can be dirctly downloaded from the [Mikulski Archive for Space Telescopes](https://archive.stsci.edu/pub/hlsp/frontier/abell2744/images/hst/v1.0/hlsp_frontier_hst_wfc3-60mas_abell2744_f105w_v1.0_drz.fits). \n",
+    "\n",
+    "We first use `astropy`'s ``CCDData`` to load the example data and visualize it through `matplotlib`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "cca798ac",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.nddata import CCDData\n",
+    "\n",
+    "image = CCDData.read('data/abell_2744_dwarf_galaxy_f105w.fits.gz')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c0df0ebd",
+   "metadata": {
+    "nbsphinx": "hidden"
+   },
+   "outputs": [],
+   "source": [
+    "# Hidden cell\n",
+    "\n",
+    "%matplotlib inline"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6d936492",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "plt.rcParams['figure.figsize'] = [10, 10]\n",
+    "plt.rcParams['image.origin'] = 'lower'\n",
+    "\n",
+    "vmax = image.data.std() # Use the image std as max and min of all plots \n",
+    "vmin = - vmax \n",
+    "\n",
+    "plt.imshow(image.data, vmin=0, vmax=image.data.std())\n",
+    "plt.title(\"Galaxy in Abell 2744\")\n",
+    "plt.xlabel(\"Pixels\")\n",
+    "plt.ylabel(\"Pixels\")\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "20444fd6",
+   "metadata": {},
+   "source": [
+    "### Estimate data noise at dark area"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "34743c6c",
+   "metadata": {},
+   "source": [
+    "In this section we estimate the noise levels in the image. This estimate is used as a threshold for the detection and segmentation steps. To estimate the background noise, we find a dark region in the image (in this case the corner of the image), and make a cutout using `Cutout2D`. We then compute the statistics for that cutout region.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "101d412e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.nddata import Cutout2D\n",
+    "\n",
+    "# Estimate data noise at dark area\n",
+    "# --------------------------------\n",
+    "noise_cutout_pos = (50, 50)\n",
+    "noise_cutout_size = 50 \n",
+    "noise_cutout = Cutout2D(image, noise_cutout_pos, noise_cutout_size)\n",
+    "\n",
+    "noise_mean = noise_cutout.data.mean()\n",
+    "noise_sigma = noise_cutout.data.std()\n",
+    "noise_3_sigma = noise_sigma * 3.\n",
+    "noise_8_sigma = noise_sigma * 8.\n",
+    "\n",
+    "print(noise_mean, noise_3_sigma, noise_8_sigma)\n",
+    "\n",
+    "# Plot image and noise distribution\n",
+    "# ---------------------------------\n",
+    "plt.imshow(noise_cutout.data, vmax=noise_mean+noise_3_sigma, vmin=noise_mean-noise_3_sigma)\n",
+    "plt.title(\"Dark Patch\")\n",
+    "plt.xlabel(\"Pixels\")\n",
+    "plt.ylabel(\"Pixels\")\n",
+    "plt.show()\n",
+    "\n",
+    "n, bins, patches = plt.hist(noise_cutout.data.flatten(), bins=35, align='left', color='black')\n",
+    "plt.plot(bins[:-1], n, c='r', linewidth=3)\n",
+    "plt.axvline(noise_mean, label=\"noise_mean\", linestyle=\"--\")\n",
+    "\n",
+    "plt.xlabel('Flux Bins [{}]'.format(str(image.unit)))\n",
+    "plt.ylabel('Count')\n",
+    "plt.title('Noise Histogram')\n",
+    "plt.legend()\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9088b8c7",
+   "metadata": {},
+   "source": [
+    "We can also use the standard deviation from the `astropy` `sigma_clipped_stats` function to estimate the detection threshold. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ec9baf08",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.stats import sigma_clipped_stats\n",
+    "image_mean, image_median, image_stddev = sigma_clipped_stats(image.data, sigma=3)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "36d0015a",
+   "metadata": {},
+   "source": [
+    "## Catalogs\n",
+    "\n",
+    "Before we can preform photometery, we need to first identfiy the sources in the image. To do this, we use `photutils` and the wrappers in `petrofit`. \n",
+    "\n",
+    "### Make Catalog \n",
+    "\n",
+    "We first start by defining the detection threshold and we select this value to be the data standard dev or `noise_8_sigma` computed in the last section."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5dc2e8af",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Define detect threshold\n",
+    "threshold = noise_8_sigma"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "36f2709b",
+   "metadata": {},
+   "source": [
+    "Next, we define the parameters of a Gaussian kernel that is used to smooth the image before segmentation. The `kernel_size` defines the dimensions of the smoothing kernel and `fwhm` which is used to compute the `sigma` value of the Gaussian distribution. The `fwhm` is used to compute the `sigma` value as follows: \n",
+    "\n",
+    "```\n",
+    "sigma = fwhm * gaussian_fwhm_to_sigma\n",
+    "kernel = Gaussian2DKernel(sigma, x_size=kernel_size, y_size=kernel_size)\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ebb05648",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Define smoothing kernel\n",
+    "kernel_size = 3\n",
+    "fwhm = 3"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "95102409",
+   "metadata": {},
+   "source": [
+    "We also have to define the number of pixels that make up the smallest object. `npixels` is the number of connected pixels, each greater than threshold value, that an object must have to be detected. `npixels` must be a positive integer."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6b042b37",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "npixels = 4**2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a0d7d08c",
+   "metadata": {},
+   "source": [
+    "\n",
+    "To make a catalog of sources and segmentation maps, we use ` petrofit`'s `make_catalog` function. The function returns a source catalog (`photutils.SourceCatalog`), a segmentation image and, if `deblend=True`, a deblended segmentation image. \n",
+    "\n",
+    "The `make_catalog` function wraps three steps into one function:\n",
+    "\n",
+    "1. **Segmentation:**\n",
+    "\n",
+    "    To identify sources in the image, we first sgement the image. The image is smoothed with a gaussian kernel if ` kernel_size ` is provided and clipped at the threshold specified (after smoothing if applicable). The image is then segmented using the ` petrofit.segmentation.make_segments` function, which is a wrapper for `photutil`’s ` detect_sources` functionality. \n",
+    "\n",
+    "\n",
+    "2. **Deblending:**\n",
+    "\n",
+    "    To further distinguish the sources, we use `photutils.deblend_sources` to deblend the sources into individual galaxies. The `contrast` parameter is the fraction of the total (blended) source flux that a local peak must have (at any one of the multi-thresholds) to be considered as a separate object and `nlevels` is the number of multi-thresholding levels to use. If `deblend` is set to ``False``, ``None`` is returend for `segm_deblend`.\n",
+    "\n",
+    "3. **Source Catalog:**\n",
+    "\n",
+    "    Now that we have deblended the sourecs into individual sources, the next step is to create a source catalog (`photutils.SourceCatalog`) that contains properties like `(xcentroid, ycentroid)`, `eccentricity` and `area`. Note that the deblended map is used to make the source catalog but if `deblend` is set to ``False``, the sgementation map is used instead.\n",
+    "    \n",
+    "By setting the `plot` flag to `True`, we see plots of the segmentation and deblended segmentation maps. The image is plotted along with a color coded overplot of the segmentation map (each source is a different color). `vmax` and `vmin` can be used the same way as in `plt.imshow`. \n",
+    "\n",
+    "\n",
+    "After the computation, the following objects are returned:\n",
+    "\n",
+    "- `cat` : A catalog of sources.\n",
+    "\n",
+    "- `segm` : Segmentation map.\n",
+    "\n",
+    "- `segm_deblend` : Deblended segmentation map."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "574d4356",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import make_catalog, plot_segments\n",
+    "\n",
+    "cat, segm, segm_deblend = make_catalog(    \n",
+    "    image.data, \n",
+    "    threshold, \n",
+    "    deblend=True,                 \n",
+    "    kernel_size=kernel_size,                  \n",
+    "    fwhm=fwhm, \n",
+    "    npixels=npixels,\n",
+    "    plot=True, vmax=vmax, vmin=vmin\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4d85df3a",
+   "metadata": {},
+   "source": [
+    "To demonstrate the useful information in the catalog, we convert the `SourceCatalog` to an `astropy.table.Table` and display the first 10 objects. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1eabaace",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Display source properties\n",
+    "print(\"Num of Targets:\", len(cat))\n",
+    "\n",
+    "# Convert to table\n",
+    "cat_table = cat.to_table()\n",
+    "\n",
+    "cat_table[:10]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0712b1dc",
+   "metadata": {},
+   "source": [
+    "### Plotting Segmentation Maps\n",
+    "\n",
+    "To plot segmentations, you can use the `plot_segments` function included in PetroFit as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "cf7e6e2c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import plot_segments\n",
+    "\n",
+    "plot_segments(segm, image=image.data, vmax=vmax, vmin=vmin)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0f1bfef8",
+   "metadata": {},
+   "source": [
+    "As you can see, the segmentation resulted in the identification sources but the sources at the center were classified as a single object because they have interconnecting pixels that are above the threshold.\n",
+    "\n",
+    "Next we use the same functiton to plot the deblended segmentation map, notice how the central sources are now deblended into individual sources:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e928bfa3",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "plot_segments(segm_deblend, image=image.data, vmax=vmax, vmin=vmin)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ab074429",
+   "metadata": {},
+   "source": [
+    "We can also plot the background pixels that are not a part of a source’s segmentation footprint using the `plot_segment_residual` function. We significantly lower the `vmax` and `vmin` values so the background pixels become more apparent. This plot can be used to see if threshold used to segment the image was too high. If the threshold is high, we would notice bright pixels that are part of the source in this plot. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d8e230ca",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import plot_segment_residual\n",
+    "plot_segment_residual(segm, image.data, vmax=vmax/5)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "62b1115d",
+   "metadata": {},
+   "source": [
+    "## Photometry on Single Source"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4cc2bd90",
+   "metadata": {},
+   "source": [
+    "The purpose of this step is to perform aperture photometry to construct a curve of growth that we can use for the petrosian measurements. \n",
+    "\n",
+    "### Source Selection\n",
+    "\n",
+    "For this example, we will focus on a single source. We have included a helper function `order_cat` that will produce a list of indices sorted by a key (default is 'area'). We use the `order_cat` function to identify the source of interest and perform photometry on its cutout."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "dfa11b07",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import order_cat\n",
+    "\n",
+    "# Sort and get the largest object in the catalog\n",
+    "sorted_idx_list = order_cat(cat, key='area', reverse=True)\n",
+    "idx = sorted_idx_list[1] # index 0 is largest \n",
+    "source = cat[idx]  # get source from the catalog "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bcc8ce3c",
+   "metadata": {},
+   "source": [
+    "### Aperture Radii \n",
+    "\n",
+    "To construct the curve of growth, we measure the photometry using circular and/or elliptical apertures of varying, concentric radii that are centered on the source. Before we perform the photometry, we need to provide a list of radii that will be used to construct the circular and elliptical apertures. To achieve this, we have provided a helper function that takes in the max radius in pixels (`max_pix`) and the number radii (`n`). The function will return a list of radii by dividing the range `(max_pix/n, max_pix)` into n  equally spaced integers. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1e59cc07",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import make_radius_list\n",
+    "\n",
+    "r_list = make_radius_list(\n",
+    "    max_pix=50, # Max pixel to go up to\n",
+    "    n=50 # the number of radii to produce \n",
+    ")\n",
+    "\n",
+    "print(repr(r_list))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "aae24fef",
+   "metadata": {},
+   "source": [
+    "### Photometry Calculation\n",
+    "\n",
+    "The `source_photometry` function is used to perform photometry on a single source (`photutils.segmentation.catalog.SourceCatalog`). In this example we provide the function with the source object, the raw image (note that this is the 2D array and not `CCDData`), segmentation from the last step (`SegmentationImage`) and the list of radii we made using `make_radius_list`. Given these parameters and the options below the function performs photometry as follows:\n",
+    "\n",
+    "- The positions (max value of source in pixels), elongation and position angle of the source is determined from the source object. The position will be used to center the apertures and the elongation and position angles will be used as parameters of the elliptical apertures. Each of the radii will be assigned an elliptical aperture with these parameters. \n",
+    "\n",
+    "\n",
+    "- If `cutout_size` is defined, the code will use it to make a cutout of that size with the source centered. If the `cutout_size` is larger than the image or contains pixels outside the image, those pixels outside of the image are replaced by `np.nan`.\n",
+    "\n",
+    "\n",
+    "- Once the `cutout_size` is determined, a cutout of the error map (if provided) and image is produced. Before the raw image is cutout, sources that are not the source of interest are masked using the segmentation map. The `mask_background` option gives us the ability to also mask pixels that are considered to be background pixels because they do not belong to any source’s segmentation map. All masked pixels are replaced by `np.nan` and are not counted in the returned area array.  \n",
+    "\n",
+    "\n",
+    "- If `bkg_sub` is set to true, a 2D plane is used to fit pixels that are below a specified sigma from the mean using the `petrofit.fitting.fit_plane` function. The sigma `sigma` value is used to determine noise pixels. Once the pixels above this value are masked, a 2D plane is fit to determine the background. The 2D plane model is then converted into an image and subtracted from the cutout of the target source. `sigma_type` is used to set how this `sigma` value will be used. The `sigma_type` options are `'clip'` and `'bound'`:\n",
+    "    - ``'clip'`` (default): Uses `astropy.stats.sigma_clipping.sigma_clip` to clip at the provided `sigma` std value. Note that `sigma` in this case is the number of stds above the mean.\n",
+    "    - ``'bound'`` : After computing the mean of the image, clip at `mean - sigma` and `mean + sigma`. Note that `sigma` in this case is a value and not the number of stds above the mean.\n",
+    "\n",
+    "\n",
+    "- The resulting image (after being noise subtracted if `bkg_sub` is set to true) is passed to the `petrofit.photometry.photometry_step` which constructs the apertures and performs photometry. \n",
+    "\n",
+    "After calculating the photometry at each radius, three arrays are returned:\n",
+    "\n",
+    "* `flux_arr`: Photometric sum in aperture.\n",
+    "\n",
+    "* `area_arr`: Exact area of aperture.\n",
+    "\n",
+    "* `error_arr`: if error map is provided, error of measurements.\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3a6edf4f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import source_photometry\n",
+    "\n",
+    "# Photomerty \n",
+    "flux_arr, area_arr, error_arr = source_photometry(\n",
+    "    \n",
+    "    # Inputs \n",
+    "    source, # Source (`photutils.segmentation.catalog.SourceCatalog`)\n",
+    "    image.data, # Image as 2D array \n",
+    "    segm_deblend, # Deblended segmentation map of image\n",
+    "    r_list, # list of aperture radii  \n",
+    "    \n",
+    "    # Options \n",
+    "    cutout_size=max(r_list)*2, # Cutout out size, set to double the max radius  \n",
+    "    bkg_sub=True, # Subtract background  \n",
+    "    sigma=1, sigma_type='clip', # Fit a 2D plane to pixels within 1 sigma of the mean\n",
+    "    plot=True, vmax=vmax, vmin=vmin, # Show plot with max and min defined above\n",
+    ")\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "531fde92",
+   "metadata": {},
+   "source": [
+    "If `source_photometry`’s `plot` option is set to True, four plots are displayed: \n",
+    "- The top left plot shows the cutout with the 2D plane background subtraction and the surrounding sources masked (replaced by `np.nan`).\n",
+    "- The top right plot shows the curve of growth with increasing radius. The red lines represent the aperture radius.\n",
+    "- The bottom two plots show the source profile sliced at the center of the image in the y and x direction respectively.\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1cd59c51",
+   "metadata": {},
+   "source": [
+    "### Save Photometry Arrays\n",
+    "\n",
+    "There are many ways of saving the photometry results. For example adding the photometry to the source catalog with the radii as columns. One simple way to save the results for a single source is to save it as a `csv` file useing AstroPy `Table`. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f675dd4b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from astropy.table import Table\n",
+    "\n",
+    "t = Table(\n",
+    "    data=[r_list, flux_arr, area_arr, error_arr],\n",
+    "    names=['r_list', 'flux_arr', 'area_arr', 'error_arr'],   \n",
+    ")\n",
+    "\n",
+    "t.write('temp/abell_2744_galaxy_f105w_photometry.csv', overwrite=True)\n",
+    "\n",
+    "t[:10]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4bf8ff3d",
+   "metadata": {},
+   "source": [
+    "# Petrosian"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e375cfc3",
+   "metadata": {},
+   "source": [
+    "## Construct Petrosian from Photometry\n",
+    "\n",
+    "In this section we use photometric values stored in flux, aperture area and radii arrays to construct a `Petrosian` object. The following inputs are needed as inputs:\n",
+    "\n",
+    "* `r_list`: Array of radii in pixels.\n",
+    "\n",
+    "* `area_list`: Array of aperture areas.\n",
+    "\n",
+    "* `flux_list` : Array of photometric flux values.\n",
+    "\n",
+    "This values should reprisent the curve of growth and can be computed by using the [PetroFit photometry tools](#Photometry).\n",
+    "\n",
+    "The user can also specify the `eta` and `epsilon` values.\n",
+    "\n",
+    "* `eta` (default=0.2) is the petrosian value which defines the petrosian radius.\n",
+    "\n",
+    "\n",
+    "* `epsilon` (default=2) is used to determine the radius of total flux.\n",
+    "\n",
+    "    * `r_total_flux = r_petrosian * epsilon`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "30054dac",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.petrosian import Petrosian\n",
+    "\n",
+    "p = Petrosian(r_list, area_arr, flux_arr)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "aa5649d5",
+   "metadata": {},
+   "source": [
+    "## Petrosian Radii\n",
+    "\n",
+    "PetroFit uses the curve of growth of a galaxy’s flux to compute its Petrosian properties such as Petrosian radius and concentration index."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "74bf2a89",
+   "metadata": {},
+   "source": [
+    "### Petrosian Radius\n",
+    "\n",
+    "The Petrosian radius is defined as the radius at which the Petrosian profile reaches the Eta (`eta`, default=0.2) value."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3b795a20",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p.r_petrosian # in pixels"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a33476cc",
+   "metadata": {},
+   "source": [
+    "### Petrosian Total Flux Radius\n",
+    "\n",
+    "The Petrosian flux or total flux radius is the radius which ideally encloses all the flux of the galaxy. The Petrosian total flux radius is estimated by multiplying `r_petrosian` with `epsilon` (default=2). \n",
+    "\n",
+    "`r_total_flux = r_petrosian * epsilon`\n",
+    "\n",
+    "We can use the `r_total_flux_arcsec` function, by passing it a WCS object, to compute the total flux radius in arcsec."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c81e7bfa",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p.r_total_flux # pixels"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8ee5e5da",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p.r_total_flux_arcsec(image.wcs) # arcsec"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ae23476b",
+   "metadata": {},
+   "source": [
+    "### Petrosian Half Light Radius\n",
+    "\n",
+    "The half light radius contains half of the galaxy total flux. To compute the half light radius, we find the total flux (flux at `r_total_flux`) and divide it by half to find the “half flux” or “half light”. We then find the pixel closest to the half light value and define it as the half light radius. Please note that interpolation is used between the inputted flux radii to find the radius that best matches the half light flux.   \n",
+    "\n",
+    "We can use the `r_half_light_arcsec` function, by passing it a WCS object, to compute the half light radius in arcsec.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "87b5963c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p.r_half_light # pixels"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fb618407",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p.r_half_light_arcsec(image.wcs) # arcsec"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5dbab0bc",
+   "metadata": {},
+   "source": [
+    "### Fraction of Flux Radius\n",
+    "\n",
+    "We can compute a radius that contains a specific fraction of the total flux using the `fraction_flux_to_r` function. For example we can compute the radius that contains 60% of the total flux as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1229844c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p.fraction_flux_to_r(fraction=0.6) # pixels "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6004f5f1",
+   "metadata": {},
+   "source": [
+    "### Concentration Index\n",
+    "\n",
+    "The concentration index is the ratio two aperture radii that contain a fraction (percent) of the total flux. It is computed as follows  \n",
+    "\n",
+    "`concentration_index = 5 * np.log10( r(fraction_2) / r(fraction_1) )`\n",
+    "\n",
+    "The default is set to `fraction_1 = 0.2` and `fraction_2 = 0.8`. The `concentration_index` function returns the `r_fraction_1`, `r_fraction_2` and `concentration_index`.\n",
+    "\n",
+    "In these examples, we comput the default `C2080` and `C5090` concentration indices for the input galaxy:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "450a0274",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "r_20, r_80, c2080 = p.concentration_index()  # defualt c2080\n",
+    "\n",
+    "r_20, r_80, c2080 # Radii in pixels"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5cde8f1e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "r_50, r_90, c5090 = p.concentration_index(\n",
+    "    fraction_1=0.5, \n",
+    "    fraction_2=0.9\n",
+    ")\n",
+    "\n",
+    "r_50, r_90, c5090 # Radii in pixels"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bda683b9",
+   "metadata": {},
+   "source": [
+    "### Total Petrosian Flux \n",
+    "\n",
+    "We can also use `Petrosian` to compute the total Petrosian flux, which is defined as the flux at `r_total_flux`. If the `r_total_flux` is outside the photometric aperture radii, ``np.nan`` is returned.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "769cd8cf",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p.total_flux"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3737b4e6",
+   "metadata": {},
+   "source": [
+    "For Hubble data, we can use the `flux_to_abmag` function to convert flux values into `mags` by providing a header."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c5e01dc8",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.photometry import flux_to_abmag\n",
+    "\n",
+    "flux_to_abmag(p.total_flux, header=image.header)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2a74a785",
+   "metadata": {},
+   "source": [
+    "## Petrosian Plots\n",
+    "\n",
+    "### Profile Plot \n",
+    "The  Petrosian plot shows the Petrosian profile, the `eta` valued to define the Petrosian radius and the  Petrosian radius. The blue points are the data points and the orange curve is the interpolated values."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "61f0afdb",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Plot the Petrosian profile\n",
+    "p.plot()\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "26626023",
+   "metadata": {},
+   "source": [
+    "We can overplot the half light radius and total flux radius by setting `plot_r=True`. We can also overplot a normalized flux curve of growth by setting `plot_normalized_flux=True`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ed484e04",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Plot with radii and overplot normalized flux curve of growth\n",
+    "p.plot(plot_r=True, plot_normalized_flux=True)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "cbda2822",
+   "metadata": {},
+   "source": [
+    "### Image Overplot\n",
+    "\n",
+    "Another way to visualize the radii is to overplot them over an image. To do this we first plot the image as usual and use the ` Petrosian.imshow` function to overplot the `r_half_light`, `r_total_flux`, `r_20` and `r_80`. The ` Petrosian.imshow` requires the center of the apertures and plots the radii in pixels. Since elliptical apertures were used, we also provide the `elongation` and orientation (`theta`) of the apertures. We get these values from the source object and use utility functions (`get_source_position`,  `get_source_elong`, `get_source_theta`) to extract them: "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d51ca62c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.segmentation import get_source_position, get_source_elong, get_source_theta\n",
+    "\n",
+    "position = get_source_position(source)\n",
+    "elong = get_source_elong(source)\n",
+    "theta = get_source_theta(source)\n",
+    "\n",
+    "p.imshow(position=position, elong=elong, theta=theta, lw=1.25)\n",
+    "\n",
+    "plt.imshow(image.data, vmax=vmax, vmin=vmin)\n",
+    "\n",
+    "plt.legend()\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a02e00f3",
+   "metadata": {},
+   "source": [
+    "### Change eta and epsilon\n",
+    "\n",
+    "We can change the petrosian `eta` and `epsilon` values after the `Petrosian` object has been initiated by setting their respective attributes. After setting the attributes, all other calculations and plots will use the new values.\n",
+    "\n",
+    "In this example we copy the `Petrosian` object and change the `eta` and `epsilon` values to see how the radii change. Note how `r_half_light` and `r_total_flux` changed. Since `epsilon = 1`, `r_total_flux = r_petrosian` \n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a9e5c432",
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [],
+   "source": [
+    "from copy import copy\n",
+    "\n",
+    "p_copy = copy(p)\n",
+    "p_copy.eta = 0.3\n",
+    "p_copy.epsilon = 1\n",
+    "\n",
+    "print('eta =', p_copy.eta)\n",
+    "print('epsilon =', p_copy.epsilon)\n",
+    "print('r_half_light (old vs new) = {:0.2f} vs {:0.2f}'.format(p.r_half_light, p_copy.r_half_light))\n",
+    "print('r_total_flux (old vs new) = {:0.2f} vs {:0.2f}'.format(p.r_total_flux, p_copy.r_total_flux))\n",
+    "p_copy.plot(plot_r=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1e1fe6dd",
+   "metadata": {},
+   "source": [
+    "## Petrosian Corrections\n",
+    "\n",
+    "The most accurate value for the total flux is given when the `epsilon` value is a function of the Sersic index. As sersic index has been shown to be correlated with the concentration index,  we can use the measured concentration index to determine the correct value of `epsilon` to return the the radii at which to measure the total flux. \n",
+    "\n",
+    "\n",
+    "\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ffce04ba",
+   "metadata": {},
+   "source": [
+    "### Load Correction Grid \n",
+    "\n",
+    "As a convenience, a grid of values for `epsilon` for different concentration indices and half-light radii is provided such that the radius given by `r_total_flux = r_petrosian * epsilon` will theoretically return 99% of the flux for the source. \n",
+    "\n",
+    "To load a grid, simply pass its path to the `PetrosianCorrection` class as follows:\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "98ef1852",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from petrofit.petrosian import PetrosianCorrection\n",
+    "\n",
+    "pc = PetrosianCorrection(\"data/concentration_index_grid_f105w_60mas.yaml\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b204bb75",
+   "metadata": {},
+   "source": [
+    "### Estimate Sersic Index\n",
+    "\n",
+    "We can estimate the Sersic index `n` by passing the `estimate_n` function the uncorrected `r_half_light` and `C2080`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f5837b99",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "estimated_n = pc.estimate_n(\n",
+    "    p.r_half_light,\n",
+    "    p.concentration_index()[-1]\n",
+    ")\n",
+    "\n",
+    "estimated_n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ecf650fc",
+   "metadata": {},
+   "source": [
+    "### Estimate Corrected Epsilon\n",
+    "\n",
+    "`epsilon` is the factor we multiply the Petrosian radius with to find the total flux radius and in trun the half light radius. Here we estimate the corrected value that will result in a better estimate of the total flux radius and half light radius by passing the `estimate_epsilon` function the uncorrected `r_half_light` and `C2080`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8caf22d1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "estimated_epsilon = pc.estimate_epsilon(\n",
+    "    p.r_half_light,\n",
+    "    p.concentration_index()[-1]\n",
+    ")\n",
+    "\n",
+    "estimated_epsilon"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "34ae7114",
+   "metadata": {},
+   "source": [
+    "### Corrected Petrosian\n",
+    "\n",
+    "Now that we have a better estimate of `epsilon`, we override the default `epsilon` value. We recompute the half light radius and expect it to match the r_eff parameter above (r_eff is the half light radius). To save the original `Petrosian` object, we make a new instance with the corrected `epsilon`:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "83994012",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p_corrected = Petrosian(\n",
+    "    p.r_list,\n",
+    "    p.area_list,\n",
+    "    p.flux_list,\n",
+    "    epsilon=estimated_epsilon,\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "29fad565",
+   "metadata": {},
+   "source": [
+    "Plot the corrected Petrosian radii:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d04a9d9f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p_corrected.plot(plot_r=True, plot_normalized_flux=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "66d5484c",
+   "metadata": {},
+   "source": [
+    "We use the same `position`, `elong` and `theta` values from the [Image Overplot](#Image-Overplot) section to overplot corrected and uncorrected (in black) radii over the image. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6f19de61",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Uncorrected (Black)\n",
+    "p.imshow(position=position, elong=elong, theta=theta, color='black')\n",
+    "\n",
+    "# Corrected \n",
+    "p_corrected.imshow(position=position, elong=elong, theta=theta)\n",
+    "\n",
+    "plt.imshow(image.data, vmax=vmax, vmin=vmin)\n",
+    "plt.legend()\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d6cb52e6",
+   "metadata": {},
+   "source": [
+    "### Corrected Petrosian Total Flux"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "db00c715",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(\"Uncorrected Flux = {}\".format(p.total_flux * image.unit))\n",
+    "print(\"Corrected Flux = {}\".format(p_corrected.total_flux * image.unit))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/environment.yml b/environment.yml
new file mode 100644
index 0000000..15c0d21
--- /dev/null
+++ b/environment.yml
@@ -0,0 +1,59 @@
+# This file describes a conda environment that can be to install STIPS
+#
+# Run the following command to set up this environment:
+# $ conda env create -f environment.yml
+#
+# The environment name can be overridden with the following command:
+# $ conda env create -n <custom name> -f environment.yml
+#
+# Run the following command to activate the environment:
+# $ source activate petrofit
+#
+# To deactivate the environment run the following command:
+# $ source deactivate
+#
+# To remove the environment entirely, run the following command:
+# $ conda env remove -n petrofit
+#
+# To update an environment
+# $ conda env update -f environment.yml
+
+name: petrofit
+
+channels:
+  - conda-forge
+  - astropy
+  - http://ssb.stsci.edu/astroconda
+  - defaults
+
+dependencies:
+  # Base dependencies
+  - pip
+  - python>=3.7
+  - Cython
+  - numpy>=1.13
+  - scipy
+  - matplotlib>=3.1.1
+  - astropy
+  - jupyter
+  - notebook
+
+  # Dependencies
+  - photutils>=1.1.0
+  - ipywidgets
+
+  # Docs
+  - sphinx
+  - docutils
+  - nbsphinx
+
+
+  - pip:
+    - tox
+
+    # Docs
+    - astropy_helpers
+    - extension_helpers
+    - sphinx_astropy
+    - sphinx_rtd_theme
+    - sphinx-automodapi
diff --git a/petrofit/__init__.py b/petrofit/__init__.py
index 65b8d0e..6806c70 100644
--- a/petrofit/__init__.py
+++ b/petrofit/__init__.py
@@ -6,4 +6,10 @@
 from ._astropy_init import *   # noqa
 # ----------------------------------------------------------------------------
 
-__all__ = []
+from .correction import *
+from .fitting import *
+from .models import *
+from .petrosian import *
+from .photometry import *
+from .segmentation import *
+from .utils import *
diff --git a/petrofit/correction.py b/petrofit/correction.py
new file mode 100644
index 0000000..dee828b
--- /dev/null
+++ b/petrofit/correction.py
@@ -0,0 +1,188 @@
+from copy import copy
+import yaml
+
+import numpy as np
+
+from matplotlib import pyplot as plt
+
+from scipy.interpolate import interp1d
+from scipy.special import gammaincinv
+
+from astropy.utils.console import ProgressBar
+from astropy.modeling import models
+
+from petrofit.models import PSFModel, sersic_enclosed, sersic_enclosed_inv
+from petrofit.photometry import photometry_step
+from petrofit.fitting import model_to_image
+from petrofit.petrosian import Petrosian
+
+
+__all__ = ['generate_petrosian_sersic_correction']
+
+
+def generate_petrosian_sersic_correction(output_yaml_name, psf=None, r_eff_list=None, n_list=None,
+                                         oversample=('x_0', 'y_0', 10, 10), plot=True):
+    """
+    This function generates corrections for Petrosian radii by simulating a galaxy image and measuring its properties.
+    This is done to identify the correct `epsilon` value that, multiplied with `r_petrosian`, would give `r_total_flux`.
+    To achieve this, an image created from a Sersic model and convolved with a PSF (if provided). The Petrosian radii
+    and concentrations are computed using the default `epsilon` = 2. Since the real `r_total_flux` of the simulated galaxy
+    is known, the correct `epsilon` can be determined by `epsilon = r_petrosian / r_total_flux`. The resulting grid will
+    be used to map measured `r_petrosian` and `C2080` to the correct `epsilon` value. After the gird is computed, it
+    will be saved to a yaml file which is readable by `petrofit.petrosian.PetrosianCorrection`.
+
+    Parameters
+    ----------
+    output_yaml_name : str
+        Name of output file, must be .yaml or .yml
+
+    psf : numpy.array
+        2D PSF image to pass to `petrofit.fitting.models.PSFModel`
+
+    r_eff_list : list, (optional)
+        List of `r_eff` (half light radii) in pixels to evaluate.
+
+    n_list : list, (optional)
+        List of Sersic indices to evaluate.
+
+    oversample : int or tuple
+        oversampling to pass to `petrofit.fitting.models.PSFModel`
+
+    plot : bool
+        Shows plot of photometry and Petrosian
+
+    Returns
+    -------
+    petrosian_grid : dict
+        Dictionary that is readable by `petrofit.petrosian.PetrosianCorrection`
+        Also saves Yaml file that is readable by `petrofit.petrosian.PetrosianCorrection`.
+    """
+
+    if r_eff_list is None:
+        r_eff_list = np.arange(10, 100 + 5, 5)
+
+    if n_list is None:
+        n_list = np.arange(1, 6.0 + 0.5, 0.5)
+
+    petrosian_grid = {}
+
+    with ProgressBar(len(r_eff_list) * len(n_list), ipython_widget=True) as bar:
+
+        for r_eff_idx, r_eff in enumerate(r_eff_list):
+
+            c_pet_list_output = []
+            n_list_output = []
+            r_p_list_output = []
+            epsilon_list_output = []
+            r_p_hl_list_output = []
+
+            for n_idx, n in enumerate(n_list):
+                bar.update()
+
+                n = np.round(n, 2)
+                amplitude = 100 / np.exp(gammaincinv(2. * n, 0.5))
+
+                # Total flux
+                total_flux = sersic_enclosed(
+                    np.inf,
+                    amplitude=amplitude,
+                    r_eff=r_eff,
+                    n=n
+                )
+                total_flux = total_flux * 0.99
+
+                # Total flux radius
+                r_total_flux = sersic_enclosed_inv(
+                    total_flux,
+                    amplitude=amplitude,
+                    r_eff=r_eff,
+                    n=n
+                )
+                ori_r_total_flux = r_total_flux
+                max_r = r_total_flux * 2 if n < 2 else r_total_flux * 1.2
+
+                # Make r_list
+                if max_r >= 200:
+                    r_list = [x for x in range(1, 201, 2)]
+                    r_list += [x for x in range(300, int(max_r) + 100, 100)]
+                else:
+                    r_list = [x for x in range(1, int(max_r) + 2, 2)]
+                r_list = np.array(r_list)
+
+                image_size = max(r_list) * 2
+
+                x_0 = image_size // 2
+                y_0 = image_size // 2
+
+                # Define model
+                galaxy_model = models.Sersic2D(
+                    amplitude=amplitude,
+                    r_eff=r_eff,
+                    n=n,
+                    x_0=x_0,
+                    y_0=y_0,
+                    ellip=0.,
+                    theta=0.,
+                )
+
+                # PSF weap
+                galaxy_model = PSFModel.wrap(galaxy_model, psf=psf, oversample=oversample)
+
+                galaxy_image = model_to_image(x_0, y_0, image_size, galaxy_model)
+
+                flux_list, area_list, err = photometry_step((image_size // 2, image_size // 2), r_list, galaxy_image,
+                                                            plot=plot,
+                                                            vmax=amplitude / 100)
+                plt.show()
+
+                if plot:
+                    print(r_eff, n, r_total_flux)
+                    plt.show()
+
+                # Petrosian from Photometry
+                p = Petrosian(r_list, area_list, flux_list)
+                rc1, rc2, c_index = p.concentration_index()
+                if np.any(np.isnan(np.array([rc1, rc2, c_index]))):
+                    raise Exception("concentration_index cant be computed")
+
+                # Compute new r_total_flux
+                u, indices = np.unique(flux_list, return_index=True)
+                indices = np.array(indices)
+                f = interp1d(flux_list[indices], r_list[indices], kind='linear')
+                corrected_r_total_flux = f(total_flux)
+
+                # Compute corrections
+                corrected_epsilon = corrected_r_total_flux / p.r_petrosian
+                corrected_p = copy(p)
+                corrected_p.epsilon = corrected_epsilon
+                if plot:
+                    corrected_p.plot(True, True)
+                    plt.show()
+                    print(corrected_epsilon)
+                    print(r_eff, p.r_half_light, corrected_p.r_half_light)
+                    print(ori_r_total_flux, p.r_total_flux, corrected_p.r_total_flux, corrected_r_total_flux)
+                    print(" ")
+
+                c_pet_list_output.append(p.concentration_index()[-1])
+                n_list_output.append(n)
+                r_p_list_output.append(p.r_petrosian)
+                epsilon_list_output.append(corrected_epsilon)
+                r_p_hl_list_output.append(corrected_p.r_half_light)
+
+                del galaxy_model, galaxy_image
+
+            petrosian_grid[r_eff] = {
+                'c_index': c_pet_list_output,
+                'n': n_list_output,
+                'epsilon': epsilon_list_output,
+
+                'r_petrosian': r_p_list_output,
+                'r_hl_petrosian': r_p_hl_list_output
+            }
+
+    if output_yaml_name is not None:
+        with open(output_yaml_name, 'w') as outfile:
+            print(outfile.name)
+            yaml.dump(petrosian_grid, outfile)
+
+    return petrosian_grid
\ No newline at end of file
diff --git a/petrofit/fitting.py b/petrofit/fitting.py
new file mode 100644
index 0000000..871e708
--- /dev/null
+++ b/petrofit/fitting.py
@@ -0,0 +1,251 @@
+import numpy as np
+
+from astropy.modeling import models, fitting, Parameter
+from astropy.modeling.optimizers import DEFAULT_ACC, DEFAULT_EPS
+
+from matplotlib import pyplot as plt
+
+__all__ = [
+    'fit_model', 'model_to_image', 'fit_plane',
+    'fit_gaussian2d', 'print_model_params', 'plot_fit'
+]
+
+
+def fit_model(image, model, maxiter=5000, epsilon=DEFAULT_EPS, acc=DEFAULT_ACC):
+    """
+    Wrapper function to conveniently fit an image to an input model.
+
+    Parameters
+    ----------
+    image : array
+        2D array to fit.
+
+    model : `~astropy.modeling.FittableModel`
+        AstroPy model to sample from.
+
+    maxiter : int
+        maximum number of iterations
+
+    epsilon : float
+        A suitable step length for the forward-difference
+        approximation of the Jacobian (if model.fjac=None). If
+        epsfcn is less than the machine precision, it is
+        assumed that the relative errors in the functions are
+        of the order of the machine precision.
+
+    acc : float
+        Relative error desired in the approximate solution
+
+    Returns
+    -------
+    fitted_model, fitter
+
+        * fitted_model : `~astropy.modeling.FittableModel`
+            A copy of the input model with parameters set by the fitter.
+
+        * fitter : LevMarLSQFitter
+            Fitter used to estimate and set model parameters.
+    """
+
+    # Make x and y grid to fit to
+    y_arange, x_arange = np.where(~(np.isnan(image)))
+
+    z = image[(y_arange, x_arange)]
+
+    # Fit model to grid
+    fitter = fitting.LevMarLSQFitter()
+    fitted_model= fitter(model, x_arange, y_arange, z, maxiter=maxiter, epsilon=epsilon, acc=acc)
+
+    return fitted_model, fitter
+
+
+def model_to_image(x, y, size, model):
+    """
+    Construct an image from a model.
+
+    Parameters
+    ----------
+    x : int
+        x center of sampling grid.
+
+    y : int
+        y center of sampling grid.
+
+    size : int
+        Size of sampling pixel grid.
+
+    model : `~astropy.modeling.FittableModel`
+        AstroPy model to sample from.
+
+    Returns
+    -------
+    model_image : array
+        2D image of the model.
+    """
+    y_arange, x_arange = np.mgrid[
+                         int(y) - size//2:int(y) + size//2,
+                         int(x) - size//2:int(x) + size//2, ]
+    return model(x_arange, y_arange)
+
+
+def fit_plane(image):
+    """
+    Given an image, fit a 2D plane.
+
+    Parameters
+    ----------
+    image : array
+        2D array to fit.
+
+    Returns
+    -------
+    model : `~astropy.modeling.models.Planar2D`
+        Plane model with best fit params
+    """
+    model = models.Planar2D(slope_x=0., slope_y=0, intercept=0)
+
+    # Make x and y grid to fit to
+    y_arange, x_arange = np.where(~(np.isnan(image)))
+
+    z = image[(y_arange, x_arange)]
+
+    # Fit model to grid
+    fit = fitting.LinearLSQFitter()
+    fitted_plane = fit(model, x_arange, y_arange, z)
+
+    return fitted_plane, fit
+
+
+def fit_gaussian2d(image):
+    """
+    Fit a 2D gaussian to a source in an image.
+
+    Parameters
+    ----------
+    image : array
+        2D array to fit.
+
+    Returns
+    -------
+    fitted_model : `~astropy.modeling.models.Gaussian2D`
+        AstroPy Gaussian2D model with parameters set by the fitter.
+    """
+
+    # Estimate center of target
+    y_mean, x_mean = np.array(image.shape) // 2  # Center guess
+
+    # Create model to fit
+    model = models.Gaussian2D(amplitude=image.max(),
+                              x_mean=x_mean,
+                              y_mean=y_mean,
+                              fixed={}
+                              )
+
+    # Fit model to grid
+    fitted_model, fit = fit_model(image, model)
+
+    return fitted_model
+
+
+def print_model_params(model):
+    """Print the params and values of an AstroPy model"""
+    for param, value in zip(model.param_names, model.parameters):
+        print("{:0.4f}\t{}".format(value,param))
+
+
+def plot_fit(image, model, vmin=None, vmax=None):
+    """
+    Plot fitted model, its 1D fit profile and residuals.
+
+    Parameters
+    ----------
+    image : array
+        2D array that was fit by the model.
+
+    model : `~astropy.modeling.FittableModel`
+        Fitted AstroPy model.
+
+    vmin : float
+        Min plot value
+
+    vmax : float
+        Max plot value
+    """
+    if isinstance(model, models.Sersic2D):
+        x_0, y_0 = model.x_0, model.y_0  # Center
+    elif isinstance(model, models.Gaussian2D):
+        x_0, y_0 = [i.value for i in [model.x_mean, model.y_mean]]
+    else:
+        x_0, y_0 = model.x_0, model.y_0  # Center
+
+    if isinstance(x_0, Parameter):
+        x_0, y_0 = [int(i.value) for i in [x_0, y_0]]
+
+    fig = plt.figure(figsize=(12, 12))
+
+    # Make x and y grid to plot to
+    y_arange, x_arange = np.mgrid[:image.shape[0], :image.shape[1]]
+
+    # Plot input image with FWHM and center
+    # -------------------------------------
+    ax0 = fig.add_subplot(221)
+
+    ax0.imshow(image, vmin=vmin, vmax=vmax)
+    ax0.axvline(x_0, label="Center")
+    ax0.axhline(y_0)
+
+    ax0.set_title("Image")
+    ax0.set_xlabel("X Pixel")
+    ax0.set_ylabel("Y Pixel")
+
+    ax0.legend()
+
+    # Plot residuals
+    # ---------------
+
+    residuals = image - model(x_arange, y_arange)
+    # residuals[np.where(residuals < 0)] = 0.
+    ax1 = fig.add_subplot(222)
+    ax1.imshow(residuals, vmin=vmin, vmax=vmax)
+
+    ax1.set_title("Residual (Image - Fit)")
+    ax1.set_xlabel("X Pixel")
+    ax1.set_ylabel("Y Pixel")
+
+    # Prepare fine grid
+    # -----------------
+
+    # We need a fine grid to fill in inter-pixel values
+    # Oversample by a factor of 10
+
+    y_arange_fine, x_arange_fine = np.mgrid[:image.shape[0] * 10, :image.shape[1] * 10] / 10
+
+    fine_image = model(x_arange_fine, y_arange_fine)
+    x_slice_fine = fine_image[fine_image.shape[0] // 2, :]
+    y_slice_fine = fine_image[:, fine_image.shape[1] // 2]
+
+    # Plot X fit
+    # ----------
+
+    ax2 = fig.add_subplot(223)
+
+    ax2.plot(x_arange_fine[1, :], x_slice_fine, c='r')
+    ax2.scatter(x_arange[1, :], image[int(np.round(y_0)), :], c='black')
+
+    ax2.set_title("X Cross Section")
+    ax2.set_xlabel("X Pixel")
+    ax2.set_ylabel("Flux")
+
+    # Plot Y fit
+    # ----------
+
+    ax3 = fig.add_subplot(224)
+
+    ax3.plot(y_arange_fine[:, 1], y_slice_fine, c='r')
+    ax3.scatter(y_arange[:, 1], image[:, int(np.round(x_0))], c='black')
+
+    ax3.set_title("Y Cross Section")
+    ax3.set_xlabel("Y Pixel")
+    ax3.set_ylabel("Flux")
+
+    return fig, [ax0, ax1, ax2, ax3]
\ No newline at end of file
diff --git a/petrofit/models.py b/petrofit/models.py
new file mode 100644
index 0000000..3e6edf1
--- /dev/null
+++ b/petrofit/models.py
@@ -0,0 +1,292 @@
+import os
+from collections import OrderedDict
+
+import numpy as np
+
+from scipy.ndimage import rotate
+from scipy.special import gammainc, gamma, gammaincinv
+
+from astropy.convolution import convolve
+from astropy.nddata import block_reduce
+from astropy.modeling import FittableModel, Parameter, custom_model, models
+
+__all__ = [
+    'make_grid', 'PSFModel',
+    'Nuker2D', 'Moffat2D', 'EllipMoffat2D',
+    'sersic_enclosed', 'sersic_enclosed_inv', 'sersic_enclosed_model',
+    'petrosian_profile', 'petrosian_model', 
+]
+
+
+def make_grid(size, factor=1):
+    assert isinstance(factor, int)
+    x_arange = y_arange = (np.arange(0.5, size * factor, 1) / factor) - 0.5
+    return np.meshgrid(x_arange, y_arange)
+
+
+class PSFModel(FittableModel):
+    oversample = None
+
+    _cache_grid = True
+    _cached_grid_size = 0
+    _cached_grid_factor = 0
+    _cached_grid = None
+
+    def clear_cached_grid(self):
+        self._cached_grid_size = 0
+        self._cached_grid_factor = 0
+        if self._cached_grid is not None:
+            del self._cached_grid
+        self._cached_grid = None
+
+    @property
+    def cache_grid(self):
+        return self._cache_grid
+
+    @cache_grid.setter
+    def cache_grid(self, value):
+        if value == False:
+            self._cache_grid = False
+            self.clear_cached_grid()
+        elif value == True:
+            self._cache_grid = True
+        else:
+            raise ValueError("{} is not a bool, use True or False".format(value))
+
+    def evaluate(self, *args, **kwargs):
+        psf_p = args[-1]
+        args = args[:-1]
+
+        x = args[0]
+        y = args[1]
+
+        assert not np.any(x < 0), 'negative pixel values not supported at this time'
+        assert not np.any(y < 0), 'negative pixel values not supported at this time'
+
+        grid_size = max([i.max() + 1 for i in [x, y]])
+        grid_factor = self.oversample if isinstance(self.oversample, int) else 1
+
+        if grid_size == self._cached_grid_size and self._cached_grid_factor == grid_factor:
+            main_grid = self._cached_grid
+        else:
+            main_grid = make_grid(grid_size, factor=grid_factor)
+
+            if self.cache_grid:
+                self._cached_grid = main_grid
+                self._cached_grid_size = grid_size
+                self._cached_grid_factor = grid_factor
+
+        x_grid, y_grid = main_grid
+
+        model_image = self._model.evaluate(x_grid, y_grid, *args[self.n_inputs:])
+
+        if isinstance(self.oversample, int):
+            model_image = block_reduce(model_image, grid_factor) / grid_factor ** 2
+
+        elif isinstance(self.oversample, tuple):
+            sub_grid_x0, sub_grid_y0, sub_grid_size, sub_grid_factor = self.oversample
+
+            if isinstance(sub_grid_x0, str):
+                assert sub_grid_x0 in self._model.param_names, "oversample param '{}' is not in the wrapped model param list".format(
+                    sub_grid_x0)
+
+                idx = self._model.param_names.index(sub_grid_x0)
+                sub_grid_x0 = args[self.n_inputs:][idx][0]
+
+            if isinstance(sub_grid_y0, str):
+                assert sub_grid_y0 in self._model.param_names, "oversample param '{}' is not in the wrapped model param list".format(
+                    sub_grid_y0)
+
+                idx = self._model.param_names.index(sub_grid_y0)
+                sub_grid_y0 = args[self.n_inputs:][idx][0]
+
+            x_sub_grid, y_sub_grid = make_grid(sub_grid_size, factor=sub_grid_factor)
+
+            x_sub_grid += int(sub_grid_x0) - sub_grid_size // 2
+            y_sub_grid += int(sub_grid_y0) - sub_grid_size // 2
+
+            sub_model_oversampled_image = self._model.evaluate(x_sub_grid, y_sub_grid, *args[self.n_inputs:])
+
+            # Experimental  
+            # over_sampled_sub_model_x0 = np.argmin(
+            #     np.abs(x_sub_grid[0, :] - 1 / (2 * sub_grid_factor) - (sub_grid_x0 * sub_grid_factor)))
+            # over_sampled_sub_model_y0 = np.argmin(
+            #     np.abs(y_sub_grid[:, 0] - 1 / (2 * sub_grid_factor) - (sub_grid_y0 * sub_grid_factor)))
+            #
+            # sub_model_oversampled_image[
+            #     over_sampled_sub_model_y0,
+            #     over_sampled_sub_model_x0
+            # ] = self._model.evaluate(sub_grid_x0, sub_grid_y0, *args[self.n_inputs:])
+
+            sub_model_image = block_reduce(sub_model_oversampled_image, sub_grid_factor) / sub_grid_factor ** 2
+
+            x_sub_min = int(x_sub_grid[0][0] - 1 / (2 * sub_grid_factor)) + 1
+            y_sub_min = int(y_sub_grid[0][0] - 1 / (2 * sub_grid_factor)) + 1
+
+            model_image[
+            y_sub_min: y_sub_min + sub_grid_size,
+            x_sub_min: x_sub_min + sub_grid_size
+            ] = sub_model_image
+
+        if self.psf is None:
+            return model_image[y.astype(int), x.astype(int)]
+
+        else:
+            psf = self.psf
+            if psf_p[0] != 0:
+                psf = rotate(psf, psf_p[0], reshape=False)
+            return convolve(model_image, psf)[y.astype(int), x.astype(int)]
+
+    @property
+    def model(self):
+
+        model = self._model.copy()
+        for param in model.param_names:
+            setattr(model, param, getattr(self, param).value)
+
+        fixed = self.fixed
+        del fixed['psf_pa']
+
+        bounds = self.bounds
+        del bounds['psf_pa']
+
+        model.fixed.update(fixed)
+        model.bounds.update(bounds)
+
+        return model
+
+    @staticmethod
+    def wrap(model, psf=None, oversample=None):
+        if isinstance(model, PSFModel):
+            raise TypeError("Can not wrap a PSFModel, try: PSFModel.wrap(psf_model.model)")
+
+        # Extract model params
+        params = OrderedDict(
+            (param_name, Parameter(param_name, default=param_val)) for param_name, param_val in
+            zip(model.param_names, model.parameters)
+        )
+
+        # Prepare class attributes
+        members = OrderedDict([
+            ('__module__', '__main__'),
+            ('__doc__', 'PSF Wrapped Model\n{}'.format(model.__doc__)),
+            ('n_inputs', model.n_inputs),
+            ('n_outputs', model.n_outputs),
+            ('psf', psf),
+            ('_model', model),
+        ])
+
+        # Add params to class attributes
+        members.update(params)
+        members.update({'psf_pa': Parameter('psf_pa', default=0)})
+
+        # Construct new model class
+        model_class = type('PSFModel', (PSFModel,), members)
+
+        # Init new model from new model class
+        new_model = model_class()
+
+        # Sync model states
+        new_model.fixed.update(model.fixed)
+        new_model.bounds.update(model.bounds)
+
+        # add oversample regions
+        if oversample is not None:
+            if isinstance(oversample, int) or isinstance(oversample, tuple):
+                new_model.oversample = oversample
+            else:
+                raise ValueError("oversample should be a single int factor or a tuple (x, y, size, factor).")
+
+        # Return new model
+        return new_model
+
+
+@custom_model
+def Nuker2D(x, y, amplitude=1, r_eff=1, x_0=0, y_0=0, a=1, b=2, g=0, ellip=0, theta=0):
+    """Two dimensional Nuker2D model"""
+    A, B = 1 * r_eff, (1 - ellip) * r_eff
+    cos_theta, sin_theta = np.cos(theta), np.sin(theta)
+    x_maj = (x - x_0) * cos_theta + (y - y_0) * sin_theta
+    x_min = -(x - x_0) * sin_theta + (y - y_0) * cos_theta
+    r = np.sqrt((x_maj / A) ** 2 + (x_min / B) ** 2)
+
+    return 2 ** ((b - g) / a) * amplitude * (r_eff / r) ** (g) * (1 + (r / r_eff) ** a) ** ((g - b) / a)
+
+
+@custom_model
+def Moffat2D(x, y, amplitude=1.0, x_0=0.0, y_0=0.0, gamma=1.0, alpha=1.0):
+    """Two dimensional Moffat function."""
+    rr_gg = ((x - x_0) ** 2 + (y - y_0) ** 2) / gamma ** 2
+    return amplitude * (1 + rr_gg) ** (-alpha)
+
+
+@custom_model
+def EllipMoffat2D(x, y, amplitude=1.0, x_0=0.0, y_0=0.0, gamma=1.0, alpha=1.0, ellip=0, theta=0, r=1):
+    """Two dimensional Moffat function."""
+
+    a, b = 1 * r, (1 - ellip) * r
+    cos_theta, sin_theta = np.cos(theta), np.sin(theta)
+    x_maj = (x - x_0) * cos_theta + (y - y_0) * sin_theta
+    x_min = -(x - x_0) * sin_theta + (y - y_0) * cos_theta
+    z = np.sqrt((x_maj / a) ** 2 + (x_min / b) ** 2)
+
+    rr_gg = (z) / gamma ** 2
+
+    return amplitude * (1 + rr_gg) ** (-alpha)
+
+
+def sersic_enclosed(
+        r,
+        amplitude,
+        r_eff,
+        n,
+):
+    bn = gammaincinv(2. * n, 0.5)
+    x = bn * (r / r_eff) ** (1 / n)
+    g = gamma(2. * n) * gammainc(2. * n, x)
+
+    return amplitude * (r_eff) ** 2 * 2 * np.pi * n * ((np.exp(bn)) / (bn) ** (2 * n)) * g
+
+
+def sersic_enclosed_inv(
+        f,
+        amplitude,
+        r_eff,
+        n,
+):
+    bn = gammaincinv(2. * n, 0.5)
+    g = f / (amplitude * (r_eff) ** 2 * 2 * np.pi * n * ((np.exp(bn)) / (bn) ** (2 * n)))
+
+    x = gammaincinv(2. * n, g / gamma(2. * n))
+
+    return (x / bn) ** n * r_eff
+
+
+@custom_model
+def sersic_enclosed_model(
+        x,
+        amplitude=1000,
+        r_eff=30,
+        n=2,
+):
+    return sersic_enclosed(x, amplitude, r_eff, n)
+
+
+def petrosian_profile(r, r_eff, n):
+    bn = gammaincinv(2. * n, 0.5)
+
+    x = bn * (r / r_eff) ** (1 / n)
+
+    g = gamma(2 * n) * gammainc(2 * n, x)
+
+    return (np.exp(-x) * x ** (2 * n)) / (2 * n * g)
+
+
+@custom_model
+def petrosian_model(
+    x, 
+    r_eff=1, 
+    n=4
+
+):
+    return petrosian_profile(x, r_eff, n)
diff --git a/petrofit/petrosian.py b/petrofit/petrosian.py
new file mode 100644
index 0000000..c0abc03
--- /dev/null
+++ b/petrofit/petrosian.py
@@ -0,0 +1,663 @@
+import yaml
+
+import numpy as np
+
+from scipy.interpolate import interp1d
+
+from matplotlib import pyplot as plt
+
+from sklearn.tree import DecisionTreeRegressor
+
+from .utils import closest_value_index, get_interpolated_values, pixel_to_angular
+from .photometry import radial_elliptical_aperture
+
+__all__ = [
+    'plot_petrosian', 'calculate_petrosian', 'calculate_petrosian_r', 'discrete_petrosian_r',
+    'calculate_r_total_flux', 'fraction_flux_to_r', 'calculate_r_half_light',
+    'calculate_concentration_index', 'estimate_n', 'Petrosian', 'PetrosianCorrection'
+]
+
+
+def plot_petrosian(r_list, area_list, flux_list, epsilon=2., eta=0.2, plot_r=False):
+    """
+    Given photometric values, plots petrosian profile.
+
+    Parameters
+    ----------
+    r_list : numpy.array
+        Array of radii in pixels.
+
+    area_list : numpy.array
+        Array of aperture areas.
+
+    flux_list : numpy.array
+        Array of photometric flux values.
+
+    epsilon : float
+        Epsilon value (used to determine `r_total_flux`).
+        N.B: `r_total_flux` = `r_petrosian` * `epsilon`
+
+    eta : float, default=0.2
+        Eta is the petrosian value which defines the `r_petrosian`.
+
+    plot_r : bool
+        If set to True, `r_half_light` and `r_total_flux` will be plotted.
+    """
+    petrosian_list = calculate_petrosian(area_list, flux_list)
+
+    r_list_new, petrosian_list_new = get_interpolated_values(r_list[1:], petrosian_list[1:])
+
+    plt.plot(r_list, petrosian_list, marker='o', linestyle='None', label='Data')
+    plt.plot(r_list_new, petrosian_list_new, label='Interpolated [cubic]')
+
+    r_petrosian = calculate_petrosian_r(r_list, area_list, flux_list, eta=eta)
+    if not np.isnan(r_petrosian):
+        plt.axvline(r_petrosian, linestyle='--', label="r_petrosian={:0.4f} pix".format(r_petrosian))
+        plt.axhline(eta, linestyle='--', label='eta={:0.4f}'.format(eta))
+
+    r_total = calculate_r_total_flux(r_list, area_list, flux_list, epsilon, eta)
+    if not np.isnan(r_total) and plot_r:
+        plt.axvline(r_total, linestyle='--', label="r_total={:0.4f} pix".format(r_total), c='black')
+
+    r_half_light = calculate_r_half_light(r_list, flux_list, r_total)
+    if not np.isnan(r_half_light) and plot_r:
+        plt.axvline(r_half_light, linestyle='--', label="r_half_light={:0.4f} pix".format(r_half_light), c='gray')
+
+    plt.legend(loc='best')
+
+    plt.title("Petrosian")
+    plt.xlabel("Aperture Radius [Pix]")
+    plt.ylabel("Petrosian Value")
+
+
+def calculate_petrosian(area_list, flux_list):
+    """
+    Given a list of aperture areas and associated fluxes, computes the petrosian curve.
+
+    Parameters
+    ----------
+    area_list : numpy.array
+        Array of aperture areas.
+
+    flux_list : numpy.array
+        Array of photometric flux values.
+
+    Returns
+    -------
+    petrosian_list : numpy.array
+        Array of petrosian values at each value of `area_list`
+    """
+
+    petrosian_list = []
+
+    last_area = area_list[0]
+    last_I = flux_list[0]
+    petrosian_value = np.nan
+    for i in range(len(area_list)):
+        area = area_list[i]
+        I = flux_list[i]
+
+        if area != last_area:
+            area_of_slice = area - last_area
+            I_at_r = (I - last_I) / area_of_slice
+
+            area_within_r = area
+            I_avg_within_r = (I / area_within_r)
+
+            petrosian_value = I_at_r / I_avg_within_r
+
+        petrosian_list.append(petrosian_value)
+
+        last_area = area
+        last_I = I
+
+    return np.array(petrosian_list)
+
+
+def calculate_petrosian_r(r_list, area_list, flux_list, eta=0.2):
+    """
+    Calculate petrosian radius from photometric values using interpolation.
+    The petrosian radius is defined as the radius at which the petrosian profile equals eta.
+
+    Parameters
+    ----------
+    r_list : numpy.array
+        Array of radii in pixels.
+
+    area_list : numpy.array
+        Array of aperture areas.
+
+    flux_list : numpy.array
+        Array of photometric flux values.
+
+    eta : float, default=0.2
+        Eta is the petrosian value which defines the `r_petrosian`.
+
+    Returns
+    -------
+    r_petrosian : float or numpy.nan
+        Petrosian radius
+    """
+    petrosian_list = calculate_petrosian(area_list, flux_list)
+
+    # replace the first element with r=0 and petrosian=1
+    # This is because the petrosian for the first radius in r_list can not be
+    # computed, we instead replace that value with r=0, since that value is known to equal 0.
+    r_list[0] = 0
+    petrosian_list[0] = 1
+
+    # Interpolate values
+    r_list_new, petrosian_list_new = get_interpolated_values(r_list, petrosian_list)
+
+    idx = closest_value_index(eta, petrosian_list_new)
+
+    return np.nan if idx is None else r_list_new[idx]
+
+
+def discrete_petrosian_r(r_list, area_list, flux_list, eta=0.2):
+    """
+    Calculate petrosian radius from photometric values by using the nearest value petrosian to eta.
+    The petrosian radius is defined as the radius at which the petrosian profile equals eta.
+
+    Parameters
+    ----------
+    r_list : numpy.array
+        Array of radii in pixels.
+
+    area_list : numpy.array
+        Array of aperture areas.
+
+    flux_list : numpy.array
+        Array of photometric flux values.
+
+    eta : float, default=0.2
+        Eta is the petrosian value which defines the `r_petrosian`.
+
+    Returns
+    -------
+    r_petrosian : float or numpy.nan
+        Petrosian radius
+    """
+
+    petrosian_list = calculate_petrosian(area_list, flux_list)
+    idx_list = np.where(petrosian_list <= eta)[0]
+
+    r_petrosian = np.nan
+    if idx_list.size > 0:
+        idx = idx_list[0]
+        r_petrosian = r_list[idx]
+
+    return r_petrosian
+
+
+def calculate_r_total_flux(r_list, area_list, flux_list, epsilon=2., eta=0.2, verbose=False):
+    """
+    Given photometric values, calculate Petrosian `r_total_flux`.
+
+    Parameters
+    ----------
+    r_list : numpy.array
+        Array of radii in pixels.
+
+    area_list : numpy.array
+        Array of aperture areas.
+
+    flux_list : numpy.array
+        Array of photometric flux values.
+
+    epsilon : float
+        Epsilon value (used to determine `r_total_flux`).
+        N.B: `r_total_flux` = `r_petrosian` * `epsilon`
+
+    eta : float, default=0.2
+        Eta is the petrosian value which defines the `r_petrosian`.
+
+    Returns
+    -------
+    r_total_flux : float or numpy.nan
+        Total flux radius determined by the Petrosian profile.
+    """
+
+    r_petrosian = calculate_petrosian_r(r_list, area_list, flux_list, eta=eta)
+    if np.isnan(r_petrosian):
+        if verbose:
+            print("r_petrosian could not be computed")
+        return np.nan
+
+    return r_petrosian * epsilon
+
+
+def fraction_flux_to_r(r_list, flux_list, r_total_flux, fraction=0.5):
+    """
+    Given photometric values and `r_total_flux`, calculate radius which encloses a specified
+    fraction of the total flux.
+
+    Parameters
+    ----------
+    r_list : numpy.array
+        Array of radii in pixels.
+
+    flux_list : numpy.array
+        Array of photometric flux values.
+
+    r_total_flux : float
+        Total flux radius (hint: `petrofit.petrosian.calculate_r_total_flux` can be used to measure this).
+
+    fraction : float
+        Fraction of flux total flux enclosed in target radius.
+
+    Returns
+    -------
+    r_fraction_flux : float or numpy.nan
+        Radius which encloses a specified fraction of the total flux (determined by the Petrosian profile).
+    """
+
+    if r_total_flux > max(r_list):
+        return np.nan
+
+    f = interp1d(r_list, flux_list, kind='cubic')
+    total_flux = f(r_total_flux)
+    fractional_flux = total_flux * fraction
+
+    r_list_new, flux_list_new = get_interpolated_values(r_list, flux_list)
+
+    # idx = abs(flux_list_new - fractional_flux).argmin()
+    idx = closest_value_index(fractional_flux, flux_list_new, growing=True)
+    return np.nan if idx is None else r_list_new[idx]
+
+
+def calculate_r_half_light(r_list, flux_list, r_total_flux):
+    """
+    Given photometric values, calculate Petrosian `r_half_light`.
+
+    Parameters
+    ----------
+    r_list : numpy.array
+        Array of radii in pixels.
+
+    flux_list : numpy.array
+        Array of photometric flux values.
+
+    r_total_flux : float
+        Total flux radius (hint: `petrofit.petrosian.calculate_r_total_flux` can be used to measure this).
+
+    Returns
+    -------
+    r_half_light : float or numpy.nan
+        Radius containing half of total flux.
+    """
+    return fraction_flux_to_r(r_list, flux_list, r_total_flux, fraction=0.5)
+
+
+def calculate_concentration_index(r_list, flux_list, r_total_flux, fraction_1=0.2, fraction_2=0.8):
+    """
+    Calculates Petrosian concentration index.
+
+    ``concentration_index = 5 * np.log10( r(fraction_2) / r(fraction_1) )``
+
+    Parameters
+    ----------
+    r_list : numpy.array
+        Array of radii in pixels.
+
+    flux_list : numpy.array
+        Array of photometric flux values.
+
+    r_total_flux : float
+        Total flux radius (hint: `petrofit.petrosian.calculate_r_total_flux` can be used to measure this).
+
+    fraction_1 : float
+        Fraction of total light enclosed by the radius in the denominator.
+
+    fraction_2 : float
+        Fraction of total light enclosed by the radius in the numerator.
+
+    Returns
+    -------
+    r_fraction_1, r_fraction_2, concentration_index
+
+        * r_fraction_1 : float or np.nan
+            Radius containing `fraction_1` of the total flux.
+
+        * r_fraction_2: float or np.nan
+            Radius containing `fraction_2` of the total flux.
+
+        * concentration_index : float or np.nan
+            Concentration index
+    """
+
+    if r_total_flux > max(r_list):
+        return [np.nan, np.nan, np.nan]
+
+    r1 = fraction_flux_to_r(r_list, flux_list, r_total_flux, fraction=fraction_1)
+    r2 = fraction_flux_to_r(r_list, flux_list, r_total_flux, fraction=fraction_2)
+
+    # if np.any(np.isnan(np.array([r1, r2]))):
+    #     return [np.nan, np.nan, np.nan]
+
+    return r1, r2, 5 * np.log10(r2 / r1)
+
+
+def estimate_n(c2080pet, verbose=False):
+    n_list = [0.5, 0.75, 1, 1.5, 2, 4, 6, 8]
+    c_pet_list = [2.14, 2.49, 2.78, 3.26, 3.63, 4.50, 4.99, 5.31]
+    f = interp1d(c_pet_list, n_list, kind='cubic')
+    try:
+        return f(c2080pet)
+    except ValueError:
+        if verbose:
+            print("Could not estimate n for {}, returning closest".format(c2080pet))
+        return 0.5 if c2080pet < 2.14 else 5.31
+
+
+class Petrosian:
+    """
+    Class that computes and plots Petrosian properties.
+    """
+
+    def __init__(self, r_list, area_list, flux_list,
+                 epsilon=2., eta=0.2, verbose=False):
+        """
+        Initialize Petrosian properties by providing flux information.
+
+        Parameters
+        ----------
+        r_list : numpy.array
+            Array of radii in pixels.
+
+        area_list : numpy.array
+            Array of aperture areas.
+
+        flux_list : numpy.array
+            Array of photometric flux values.
+
+        epsilon : float
+            Epsilon value (used to determine `r_total_flux`).
+            N.B: `r_total_flux` = `r_petrosian` * `epsilon`
+
+        eta : float, default=0.2
+            Eta is the petrosian value which defines the `r_petrosian`.
+
+        verbose : bool
+            Prints info using
+        """
+
+        self.verbose = verbose
+
+        self.r_list = np.array(r_list)
+        self.area_list = np.array(area_list)
+        self.flux_list = np.array(flux_list)
+
+        assert len(self.r_list) > 2, "At least 3 data points are needed to compute Petrosian."
+        assert len(self.r_list.shape), "Input arrays should be one dimensional."
+        assert self.r_list.shape == self.flux_list.shape == self.flux_list.shape
+
+        self._epsilon = None
+        self._eta = None
+
+        self.epsilon = float(epsilon)
+        self.eta = float(eta)
+
+    @property
+    def epsilon(self):
+        """
+        Epsilon value (used to determine `r_total_flux`).
+        N.B: ``r_total_flux = r_petrosian * epsilon``
+        """
+        return self._epsilon
+
+    @epsilon.setter
+    def epsilon(self, value):
+        self._epsilon = value
+
+    @property
+    def eta(self):
+        """Eta is the petrosian value which defines the `r_petrosian`"""
+        return self._eta
+
+    @eta.setter
+    def eta(self, value):
+        self._eta = value
+
+    @property
+    def r_petrosian(self):
+        """
+        The Petrosian radius is defined as the radius at which the petrosian profile equals eta.
+        """
+        return calculate_petrosian_r(self.r_list, self.area_list, self.flux_list,
+                                     eta=self.eta)
+
+    @property
+    def r_total_flux(self):
+        """The radius containing the total flux"""
+        return calculate_r_total_flux(self.r_list, self.area_list, self.flux_list,
+                                      epsilon=self.epsilon, eta=self.eta,
+                                      verbose=self.verbose)
+
+    @property
+    def total_flux(self):
+        """Returns the flux at `r_total_flux` or np.nan if out of range"""
+        if not min(self.r_list) <= self.r_total_flux <= max(self.r_list):
+            return np.nan
+
+        f = interp1d(self.r_list, self.flux_list, kind='cubic')
+        total_flux = f(self.r_total_flux)
+        return float(total_flux)
+
+    @property
+    def r_half_light(self):
+        """Radius containing half of the total Petrosian flux"""
+        return calculate_r_half_light(self.r_list, self.flux_list, self.r_total_flux)
+
+    @property
+    def c2080(self):
+        return self.concentration_index(fraction_1=0.2, fraction_2=0.8)[-1]
+
+    @property
+    def c5090(self):
+        return self.concentration_index(fraction_1=0.5, fraction_2=0.9)[-1]
+
+    def r_half_light_arcsec(self, wcs):
+        """
+        Given a wcs, compute the radius containing half of the total Petrosian flux in arcsec.
+        """
+        if not np.isnan(self.r_half_light):
+            return pixel_to_angular(self.r_half_light, wcs).value
+        return np.nan
+
+    def r_total_flux_arcsec(self, wcs):
+        """
+        Given a wcs, compute the radius containing the total Petrosian flux in arcsec.
+        """
+        if not np.isnan(self.r_total_flux):
+            return pixel_to_angular(self.r_total_flux, wcs).value
+        return np.nan
+
+    def concentration_index(self, fraction_1=0.2, fraction_2=0.8):
+        """
+        Calculates Petrosian concentration index.
+
+        ``concentration_index = 5 * np.log10( r(fraction_2) / r(fraction_1) )``
+
+        Parameters
+        ----------
+        fraction_1 : float
+            Fraction of total light enclosed by the radius in the denominator.
+
+        fraction_2 : float
+            Fraction of total light enclosed by the radius in the numerator.
+
+        Returns
+        -------
+        r_fraction_1, r_fraction_2, concentration_index
+
+            * r_fraction_1 : float or np.nan
+                Radius containing `fraction_1` of the total flux.
+
+            * r_fraction_2: float or np.nan
+                Radius containing `fraction_2` of the total flux.
+
+            * concentration_index : float or np.nan
+                Concentration index
+        """
+        return calculate_concentration_index(self.r_list, self.flux_list, self.r_total_flux,
+                                             fraction_1=fraction_1, fraction_2=fraction_2)
+
+    def fraction_flux_to_r(self, fraction=0.5):
+        """Given a fraction, compute the radius containing that fraction of the Petrosian total flux"""
+        return fraction_flux_to_r(self.r_list, self.flux_list, self.r_total_flux, fraction=fraction)
+
+    def plot(self, plot_r=False, plot_normalized_flux=False):
+        """
+        Plots Petrosian profile.
+
+        Parameters
+        ----------
+        plot_r : bool
+            Plot total flux and half light radii.
+
+        plot_normalized_flux:
+            Over-plot the flux curve of growth by normalize the flux axis (max_flux=1).
+        """
+        plot_petrosian(self.r_list, self.area_list, self.flux_list, epsilon=self.epsilon, eta=self.eta, plot_r=plot_r)
+
+        if plot_normalized_flux:
+            plt.plot(self.r_list, self.flux_list/self.flux_list.max(), label='Normalized Flux', linestyle='--')
+
+    def imshow(self, position=(0, 0), elong=1., theta=0., color=None, lw=None):
+        """
+        Make 2D plots of elliptical apertures with radii  of `r_half_light`, `r_total_flux`, `r_20` and `r_80`.
+
+        Parameters
+        ----------
+        position : tuple
+            (x, y) center of the apertures.
+
+        elong : float
+            Elongation of the aperture.
+
+        theta : float
+            The orientation of the aperture in rad.
+
+        color : str
+            Color override that will change the color of the apertures in the plot.
+
+        lw : float
+            Line width (thickness) of the plotted apertures.
+        """
+
+        labels = ['r_half_light', 'r_total_flux', 'r_20', 'r_80']
+        radii = [self.r_half_light, self.r_total_flux, self.fraction_flux_to_r(.2), self.fraction_flux_to_r(.8)]
+        colors = ['r', 'r', 'b', 'b']
+        linestyles = ['dashed', 'solid', 'dotted', 'dashdot']
+
+        for label, r, default_color, ls in zip(labels, radii, colors, linestyles):
+            if not np.isnan(r) and r > 0:
+                radial_elliptical_aperture(position, r, elong, theta).plot(
+                    label=label, linestyle=ls, color=color if color else default_color, lw=lw)
+
+        plt.scatter(*position, marker='+', color=color if color else 'red')
+
+
+class PetrosianCorrection:
+    """
+    This class computes corrections for Petrosian given default Petrosian measurements.
+    """
+
+    def __init__(self, grid_file):
+        """
+        Parameters
+        ----------
+        grid_file : str
+            Path to correction grid generated by `petrofit.correction.generate_petrosian_sersic_correction`
+        """
+
+        self._grid_file = grid_file
+        self.grid = self._read_grid_file()
+        self.regressor = self._train()
+
+    def _read_grid_file(self):
+        with open(self._grid_file, 'r') as infile:
+            grid = yaml.load(infile, Loader=yaml.Loader)
+        return grid
+
+    def estimate_n(self, r_hl_pet, c2080pet, verbose=False):
+        """
+        Given the half light radius and c2080 computed using the default epsilon value,
+        return an estimated sersic index n.
+        """
+        r_list = np.array(list(self.grid.keys()))
+        r_eff = r_list[np.argmin(abs(r_list - r_hl_pet))]
+
+        if verbose:
+            print("r_eff = {}".format(r_eff))
+
+        N_LIST = np.array(self.grid[r_eff]['n'])
+        C_LIST = np.array(self.grid[r_eff]['c_index'])
+
+        u, indices = np.unique(C_LIST, return_index=True)
+
+        n_list = N_LIST[indices]
+        c_pet_list = C_LIST[indices]
+        f = interp1d(c_pet_list, n_list, kind='linear')
+        try:
+            return float(f(c2080pet))
+        except ValueError:
+            if verbose:
+                print("Could not estimate n for {}, returning closest".format(c2080pet))
+            return 0.5 if c2080pet < 2.14 else 5.31
+
+    def estimate_epsilon(self, r_hl_pet, c2080pet, verbose=False):
+        """
+        Given the half light radius and c2080 computed using the default epsilon value,
+        return a corrected epsilon value.
+        """
+
+        r_list = np.array(list(self.grid.keys()))
+        r_eff = r_list[np.argmin(abs(r_list - r_hl_pet))]
+
+        if verbose:
+            print("r_eff = {}".format(r_eff))
+
+        N_LIST = np.array(self.grid[r_eff]['epsilon'])
+        C_LIST = np.array(self.grid[r_eff]['c_index'])
+
+        u, indices = np.unique(C_LIST, return_index=True)
+        indices = np.array(indices)
+
+        n_list = N_LIST[indices]
+        c_pet_list = C_LIST[indices]
+        f = interp1d(c_pet_list, n_list, kind='linear')
+        try:
+            return float(f(c2080pet))
+        except ValueError:
+            if verbose:
+                print("Could not estimate n for {}, returning closest".format(c2080pet))
+            return 2
+
+    # Experimental
+    def _train(self):
+        X = []
+        N = []
+
+        for r_eff in self.grid:
+            for i in range(len(self.grid[r_eff]['n'])):
+                c = self.grid[r_eff]['c_index'][i]
+                n = self.grid[r_eff]['n'][i]
+                r_p = self.grid[r_eff]['r_petrosian'][i]
+                epsilon = self.grid[r_eff]['epsilon'][i]
+                r_hl_petrosian = self.grid[r_eff]['r_hl_petrosian'][i]
+                X.append(np.array([r_p, c]))
+                N.append([n, epsilon])
+
+        X = np.array(X)
+        N = np.array(N)
+
+        clf = DecisionTreeRegressor()
+        clf.fit(X, N)
+        return clf
+
+    # Experimental
+    def estimate_regressor(self, r_pet, c2080pet, verbose=False):
+        """Experimental: Retrns n, epsilon using DecisionTreeRegressor"""
+        return self.regressor.predict([[r_pet, c2080pet]])[0]
diff --git a/petrofit/photometry.py b/petrofit/photometry.py
new file mode 100644
index 0000000..13d0a80
--- /dev/null
+++ b/petrofit/photometry.py
@@ -0,0 +1,511 @@
+import warnings
+
+import numpy as np
+
+from astropy.nddata import Cutout2D
+from astropy.stats import sigma_clipped_stats, sigma_clip
+from astropy.utils.exceptions import AstropyWarning
+
+from matplotlib import pyplot as plt
+
+from photutils import  EllipticalAnnulus, EllipticalAperture
+
+from .segmentation import masked_segm_image
+from .fitting import fit_plane, model_to_image
+from .segmentation import get_source_elong,  get_source_theta, get_source_position
+
+__all__ = [
+    'plot_apertures', 'flux_to_abmag', 'order_cat', 'radial_elliptical_aperture',
+    'radial_elliptical_annulus', 'calculate_photometic_density', 'make_radius_list',
+    'photometry_step', 'source_photometry'
+]
+
+
+def plot_apertures(image=None, apertures=[], vmin=None, vmax=None, color='white', lw=1.5):
+    """
+    Plot apertures on image
+
+    Parameters
+    ----------
+    image : numpy.ndarray
+        2D image array.
+
+    apertures : list
+        List of photutils Apertures.
+
+    vmin, vmax : float
+        vmax and vmin values for plot.
+
+    color : string
+        Matplotlib color for the apertures, default=White.
+
+    lw : float
+        Line width of aperture outline.
+    """
+    if image is not None:
+        plt.imshow(image, cmap='Greys_r', vmin=vmin, vmax=vmax)
+
+    for aperture in apertures:
+        aperture.plot(axes=plt.gca(), color=color, lw=lw)
+
+    if image or apertures:
+        plt.title('Apertures')
+
+
+def flux_to_abmag(flux, header):
+    """Convert HST flux to AB Mag"""
+    if not type(flux) in [int, float]:
+        flux = np.array(flux)
+        flux[np.where(flux <= 0)] = np.nan
+    elif flux <= 0:
+        return np.nan
+
+    PHOTFLAM = header['PHOTFLAM']
+    PHOTZPT = header['PHOTZPT']
+    PHOTPLAM = header['PHOTPLAM']
+
+    STMAG_ZPT = (-2.5 * np.log10(PHOTFLAM)) + PHOTZPT
+    ABMAG_ZPT = STMAG_ZPT - (5. * np.log10(PHOTPLAM)) + 18.692
+
+    return -2.5 * np.log10(flux) + ABMAG_ZPT
+
+
+def order_cat(cat, key='area', reverse=True):
+    """
+    Sort a catalog by largest area and return the argsort
+
+    Parameters
+    ----------
+    cat : `SourceCatalog` instance
+        A `SourceCatalog` instance containing the properties of each source.
+
+    key : string
+        Key to sort.
+
+    reverse : bool
+        Reverse sorting order. Default is `True` to place largest values on top.
+
+    Returns
+    -------
+    output : list
+        A list of catalog indices ordered by largest area.
+    """
+    table = cat.to_table()[key]
+    order_all = table.argsort()
+    if reverse:
+        return list(reversed(order_all))
+    return order_all
+
+
+def radial_elliptical_aperture(position, r, elong=1., theta=0.):
+    """
+    Helper function given a radius, elongation and theta,
+    will make an elliptical aperture.
+
+    Parameters
+    ----------
+    position : tuple
+        (x, y) coords for center of aperture.
+
+    r : int or float
+        Semi-major radius of the aperture.
+
+    elong : float
+        Elongation.
+
+    theta : float
+        Orientation in rad.
+
+    Returns
+    -------
+    EllipticalAperture
+    """
+    a, b = r, r / elong
+    return EllipticalAperture(position, a, b, theta=theta)
+
+
+def radial_elliptical_annulus(position, r, dr, elong=1., theta=0.):
+    """
+    Helper function given a radius, elongation and theta,
+    will make an elliptical aperture.
+
+    Parameters
+    ----------
+    position : tuple
+        (x, y) coords for center of aperture
+
+    r : int or float
+        Semi-major radius of the inner ring
+
+    dr : int or float
+        Thickness of annulus (outer ring = r + dr).
+
+    elong : float
+        Elongation.
+
+    theta : float
+        Orientation in rad.
+
+    Returns
+    -------
+    EllipticalAnnulus
+    """
+
+    a_in, b_in = r, r / elong
+    a_out, b_out = r + dr, (r + dr) / elong
+
+    return EllipticalAnnulus(position, a_in, a_out, b_out, theta=theta)
+
+
+def calculate_photometic_density(r_list, flux_list, elong=1., theta=0.):
+    """Compute value between radii"""
+    density = []
+
+    last_flux = 0
+    last_area = 0
+    for r, flux in zip(r_list, flux_list):
+        aperture = radial_elliptical_aperture((0, 0), r, elong=elong, theta=theta)
+        area = aperture.area
+        density.append((flux - last_flux) / (area - last_area))
+        last_area, last_flux = area, flux
+
+    return density
+
+
+def make_radius_list(max_pix, n):
+    """Make an array of radii of size n up to max_pix"""
+    r_list = [x * max_pix/n for x in range(1, n+1)]
+    return np.array(r_list)
+
+
+def photometry_step(position, r_list, image, error=None, mask=None, elong=1., theta=0.,
+                    plot=False, vmin=0, vmax=None, method='exact'):
+    """
+    Core photometry function.  Given a position, a list of radii and the shape
+    of apertures, calculate the photometry of the target in the image.
+
+    Parameters
+    ----------
+    position : tuple
+        (x, y) position in pixels.
+
+    r_list : list
+        A list of radii for apertures.
+
+    image : 2D array
+        Image to preform photometry on.
+
+    error : 2D array
+        Error map of the image.
+
+    mask : 2D array
+        Boolean array with True meaning that pixel is unmasked.
+
+    elong : float
+        Elongation.
+
+    theta : float
+        Orientation in rad.
+
+    plot : bool
+        Plot the target and apertures.
+
+    vmin : int
+        Min value for plot.
+
+    vmax : int
+        Max value for plot.
+
+    method : {'exact', 'center', 'subpixel'}, optional
+            The method used to determine the overlap of the aperture on
+            the pixel grid.  Not all options are available for all
+            aperture types.  Note that the more precise methods are
+            generally slower.  The following methods are available:
+
+                * ``'exact'`` (default):
+                  The the exact fractional overlap of the aperture and
+                  each pixel is calculated.  The returned mask will
+                  contain values between 0 and 1.
+
+                * ``'center'``:
+                  A pixel is considered to be entirely in or out of the
+                  aperture depending on whether its center is in or out
+                  of the aperture.  The returned mask will contain
+                  values only of 0 (out) and 1 (in).
+
+                * ``'subpixel'``
+                  A pixel is divided into subpixels (see the
+                  ``subpixels`` keyword), each of which are considered
+                  to be entirely in or out of the aperture depending on
+                  whether its center is in or out of the aperture.  If
+                  ``subpixels=1``, this method is equivalent to
+                  ``'center'``.  The returned mask will contain values
+                  between 0 and 1.
+
+    Returns
+    -------
+    photometry, aperture_area, error
+        Returns photometry, aperture area (unmasked pixels) and error at each radius.
+    """
+
+    flux_arr = []
+    error_arr = []
+    area_arr = []
+
+    if plot:
+        ax = plt.gca()
+        plt.imshow(image, vmin=vmin, vmax=image.mean() * 10 if vmax is None else vmax)
+        ax.set_title("Image and Aperture Radii")
+        ax.set_xlabel("Pixels")
+        ax.set_ylabel("Pixels")
+
+    mask = ~mask if mask is not None else None
+    for i, r in enumerate(r_list):
+        aperture = radial_elliptical_aperture(position, r, elong=elong, theta=theta)
+
+        photometric_value, photometric_err = aperture.do_photometry(data=image, error=error, mask=mask, method=method)
+        aperture_area, aperture_area_err = aperture.do_photometry(data=np.ones_like(image), error=None,
+                                                                  mask=mask, method=method)
+
+        aperture_area = float(np.round(aperture_area, 6))
+        photometric_value = float(np.round(photometric_value, 6))
+        photometric_err = float(np.round(photometric_err, 6)) if photometric_err.size > 0 else np.nan
+
+        if np.isnan(photometric_value):
+            raise Exception("Nan photometric_value")
+
+        if plot:
+            aperture.plot(plt.gca(), color='w', alpha=0.5)
+
+
+        flux_arr.append(photometric_value)
+        area_arr.append(aperture_area)
+        error_arr.append(photometric_err)
+
+    return np.array(flux_arr), np.array(area_arr), np.array(error_arr)
+
+
+def source_photometry(source, image, segm_deblend, r_list, error=None, cutout_size=None,
+                      bkg_sub=False, sigma=3.0, sigma_type='clip', method='exact', mask_background=False,
+                      plot=False, vmin=0, vmax=None, ):
+    """
+    Aperture photometry on a PhotUtils `SourceProperties`.
+
+    Parameters
+    ----------
+    source : `photutils.segmentation.SourceProperties`
+        `SourceProperties` (an entry in a `SourceCatalog`)
+
+    image : 2D array
+        Image to preform photometry on.
+
+    segm_deblend : `SegmentationImage`
+        Segmentation map of the image.
+
+    r_list : list
+        List of aperture radii.
+
+    error : 2D array
+        Error image (optional).
+
+    cutout_size : int
+        Size of cutout.
+
+    bkg_sub : bool
+        If the code should subtract the background using the `sigma` provided.
+
+    sigma : float
+        The sigma value used to determine noise pixels. Once the pixels above this value are masked,
+        a 2D plane is fit to determine the background. The 2D plane model is then converted into an image and
+        subtracted from the cutout of the target source. see the `sigma_type` on how this value will be used.
+
+    sigma_type : {'clip', 'bound'}, optional
+        The meaning of the provided sigma.
+            * ``'clip'`` (default):
+                Uses `astropy.stats.sigma_clipping.sigma_clip` to clip at the provided `sigma` std value.
+                Note that `sigma` in this case is the number of stds above the mean.
+
+            * ``'bound'``:
+                After computing the mean of the image, clip at `mean - sigma` and `mean + sigma`.
+                Note that `sigma` in this case is a value and not the number of stds above the mean.
+
+
+    method : {'exact', 'center', 'subpixel'}, optional
+        The method used to determine the overlap of the aperture on
+        the pixel grid.  Not all options are available for all
+        aperture types.  Note that the more precise methods are
+        generally slower.  The following methods are available:
+
+            * ``'exact'`` (default):
+              The the exact fractional overlap of the aperture and
+              each pixel is calculated.  The returned mask will
+              contain values between 0 and 1.
+
+            * ``'center'``:
+              A pixel is considered to be entirely in or out of the
+              aperture depending on whether its center is in or out
+              of the aperture.  The returned mask will contain
+              values only of 0 (out) and 1 (in).
+
+            * ``'subpixel'``
+              A pixel is divided into subpixels (see the
+              ``subpixels`` keyword), each of which are considered
+              to be entirely in or out of the aperture depending on
+              whether its center is in or out of the aperture.  If
+              ``subpixels=1``, this method is equivalent to
+              ``'center'``.  The returned mask will contain values
+              between 0 and 1.
+
+    mask_background : bool
+        Should background pixels, that are not part of any source in the segmentation map, be included?
+        If False, only pixels inside the source's segmentation are unmasked.
+
+    plot : bool
+        Show plot of cutout and apertures.
+
+    vmin : int
+        Min value for plot.
+
+    vmax : int
+        Max value for plot.
+
+
+    Returns
+    -------
+
+    flux_arr, area_arr, error_arr : (numpy.array, numpy.array, numpy.array)
+        Tuple of arrays:
+
+            * `flux_arr`: Photometric sum in aperture.
+
+            * `area_arr`: Exact area of aperture.
+
+            * `error_arr`: if error map is provided, error of measurements.
+    """
+
+    # Get source geometry
+    # -------------------
+    position = get_source_position(source)
+    elong = get_source_elong(source)
+    theta = get_source_theta(source)
+
+    if cutout_size is None:
+        cutout_size = np.ceil(max(r_list) * 3)
+
+    cutout_size = int(cutout_size)
+    if cutout_size % 2 == 1:
+        cutout_size += 1
+
+    # Error cutout
+    # ------------
+    masked_err = None
+    if error is not None:
+        masked_err = Cutout2D(error, position, cutout_size, mode='partial', fill_value=np.nan).data
+
+    # Image Cutout
+    # ------------
+    full_masked_image = masked_segm_image(source, image, segm_deblend, fill=np.nan, mask_background=mask_background).data
+    masked_nan_image = Cutout2D(full_masked_image, position, cutout_size, mode='partial', fill_value=np.nan)
+    masked_image = masked_nan_image.data
+
+    # Cutout for Stats
+    # ----------------
+    # This cutout has all sources masked
+    stats_cutout_size = cutout_size  # max(source.bbox.ixmax - source.bbox.ixmin, source.bbox.iymax - source.bbox.iymin) * 2
+    full_bg_image = masked_segm_image(0, image, segm_deblend, fill=np.nan, mask_background=False).data
+    masked_stats_image = Cutout2D(full_bg_image, position, stats_cutout_size, mode='partial', fill_value=np.nan).data
+
+    # Subtract Mean Plane
+    # -------------------
+    if bkg_sub:
+        if len(np.where(~np.isnan(masked_stats_image))[0]) > 10:
+            with warnings.catch_warnings():
+
+                warnings.simplefilter('ignore', AstropyWarning)
+                if sigma_type.lower() == 'clip':
+                    fit_bg_image = masked_stats_image
+                    fit_bg_image = sigma_clip(fit_bg_image, sigma)
+
+                elif sigma_type.lower() == 'bound':
+                    mean, median, std = sigma_clipped_stats(masked_stats_image, sigma=3,
+                                                            mask=np.isnan(masked_stats_image.data))
+
+                    fit_bg_image = masked_stats_image
+                    fit_bg_image[np.where(fit_bg_image > mean + sigma)] = np.nan
+                    fit_bg_image[np.where(fit_bg_image < mean - sigma)] = np.nan
+                else:
+                    raise ("background image masking sigma type not understood, try 'clip' or 'bound'")
+
+                fitted_model, _ = fit_plane(fit_bg_image)
+
+                # plt.imshow(fit_bg_image, vmax=vmax, vmin=vmin)
+                # plt.show()
+                # plt.imshow(model_to_image(cutout_size // 2, cutout_size // 2, cutout_size, fitted_model), vmin=vmin, vmax=vmax)
+                # plt.show()
+                # plt.imshow(masked_image, vmin=vmin, vmax=vmax)
+                # plt.show()
+                # plt.imshow(masked_image-model_to_image(cutout_size // 2, cutout_size // 2, cutout_size, fitted_model), vmin=vmin, vmax=vmax)
+                # plt.show()
+
+                masked_image -= model_to_image(cutout_size // 2, cutout_size // 2, cutout_size, fitted_model)
+                if sigma_type.lower() == 'bound':
+                    masked_image = np.clip(masked_image, - sigma, np.inf)
+
+        elif plot:
+            print("bkg_sub: Not enough datapoints, did not subtract.")
+
+    # Make mask
+    # ---------
+    mask = np.ones_like(masked_image)
+    mask[np.where(np.isnan(masked_image))] = 0
+    mask = mask.astype(bool)
+
+    position = np.array(masked_image.data.shape) / 2.
+
+    if plot:
+        print(source.label)
+        fig, ax = plt.subplots(1, 2, figsize=[24, 12])
+
+    if plot:
+        plt.sca(ax[0])
+
+    flux_arr, area_arr, error_arr = photometry_step(position, r_list, masked_image, error=masked_err, mask=mask,
+                                                          elong=elong, theta=theta, plot=plot, vmin=vmin, vmax=vmax,
+                                                          method=method)
+
+    if plot:
+        plt.sca(ax[1])
+        plt.plot(r_list, flux_arr, c='black', linewidth=3)
+        for r in r_list:
+            plt.axvline(r, alpha=0.5, c='r')
+        plt.title("Curve of Growth")
+        plt.xlabel("Radius in Pixels")
+        plt.ylabel("Flux Enclosed")
+        plt.show()
+
+        r = max(r_list)
+        fig, ax = plt.subplots(1, 1, figsize=[24, 6])
+        plt.plot(masked_image[:, int(position[0])], c='black', linewidth=3)
+        plt.axhline(0, c='black')
+        # plt.axhline(noise_sigma, c='b')
+        plt.axvline(position[0], linestyle='--')
+        plt.axvline(position[0] + r, alpha=0.5, c='r')
+        plt.axvline(position[0] - r, alpha=0.5, c='r')
+        plt.xlabel("Slice Along Y [pix]")
+        plt.ylabel("Flux")
+
+        fig, ax = plt.subplots(1, 1, figsize=[24, 6])
+
+        plt.plot(masked_image[int(position[1]), :], c='black', linewidth=3)
+        plt.axhline(0, c='black')
+        # plt.axhline(noise_sigma, c='b')
+        plt.axvline(position[0], linestyle='--')
+        plt.axvline(position[0] + r, alpha=0.5, c='r')
+        plt.axvline(position[0] - r, alpha=0.5, c='r')
+        plt.xlabel("Slice Along X [pix]")
+        plt.ylabel("Flux")
+
+    return flux_arr, area_arr, error_arr
+
+
+object_photometry = source_photometry  # Legacy
diff --git a/petrofit/segmentation.py b/petrofit/segmentation.py
new file mode 100644
index 0000000..6ca8dc8
--- /dev/null
+++ b/petrofit/segmentation.py
@@ -0,0 +1,366 @@
+from copy import deepcopy
+
+import numpy as np
+
+from photutils import detect_threshold
+from photutils import deblend_sources
+from photutils import detect_sources
+from photutils.segmentation import SourceCatalog
+
+from astropy.convolution import Gaussian2DKernel
+from astropy.stats import gaussian_fwhm_to_sigma
+from astropy.nddata import CCDData, Cutout2D
+
+from matplotlib import pyplot as plt
+
+__all__ = [
+    'plot_segments', 'plot_segment_residual', 'get_source_position', 'get_source_elong',
+    'get_source_ellip', 'get_source_theta', 'make_kernel', 'segm_mask', 'masked_segm_image',
+    'make_segments', 'deblend_segments'
+]
+
+
+def plot_segments(segm, image=None, vmin=None, vmax=None, alpha=0.5, title=None):
+    """
+    Plot segmented areas over an image (2D array, if provided)
+    """
+
+    cmap = segm.make_cmap(seed=np.random.randint(1000000))
+
+    if image is not None:
+        plt.imshow(image, vmin=vmin, vmax=vmax, cmap="gist_gray")
+
+    plt.imshow(segm, cmap=cmap, alpha=alpha)
+
+    if title is not None:
+        plt.title(title)
+
+    plt.xlabel("Pixels")
+    plt.ylabel("Pixels")
+
+
+def plot_segment_residual(segm, image, vmin=None, vmax=None):
+    """
+    Plot segment subtracted image (residual)
+    """
+    temp = image.copy()
+    temp[np.where(segm.data != 0)] = 0.0
+    plt.imshow(temp, vmin=vmin, vmax=vmax)
+
+
+def get_source_position(source):
+    """Return max x, y value of a SourceCatalog or catalog row"""
+    if isinstance(source, SourceCatalog):
+        x, y = source.maxval_xindex, source.maxval_yindex
+    else:
+        x, y = source['maxval_xindex'], source['maxval_yindex']
+    return x, y
+
+
+def get_source_elong(source):
+    """ Return SourceCatalog elongation"""
+    return source.elongation.value if isinstance(source, SourceCatalog) else source['elongation']
+
+
+def get_source_ellip(source):
+    """ Return SourceCatalog ellipticity"""
+    return source.ellipticity.value if isinstance(source, SourceCatalog) else source['ellipticity']
+
+
+def get_source_theta(source):
+    """ Return SourceCatalog orientation in rad"""
+    return source.orientation.to('rad').value if isinstance(source, SourceCatalog) else np.deg2rad(source['orientation'])
+
+
+def make_kernel(fwhm, kernel_size):
+    sigma = fwhm * gaussian_fwhm_to_sigma
+    kernel = Gaussian2DKernel(sigma, x_size=kernel_size, y_size=kernel_size)
+    kernel.normalize()
+    return kernel
+
+
+def segm_mask(source, segm, mask_background=False):
+    """
+    Given a segmentation and a target with an label, returns a mask
+    with all other sources masked in the original image.
+
+    Parameters
+    ----------
+
+    source : int or photutils.segmentation.properties.SourceCatalog
+        The catalog object for the target or label of target in the segmentation object.
+
+    segm : photutils.segmentation.core.SegmentationImage
+        Segmentation image.
+
+    mask_background : bool
+        Option to also mask out all the un-segmented background pixels.
+
+    Returns
+    -------
+
+    mask : bool array
+    """
+
+    if isinstance(source, SourceCatalog):
+        source = source.label
+
+    mask = (segm.data == source)
+    if not mask_background:
+        mask = ((segm.data == 0) | mask)
+    return mask
+
+
+def masked_segm_image(source, image, segm, fill=None, mask_background=False):
+    """
+    Returns a masked image of the original image by masking out other sources
+
+    Parameters
+    ----------
+
+    source : int or photutils.segmentation.properties.SourceCatalog
+        The catalog object for the target or label of target in the segmentation object.
+
+    image : CCDData or array
+        Image to mask.
+
+    segm : photutils.segmentation.core.SegmentationImage
+        Segmentation image.
+
+    fill : float
+        Fill in the masked pixels with this value.
+
+    mask_background : bool
+        Option to also mask out all the un-segmented background pixels.
+
+    Returns
+    -------
+
+    masked_image : CCDData or array
+    """
+
+    fill = np.nan if fill is None else fill
+    mask = segm_mask(source, segm, mask_background)
+
+    masked_image = deepcopy(image)
+
+    if isinstance(masked_image, np.ndarray):
+        masked_image[np.invert(mask)] = fill
+    else:
+        masked_image.data[np.invert(mask)] = fill
+
+    return masked_image
+
+
+def make_segments(image, npixels=None, threshold=3., fwhm=8., kernel_size=4):
+    """
+    Segment an image.
+
+    Parameters
+    ----------
+    image : array like
+        Input image
+
+    npixels : int
+        The number of connected pixels, each greater than ``threshold``,
+        that an object must have to be detected.  ``npixels`` must be a
+        positive integer.
+
+    threshold : float or array-like
+        The data value or pixel-wise data values to be used for the
+        detection threshold. A 2D ``threshold`` must have the same shape
+        as ``data``. See `~photutils.segmentation.detect_threshold` for
+        one way to create a ``threshold`` image.
+
+    fwhm : float
+        FWHM of smoothing gaussian kernel.
+
+    kernel_size : int
+        Size of smoothing kernel.
+
+    Returns
+    -------
+
+    segment_image : `~photutils.segmentation.SegmentationImage` or `None`
+        A 2D segmentation image, with the same shape as ``data``, where
+        sources are marked by different positive integer values.  A
+        value of zero is reserved for the background.  If no sources
+        are found then `None` is returned.
+    """
+
+    if npixels is None:
+        npixels = fwhm ** 2
+
+    kernel = make_kernel(fwhm, kernel_size) if kernel_size else None
+
+    return detect_sources(image, threshold, npixels=npixels, filter_kernel=kernel)
+
+
+def deblend_segments(image, segm, npixels=None, fwhm=8., kernel_size=4, nlevels=30, contrast=1/1000):
+    """
+    Deblend overlapping sources labeled in a segmentation image.
+
+    Parameters
+    ----------
+    image : array like
+        Input image.
+
+    segm : `~photutils.segmentation.SegmentationImage` or `None`
+        A 2D segmentation image, with the same shape as ``data``, where
+        sources are marked by different positive integer values.  A
+        value of zero is reserved for the background.  If no sources
+        are found then `None` is returned.
+
+    npixels : int
+        The number of connected pixels, each greater than ``threshold``,
+        that an object must have to be detected.  ``npixels`` must be a
+        positive integer.
+
+    fwhm : float
+        FWHM of smoothing gaussian kernel.
+
+    kernel_size : int
+        Size of smoothing kernel.
+
+    nlevels : int, optional
+        The number of multi-thresholding levels to use.  Each source
+        will be re-thresholded at ``nlevels`` levels spaced
+        exponentially or linearly (see the ``mode`` keyword) between its
+        minimum and maximum values within the source segment.
+
+    contrast : float, optional
+        The fraction of the total (blended) source flux that a local
+        peak must have (at any one of the multi-thresholds) to be
+        considered as a separate object.  ``contrast`` must be between 0
+        and 1, inclusive.  If ``contrast = 0`` then every local peak
+        will be made a separate object (maximum deblending).  If
+        ``contrast = 1`` then no deblending will occur.  The default is
+        0.001, which will deblend sources with a 7.5 magnitude
+        difference.
+
+    Returns
+    -------
+    segment_image : `~photutils.segmentation.SegmentationImage`
+        A segmentation image, with the same shape as ``data``, where
+        sources are marked by different positive integer values.  A
+        value of zero is reserved for the background.
+    """
+
+    if npixels is None:
+        npixels = fwhm ** 2
+
+    kernel = make_kernel(fwhm, kernel_size) if kernel_size else None
+
+    segm_deblend = deblend_sources(image, segm,
+                                   npixels=npixels, filter_kernel=kernel,
+                                   nlevels=nlevels, contrast=contrast)
+
+    return segm_deblend
+
+
+def make_catalog(image, threshold, wcs=None, deblend=True,
+                 npixels=None, fwhm=8., kernel_size=4,
+                 nlevels=30, contrast=1/1000,
+                 plot=True, vmax=None, vmin=None):
+    """
+    This function constructs a catalog using `PhotUtils`. The `petrofit.segmentation.make_segments` and
+    `petrofit.segmentation.deblend_segments` functions are used to construct segmentation maps and
+    the resulting segmentation is turned into a vatalog (`photutils.segmentation.catalog.SourceCatalog`)
+
+    Parameters
+    ----------
+    image : array like
+        Input image.
+
+    threshold : float or array-like
+        The data value or pixel-wise data values to be used for the
+        detection threshold. A 2D ``threshold`` must have the same shape
+        as ``data``. See `~photutils.segmentation.detect_threshold` for
+        one way to create a ``threshold`` image.
+
+    wcs : astropy.wcs.WCS
+        Astropy WCS for catalog to convert source locations to RA-Dec.
+
+    deblend : bool
+        Flag to enable deblending of sources in the segmentation map.
+
+    npixels : int
+        The number of connected pixels, each greater than ``threshold``,
+        that an object must have to be detected.  ``npixels`` must be a
+        positive integer.
+
+    fwhm : float
+        FWHM of smoothing gaussian kernel.
+
+    kernel_size : int
+        Size of smoothing kernel.
+
+    nlevels : int, optional
+        The number of multi-thresholding levels to use.  Each source
+        will be re-thresholded at ``nlevels`` levels spaced
+        exponentially or linearly (see the ``mode`` keyword) between its
+        minimum and maximum values within the source segment.
+
+    contrast : float, optional
+        The fraction of the total (blended) source flux that a local
+        peak must have (at any one of the multi-thresholds) to be
+        considered as a separate object.  ``contrast`` must be between 0
+        and 1, inclusive.  If ``contrast = 0`` then every local peak
+        will be made a separate object (maximum deblending).  If
+        ``contrast = 1`` then no deblending will occur.  The default is
+        0.001, which will deblend sources with a 7.5 magnitude
+        difference.
+
+    plot : bool
+        Flag to toggle plotting segmentation maps.
+
+    vmin, vmax : float
+        vmax and vmin values for plot.
+
+    Returns
+    -------
+    cat, segm, segm_deblend
+        cat : `photutils.segmentation.catalog.SourceCatalog`
+            A catalog of sources
+
+        segm : `photutils.segmentation.core.SegmentationImage`
+            Segmentation map.
+
+        segm_deblend : `photutils.segmentation.core.SegmentationImage`
+            Deblended segmentation map.
+    """
+
+    if isinstance(image, CCDData) or isinstance(image, Cutout2D):
+        image = image.data
+
+    # Make segmentation map
+    segm = make_segments(image,
+                         threshold=threshold,
+                         kernel_size=kernel_size,
+                         fwhm=fwhm, npixels=npixels)
+
+    if plot and segm:
+        # Make plots
+        if deblend:
+            fig, ax = plt.subplots(1, 2)
+            plt.sca(ax[0])
+        plot_segments(segm, image=image, vmax=vmax, vmin=vmin, title='Segmentation Map')
+
+    # Deblend segmentation map
+    segm_deblend = None
+    if deblend:
+        segm_deblend = deblend_segments(image, segm,
+                                        contrast=contrast,
+                                        nlevels=nlevels,
+                                        kernel_size=kernel_size,
+                                        fwhm=fwhm, npixels=npixels)
+
+        if plot and segm_deblend:
+            # Make plots
+            plt.sca(ax[1])
+            plot_segments(segm_deblend, image=image, vmax=vmax, vmin=vmin, title='Deblended Segmentation Map')
+
+    # Make catalog
+    cat = SourceCatalog(image, segm_deblend if deblend else segm, wcs=wcs)
+
+    return cat, segm, segm_deblend
\ No newline at end of file
diff --git a/petrofit/utils.py b/petrofit/utils.py
new file mode 100644
index 0000000..134eb02
--- /dev/null
+++ b/petrofit/utils.py
@@ -0,0 +1,272 @@
+import re
+
+import numpy as np
+
+from scipy.interpolate import interp1d
+
+from astropy.stats import gaussian_sigma_to_fwhm
+from astropy.wcs.utils import proj_plane_pixel_scales
+from astropy import units as u
+from astropy.coordinates import SkyCoord
+
+from matplotlib import pyplot as plt
+
+from .fitting import fit_gaussian2d, plot_fit
+
+__all__ = [
+    'match_catalogs', 'angular_to_pixel', 'pixel_to_angular',
+    'elliptical_area_to_r', 'circle_area_to_r', 'get_interpolated_values',
+    'closest_value_index', 'plot_target', 'cutout', 'cutout_subtract',
+    'measure_fwhm'
+]
+
+def natural_sort(l):
+    convert = lambda text: int(text) if text.isdigit() else text.lower()
+    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
+    return sorted(l, key = alphanum_key)
+
+
+def match_catalogs(ra_1, dec_1, ra_2, dec_2, unit='deg'):
+    """Wrapper for `SkyCoord.match_to_catalog_sky`"""
+    cat1_coords = SkyCoord(ra=ra_1, dec=dec_1, unit=unit)
+    cat2_coords = SkyCoord(ra=ra_2, dec=dec_2, unit=unit)
+    return cat1_coords.match_to_catalog_sky(cat2_coords)
+
+
+def angular_to_pixel(angular_diameter, wcs):
+    pixel_scales = proj_plane_pixel_scales(wcs)
+    assert np.allclose(*pixel_scales)
+    pixel_scale = pixel_scales[0] * wcs.wcs.cunit[0] / u.pix
+
+    pixel_size = angular_diameter / pixel_scale.to(angular_diameter.unit / u.pix)
+    pixel_size = pixel_size.value
+
+    return pixel_size
+
+
+def pixel_to_angular(pixel_size, wcs):
+    pixel_scales = proj_plane_pixel_scales(wcs)
+    assert np.allclose(*pixel_scales)
+    pixel_scale = pixel_scales[0] * wcs.wcs.cunit[0] / u.pix
+
+    if not hasattr(pixel_size, 'unit'):
+        pixel_size = pixel_size * u.pix
+
+    angular_diameter = pixel_size * pixel_scale.to(u.arcsec / u.pix)
+    return angular_diameter
+
+
+def elliptical_area_to_r(area, elong):
+    a = np.sqrt(elong * area / (np.pi))
+    b = a / elong
+    return a, b
+
+
+def circle_area_to_r(area):
+    return np.sqrt(area / (np.pi))
+
+
+def get_interpolated_values(x, y, num=5000, kind='cubic'):
+    f = interp1d(x, y, kind=kind)
+    x_new = np.linspace(min(x), max(x), num=num, endpoint=True)
+    y_new = f(x_new)
+    return x_new, y_new
+
+
+def closest_value_index(value, array, growing=False):
+    """Return first index closes to value"""
+
+    if not growing:
+        idx_list = np.where(array <= value)[0]
+    elif growing:
+        idx_list = np.where(array >= value)[0]
+
+    idx = None
+    if idx_list.size > 0:
+        idx = idx_list[0]
+        idx = abs(array[:idx + 1] - value).argmin()
+    return idx
+
+
+def plot_target(position, image, size, vmin=None, vmax=None):
+    x, y = position
+    if not isinstance(image, np.ndarray):
+        image = image.data
+    plt.imshow(image, vmin=vmin, vmax=vmax)
+    plt.plot(x, y, '+', c='r', label='Target')
+    plt.xlim(x-size, x+size)
+    plt.ylim(y-size, y+size)
+
+
+def cutout(image, x, y, dx, dy=None, vmin=None, vmax=None):
+    """
+    Clip and make a cutout of an image
+
+    Parameters
+    ----------
+    image : array like
+        Input image.
+    x, y : int
+        Center of cutout. The indexing is array[y, x] and
+        x is the x axis when plotted.
+    dx, dy : int
+        Size of image in x and y direction. The indexing is array[y, x] and
+        x is the x axis when plotted. If dy is not provided it will be set
+        to the same size as dx.
+    vmin, vmax : float
+        max and min values to clip the input image.
+
+
+    Returns
+    -------
+    Copied array
+        Clipped and cropped image.
+    """
+
+    if dy is None:
+        dy = dx
+
+    vmin = vmin if vmin else image.min()
+    vmax = vmax if vmax else image.max()
+    image = np.clip(image, vmin, vmax)
+
+    bounds = np.array([y - dy // 2, y + dy // 2, x - dx // 2, x + dx // 2])
+    bounds[bounds < 0] = 0
+    ymin, ymax, xmin, xmax = bounds
+
+    return image[ymin:ymax, xmin:xmax].copy()
+
+
+def cutout_subtract(image, target, x, y):
+    """
+    Subtract cutout from image
+
+    Parameters
+    ----------
+    image : array like
+        Main image
+
+    target : array like
+        Cutout image
+
+    x, y : int
+        Center to subtract from
+
+    Returns
+    -------
+    Copied array
+        subtracted
+    """
+
+    dy, dx = target.shape
+    bounds = np.array([y - dy // 2, y + dy // 2, x - dx // 2, x + dx // 2])
+    bounds[bounds < 0] = 0
+    ymin, ymax, xmin, xmax = bounds
+    image[ymin:ymax, xmin:xmax] -= target
+    return image
+
+
+def measure_fwhm(image, plot=True, printout=True):
+    """
+    Find the 2D FWHM of a background/continuum subtracted cutout image of a target.
+    The target should be centered and cropped in the cutout.
+    Use lcbg.utils.cutout for cropping targets.
+    FWHM is estimated using the sigmas from a 2D gaussian fit of the target's flux.
+    The FWHM is returned as a tuple of the FWHM in the x and y directions.
+
+    Parameters
+    ----------
+    image : array like
+        Input background/continuum subtracted cutout image.
+    printout : bool
+        Print out info.
+    plot : bool
+        To plot fit or not.
+
+    Returns
+    -------
+    tuple : array of floats
+        FWHM in x and y directions.
+    """
+
+    # Find FWHM
+    # ----------
+
+    fitted_line = fit_gaussian2d(image)
+
+    # Find fitted center
+    x_mean, y_mean = [i.value for i in [fitted_line.x_mean, fitted_line.y_mean]]
+
+    # Estimate FWHM using gaussian_sigma_to_fwhm
+    x_fwhm = fitted_line.x_stddev * gaussian_sigma_to_fwhm
+    y_fwhm = fitted_line.y_stddev * gaussian_sigma_to_fwhm
+
+    # Find half max
+    hm = fitted_line(x_mean, y_mean) / 2.
+
+    # Find the mean of the x and y direction
+    mean_fwhm = np.mean([x_fwhm, y_fwhm])
+    mean_fwhm = int(np.round(mean_fwhm))
+
+    # Print info about fit and FWHM
+    # ------------------------------
+
+    if printout:
+        print("Image Max: {}".format(image.max()))
+        print("Amplitude: {}".format(fitted_line.amplitude.value))
+        print("Center: ({}, {})".format(x_mean, y_mean))
+        print("Sigma = ({}, {})".format(fitted_line.x_stddev.value,
+                                        fitted_line.y_stddev.value, ))
+
+        print("Mean FWHM: {} Pix ".format(mean_fwhm))
+        print("FWHM: (x={}, y={}) Pix ".format(x_fwhm, y_fwhm))
+
+    if plot:
+
+        fig, [ax0, ax1, ax2, ax3] = plot_fit(image, fitted_line)
+
+        # Make x and y grid to plot to
+        y_arange, x_arange = np.mgrid[:image.shape[0], :image.shape[1]]
+
+        # Plot input image with FWHM and center
+        # -------------------------------------
+
+        ax0.imshow(image, cmap='gray_r')
+
+        ax0.axvline(x_mean - x_fwhm / 2, c='c', linestyle="--", label="X FWHM")
+        ax0.axvline(x_mean + x_fwhm / 2, c='c', linestyle="--")
+
+        ax0.axhline(y_mean - y_fwhm / 2, c='g', linestyle="--", label="Y FWHM")
+        ax0.axhline(y_mean + y_fwhm / 2, c='g', linestyle="--")
+
+        ax0.set_title("Center and FWHM Plot")
+        ax0.legend()
+
+        # Plot X fit
+        # ----------
+
+        ax2.axvline(x_mean, linestyle="-", label="Center")
+        ax2.axvline(x_mean - x_fwhm / 2, c='c', linestyle="--", label="X FWHM")
+        ax2.axvline(x_mean + x_fwhm / 2, c='c', linestyle="--")
+        ax2.axhline(hm, c="black", linestyle="--", label="Half Max")
+
+        ax2.legend()
+
+        # Plot Y fit
+        # ----------
+
+        ax3.axvline(y_mean, linestyle="-", label="Center")
+        ax3.axvline(y_mean - y_fwhm / 2, c='g', linestyle="--", label="Y FWHM")
+        ax3.axvline(y_mean + y_fwhm / 2, c='g', linestyle="--")
+        ax3.axhline(hm, c="black", linestyle="--", label="Half Max")
+
+        ax3.legend()
+
+        plt.show()
+
+    return np.array([x_fwhm, y_fwhm])
+
+
+
+
+
diff --git a/setup.cfg b/setup.cfg
index 0360454..8b76a92 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -17,14 +17,25 @@ packages = find:
 python_requires = >=3.7
 setup_requires = setuptools_scm
 install_requires =
+    numpy
     astropy
+    scipy
+    pyyaml
+    sklearn
+    scikit-image
+    photutils
 
 
 [options.extras_require]
 test =
     pytest-astropy
 docs =
+    sphinx
     sphinx-astropy
+    ipykernel
+    nbsphinx
+    sphinx_rtd_theme
+    ipywidgets
 
 [options.package_data]
 petrofit = data/*
diff --git a/setup.py b/setup.py
index 53ab778..bd39be3 100644
--- a/setup.py
+++ b/setup.py
@@ -9,7 +9,6 @@
 
 from setuptools import setup
 
-from extension_helpers import get_extensions
 
 
 # First provide helpful messages if contributors try and run legacy commands
@@ -78,4 +77,6 @@
 
 setup(use_scm_version={'write_to': os.path.join('petrofit', 'version.py'),
                        'write_to_template': VERSION_TEMPLATE},
-      ext_modules=get_extensions())
+include_package_data=True
+
+      )
diff --git a/tox.ini b/tox.ini
index b2c4e42..1e1f43b 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,8 +1,8 @@
 [tox]
 envlist =
-    py{36,37,38}-test{,-alldeps,-devdeps}{,-cov}
-    py{36,37,38}-test-numpy{116,117,118}
-    py{36,37,38}-test-astropy{30,40,lts}
+    py{36,37,38,39}-test{,-alldeps,-devdeps}{,-cov}
+    py{36,37,38,39}-test-numpy{116,117,118}
+    py{36,37,38,39}-test-astropy{30,40,lts}
     build_docs
     linkcheck
     codestyle
@@ -92,4 +92,4 @@ skip_install = true
 changedir = .
 description = check code style, e.g. with flake8
 deps = flake8
-commands = flake8 petrofit --count --max-line-length=100
+commands = flake8 petrofit --count --max-line-length=100
\ No newline at end of file


Test patch:
diff --git a/petrofit/tests/concentration_index_grid_no_psf.yaml b/petrofit/tests/concentration_index_grid_no_psf.yaml
new file mode 100644
index 0000000..01955de
--- /dev/null
+++ b/petrofit/tests/concentration_index_grid_no_psf.yaml
@@ -0,0 +1,3248 @@
+? &id002 !!python/object/apply:numpy.core.multiarray.scalar
+- &id003 !!python/object/apply:numpy.dtype
+  args:
+  - i8
+  - false
+  - true
+  state: !!python/tuple
+  - 3
+  - <
+  - null
+  - null
+  - null
+  - -1
+  - -1
+  - 0
+- !!binary |
+  CgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - &id001 !!python/object/apply:numpy.dtype
+      args:
+      - f8
+      - false
+      - true
+      state: !!python/tuple
+      - 3
+      - <
+      - null
+      - null
+      - null
+      - -1
+      - -1
+      - 0
+    - !!binary |
+      mLKCEnBPBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oNS8HDQxCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      O2PloJUpDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      P0BnlCiMD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tDy2c1/FEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      I4qlsB2aEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SfiCeyQ0EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HtCvRQnaEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JHBpO7huE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MmFj75TaE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ub0mquND+z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dH1q1X+ZAkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6M0b3ob2CEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      D9jlhueGEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      169/izesFUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      y0CwRRQeHEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pFPnprckIkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Kpe/ufEvJ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gVR6gp/ULUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      b41egcMwM0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7CQZgwDaI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YToUI9XSI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Yu7n+ZDHI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wOooV1bGI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7ozAMHjDI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TNHv47u9I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TPXmDnu7I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wQrirk+0I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      74ohR5W7I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TatZzxm4I0A=
+  r_petrosian:
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+  - *id002
+? &id004 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  DwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wSwY/XBOBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      piskq1IwCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      V41BR1cxDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t4BxTRWXD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DH1Le+rEEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OHIXIcOBEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      P5pHrg9VEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5Jb01qDqEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      v0B4O68+E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AeBpnejpE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FdJ6uzzd+z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      26RpMPwJA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qDNCPqilCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DkYA0RoMEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YaqhxKBpFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SMnf7D4CHUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CUzXCKnjIkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MhQYLWVNKEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lb5TIRsxL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      G1J0m/PnM0A=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ewUDU725LUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2ZEgXH+vLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NtZPD8OpLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      N0I1kACjLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Z+ItgD+YLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ojq56XSDLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aUrVLbeBLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xo4E4fp7LUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xQDHHuGMLUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Z3IKLDyPLUA=
+  r_petrosian:
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+  - *id004
+? &id005 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  FAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ouHjwe5QBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jn3wAt0pCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +CbyyzIcDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pgBnTVtwD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xolswsaxEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MXTLXKCJEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      y//KbHIsEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5KKVNC7zEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +GR4Yuo3E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JldOsQC9E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      I5dT2D4x/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      e7hvGSJIA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uTfpxRcACkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DGk+/ZZQEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pzQeV5XUFkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5JbPPkaoHUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kVLKh+dfI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      s2tVf0LxKEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RW6CiaLqL0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1VI5qgNdNEA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SsSBlpPSM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SwrRAi/GM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qJiN9dPDM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wWe6+IG6M0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      e5d+6Jy4M0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qwA1o0utM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ToMk0ZSqM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fMwhNEqxM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OGSN0dyYM0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZDKYfEmzM0A=
+  r_petrosian:
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+  - *id005
+? &id006 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  GQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +ZA1rslRBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RZ+c8ewrCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zM91+WoXDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DMxxmhF3D0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      e098KxakEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      exfFCCeLEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JFJ+d1Y1EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2TZ0PPvCEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eFIGytVuE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4wfKojy0E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      obRefoNl/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      x0WqqsdvA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8QlMloE8CkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kJnmXxRwEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      osfrdW74FkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      do98W089HkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eanyRL2WI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gNI8HGVFKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aS7fafQzMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Jn5e/H20NEA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HedptBvFOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      B6TbiaS1OEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      B6TbiaS1OEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2ZEgXH+vOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZuTMaSKgOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fVz+30aoOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      w18+UvaaOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fsjjYIShOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TrYoM1+bOEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xAJmCMSUOEA=
+  r_petrosian:
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+  - *id006
+? &id007 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  HgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +3LLXXxPBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vuqpv1kkCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uS5Bam0VDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IO4eQ8V0D0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WurPu9ylEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FweHWEBvEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lE9WGc1BEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hmLtg0PkEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6BnH6cAvE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0ZTuIiPvE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0+9RBQqN/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6/HVweGJA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aJWCE4XJCUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pQATm7mREUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      A1qijLU2F0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      h/TS2mJ/HkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FbGCD0LAI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bBdz8KeGKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iP5hsttiMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9QRHHc/7NEA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NTXHQti3PUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZdW/MhetPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lSmM+RGXPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      f0PWGM2NPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Cj+HmeaPPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      C/NacKKEPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3eI+LGCGPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UGhdIDiIPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DjPNH5VgPUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aLr4gbqKPUA=
+  r_petrosian:
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+  - *id007
+? &id008 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  IwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lCbBrx5PBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      A723TywtCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9twEgygUDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PQVyRn5mD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bdh0BmqtEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Og7tPMV7EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9GuL0mosEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pch8GnK6EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6VW7oqIkE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CKcr4j2xE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LqtI8gmm/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ur8aYJadA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9Gm1s0cZCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uKw/zNu+EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hxdP4YtiF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1eW8fD6dHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8gixmDnsI0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jMgpOny4KUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Bkarq3iDMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      A6uAACESNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Sg4P1vRVQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bSvQqZRPQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Y5EPsF5BQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zMiZ00RAQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tBvFEXM/QUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eiuZZ18/QUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +8PLI9MzQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Wa3BdscvQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /IrqBGArQUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WT2eIsQmQUA=
+  r_petrosian:
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+  - *id008
+? &id009 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  KAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JrXgGtpPBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +hS5L8AnCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3Jsg7QMfDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HYsH+rR4D0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7CIuASGrEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VAtvVvqCEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      sOXupSUtEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EtEiF+PIEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iusMS71YE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QrvdZNHRE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4lFVRGq6/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      weRmJQoEA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DVl+zCGXCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EYYmvbvJEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tMG/tZl2F0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /Qnwo4O8HkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      I8ivu4//I0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t0a6miTmKUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      91+sT86iMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      T+jc571FNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4gso/rvPQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2N1MhcO6Q0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zEfKXlO8Q0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wR0tuSC3Q0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zgxKVv2rQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /Gbz2aCtQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Kq5RU3OsQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2Dbn+y+xQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5ThPo92oQ0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fx1ABCuIQ0A=
+  r_petrosian:
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+  - *id009
+? &id010 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  LQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      agx2wSlQBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WOUEQ9ggCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3A4fNfEODUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4k/+E/ZuD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vgFxHzafEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TUi6EfliEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VZoMZVs1EkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bm/CZBqoEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yuMOz288E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Bv+GlvSGE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VzSkZ9HK/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8K5JeqW8A0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K3m0bUbeCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RvmGMrvQEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /vS4qtWMF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WdjHqL/dHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TVQsxQ0cJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      25hwVVv3KUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vNjhe+W0MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SudXzHNfNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tGfxOrdKRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WAw5qtw9RkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Bjj2CGc8RkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cFqWOJkwRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8b0lqV8sRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K7/9c2EnRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IaYM7xwdRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LKoTgK0cRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xN5u3QQXRkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lmDOLqIXRkA=
+  r_petrosian:
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+  - *id010
+? &id011 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  MgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XcVfWhxQBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      viViXXcgCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GY9fxYEHDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HMf2e+5xD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0FjTZKmaEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OcgY9j5nEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3Ttt88UHEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tjEtgNupEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4BoOSBUjE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ewQ5NmuWE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1C/DPxra/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      b1ATvVeQA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0UBAwa2sCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YZnGhA3YEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      FbxcKfGdF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      apZJXqHtHkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wo+13u8nJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kCVhfUkXKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      1kzPhqvIMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3EGeWhJ6NUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +iJDV+jBSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TeD8GsewSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      n0QcaDmpSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IKir2P+kSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iSckUmSfSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      id2WEgOcSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UR7Q4NaESEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      isisHk+RSEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OxKE6+91SEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jHrhCyh+SEA=
+  r_petrosian:
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+  - *id011
+? &id012 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  NwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rGgNrfxSBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      U9iof2UhCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      u1AAWYsZDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4gTGnwdiD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TB8kkmaXEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      u9qrKDpoEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /Grmg1krEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uDI28kuuEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6IsrOOZPE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VCOHrTihE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zhcJ6yLb+j8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      x70p+uStA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      P/yoOtK8CkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LgqWoSXiEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QYtRAUWjF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fsn4m1oHH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pcQ4AiM0JEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xUgj594sKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uHDvbnbTMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SuMaM2eVNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      w3KJXMcdS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      n+uB8cwyS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZXjn6OQmS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lIZkQ0QdS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LHEyYToUS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      F8K+tYULS0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9UPnxO37SkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LhAcREL+SkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GBcbWSzySkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      g5T06K3kSkA=
+  r_petrosian:
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+  - *id012
+? &id013 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  PAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RRMvJG9NBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      33mt+3gkCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8T8GDgcFDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Gv4PcG5qD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qIeyln+ZEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SFi6OCxrEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kw04F93+EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UzmfFnivEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IrqA76oVE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZTAY9ly/E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hN+QIdZg/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XO+a62odBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      egjBA3LJCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qWXxta7nEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      CGtMTXyyF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bL6NIiMYH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /LcW1wZGJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      yfD1CPQ0KkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      56PFB8DoMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eRTZxJKUNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5QOsVzCwTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      h9AoxdqwTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iTjQclKaTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cwosPI+VTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9BDjYiOLTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0mx1Xel1TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OoAIVhB3TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GoFh8IZjTUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ackFucV9TUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ea4HxjNLTUA=
+  r_petrosian:
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+  - *id013
+? &id014 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  QQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nEQtvzZRBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      GnhY1/8gCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rRWfa5ULDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8F9PlwtbD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      N5mh/I2YEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZIWFBD5sEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MYgvfVIkEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aPSYLO6lEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      S3EHY+NUE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wEA7MOzDE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jVbLC0sU/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IBjpJJHKA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      aX+qBkLXCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      v9Gmb1bqEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pkx3//u5F0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      S0PpVmAtH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Op1aeX1MJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mzlLHxxOKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vfpVXvDtMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0NBxHrSwNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      nBf1whcQUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      kG4nktYOUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      i8YNNWwJUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      os4bV40IUEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6SyVKYz5T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      r+EvHyn7T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3gSXbTz8T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      L6KX2SH9T0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pNuJpLXzT0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      oxLM2UX0T0A=
+  r_petrosian:
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+  - *id014
+? &id015 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  RgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pXWDigZQBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LKnvWfEoCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vJUtQUgUDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Xll7ceBeD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      At2KjaKlEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qUyuArhZEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XYBIUXYQEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dqpRMzSjEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YaLqIpUeE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ifaw+rzRE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      9eFxatpi/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MH5V+QTsA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      sKZRJMreCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MC+ZhDTxEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      c9/IWb7GF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Nfqy1asxH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Y8V3gGtYJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HxZ5u6lRKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /0IYBpLtMEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K4aJBjSwNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      UA/DqctRUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      helQjFRLUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      szCvBSdKUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      F76A4r87UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jOhldkg/UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2IB0O5E0UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6gb/FOozUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JJzxXq41UUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MYsO/IoqUUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NjMoWfUvUUA=
+  r_petrosian:
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+  - *id015
+? &id016 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  SwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +EqUnj1RBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      SEukQh8oCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      LiKP7UcFDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      sHXC2t9WD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0azOEB2VEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +SCjOaVYEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      omkxniAbEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      o+1KzfGlEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      +DaUH/85E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fpVZIUnSE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uUwshtBE/T8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      zH1vEAIBBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RLqP/E3kCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TAshaLj1EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      U7HkRyLIF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4wWsPG43H0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      H4PYJFpVJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      K7TyaupaKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      acgHt6b6MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bE8OfuvMNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xKcsqHSWUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      HGg5KQ2JUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      eyuZZ19/UkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      NKXqltuAUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      DMslch13UkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tYULqc1wUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WVKIFnhxUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      03uClPRoUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      7BNtYhJfUkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Gl1qxcdlUkA=
+  r_petrosian:
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+  - *id016
+? &id017 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  UAAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MpkbgStMBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      h0Pu4yEeCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gHOIEjkPDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AiTHUyFOD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PjXzzFuaEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MbY96nxyEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      h9xbGAcFEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vpeyPDSgEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Yb0yy7YpE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      O2+moApuE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ZABQcJil/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xDuf0AXmA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Jh9JMULnCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AbPUBVT+EUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      vCBj5uvRF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      TlODFYxCH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JQtrJo1dJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      W29lv9loKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      dloER4b6MEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      E2YDp5vMNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lrlopQ7OU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      y7ftslbFU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mDRbXVe6U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0jUzKFm1U0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      PNmizHytU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      q+3pmHqqU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MMJQMRurU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      JnB+jWOYU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fwyU4zyNU0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /YasMZqbU0A=
+  r_petrosian:
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+  - *id017
+? &id018 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  VQAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      VAWbT3ZNBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      mw5PqL4mCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fnW8wQYGDUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MQTXez5fD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xcI6YJSiEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      snNJO59vEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Lv9pSkMbEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ugFMhE6MEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      q0tipAQ6E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QqQa5fF2E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ycvxExGm/T8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      YrXFSdHwA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hf243KnoCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WTaXyd8BEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rA5ExYfZF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cOUYsCxSH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      fEp7+LxtJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XEoGNrhwKkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ek/S5BYFMUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EL1KyFrMNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IexbW7gQVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      3WFvt24CVUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      usE/hfr8VEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QQDttPXuVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ky2C3oHoVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t7gPC5jhVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2WuKR93pVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KMkYBNDOVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IzKrx1PEVEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4rDunWzRVEA=
+  r_petrosian:
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+  - *id018
+? &id019 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  WgAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      cM1V8MJOBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      t2sckl8kCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      no0r1BcADUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8aZYJstKD0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Gk2jdGyjEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      tmBLCApsEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xIdH/1YEEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2W385cfBEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xq/WpZhJE0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6KBxXuV+E0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      IM6LVtjv/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      lU0SVfjjA0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EohPJPjoCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      KgL/0CUGEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      iA87iJXcF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pBALmTVWH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ooxcw+JsJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QjLnCnB8KkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XpWdeMEMMUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      0OKBepzpNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      bvLuiiFHVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      gIklhWhBVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Qbj+XnczVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      ggQYPbEtVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      WZp2bPYsVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2+Z8/yUWVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      uVmY14ITVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Wzv/OOEeVkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      I0NX6EH/VUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      xdowCj8HVkA=
+  r_petrosian:
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+  - *id019
+? &id020 !!python/object/apply:numpy.core.multiarray.scalar
+- *id003
+- !!binary |
+  XwAAAAAAAAA=
+: c_index:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OtqAJ3hOBkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Hu2nxASBCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      RfYFYwa/DUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pPQyMPA0EEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      q+vsYAuaEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wj8WsNlnEUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      44kShk8QEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      XnWKBNfAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      5uzf6gY2E0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      2OKNMAqGE0A=
+  epsilon:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      6jmB2Uwi/D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Ep0bCD5Z/z8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      54jR3haqBEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      MDKYEo7dCkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      Vsjd/n7eF0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      wm2+NEJdH0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      j8tVPbRxJEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      rEJNBjB2KkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      hJa2ZVMVMUA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      l084knPpNUA=
+  n:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA8D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAA+D8=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAAEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAABEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAACEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAADEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAEkA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFEA=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      AAAAAAAAFkA=
+  r_hl_petrosian:
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      EQdaTkqDV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      4/SeICV9V0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      QYG8KedyV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      jhnL7i9oV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      pnpzh71dV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      j6mnmixfV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      8gHWKxhYV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      OeEecwhNV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      /6ZliZNJV0A=
+  - !!python/object/apply:numpy.core.multiarray.scalar
+    - *id001
+    - !!binary |
+      qQRzdhE9V0A=
+  r_petrosian:
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
+  - *id020
diff --git a/petrofit/tests/conftest.py b/petrofit/tests/conftest.py
new file mode 100644
index 0000000..3fee147
--- /dev/null
+++ b/petrofit/tests/conftest.py
@@ -0,0 +1,174 @@
+import os
+import pytest
+
+import numpy as np
+
+from astropy.stats import sigma_clipped_stats
+from astropy.nddata import CCDData
+from astropy.modeling import models
+from astropy.io import fits
+from astropy.wcs import WCS
+
+
+from petrofit.segmentation import make_catalog
+from petrofit.petrosian import Petrosian
+from petrofit.fitting import model_to_image
+from petrofit.photometry import (
+    make_radius_list,
+    source_photometry,
+    order_cat
+)
+
+
+def make_image():
+    """Make 2D Sersic2D image"""
+    imsize = 500
+
+    d = 5
+
+    sersic_model = models.Sersic2D(
+        amplitude=1,
+        r_eff=25,
+        n=2,
+        x_0=imsize / 2,
+        y_0=imsize / 2,
+        ellip=0,
+        theta=0,
+        bounds={
+            'amplitude': (0., None),
+            'r_eff': (0, None),
+            'n': (0, 10),
+            'ellip': (0, 1),
+            'theta': (-2 * np.pi, 2 * np.pi),
+        },
+    )
+
+    sersic_model += models.Sersic2D(
+        amplitude=1,
+        r_eff=25,
+        n=2,
+        x_0=imsize * 0.75,
+        y_0=imsize * 0.75,
+        ellip=0.5,
+        theta=np.pi / 4,
+        bounds={
+            'amplitude': (0., None),
+            'r_eff': (0, None),
+            'n': (0, 10),
+            'ellip': (0, 1),
+            'theta': (-2 * np.pi, 2 * np.pi),
+        },
+    )
+
+    sersic_model += models.Sersic2D(
+        amplitude=1,
+        r_eff=25,
+        n=1,
+        x_0=imsize * 0.25,
+        y_0=imsize * 0.25,
+        ellip=0.2,
+        theta=np.pi / 6,
+        bounds={
+            'amplitude': (0., None),
+            'r_eff': (0, None),
+            'n': (0, 10),
+            'ellip': (0, 1),
+            'theta': (-2 * np.pi, 2 * np.pi),
+        },
+    )
+
+    model_image = model_to_image(imsize // 2, imsize // 2, imsize, sersic_model)
+
+    image_mean, image_median, image_stddev = sigma_clipped_stats(model_image, sigma=3)
+
+    # model_image += np.random.normal(0, 3*image_stddev, size=model_image.shape)
+
+    wcs = WCS()
+
+    header = wcs.to_header()
+
+    for param_name, param_val in zip(sersic_model.param_names, sersic_model.parameters):
+        header[param_name] = param_val
+
+    header['BUNIT'] = 'electron / s '
+
+    path = "sersic_2d_image.fits.gz"
+    sersic_2d_path = os.path.join(os.path.dirname(__file__), path)
+    fits.writeto(
+        sersic_2d_path,
+        data=model_image,
+        header=header,
+        overwrite=True
+    )
+
+
+
+@pytest.fixture
+def sersic_2d_image():
+    """fixture for Sersic 2D image """
+    path =  "sersic_2d_image.fits.gz"
+    sersic_2d_path =  os.path.join(os.path.dirname(__file__), path)
+
+    if not os.path.isfile(sersic_2d_path):
+        make_image()
+
+    return CCDData.read(sersic_2d_path)
+
+
+@pytest.fixture
+def segm_and_cat(sersic_2d_image):
+    """fixture for segmentation and catalog"""
+    image_mean, image_median, image_stddev = sigma_clipped_stats(sersic_2d_image, sigma=3)
+
+    threshold = image_stddev * 3
+
+    # Define smoothing kernel
+    kernel_size = 3
+    fwhm = 3
+
+    # Min Source size (area)
+    npixels = 4 ** 2
+
+    return make_catalog(
+        sersic_2d_image,
+        threshold=threshold,
+        deblend=True,
+        kernel_size=kernel_size,
+        fwhm=fwhm,
+        npixels=npixels,
+        contrast=0.00,
+        plot=False,
+    )
+
+
+
+@pytest.fixture
+def sersic_petrosian(sersic_2d_image, segm_and_cat):
+    """fixture for Sersic model image Petrosian"""
+    cat, segm, segm_deblend = segm_and_cat
+
+    source = cat[order_cat(cat)[0]]
+
+    max_pix = 200
+
+    r_list = make_radius_list(
+        max_pix=max_pix,  # Max pixel to go up to
+        n=max_pix  # the number of radii to produce
+    )
+
+    flux_list, area_list, error_arr = source_photometry(
+
+        # Inputs
+        source,  # Source (`photutils.segmentation.catalog.SourceCatalog`)
+        sersic_2d_image.data,  # Image as 2D array
+        segm_deblend,  # Deblended segmentation map of image
+        r_list,  # list of aperture radii
+
+        # Options
+        cutout_size=max(r_list) * 2,  # Cutout out size, set to double the max radius
+        bkg_sub=False,  # Subtract background
+        sigma=1, sigma_type='clip',  # Fit a 2D plane to pixels within 1 sigma of the mean
+        plot=False, vmax=0, vmin=1,  # Show plot with max and min defined above
+    )
+
+    return Petrosian(r_list, area_list, flux_list)
diff --git a/petrofit/tests/test_fitting.py b/petrofit/tests/test_fitting.py
new file mode 100644
index 0000000..0e32c82
--- /dev/null
+++ b/petrofit/tests/test_fitting.py
@@ -0,0 +1,84 @@
+
+
+import numpy as np
+
+
+from astropy.convolution import convolve
+from astropy.modeling import FittableModel, Parameter, custom_model, models
+
+from petrofit.models import Moffat2D, PSFModel, make_grid
+from petrofit.fitting import model_to_image, fit_model
+from petrofit.segmentation import masked_segm_image
+
+import matplotlib.pyplot as plt
+
+
+def test_psfmodel():
+    """Test fitting and PSF convolution"""
+
+    # Make model:
+
+    imsize = 300
+
+    sersic_model = models.Sersic2D(
+        amplitude=1,
+        r_eff=25,
+        n=2,
+        x_0=imsize / 2,
+        y_0=imsize / 2,
+        ellip=0,
+        theta=0,
+        bounds={
+            'amplitude': (0., None),
+            'r_eff': (0, None),
+            'n': (0, 10),
+            'ellip': (0, 1),
+            'theta': (-2 * np.pi, 2 * np.pi),
+        },
+    )
+
+    # Make model image
+    image = model_to_image(imsize // 2, imsize // 2, imsize, sersic_model)
+
+    # Make a PSF
+    x_grid, y_grid = make_grid(51, 1)
+    PSF = Moffat2D(x_0=25.0, y_0=25.0)(x_grid, y_grid)
+    PSF /= PSF.sum()
+
+    # Make a PSF image using model image and PSF
+    psf_sersic_image = convolve(image, PSF)
+
+    # Make a PSFModel
+    psf_sersic_model = PSFModel.wrap(sersic_model, psf=PSF, oversample=None)
+    psf_sersic_model.fixed['psf_pa'] = True
+
+    # Make a PSFModel image
+    psf_sersic_model_image = model_to_image(imsize // 2, imsize // 2, imsize, psf_sersic_model)
+
+    # Compare the PSF image to PSFModel image
+    error_arr =  abs(psf_sersic_model_image - psf_sersic_image) / psf_sersic_image
+    assert np.max(error_arr) < 0.01 # max error less than 1% error
+
+    # Test fitting
+
+    # Change params with offset
+    psf_sersic_model.r_eff = 23
+    psf_sersic_model.x_0 = 0.6 + imsize / 2
+    psf_sersic_model.y_0 = 0.1 + imsize / 2
+    psf_sersic_model.n = 3
+
+
+    # Fit
+    fitted_model, fit_info = fit_model(
+        psf_sersic_image, psf_sersic_model,
+        maxiter=10000,
+        epsilon=1.4901161193847656e-10,
+        acc=1e-9,
+    )
+
+    # Generate a model image from the fitted model
+    fitted_model_image = model_to_image(imsize // 2, imsize // 2, imsize, model=fitted_model)
+
+    # Check if fit is close to actual
+    error_arr = abs(fitted_model_image - psf_sersic_image) / psf_sersic_image
+    assert np.max(error_arr) < 0.01 # max error less than 1% error
diff --git a/petrofit/tests/test_petrosian.py b/petrofit/tests/test_petrosian.py
new file mode 100644
index 0000000..b61f9bd
--- /dev/null
+++ b/petrofit/tests/test_petrosian.py
@@ -0,0 +1,82 @@
+import os
+import pytest
+from copy import deepcopy
+
+import numpy as np
+
+from matplotlib import pyplot as plt
+
+from petrofit.photometry import source_photometry, make_radius_list, order_cat
+
+from petrofit.petrosian import Petrosian, PetrosianCorrection
+
+
+def test_petrosian(sersic_petrosian):
+    p = sersic_petrosian
+
+    # Assert default
+    assert p.epsilon == 2.
+    assert p.eta == 0.2
+    assert p.fraction_flux_to_r(0.5) == p.r_half_light
+    assert p.fraction_flux_to_r(0.2) == p.concentration_index()[0]
+    assert p.fraction_flux_to_r(0.8) == p.concentration_index()[1]
+
+    # Check values
+    assert (p.r_petrosian - 58.274255) / 58.274255 < 0.05
+    assert (p.r_total_flux - 116.54851) / 116.54851 < 0.05
+    assert (p.r_half_light - 24.233447) / 24.233447 < 0.05
+    assert (p.total_flux - 9789.636481) / 9789.63648 < 0.05
+    assert (p.concentration_index()[0] - 9.641128) / 9.641128 < 0.05
+
+    # Test if plotting works
+    p.plot(True, True)
+    plt.show()
+
+    p.imshow()
+    plt.show()
+
+
+def test_corrections(sersic_petrosian):
+    p = sersic_petrosian
+
+    pc = PetrosianCorrection(
+        os.path.join(
+            os.path.dirname(__file__),
+            'concentration_index_grid_no_psf.yaml'
+        )
+    )
+
+    c2080 = p.concentration_index()[-1]
+
+    n = pc.estimate_n(p.r_half_light, c2080)
+
+    n_err = (n - 2) / 2
+    assert n_err < 0.05 # 5% error
+
+    epsilon = pc.estimate_epsilon(p.r_half_light, c2080)
+
+    assert (epsilon - 3.4) / 3.4 < 0.05
+
+    corrected_p = Petrosian(
+        p.r_list, p.area_list, p.flux_list,
+        epsilon=epsilon
+    )
+
+    corrected_p.plot(True, True)
+    plt.show()
+
+    assert corrected_p.r_petrosian == p.r_petrosian
+    assert (corrected_p.r_half_light - 25) / 25 < 0.05
+
+    r_total_flux = p.r_total_flux
+
+    p.epsilon = 4
+
+    assert p.r_total_flux == r_total_flux * 2
+
+
+
+
+
+
+
diff --git a/petrofit/tests/test_photometry.py b/petrofit/tests/test_photometry.py
new file mode 100644
index 0000000..ddb4d1b
--- /dev/null
+++ b/petrofit/tests/test_photometry.py
@@ -0,0 +1,139 @@
+
+import numpy as np
+
+from astropy.io import fits
+
+from petrofit.photometry import (
+    radial_elliptical_aperture,
+    radial_elliptical_annulus,
+    make_radius_list,
+    photometry_step,
+    source_photometry,
+    flux_to_abmag,
+    order_cat
+)
+
+
+def test_radial_elliptical_aperture():
+    """Test if loading elliptical aperture"""
+    radial_elliptical_aperture(position=(0, 0), r=10)
+
+
+def test_radial_elliptical_annulus():
+    """Test if loading elliptical annulus"""
+    radial_elliptical_annulus(position=(0, 0), r=10, dr=5)
+
+
+def test_make_radius_list():
+    """test the make_radius_list function"""
+    # Simple r_list
+    max_pix = 100
+    n = 50
+
+    r_list = make_radius_list(max_pix, n)
+
+    assert max(r_list) == max_pix
+    assert len(r_list) == n
+    assert not np.any(r_list <= 0)
+
+    # Odd division r_list
+    max_pix = 100
+    n = 30
+
+    r_list = make_radius_list(max_pix, n)
+
+    assert max(r_list) == max_pix
+    assert len(r_list) == n
+    assert not np.any(r_list <= 0)
+
+
+def test_photometry_step():
+    """
+    Test photometry core by doing photometry
+    where the total flux = pixel area.
+    """
+    image_size = 30
+    ones_image = np.ones((30, 30))
+
+    r_list = make_radius_list(image_size // 2, image_size // 2)
+
+    results = photometry_step(
+        np.array(ones_image.shape) // 2,
+        r_list,
+        ones_image,
+        plot=True
+    )
+
+    results = [r_list] + list(results)
+
+    results = [np.round(l, 6) for l in results]
+
+    for r, photometry, aperture_area, error in zip(*results):
+        area = np.round(np.pi * r ** 2, 6)
+
+        photo_error = abs(photometry - area) / area
+        assert photo_error < 0.01, "{}".format(photo_error)
+
+        area_error = abs(aperture_area - area) / area
+        assert area_error < 0.01, "{}".format(area_error)
+
+
+def test_source_photometry(sersic_2d_image, segm_and_cat):
+    """
+    Test the source_photometry function by doing photometry on
+    a simulated image.
+    """
+    cat, segm, segm_deblend = segm_and_cat
+
+    source = cat[0]
+
+    max_pix = 120
+
+    r_list = make_radius_list(
+        max_pix=max_pix, # Max pixel to go up to
+        n=max_pix # the number of radii to produce
+    )
+
+
+    flux_arr, area_arr, error_arr = source_photometry(
+
+        # Inputs
+        source, # Source (`photutils.segmentation.catalog.SourceCatalog`)
+        sersic_2d_image.data, # Image as 2D array
+        segm_deblend, # Deblended segmentation map of image
+        r_list, # list of aperture radii
+
+        # Options
+        cutout_size=max(r_list)*2, # Cutout out size, set to double the max radius
+        bkg_sub=True, # Subtract background
+        sigma=1, sigma_type='clip', # Fit a 2D plane to pixels within 1 sigma of the mean
+        plot=True, vmax=0, vmin=1, # Show plot with max and min defined above
+    )
+
+
+
+def test_order_cat(segm_and_cat):
+    """Test if ordering is correct"""
+    cat, segm, segm_deblend = segm_and_cat
+    order = order_cat(cat, 'area')
+
+    source = None
+    for idx in order:
+        if source is not None:
+            assert source.area > cat[idx].area
+
+        source = cat[idx]
+
+
+def test_flux_to_abmag():
+    """Test HST Flux to AB mag conversions"""
+
+    header = fits.Header()
+
+    header['PHOTFLAM'] = 3.03865739999999e-20
+    header['PHOTZPT'] =  -21.10000000000001
+    header['PHOTPLAM'] = 10551.04700000001
+
+    mags = np.round(flux_to_abmag(100, header), 2)
+
+    assert mags == 21.27
diff --git a/petrofit/tests/test_segmentation.py b/petrofit/tests/test_segmentation.py
new file mode 100644
index 0000000..7306b78
--- /dev/null
+++ b/petrofit/tests/test_segmentation.py
@@ -0,0 +1,48 @@
+import pytest
+
+from petrofit.segmentation import (
+    plot_segments,
+    plot_segment_residual,
+    get_source_ellip,
+    get_source_elong,
+    get_source_position,
+    get_source_theta,
+)
+
+
+def test_make_catalog(segm_and_cat):
+    """This tests the segmentation, deblending and catalog code"""
+
+    cat, segm, segm_deblend = segm_and_cat
+
+    assert len(cat) == 3
+
+
+def test_get_functions(segm_and_cat):
+    """
+    Test the convenience functions that
+    get source properties
+    """
+    cat, segm, segm_deblend = segm_and_cat
+
+    base_source = cat[0]
+
+    source = base_source
+
+    assert get_source_position(source) == (base_source.maxval_xindex, base_source.maxval_yindex)
+    assert get_source_elong(source) == base_source.elongation.value
+    assert get_source_ellip(source) == base_source.ellipticity.value
+    assert get_source_theta(source) == base_source.orientation.to('rad').value
+
+
+def test_plot_segments(sersic_2d_image, segm_and_cat):
+    """Test segment plotting functions"""
+    cat, segm, segm_deblend = segm_and_cat
+
+    plot_segments(segm, vmax=1, vmin=0)
+
+    plot_segments(segm_deblend, vmax=1, vmin=0)
+
+    plot_segment_residual(segm, sersic_2d_image.data, vmax=1, vmin=0)
+
+