diff --git a/_toc.yml b/_toc.yml
index c6fb66e1b..c367c100d 100644
--- a/_toc.yml
+++ b/_toc.yml
@@ -56,3 +56,22 @@ parts:
- file: notebooks/STIS/target_acquisition/target_acquisition.ipynb
- file: notebooks/STIS/view_data/view_data.ipynb
- file: notebooks/STIS/extraction/1D_Extraction.ipynb
+ - caption: WFC3
+ chapters:
+ - file: notebooks/WFC3/README.md
+ - file: notebooks/WFC3/calwf3_recalibration/calwf3_recal_tvb.ipynb
+ - file: notebooks/WFC3/calwf3_v1.0_cte/calwf3_with_v1.0_PCTE.ipynb
+ - file: notebooks/WFC3/dash/dash.ipynb
+ - file: notebooks/WFC3/exception_report/wfc3_exception_report.ipynb
+ - file: notebooks/WFC3/filter_transformations/filter_transformations.ipynb
+ - file: notebooks/WFC3/flux_conversion_tool/flux_conversion_tool.ipynb
+ - file: notebooks/WFC3/image_displayer_analyzer/wfc3_image_displayer_analyzer.ipynb
+ - file: notebooks/WFC3/ir_ima_visualization/IR_IMA_Visualization_with_an_Example_of_Time_Variable_Background.ipynb
+ - file: notebooks/WFC3/ir_scattered_light_calwf3_corrections/Correcting_for_Scattered_Light_in_IR_Exposures_Using_calwf3_to_Mask_Bad_Reads.ipynb
+ - file: notebooks/WFC3/ir_scattered_light_manual_corrections/Correcting_for_Scattered_Light_in_IR_Exposures_by_Manually_Subtracting_Bad_Reads.ipynb
+ - file: notebooks/WFC3/persistence/wfc3_ir_persistence.ipynb
+ - file: notebooks/WFC3/photometry_examples/phot_examples.ipynb
+ - file: notebooks/WFC3/tvb_flattenramp/TVB_flattenramp_notebook.ipynb
+ - file: notebooks/WFC3/uvis_pam_corrections/WFC3_UVIS_Pixel_Area_Map_Corrections_for_Subarrays.ipynb
+ - file: notebooks/WFC3/uvis_time_dependent_photometry/uvis_timedep_phot.ipynb
+ - file: notebooks/WFC3/zeropoints/zeropoints.ipynb
diff --git a/notebooks/ACS/acs_cte_forward_model/requirements.txt b/notebooks/ACS/acs_cte_forward_model/requirements.txt
index 5a15b2718..ec808d154 100644
--- a/notebooks/ACS/acs_cte_forward_model/requirements.txt
+++ b/notebooks/ACS/acs_cte_forward_model/requirements.txt
@@ -1,8 +1,6 @@
-acstools==3.6.1
+acstools==3.5.0
astropy==5.2.1
astroquery==0.4.6
matplotlib==3.7.0
numpy==1.23.4
photutils==1.6.0
-crds==11.16.14
-stsci-tools==4.0.1
\ No newline at end of file
diff --git a/notebooks/ACS/acs_findsat_mrt/requirements.txt b/notebooks/ACS/acs_findsat_mrt/requirements.txt
index eb7f27216..faca13750 100644
--- a/notebooks/ACS/acs_findsat_mrt/requirements.txt
+++ b/notebooks/ACS/acs_findsat_mrt/requirements.txt
@@ -1,13 +1,5 @@
-acstools==3.6.1
+acstools==3.5.0
astropy==5.2.1
+astroquery==0.4.6
matplotlib==3.7.0
numpy==1.23.4
-astroquery==0.4.6
-stsci-image==2.3.5
-stsci-imagestats==1.6.3
-stsci-skypac==1.0.9
-stsci-stimage==0.2.5
-stsci-tools==4.0.1
-crds==11.16.14
-photutils==1.6.0
-scikit-image==0.19.3
\ No newline at end of file
diff --git a/notebooks/ACS/acs_pixel_area_maps/requirements.txt b/notebooks/ACS/acs_pixel_area_maps/requirements.txt
index d3d1672dd..98a62fd15 100644
--- a/notebooks/ACS/acs_pixel_area_maps/requirements.txt
+++ b/notebooks/ACS/acs_pixel_area_maps/requirements.txt
@@ -1,6 +1,5 @@
astropy==5.2.1
astroquery==0.4.6
-matplotlib==3.7.0
stsci.image==2.3.5
stsci.imagestats==1.6.3
stsci.skypac==1.0.9
diff --git a/notebooks/ACS/acs_reduction/requirements.txt b/notebooks/ACS/acs_reduction/requirements.txt
index 3e23f6963..eda2977b7 100644
--- a/notebooks/ACS/acs_reduction/requirements.txt
+++ b/notebooks/ACS/acs_reduction/requirements.txt
@@ -1,5 +1,3 @@
astropy==5.2.1
astroquery==0.4.6
-matplotlib==3.7.0
stwcs==1.7.2
-crds==11.16.14
\ No newline at end of file
diff --git a/notebooks/ACS/acs_saturation_trails/requirements.txt b/notebooks/ACS/acs_saturation_trails/requirements.txt
index ad3ca9766..8ed722675 100644
--- a/notebooks/ACS/acs_saturation_trails/requirements.txt
+++ b/notebooks/ACS/acs_saturation_trails/requirements.txt
@@ -3,7 +3,7 @@ astroquery==0.4.6
matplotlib==3.7.0
numpy==1.23.4
photutils==1.6.0
-scipy==1.11.1
+scipy==1.9.1
stsci.image==2.3.5
stsci.imagestats==1.6.3
stsci.skypac==1.0.9
diff --git a/notebooks/ACS/acs_subarrays/requirements.txt b/notebooks/ACS/acs_subarrays/requirements.txt
index f18d11448..0362b7624 100644
--- a/notebooks/ACS/acs_subarrays/requirements.txt
+++ b/notebooks/ACS/acs_subarrays/requirements.txt
@@ -2,4 +2,3 @@ acstools==3.5.0
astropy==5.2.1
astroquery==0.4.6
stwcs==1.7.2
-crds==11.16.14
diff --git a/notebooks/COS/DayNight/requirements.txt b/notebooks/COS/DayNight/requirements.txt
index 92c83ebcc..046dd15fd 100644
--- a/notebooks/COS/DayNight/requirements.txt
+++ b/notebooks/COS/DayNight/requirements.txt
@@ -4,4 +4,3 @@ calcos==3.4.4
costools==1.2.6
matplotlib==3.7.0
numpy==1.23.4
-crds==11.17.0
\ No newline at end of file
diff --git a/notebooks/COS/Extract/requirements.txt b/notebooks/COS/Extract/requirements.txt
index c1c91711d..02145f91a 100644
--- a/notebooks/COS/Extract/requirements.txt
+++ b/notebooks/COS/Extract/requirements.txt
@@ -3,5 +3,4 @@ astroquery==0.4.6
calcos==3.4.4
matplotlib==3.7.0
numpy==1.23.4
-scipy==1.11.1
-crds==11.17.0
+scipy==1.9.1
diff --git a/notebooks/COS/LSF/requirements.txt b/notebooks/COS/LSF/requirements.txt
index 3dcfdd48f..9fc75b472 100644
--- a/notebooks/COS/LSF/requirements.txt
+++ b/notebooks/COS/LSF/requirements.txt
@@ -1,5 +1,5 @@
-astropy>=5.2.1
-astroquery>=0.4.6
-matplotlib>=3.7.0
-numpy>=1.23.4
-scipy>=1.11.1
+astropy==5.2.1
+astroquery==0.4.6
+matplotlib==3.7.0
+numpy==1.23.4
+scipy==1.9.1
diff --git a/notebooks/DrizzlePac/mask_satellite/requirements.txt b/notebooks/DrizzlePac/mask_satellite/requirements.txt
index bef4b7608..144d817c1 100644
--- a/notebooks/DrizzlePac/mask_satellite/requirements.txt
+++ b/notebooks/DrizzlePac/mask_satellite/requirements.txt
@@ -1,7 +1,8 @@
-acstools==3.6.1
+acstools==3.5.0
astropy==5.2.1
astroquery==0.4.6
drizzlepac==3.5.1
ipython==8.11.0
matplotlib==3.7.0
pyregion==2.2.0
+skimage==0.0
diff --git a/notebooks/STIS/calstis/requirements.txt b/notebooks/STIS/calstis/requirements.txt
index 8b9a744ba..8170165f6 100644
--- a/notebooks/STIS/calstis/requirements.txt
+++ b/notebooks/STIS/calstis/requirements.txt
@@ -1,8 +1,4 @@
astropy==5.2.1
astroquery==0.4.6
-ipython==8.11.0
matplotlib==3.7.0
-numpy==1.23.4
-pandas==1.5.3
stistools==1.4.4
-crds==11.17.3
\ No newline at end of file
diff --git a/notebooks/STIS/cross-correlation/requirements.txt b/notebooks/STIS/cross-correlation/requirements.txt
index 4701d8696..ffaa34b31 100644
--- a/notebooks/STIS/cross-correlation/requirements.txt
+++ b/notebooks/STIS/cross-correlation/requirements.txt
@@ -2,6 +2,5 @@ astropy==5.2.1
astroquery==0.4.6
matplotlib==3.7.0
numpy==1.23.4
-scipy==1.11.1
+scipy==1.9.1
stistools==1.4.4
-crds==11.17.3
\ No newline at end of file
diff --git a/notebooks/STIS/custom_ccd_darks/requirements.txt b/notebooks/STIS/custom_ccd_darks/requirements.txt
index 4b70d7587..f3ec2de4e 100644
--- a/notebooks/STIS/custom_ccd_darks/requirements.txt
+++ b/notebooks/STIS/custom_ccd_darks/requirements.txt
@@ -1,7 +1,6 @@
astropy==5.2.1
astroquery==0.4.6
-crds==11.16.20
matplotlib==3.7.0
numpy==1.23.4
+refstis==0.6.1
stistools==1.4.4
-refstis==0.8.2
diff --git a/notebooks/STIS/drizpac_notebook/requirements.txt b/notebooks/STIS/drizpac_notebook/requirements.txt
index c1025b23c..1cad07f60 100644
--- a/notebooks/STIS/drizpac_notebook/requirements.txt
+++ b/notebooks/STIS/drizpac_notebook/requirements.txt
@@ -1,15 +1,8 @@
astropy==5.2.1
astroquery==0.4.6
-crds==11.17.3
-drizzlepac==3.6.1
+drizzlepac==3.5.1
ipython==8.11.0
-matplotlib==3.6.0
+matplotlib==3.7.0
+numpy==1.23.4
pandas==1.5.3
-stistools==1.4.4
-stsci.tools==4.0.1
-pysynphot==1.0.0
-photutils==1.9.0
-setuptools==52.0.0
-stwcs==1.6.1
-stis_cti @ git+https://github.com/spacetelescope/stis_cti@master
-refstis==0.8.2
+stis_cti==1.1
diff --git a/notebooks/WFC3/README.md b/notebooks/WFC3/README.md
new file mode 100644
index 000000000..1d66081ae
--- /dev/null
+++ b/notebooks/WFC3/README.md
@@ -0,0 +1,106 @@
+WFC3Library
+===========
+
+Here the user will find the latest Python-based software notebooks for the Wide
+Field Camera 3 (WFC3) on the Hubble Space Telescope (HST). For our primary WFC3
+user-support tools, see [wfc3tools](https://github.com/spacetelescope/wfc3tools) and
+[WFC3 Software Tools](https://www.stsci.edu/hst/instrumentation/wfc3/software-tools).
+
+WFC3Library is the primary repository for Jupyter notebooks, including general tools,
+WFC3/IR, time variable background (TVB), and photometry. This repository contains the
+complementary notebooks mentioned in the [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb).
+These notebooks include:
+
+General Tools:
+- WFC3 Image Displayer and Analyzer
+- Exception Report Checklist - WFC3
+- Processing WFC3/UVIS Data with `calwf3` Using the v1.0 CTE-Correction
+
+WFC3/IR:
+- Masking Persistence in WFC3/IR Images
+- How to use `wfc3_dash` on DASH data
+
+WFC3/IR Time Variable Background (TVB):
+- WFC3/IR IMA Visualization Tools with an Example of Time Variable Background
+- Manual Recalibration of Images using `calwf3`: Turning off the WFC3/IR Linear Ramp Fit
+- Correcting for Helium Line Emission Background in WFC3/IR Exposures using the "Flatten-Ramp" Technique
+- Correcting for Scattered Light in WFC3/IR Exposures: Manually Subtracting Bad Reads
+- Correcting for Scattered Light in WFC3/IR Exposures: Using `calwf3` to Mask Bad Reads
+
+Photometry:
+- WFC3/UVIS Filter Transformations with `stsynphot`
+- Flux Unit Conversions with `synphot` and `stsynphot`
+- Synthetic Photometry Examples for WFC3
+- WFC3/UVIS Time-dependent Photometry
+- Calculating WFC3 Zeropoints with `stsynphot`
+- WFC3/UVIS Pixel Area Map Corrections for Subarrays
+
+Each folder in `notebooks` has an individual `README.md` with further
+details and a HTML file that can be opened in a browser after cloning this
+repository. The HTML file is identical to the notebook, except they contain
+output plots and tables.
+
+Installation
+------------
+
+All notebooks require the virtual environment `stenv-stable` (last stable
+version used for review was December 2022), which contains libraries necessary
+for processing and analyzing data from the Hubble Space Telescope (HST) and the
+James Webb Space Telescope (JWST).
+
+To install, see [stenv readthedocs](https://stenv.readthedocs.io/en/latest/)
+or [stenv GitHub](https://github.com/spacetelescope/stenv).
+
+In addition, the individual `README.md` files in `notebooks` may have
+further installation instructions. Please read them to run the notebooks
+properly.
+
+With the environment activated and additional libraries installed based on the
+individual `README.md` files, you will be able to complete the notebooks.
+
+Installation (Legacy Environment)
+---------------------------------
+
+**WARNING: `wfc3_env` is a legacy environment, meaning it is deprecated**
+**and no longer maintained. We recommend using `stenv-stable` in all cases.**
+
+All notebooks used to require the same anaconda virtual environment named
+`wfc3_env`. To create the virtual environment, run this line in a terminal
+window:
+
+ conda env create -f wfc3_env_legacy.yml
+
+To activate `wfc3_env`, run this line in a terminal window:
+
+ conda activate wfc3_env
+
+You can also create and activate `wfc3_env_no_builds`, which is `wfc3_env`
+but without the build specifications to avoid platform specific conflicts.
+
+Please read the individual `README.md` files in `notebooks` for further
+installation instructions.
+
+Contributing
+------------
+
+Please open a new issue or new pull request for bugs, feedback, or new features
+you would like to see. If there is an issue you would like to work on, please
+leave a comment and we will be happy to assist. New contributions and
+contributors are very welcome!
+
+WFC3Library follows the
+[Astropy Code of Conduct](https://www.astropy.org/code_of_conduct.html)
+and strives to provide a welcoming community to all of our users and
+contributors.
+
+Want more information about how to make a contribution? Take a look at
+the the `astropy`
+[contributing](https://www.astropy.org/contribute.html)
+and [developer](https://docs.astropy.org/en/stable/index.html#developer-documentation)
+documentation.
+
+
+License
+-------
+
+WFC3Library is licensed under a 3-clause BSD style license (see the `LICENSE.txt` file).
diff --git a/notebooks/WFC3/calwf3_recalibration/README.md b/notebooks/WFC3/calwf3_recalibration/README.md
new file mode 100644
index 000000000..bbf6fa072
--- /dev/null
+++ b/notebooks/WFC3/calwf3_recalibration/README.md
@@ -0,0 +1 @@
+A new Jupyter notebook provides `calwf3` reprocessing examples to improve calibrated WFC3/IR images affected by time-variable background. The notebook shows how to diagnose images with poor-quality ramp fits and rerun `calwf3` with the 'CRCORR' step turned off. This method is described as the 'Last-minus-first' technique [WFC3 ISR 2016-16](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2016/WFC3-2016-16.pdf). See Section 3.5.2 of the [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb) for more information.
diff --git a/notebooks/WFC3/calwf3_recalibration/calwf3_recal_tvb.ipynb b/notebooks/WFC3/calwf3_recalibration/calwf3_recal_tvb.ipynb
new file mode 100755
index 000000000..c5a53486a
--- /dev/null
+++ b/notebooks/WFC3/calwf3_recalibration/calwf3_recal_tvb.ipynb
@@ -0,0 +1,734 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Manual Recalibration with calwf3: Turning off the IR Linear Ramp Fit\n",
+ "***\n",
+ "\n",
+ "## Learning Goals\n",
+ "\n",
+ "This notebook shows two reprocessing examples for WFC3/IR observations impacted by time-variable background (TVB).\n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "- Analyze exposure statistics for each read in an IMA file using `pstat`.\n",
+ "- Reprocess a single exposure and an image association using `calwf3`.\n",
+ "- Combine the reprocessed exposures using `astrodrizzle`.\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#imports)
\n",
+ "[2. Download the data](#download)
\n",
+ "[3. Query CRDS for reference files](#query)
\n",
+ "[4. Diagnose TVB and reprocess a single exposure](#exec1)
\n",
+ "[5. Reprocess multiple exposures in an association](#exec2)
\n",
+ "[6. Conclusions](#conclusion)
\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Introduction\n",
+ "\n",
+ "Exposures in the F105W and F110W filters may be impacted by Helium I emission from the Earth's atmosphere at 1.083 microns. This typically affects the reads taken closest in time to Earth occultation. The emission produces a flat background signal which is added to the total background in a subset of reads. In some cases, this non-linear signal may be strong enough to compromise the ramp fitting performed by ``calwf3``, which is designed to flag and remove cosmic rays and saturated reads. The affected calibrated FLT data products will have much larger noise and a non-gaussian sky background. \n",
+ "\n",
+ "This notebook demonstrates how to diagnose and correct for a non-linear background and is based on the 'Last-minus-first' technique described in WFC3 ISR 2016-16: [Reprocessing WFC3/IR Exposures Affected by Time-Variable Backgrounds](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2016/WFC3-2016-16.pdf). This turns off the ramp fitting step in ``calwf3`` and treats the IR detector like a CCD that accumulates charge and is read out only at the end of the exposure. In this case, the observed count rate is determined by simply subtracting the first from the last read of the detector and dividing by the time elapsed between the two reads.\n",
+ "\n",
+ "While non-linear background also impacts the IR grisms, the method described here should not be used to correct G102 and G141 observations, which are affected by a combination of Helium I, Zodiacal background, and scattered Earth light, each of which varies spatially across the detector. More detail on correcting grism data is provided in WFC3 ISR 2020-04: [The dispersed infrared background in WFC3 G102 and G141 observations](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2020/WFC3_IR_2020-04.pdf)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "- *os* for setting environment variables\n",
+ "- *glob* for finding lists of files\n",
+ "- *shutil* for managing directories\n",
+ "\n",
+ "- *numpy* for handling array functions\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *astropy.io fits* for accessing FITS files\n",
+ "- *astroquery.mast Observations* for downloading data from MAST\n",
+ "\n",
+ "- *wfc3tools pstat* for plotting statistics of WFC3 data\n",
+ "- *wfc3tools calwf3* for calibrating WFC3 data\n",
+ "- *ccdproc* for building the association\n",
+ "- *stwcs* for updating the World Coordinate System\n",
+ "- *drizzlepac astrodrizzle* for combining images"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import os\n",
+ "import glob\n",
+ "import shutil \n",
+ "\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "from astropy.io import fits\n",
+ "from astroquery.mast import Observations\n",
+ "\n",
+ "from wfc3tools import pstat\n",
+ "from wfc3tools import calwf3\n",
+ "from ccdproc import ImageFileCollection\n",
+ "from stwcs import updatewcs\n",
+ "from drizzlepac import astrodrizzle"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 2. Download the data\n",
+ "\n",
+ "The following commands query MAST for the necessary products and then downloads them to the current directory. Here we obtain WFC3/IR observations from CANDELS program [12242](http://www.stsci.edu/cgi-bin/get-proposal-info?id=12442&observatory=HST), Visit BF. The data products requested are the ASN, RAW, IMA, FLT, and DRZ files.\n",
+ "\n",
+ "#### Warning: this cell may take a few minutes to complete."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "data_list = Observations.query_criteria(obs_id='IBOHBF040')\n",
+ "\n",
+ "Observations.download_products(data_list['obsid'],project='CALWF3',download_dir='./data',\n",
+ " mrp_only=False,productSubGroupDescription=['ASN','RAW','IMA','FLT','DRZ'])\n",
+ "\n",
+ "science_files = glob.glob('data/mastDownload/HST/*/*fits')\n",
+ "\n",
+ "for im in science_files:\n",
+ " root = im.split('/')[-1]\n",
+ " os.rename(im,'./'+root)\n",
+ "shutil.rmtree('data/')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The association file for visit BF comprises six consecutive exposures in F105W acquired in a single visit over 3 orbits. Each orbit consists of two 1600 sec exposures, followed by the Earth occultation. Each exposure is dithered by a small fraction of the field of view, where the POSTARG values listed below are in arseconds."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "collec = ImageFileCollection('./',\n",
+ " keywords=[\"asn_id\",\"targname\",\"filter\",\"samp_seq\",\"nsamp\",\"exptime\",\n",
+ " \"postarg1\",\"postarg2\",\"date-obs\",\"time-obs\",], glob_include=\"*flt.fits\", ext=0)\n",
+ "out_table = collec.summary\n",
+ "out_table"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. Query CRDS for reference files \n",
+ "\n",
+ "Before running `calwf3`, we need to set some environment variables for several subsequent calibration tasks.\n",
+ "\n",
+ "We will point to a subdirectory called `crds_cache/` using the IREF environment variable. The IREF variable is used for WFC3 reference files. Other instruments use other variables, e.g., JREF for ACS."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "os.environ['CRDS_SERVER_URL'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_SERVER'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_PATH'] = './crds_cache'\n",
+ "os.environ['iref'] = './crds_cache/references/hst/wfc3/'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The code block below will query CRDS for the best reference files currently available for these datasets and update the header keywords to point to these new files. We will use the Python package `os` to run terminal commands. In the terminal, the line would be:\n",
+ "\n",
+ "```crds bestrefs --files [filename] --sync-references=1 --update-bestrefs```\n",
+ "\n",
+ "...where 'filename' is the name of your fits file.\n",
+ "\n",
+ "#### Warning: this cell may take a few minutes to complete."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "raw_files = glob.glob('*_raw.fits')\n",
+ "\n",
+ "for file in raw_files:\n",
+ " command_line_input = 'crds bestrefs --files {:} --sync-references=1 --update-bestrefs'.format(file)\n",
+ " os.system(command_line_input)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. Diagnose TVB and reprocess a single exposure"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this example, we assume that the observer desires to reprocess only a single exposure with the ramp fitting step turned off. This is done by setting the CRCORR switch to OMIT from the default value (PERFORM)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First, we list the contents of the image association 'ibohbf040'. This provides the rootnames of the six dithered exposures. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fits.getdata('ibohbf040_asn.fits',1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here, we compare the first two images in the set: 'ibohbfb7q' and 'ibohbfb9q'. The first is has a nominal background with a constant rate and the second has a strongly non-linear background."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "b7q_data = fits.getdata('ibohbfb7q_flt.fits', ext=1)\n",
+ "b9q_data = fits.getdata('ibohbfb9q_flt.fits', ext=1)\n",
+ "\n",
+ "fig = plt.figure(figsize=(15,8))\n",
+ "ax1 = fig.add_subplot(1,2,1)\n",
+ "ax2 = fig.add_subplot(1,2,2)\n",
+ "\n",
+ "ax1.imshow(b7q_data, vmin=0.25,vmax=1.25,cmap='Greys_r',origin='lower')\n",
+ "ax2.imshow(b9q_data, vmin=1.25,vmax=2.25,cmap='Greys_r',origin='lower')\n",
+ "\n",
+ "ax1.set_title('ibohbfb7q (Linear Bkg)',fontsize=20)\n",
+ "ax2.set_title('ibohbfb9q (Non-linear Bkg)',fontsize=20)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we compare histograms of the two FLT frames. Exposure 'ibohbfb9q' has a strongly non-gaussian background with three separate peaks due to a poor ramp fit during `calwf3` processing."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize=(15,3))\n",
+ "ax1 = fig.add_subplot(1,2,1)\n",
+ "ax2 = fig.add_subplot(1,2,2)\n",
+ "\n",
+ "n, bins, patches = ax1.hist(b7q_data.flatten(),bins=200,range=(0,1))\n",
+ "n, bins, patches = ax2.hist(b9q_data.flatten(),bins=200,range=(1,2))\n",
+ "\n",
+ "ax1.set_title('ibohbfb7q (Linear Bkg)',fontsize=15)\n",
+ "ax2.set_title('ibohbfb9q (Non-linear Bkg)',fontsize=15)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we use `pstat` in `wfc3tools` to plot statistics for the individual reads in each IMA file. \n",
+ "Here, we plot the midpoint of each read in units of count rate. For the first image, the background is relatively constant throughout the exposure at 0.5 e/s. In the second image, the background quickly increases from a value of 0.5 e/s and levels off at ~1.5 e/s toward the end of the exposure. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "imafiles = ('ibohbfb7q_ima.fits', 'ibohbfb9q_ima.fits')\n",
+ "fig, axarr = plt.subplots(1, 2)\n",
+ "axarr = axarr.reshape(-1)\n",
+ "fig.set_size_inches(10, 3)\n",
+ "fig.set_dpi(100)\n",
+ "\n",
+ "for i, ima in enumerate(imafiles):\n",
+ " time, counts = pstat(ima, stat='midpt', units='rate', plot=False)\n",
+ " axarr[i].plot(time, counts, '+', markersize=10)\n",
+ " axarr[i].set_title(ima)\n",
+ " axarr[i].set_xlabel('Exposure time (s)')\n",
+ " axarr[i].set_ylabel('Count Rate (e-/s)')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To reprocess this image, we set the value of the header keyword CRCORR to \"OMIT\". This will perform all steps in the calibration pipeline except for the ramp fitting. To see the current value of CRCORR, we use `astropy.io.fits.getval( ) `."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fits.getval('ibohbfb9q_raw.fits', 'CRCORR', 0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we edit the primary image header of the raw file to reflect the new value of CRCORR."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fits.setval('ibohbfb9q_raw.fits', 'CRCORR', value='OMIT')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Before running `calwf3`, we move the original pipeline products to a directory called `orig/`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "os.mkdir('orig/')\n",
+ "\n",
+ "for imas in glob.glob('ibohbf*_ima.fits'):\n",
+ " shutil.move(imas,'orig/')\n",
+ "for flts in glob.glob('ibohbf*_flt.fits'):\n",
+ " shutil.move(flts,'orig/') \n",
+ "for driz in glob.glob('ibohbf*_drz.fits'):\n",
+ " shutil.move(driz,'orig/') "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally, we run `calwf3` on the single raw exposure."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "calwf3('ibohbfb9q_raw.fits')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The product will be a single calibrated IMA and FLT image. We now compare the original FLT and the reprocessed FLT for a small 200x200 pixel region of the detector. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "b9q_data = fits.getdata('orig/ibohbfb9q_flt.fits', ext=1)\n",
+ "b9q_newdata = fits.getdata('ibohbfb9q_flt.fits', ext=1)\n",
+ "\n",
+ "fig = plt.figure(figsize=(15,8))\n",
+ "ax1 = fig.add_subplot(1,2,1)\n",
+ "ax2 = fig.add_subplot(1,2,2)\n",
+ "\n",
+ "ax1.imshow(b9q_data[520:720,750:970], vmin=1.25,vmax=2.25,cmap='Greys_r',origin='lower')\n",
+ "ax2.imshow(b9q_newdata[520:720,750:970], vmin=1.25,vmax=2.25,cmap='Greys_r',origin='lower')\n",
+ "\n",
+ "ax1.set_title('ibohbfb9q (Original)', fontsize=20)\n",
+ "ax2.set_title('ibohbfb9q (Reprocessed)',fontsize=20)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here we plot the image histogram showing the background in the original and reprocessed images."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize=(15,3))\n",
+ "ax1 = fig.add_subplot(1,2,1)\n",
+ "ax2 = fig.add_subplot(1,2,2)\n",
+ "\n",
+ "n, bins, patches = ax1.hist(b9q_data.flatten(), bins=200,range=(1,2))\n",
+ "n, bins, patches = ax2.hist(b9q_newdata.flatten(),bins=200,range=(1,2))\n",
+ "\n",
+ "ax1.set_title('ibohbfb9q (Original FLT)', fontsize=15)\n",
+ "ax2.set_title('ibohbfb9q (Reprocessed FLT)',fontsize=15)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The non-gaussian image histogram is now corrected in the reprocessed FLT and the distribution is centered at a mean background of 1.5 e/s. One caveat of this approach is that cosmic-rays are not cleaned in the reprocessed image and will need to be corrected when combining the six FLT frames with AstroDrizzle. This is demonstrated in the next example."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 5. Reprocess multiple exposures in an association"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this example, we inspect the other images in the association to determine which are impacted by time-variable background, and we reprocess all six images with `calwf3` and `astrodrizzle`. \n",
+ "\n",
+ "Again, we list the contents of the association (asn) table."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dat = fits.getdata('ibohbf040_asn.fits',1)\n",
+ "dat"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can also print only the rootnames (ipppssoots) in the association."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dat['MEMNAME']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Using `pstat`, we can identify which of the six images are impacted by time-variable background.\n",
+ "\n",
+ "Individual exposures b9q, bgq, and bkq show signs of strong time-variable background, where the change is more than a factor of 2. We will turn off the ramp fitting for these images and rerun `calwf3`. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "imafiles = sorted(glob.glob('orig/*ima.fits'))\n",
+ "fig, axarr = plt.subplots(2, 3)\n",
+ "axarr = axarr.reshape(-1)\n",
+ "fig.set_size_inches(15, 8)\n",
+ "fig.set_dpi(80)\n",
+ "\n",
+ "for i, ima in enumerate(imafiles):\n",
+ " time, counts = pstat(ima, stat='midpt', units='rate', plot=False)\n",
+ " axarr[i].plot(time, counts, '+', markersize=10)\n",
+ " axarr[i].set_title(ima[5:], fontsize=12)\n",
+ " axarr[i].set_ylabel('Count Rate (e-/s)')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here we edit the primary image header of the three RAW images to set CRCORR to the value OMIT."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for rawfile in ['ibohbfb9q_raw.fits', 'ibohbfbgq_raw.fits', 'ibohbfbkq_raw.fits']:\n",
+ " fits.setval(rawfile, 'CRCORR', value='OMIT')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we remove the calibrated products from the first example and then run `calwf3` on the image association. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "os.remove('ibohbfb9q_ima.fits')\n",
+ "os.remove('ibohbfb9q_flt.fits')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "calwf3('ibohbf040_asn.fits')\n",
+ "\n",
+ "#Alternatively, calwf3 may be run on a list of RAW files rather than the ASN\n",
+ "\n",
+ "#for raws in glob.glob('ibohbf*_raw.fits'):\n",
+ "# calwf3(raws)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally we combine the reprocessed FLTs with AstroDrizzle.\n",
+ "\n",
+ "First, the World Coordinate System (WCS) of the calibrated images must be updated using `updatewcs`. This prepares the image for `astrodrizzle` to apply the various components of geometric distortion correction. \n",
+ "\n",
+ "When the parameter `use_db=False`, the WCS will be based on the coordinates of the Guide Star Catalogs in use at the time. No realignment of the images is performed, and this typically gives the best 'relative' astrometry between exposures in a visit, either in the same filter or across multiple filters. \n",
+ "\n",
+ "When `use_db=True`, the software will connect to the astrometry database and update the WCS to an absolute frame of reference, typically based on an external catalog such as Gaia. Here, the quality of the fit is dependent on the number of bright sources in each image, and in some cased the relative astrometry may not be optimal. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for flts in glob.glob('ibohbf*_flt.fits'):\n",
+ " updatewcs.updatewcs(input=flts, use_db=False) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we use AstroDrizzle to combine the FLT frames, making use of internal CR-flagging algorithms to clean the images. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "astrodrizzle.AstroDrizzle(input='ibohbf040_asn.fits', mdriztab=True, preserve=False, clean=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The quality of the reprocessed DRZ product is significantly improved and the histogram of the background is narrower. Cosmic-rays which were present in the three reprocessed FLTs are effectively cleaned from the combined image. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "drz_origdata = fits.getdata('orig/ibohbf040_drz.fits', ext=1)\n",
+ "drz_newdata = fits.getdata('ibohbf040_drz.fits', ext=1)\n",
+ "\n",
+ "fig = plt.figure(figsize=(15,8))\n",
+ "ax1 = fig.add_subplot(1,2,1)\n",
+ "ax2 = fig.add_subplot(1,2,2)\n",
+ "\n",
+ "ax1.imshow(drz_origdata[520:720,750:970], vmin=0.4,vmax=0.6,cmap='Greys_r',origin='lower')\n",
+ "ax2.imshow(drz_newdata[520:720,750:970], vmin=0.4,vmax=0.6,cmap='Greys_r',origin='lower')\n",
+ "\n",
+ "ax1.set_title('Original DRZ',fontsize=20)\n",
+ "ax2.set_title('Reprocessed DRZ',fontsize=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize=(15,3))\n",
+ "ax1 = fig.add_subplot(1,2,1)\n",
+ "ax2 = fig.add_subplot(1,2,2)\n",
+ "\n",
+ "n, bins, patches = ax1.hist(drz_origdata.flatten(),bins=200,range=(0.4,0.52))\n",
+ "n, bins, patches = ax2.hist(drz_newdata.flatten(), bins=200,range=(0.4,0.52))\n",
+ "\n",
+ "ax1.set_title('Original DRZ', fontsize=15)\n",
+ "ax2.set_title('Reprocessed DRZ',fontsize=15)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 6. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. Now using WFC3 data, you should be more familiar with:\n",
+ "\n",
+ "- Analyzing exposure statistics for each read in an IMA file using `pstat`.\n",
+ "- Reprocessing a single exposure and an image association using `calwf3`.\n",
+ "- Combining the reprocessed exposures using `astrodrizzle`.\n",
+ "\n",
+ "#### Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ " - see section 3.5.2 for reference to this notebook\n",
+ " - see section 7.10 for further discussion of time-variable background\n",
+ "\n",
+ " \n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Authors:** Jennifer Mack, Harish Khandrika; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** 2021-09-13\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `astropy`, `astroquery`, `wfc3tools`, or `drizzlepac` for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://astroquery.readthedocs.io/en/latest/)\n",
+ "* [Citing `wfc3tools`](https://wfc3tools.readthedocs.io/en/latest/)\n",
+ "* [Citing `drizzlepac`](https://drizzlepac.readthedocs.io/en/latest/LICENSE.html)\n",
+ "\n",
+ "***\n",
+ "[Top of Page](#title)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.7.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/notebooks/WFC3/calwf3_recalibration/requirements.txt b/notebooks/WFC3/calwf3_recalibration/requirements.txt
new file mode 100644
index 000000000..26df866c6
--- /dev/null
+++ b/notebooks/WFC3/calwf3_recalibration/requirements.txt
@@ -0,0 +1,8 @@
+astropy==5.2.1
+astroquery==0.4.6
+ccdproc==2.4.0
+drizzlepac==3.5.1
+matplotlib==3.7.0
+numpy==1.23.4
+stwcs==1.7.2
+wfc3tools==1.4.0
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/README.md b/notebooks/WFC3/calwf3_v1.0_cte/README.md
new file mode 100755
index 000000000..0e3469566
--- /dev/null
+++ b/notebooks/WFC3/calwf3_v1.0_cte/README.md
@@ -0,0 +1,22 @@
+This directory, once cloned from the repository, should contain this
+`README.md`, the Jupyter Notebook `calwf3_with_v1.0_PCTE.ipynb`, a file
+called `archived_drkcfiles.txt` and a subdirectory `example/`.
+
+**In order to run this Jupyter Notebook you must have created a virtual
+conda environment that includes `calwf3` v3.5.2.** Version 3.5.2 of `calwf3`
+is available in HSTCAL release 2.5.0. To create an environment with
+`calwf3` v3.5.2 try this from the terminal:
+
+```
+$ conda config --add channels http://ssb.stsci.edu/astroconda
+
+$ conda create -n v1_PCTE hstcal==2.5.0 python=3.7 ginga stsci-hst notebook
+```
+
+In general, users wanting to use the v1.0 pixel-based CTE correction
+within `calwf3` should use `calwf3` v3.5.2. This version will provide the
+most up-to-date calibration procedures such as time-dependent photometric
+corrections and zeropoints, while also including the v1.0 correction.
+
+Questions or concerns should be sent to the [HST Help Desk](https://stsci.service-now.com/hst).
+---------------------------------------------------------------------
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/archived_drkcfiles.txt b/notebooks/WFC3/calwf3_v1.0_cte/archived_drkcfiles.txt
new file mode 100644
index 000000000..e56a9b10e
--- /dev/null
+++ b/notebooks/WFC3/calwf3_v1.0_cte/archived_drkcfiles.txt
@@ -0,0 +1,4023 @@
+#drkcfile delivery-date activation-date delivery-mjd activation-mjd useafter useafter-mjd
+01l21081i_dkc.fits 2016-01-21 2016-02-23 57408.789583 57441.766667 2009-05-11 54962.0
+39i1628mi_dkc.fits 2019-09-18 2019-09-18 58744.519444 58744.60625 2009-08-21 55064.114583
+zcv1957gi_dkc.fits 2016-01-21 2016-02-23 57408.621528 57441.766667 2009-08-22 55065.619444
+39i1632gi_dkc.fits 2019-09-18 2019-09-18 58744.522222 58744.60625 2009-08-23 55066.095139
+39i1621ci_dkc.fits 2019-09-18 2019-09-18 58744.514583 58744.60625 2009-08-24 55067.665278
+zcv1924di_dkc.fits 2016-01-08 2016-02-23 57395.566667 57441.766667 2009-08-25 55068.627083
+39i16289i_dkc.fits 2019-09-18 2019-09-18 58744.519444 58744.60625 2009-08-26 55069.609722
+39i1626pi_dkc.fits 2019-09-18 2019-09-18 58744.518056 58744.60625 2009-08-28 55071.160417
+zcv1924gi_dkc.fits 2016-01-08 2016-02-23 57395.566667 57441.766667 2009-08-29 55072.022222
+39i16523i_dkc.fits 2019-09-18 2019-09-18 58744.536111 58744.60625 2009-08-29 55072.157639
+39i16568i_dkc.fits 2019-09-18 2019-09-18 58744.538889 58744.60625 2009-08-30 55073.027083
+39i1703ti_dkc.fits 2019-09-18 2019-09-18 58744.544444 58744.60625 2009-08-30 55073.927778
+39i1634bi_dkc.fits 2019-09-18 2019-09-18 58744.523611 58744.60625 2009-09-01 55075.005556
+39i1644ci_dkc.fits 2019-09-18 2019-09-18 58744.530556 58744.60625 2009-09-02 55076.025694
+39i1647hi_dkc.fits 2019-09-18 2019-09-18 58744.532639 58744.60625 2009-09-03 55077.005556
+39i16553i_dkc.fits 2019-09-18 2019-09-18 58744.538194 58744.60625 2009-09-04 55078.102083
+39i16528i_dkc.fits 2019-09-18 2019-09-18 58744.536111 58744.60625 2009-09-05 55079.131944
+39i16333i_dkc.fits 2019-09-18 2019-09-18 58744.522917 58744.60625 2009-09-06 55080.0625
+39i16597i_dkc.fits 2019-09-18 2019-09-18 58744.540972 58744.60625 2009-09-06 55080.666667
+39i1626ki_dkc.fits 2019-09-18 2019-09-18 58744.518056 58744.60625 2009-09-07 55081.595833
+39i1643li_dkc.fits 2019-09-18 2019-09-18 58744.529861 58744.60625 2009-09-09 55083.058333
+39i16281i_dkc.fits 2019-09-18 2019-09-18 58744.519444 58744.60625 2009-09-10 55084.229167
+39i1622oi_dkc.fits 2019-09-18 2019-09-18 58744.515278 58744.60625 2009-09-11 55085.338889
+39i16430i_dkc.fits 2019-09-18 2019-09-18 58744.529861 58744.60625 2009-09-14 55088.854167
+zcv1924qi_dkc.fits 2016-01-08 2016-02-23 57395.567361 57441.766667 2009-09-14 55088.854167
+39i16517i_dkc.fits 2019-09-18 2019-09-18 58744.535417 58744.60625 2009-09-16 55090.102778
+zcv1924ti_dkc.fits 2016-01-08 2016-02-23 57395.568056 57441.766667 2009-09-18 55092.017361
+zcv1924si_dkc.fits 2016-01-08 2016-02-23 57395.568056 57441.766667 2009-09-18 55092.14375
+39i16343i_dkc.fits 2019-09-18 2019-09-18 58744.523611 58744.60625 2009-09-18 55092.194444
+39i1624mi_dkc.fits 2019-09-18 2019-09-18 58744.516667 58744.60625 2009-09-20 55094.05
+39i1649ti_dkc.fits 2019-09-18 2019-09-18 58744.534722 58744.60625 2009-09-20 55094.142361
+39i16428i_dkc.fits 2019-09-18 2019-09-18 58744.529167 58744.60625 2009-09-21 55095.125
+39i1617ei_dkc.fits 2019-09-18 2019-09-18 58744.511806 58744.60625 2009-09-23 55097.052778
+zcv19254i_dkc.fits 2016-01-08 2016-02-23 57395.568056 57441.766667 2009-09-24 55098.001389
+39i16300i_dkc.fits 2019-09-18 2019-09-18 58744.520833 58744.60625 2009-09-24 55098.013194
+39i16171i_dkc.fits 2019-09-18 2019-09-18 58744.511806 58744.60625 2009-09-25 55099.001389
+39i1629di_dkc.fits 2019-09-18 2019-09-18 58744.520139 58744.60625 2009-09-26 55100.202083
+zcv1927mi_dkc.fits 2016-01-11 2016-02-23 57398.59375 57441.766667 2009-09-27 55101.469444
+39i1629mi_dkc.fits 2019-09-18 2019-09-18 58744.520139 58744.60625 2009-09-28 55102.427778
+39i16189i_dkc.fits 2019-09-18 2019-09-18 58744.5125 58744.60625 2009-09-29 55103.133333
+39i1648pi_dkc.fits 2019-09-18 2019-09-18 58744.533333 58744.60625 2009-09-30 55104.311111
+39i16328i_dkc.fits 2019-09-18 2019-09-18 58744.522222 58744.60625 2009-10-01 55105.170139
+zcv1927ri_dkc.fits 2016-01-11 2016-02-23 57398.59375 57441.766667 2009-10-02 55106.098611
+39i1658li_dkc.fits 2019-09-18 2019-09-18 58744.540278 58744.60625 2009-10-02 55106.375694
+zcv1927si_dkc.fits 2016-01-11 2016-02-23 57398.594444 57441.766667 2009-10-03 55107.252083
+39i1638li_dkc.fits 2019-09-18 2019-09-18 58744.526389 58744.60625 2009-10-03 55107.305556
+39i1656pi_dkc.fits 2019-09-18 2019-09-18 58744.538889 58744.60625 2009-10-04 55108.371528
+zcv19280i_dkc.fits 2016-01-11 2016-02-23 57398.594444 57441.766667 2009-10-05 55109.123611
+39i1654oi_dkc.fits 2019-09-18 2019-09-18 58744.5375 58744.60625 2009-10-05 55109.301389
+zcv19281i_dkc.fits 2016-01-11 2016-02-23 57398.594444 57441.766667 2009-10-06 55110.124306
+39i1658gi_dkc.fits 2019-09-18 2019-09-18 58744.540278 58744.60625 2009-10-06 55110.232639
+39i16434i_dkc.fits 2019-09-18 2019-09-18 58744.529861 58744.60625 2009-10-07 55111.111806
+39i1658pi_dkc.fits 2019-09-18 2019-09-18 58744.540278 58744.60625 2009-10-08 55112.307639
+39i16384i_dkc.fits 2019-09-18 2019-09-18 58744.526389 58744.60625 2009-10-09 55113.242361
+39i1646gi_dkc.fits 2019-09-18 2019-09-18 58744.531944 58744.60625 2009-10-11 55115.222222
+39i16503i_dkc.fits 2019-09-18 2019-09-18 58744.534722 58744.60625 2009-10-12 55116.41875
+39i1627bi_dkc.fits 2019-09-18 2019-09-18 58744.51875 58744.60625 2009-10-16 55120.519444
+zcv19288i_dkc.fits 2016-01-11 2016-02-23 57398.595139 57441.766667 2009-10-18 55122.111806
+39i16181i_dkc.fits 2019-09-18 2019-09-18 58744.5125 58744.60625 2009-10-18 55122.371528
+39i1637pi_dkc.fits 2019-09-18 2019-09-18 58744.525694 58744.60625 2009-10-19 55123.076389
+39i16251i_dkc.fits 2019-09-18 2019-09-18 58744.517361 58744.60625 2009-10-20 55124.0875
+39i1628di_dkc.fits 2019-09-18 2019-09-18 58744.519444 58744.60625 2009-10-21 55125.027083
+39i16359i_dkc.fits 2019-09-18 2019-09-18 58744.524306 58744.60625 2009-10-22 55126.202083
+39i1618qi_dkc.fits 2019-09-18 2019-09-18 58744.5125 58744.60625 2009-10-25 55129.127083
+39i1647pi_dkc.fits 2019-09-18 2019-09-18 58744.532639 58744.60625 2009-10-25 55129.976389
+39i1628qi_dkc.fits 2019-09-18 2019-09-18 58744.519444 58744.60625 2009-10-27 55131.078472
+39i1642di_dkc.fits 2019-09-18 2019-09-18 58744.529167 58744.60625 2009-10-28 55132.001389
+39i1702ki_dkc.fits 2019-09-18 2019-09-18 58744.543056 58744.60625 2009-10-29 55133.020139
+zcv1958ei_dkc.fits 2016-01-15 2016-02-23 57402.023611 57441.766667 2009-10-30 55134.009722
+39i16444i_dkc.fits 2019-09-18 2019-09-18 58744.530556 58744.60625 2009-10-31 55135.090972
+39i1625di_dkc.fits 2019-09-18 2019-09-18 58744.517361 58744.60625 2009-11-01 55136.022222
+39i1622bi_dkc.fits 2019-09-18 2019-09-18 58744.515278 58744.60625 2009-11-02 55137.154167
+zcv1958ii_dkc.fits 2016-01-15 2016-02-23 57402.023611 57441.766667 2009-11-03 55138.027778
+39i16578i_dkc.fits 2019-09-18 2019-09-18 58744.539583 58744.60625 2009-11-03 55138.039583
+39i1621gi_dkc.fits 2019-09-18 2019-09-18 58744.514583 58744.60625 2009-11-05 55140.622917
+39i1651ti_dkc.fits 2019-09-18 2019-09-18 58744.536111 58744.60625 2009-11-06 55141.011806
+39i1640ti_dkc.fits 2019-09-18 2019-09-18 58744.528472 58744.60625 2009-11-07 55142.05
+39i17043i_dkc.fits 2019-09-18 2019-09-18 58744.544444 58744.60625 2009-11-08 55143.001389
+39i16453i_dkc.fits 2019-09-18 2019-09-18 58744.53125 58744.60625 2009-11-09 55144.638889
+zcv1958oi_dkc.fits 2016-01-15 2016-02-23 57402.024306 57441.766667 2009-11-10 55145.195833
+39i16213i_dkc.fits 2019-09-18 2019-09-18 58744.514583 58744.60625 2009-11-10 55145.921528
+39i1703gi_dkc.fits 2019-09-18 2019-09-18 58744.54375 58744.60625 2009-11-14 55149.215278
+39i16232i_dkc.fits 2019-09-18 2019-09-18 58744.515972 58744.60625 2009-11-16 55151.336111
+39i16227i_dkc.fits 2019-09-18 2019-09-18 58744.515278 58744.60625 2009-11-17 55152.427778
+39i16420i_dkc.fits 2019-09-18 2019-09-18 58744.529167 58744.60625 2009-11-18 55153.184028
+39i1631qi_dkc.fits 2019-09-18 2019-09-18 58744.521528 58744.60625 2009-11-20 55155.111111
+zcv19590i_dkc.fits 2016-01-15 2016-02-23 57402.025 57441.766667 2009-11-21 55156.061111
+39i16584i_dkc.fits 2019-09-18 2019-09-18 58744.540278 58744.60625 2009-11-21 55156.384722
+39i16200i_dkc.fits 2019-09-18 2019-09-18 58744.513889 58744.60625 2009-11-22 55157.721528
+39i1638hi_dkc.fits 2019-09-18 2019-09-18 58744.526389 58744.60625 2009-11-24 55159.213889
+zcv19593i_dkc.fits 2016-01-15 2016-02-23 57402.025 57441.766667 2009-11-25 55160.049306
+39i1631li_dkc.fits 2019-09-18 2019-09-18 58744.521528 58744.60625 2009-11-26 55161.051389
+zcv19595i_dkc.fits 2016-01-15 2016-02-23 57402.025 57441.766667 2009-11-27 55162.399306
+39i16593i_dkc.fits 2019-09-18 2019-09-18 58744.540972 58744.60625 2009-11-27 55162.411111
+39i1626ci_dkc.fits 2019-09-18 2019-09-18 58744.518056 58744.60625 2009-11-28 55163.326389
+39i1630mi_dkc.fits 2019-09-18 2019-09-18 58744.520833 58744.60625 2009-11-29 55164.025
+39i1652pi_dkc.fits 2019-09-18 2019-09-18 58744.536111 58744.60625 2009-11-30 55165.09375
+39i1700gi_dkc.fits 2019-09-18 2019-09-18 58744.541667 58744.60625 2009-12-01 55166.158333
+39i1653oi_dkc.fits 2019-09-18 2019-09-18 58744.536806 58744.60625 2009-12-02 55167.173611
+39i16398i_dkc.fits 2019-09-18 2019-09-18 58744.527083 58744.60625 2009-12-03 55168.201389
+39i1630ii_dkc.fits 2019-09-18 2019-09-18 58744.520833 58744.60625 2009-12-04 55169.015972
+39i16176i_dkc.fits 2019-09-18 2019-09-18 58744.511806 58744.60625 2009-12-05 55170.097917
+39i1650hi_dkc.fits 2019-09-18 2019-09-18 58744.534722 58744.60625 2009-12-06 55171.041667
+zcv2001ti_dkc.fits 2016-01-15 2016-02-23 57402.482639 57441.766667 2009-12-07 55172.227778
+39i1640hi_dkc.fits 2019-09-18 2019-09-18 58744.527778 58744.60625 2009-12-07 55172.265972
+39i1658ti_dkc.fits 2019-09-18 2019-09-18 58744.540972 58744.60625 2009-12-08 55173.036806
+39i1636hi_dkc.fits 2019-09-18 2019-09-18 58744.525 58744.60625 2009-12-11 55176.825
+zcv20022i_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-14 55179.251389
+39i16195i_dkc.fits 2019-09-18 2019-09-18 58744.513194 58744.60625 2009-12-14 55179.251389
+39i1633ki_dkc.fits 2019-09-18 2019-09-18 58744.522917 58744.60625 2009-12-16 55181.170139
+39i16347i_dkc.fits 2019-09-18 2019-09-18 58744.523611 58744.60625 2009-12-16 55181.201389
+39i1658ci_dkc.fits 2019-09-18 2019-09-18 58744.540278 58744.60625 2009-12-18 55183.05
+39i16478i_dkc.fits 2019-09-18 2019-09-18 58744.532639 58744.60625 2009-12-19 55184.001389
+39i1651gi_dkc.fits 2019-09-18 2019-09-18 58744.535417 58744.60625 2009-12-20 55185.188194
+zcv20027i_dkc.fits 2016-01-15 2016-02-23 57402.482639 57441.766667 2009-12-20 55185.219444
+39i16440i_dkc.fits 2019-09-18 2019-09-18 58744.530556 58744.60625 2009-12-21 55186.022222
+39i16508i_dkc.fits 2019-09-18 2019-09-18 58744.534722 58744.60625 2009-12-22 55187.001389
+zcv20028i_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-22 55187.001389
+zcv20029i_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-23 55188.584722
+39i1626ti_dkc.fits 2019-09-18 2019-09-18 58744.51875 58744.60625 2009-12-23 55188.584722
+zcv2002bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-25 55190.115278
+39i1621ti_dkc.fits 2019-09-18 2019-09-18 58744.515278 58744.60625 2009-12-25 55190.115278
+zcv2002ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-25 55190.253472
+39i16353i_dkc.fits 2019-09-18 2019-09-18 58744.524306 58744.60625 2009-12-25 55190.253472
+zcv2002ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-27 55192.001389
+39i1700ki_dkc.fits 2019-09-18 2019-09-18 58744.541667 58744.60625 2009-12-27 55192.001389
+zcv2002di_dkc.fits 2016-01-15 2016-02-23 57402.483333 57441.766667 2009-12-28 55193.622917
+39i1644ti_dkc.fits 2019-09-18 2019-09-18 58744.53125 58744.60625 2009-12-28 55193.642361
+zcv2002ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-29 55194.444444
+39i1647ci_dkc.fits 2019-09-18 2019-09-18 58744.532639 58744.60625 2009-12-29 55194.444444
+zcv2002fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-30 55195.55
+39i1634ki_dkc.fits 2019-09-18 2019-09-18 58744.523611 58744.60625 2009-12-30 55195.55
+39i1657ci_dkc.fits 2019-09-18 2019-09-18 58744.539583 58744.60625 2009-12-31 55196.274306
+zcv2002gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2009-12-31 55196.274306
+01j1656ti_dkc.fits 2016-01-19 2016-02-23 57406.506944 57441.766667 2010-01-01 55197.204167
+39i1701si_dkc.fits 2019-09-18 2019-09-18 58744.543056 58744.60625 2010-01-01 55197.544444
+zcv20052i_dkc.fits 2016-01-19 2016-02-23 57406.507639 57441.766667 2010-01-02 55198.347222
+39i1701ji_dkc.fits 2019-09-18 2019-09-18 58744.542361 58744.60625 2010-01-03 55199.076389
+39i17022i_dkc.fits 2019-09-18 2019-09-18 58744.543056 58744.60625 2010-01-06 55202.701389
+zcv20053i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-06 55202.701389
+zcv20054i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-08 55204.334028
+39i1659ci_dkc.fits 2019-09-18 2019-09-18 58744.540972 58744.60625 2010-01-08 55204.334028
+39i1655ki_dkc.fits 2019-09-18 2019-09-18 58744.538194 58744.60625 2010-01-09 55205.268056
+zcv20055i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-09 55205.268056
+39i1655pi_dkc.fits 2019-09-18 2019-09-18 58744.538194 58744.60625 2010-01-10 55206.118056
+zcv20056i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-10 55206.118056
+39i1624ei_dkc.fits 2019-09-18 2019-09-18 58744.516667 58744.60625 2010-01-11 55207.254167
+zcv20057i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-11 55207.254167
+39i1635mi_dkc.fits 2019-09-18 2019-09-18 58744.524306 58744.60625 2010-01-12 55208.134028
+zcv1957hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-12 55208.134028
+zcv1957ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-13 55209.452083
+39i16268i_dkc.fits 2019-09-18 2019-09-18 58744.518056 58744.60625 2010-01-13 55209.452083
+39i1618ii_dkc.fits 2019-09-18 2019-09-18 58744.5125 58744.60625 2010-01-14 55210.1375
+zcv19256i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-14 55210.1375
+zcv19257i_dkc.fits 2016-01-08 2016-02-23 57395.56875 57441.766667 2010-01-15 55211.183333
+zcv19258i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-16 55212.105556
+39i17003i_dkc.fits 2019-09-18 2019-09-18 58744.541667 58744.60625 2010-01-16 55212.105556
+zcv19259i_dkc.fits 2016-01-08 2016-02-23 57395.56875 57441.766667 2010-01-17 55213.652083
+39i16404i_dkc.fits 2019-09-18 2019-09-18 58744.527778 58744.60625 2010-01-18 55214.034028
+zcv1925ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-18 55214.447222
+39i16369i_dkc.fits 2019-09-18 2019-09-18 58744.525 58744.60625 2010-01-18 55214.447222
+39i1624ai_dkc.fits 2019-09-18 2019-09-18 58744.516667 58744.60625 2010-01-19 55215.445139
+zcv1925bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-19 55215.445139
+zcv1925ci_dkc.fits 2016-01-08 2016-02-23 57395.56875 57441.766667 2010-01-20 55216.443056
+zcv1925di_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-21 55217.372917
+39i16374i_dkc.fits 2019-09-18 2019-09-18 58744.525694 58744.60625 2010-01-21 55217.372917
+zcv1925ei_dkc.fits 2016-01-08 2016-02-23 57395.569444 57441.766667 2010-01-22 55218.134722
+39i1632ci_dkc.fits 2019-09-18 2019-09-18 58744.522222 58744.60625 2010-01-22 55218.146528
+zcv1925fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-23 55219.430556
+39i16557i_dkc.fits 2019-09-18 2019-09-18 58744.538194 58744.60625 2010-01-23 55219.430556
+39i1652ci_dkc.fits 2019-09-18 2019-09-18 58744.536111 58744.60625 2010-01-24 55220.086111
+zcv1925gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-24 55220.086111
+zcv1925hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-25 55221.503472
+39i1653si_dkc.fits 2019-09-18 2019-09-18 58744.5375 58744.60625 2010-01-25 55221.503472
+zcv1925ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-26 55222.363889
+39i1641gi_dkc.fits 2019-09-18 2019-09-18 58744.528472 58744.60625 2010-01-26 55222.363889
+zcv1925ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-27 55223.360417
+39i1645hi_dkc.fits 2019-09-18 2019-09-18 58744.53125 58744.60625 2010-01-27 55223.360417
+39i16439i_dkc.fits 2019-09-18 2019-09-18 58744.529861 58744.60625 2010-01-28 55224.360417
+zcv19549i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-28 55224.360417
+39i1620pi_dkc.fits 2019-09-18 2019-09-18 58744.513889 58744.60625 2010-01-29 55225.069444
+zcv1954ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-29 55225.069444
+39i16324i_dkc.fits 2019-09-18 2019-09-18 58744.522222 58744.60625 2010-01-30 55226.4625
+zcv1954bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-30 55226.4625
+39i16542i_dkc.fits 2019-09-18 2019-09-18 58744.5375 58744.60625 2010-01-31 55227.301389
+zcv1954ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-01-31 55227.301389
+zcv1925ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-01 55228.324306
+39i1638ci_dkc.fits 2019-09-18 2019-09-18 58744.526389 58744.60625 2010-02-01 55228.324306
+39i1657ki_dkc.fits 2019-09-18 2019-09-18 58744.539583 58744.60625 2010-02-04 55231.822222
+zcv1925li_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-04 55231.822222
+zcv1925mi_dkc.fits 2016-01-08 2016-02-23 57395.569444 57441.766667 2010-02-06 55233.979861
+39i1655gi_dkc.fits 2019-09-18 2019-09-18 58744.538194 58744.60625 2010-02-06 55233.991667
+39i1650li_dkc.fits 2019-09-18 2019-09-18 58744.534722 58744.60625 2010-02-07 55234.440278
+zcv1925ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-07 55234.440278
+39i1639pi_dkc.fits 2019-09-18 2019-09-18 58744.527083 58744.60625 2010-02-08 55235.251389
+zcv1925oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-08 55235.251389
+39i16537i_dkc.fits 2019-09-18 2019-09-18 58744.536806 58744.60625 2010-02-09 55236.575694
+zcv1925pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-09 55236.575694
+39i16390i_dkc.fits 2019-09-18 2019-09-18 58744.527083 58744.60625 2010-02-10 55237.504861
+zcv1925qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-10 55237.504861
+39i1616ni_dkc.fits 2019-09-18 2019-09-18 58744.511111 58744.60625 2010-02-12 55239.015972
+zcv1925si_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-12 55239.015972
+zcv1925ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-12 55239.500694
+39i1703ki_dkc.fits 2019-09-18 2019-09-18 58744.54375 58744.60625 2010-02-12 55239.500694
+zcv1925ti_dkc.fits 2016-01-08 2016-02-23 57395.570139 57441.766667 2010-02-13 55240.29375
+39i1652gi_dkc.fits 2019-09-18 2019-09-18 58744.536111 58744.60625 2010-02-13 55240.634722
+39i1623ai_dkc.fits 2019-09-18 2019-09-18 58744.515972 58744.60625 2010-02-14 55241.21875
+zcv19260i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-14 55241.21875
+39i1617ri_dkc.fits 2019-09-18 2019-09-18 58744.511806 58744.60625 2010-02-15 55242.254167
+zcv19261i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-15 55242.254167
+zcv19262i_dkc.fits 2016-01-08 2016-02-23 57395.570833 57441.766667 2010-02-16 55243.215972
+39i1651ki_dkc.fits 2019-09-18 2019-09-18 58744.535417 58744.60625 2010-02-16 55243.863889
+zcv1928ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-17 55244.424306
+39i1641ci_dkc.fits 2019-09-18 2019-09-18 58744.528472 58744.60625 2010-02-17 55244.424306
+39i16208i_dkc.fits 2019-09-18 2019-09-18 58744.513889 58744.60625 2010-02-18 55245.420833
+zcv1928ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-18 55245.420833
+zcv1928ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-19 55246.386806
+39i1628ii_dkc.fits 2019-09-18 2019-09-18 58744.519444 58744.60625 2010-02-19 55246.386806
+zcv1928li_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-20 55247.600694
+39i16473i_dkc.fits 2019-09-18 2019-09-18 58744.532639 58744.60625 2010-02-20 55247.600694
+39i1700si_dkc.fits 2019-09-18 2019-09-18 58744.542361 58744.60625 2010-02-21 55248.48125
+zcv1928mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-21 55248.48125
+zcv1928ni_dkc.fits 2016-01-11 2016-02-23 57398.595833 57441.766667 2010-02-22 55249.3
+39i16260i_dkc.fits 2019-09-18 2019-09-18 58744.518056 58744.60625 2010-02-22 55249.311806
+zcv1928oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-23 55250.284722
+39i16394i_dkc.fits 2019-09-18 2019-09-18 58744.527083 58744.60625 2010-02-23 55250.284722
+39i1654ji_dkc.fits 2019-09-18 2019-09-18 58744.5375 58744.60625 2010-02-24 55251.274306
+zcv1928pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-24 55251.274306
+39i1645ci_dkc.fits 2019-09-18 2019-09-18 58744.53125 58744.60625 2010-02-25 55252.205556
+zcv1928qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-02-25 55252.205556
+zcv1928ri_dkc.fits 2016-01-11 2016-02-23 57398.596528 57441.766667 2010-02-26 55253.336806
+39i16304i_dkc.fits 2019-09-18 2019-09-18 58744.520833 58744.60625 2010-02-26 55253.368056
+zcv1928si_dkc.fits 2016-01-11 2016-02-23 57398.596528 57441.766667 2010-02-28 55255.331944
+39i1618mi_dkc.fits 2019-09-18 2019-09-18 58744.5125 58744.60625 2010-02-28 55255.409722
+zcv1928ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-02 55257.911111
+39i1649ki_dkc.fits 2019-09-18 2019-09-18 58744.534028 58744.60625 2010-03-02 55257.911111
+zcv19291i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-05 55260.272222
+39i1616ai_dkc.fits 2019-09-18 2019-09-18 58744.511111 58744.60625 2010-03-05 55260.272222
+zcv19290i_dkc.fits 2016-01-11 2016-02-23 57398.596528 57441.766667 2010-03-05 55260.403472
+39i1616ri_dkc.fits 2019-09-18 2019-09-18 58744.511806 58744.60625 2010-03-05 55260.415278
+zcv19292i_dkc.fits 2016-01-11 2016-02-23 57398.596528 57441.766667 2010-03-07 55262.151389
+39i1647li_dkc.fits 2019-09-18 2019-09-18 58744.532639 58744.60625 2010-03-07 55262.179861
+zcv19293i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-08 55263.704861
+39i1645li_dkc.fits 2019-09-18 2019-09-18 58744.53125 58744.60625 2010-03-08 55263.704861
+39i16414i_dkc.fits 2019-09-18 2019-09-18 58744.528472 58744.60625 2010-03-10 55265.170833
+zcv19294i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-10 55265.170833
+zcv19295i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-11 55266.18125
+39i1629qi_dkc.fits 2019-09-18 2019-09-18 58744.520139 58744.60625 2010-03-11 55266.18125
+39i1643hi_dkc.fits 2019-09-18 2019-09-18 58744.529861 58744.60625 2010-03-12 55267.007639
+zcv19296i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-12 55267.007639
+zcv19297i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-12 55267.3125
+39i1630di_dkc.fits 2019-09-18 2019-09-18 58744.520833 58744.60625 2010-03-12 55267.3125
+zcv19298i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-14 55269.079861
+39i16264i_dkc.fits 2019-09-18 2019-09-18 58744.518056 58744.60625 2010-03-14 55269.079861
+39i1622si_dkc.fits 2019-09-18 2019-09-18 58744.515972 58744.60625 2010-03-15 55270.072222
+zcv19299i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-15 55270.072222
+39i1644pi_dkc.fits 2019-09-18 2019-09-18 58744.530556 58744.60625 2010-03-16 55271.022222
+39i1620di_dkc.fits 2019-09-18 2019-09-18 58744.513889 58744.60625 2010-03-16 55271.427778
+39i1659gi_dkc.fits 2019-09-18 2019-09-18 58744.540972 58744.60625 2010-03-18 55273.05
+zcv1929ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-18 55273.05
+39i1625mi_dkc.fits 2019-09-18 2019-09-18 58744.517361 58744.60625 2010-03-18 55273.645139
+zcv1929bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-18 55273.645139
+39i16480i_dkc.fits 2019-09-18 2019-09-18 58744.533333 58744.60625 2010-03-20 55275.182639
+zcv1929ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-20 55275.182639
+zcv19598i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-21 55276.047222
+39i1640ci_dkc.fits 2019-09-18 2019-09-18 58744.527778 58744.60625 2010-03-21 55276.047222
+39i1701fi_dkc.fits 2019-09-18 2019-09-18 58744.542361 58744.60625 2010-03-22 55277.126389
+zcv19599i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-22 55277.126389
+39i1702si_dkc.fits 2019-09-18 2019-09-18 58744.54375 58744.60625 2010-03-23 55278.001389
+zcv1959ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-23 55278.001389
+39i16365i_dkc.fits 2019-09-18 2019-09-18 58744.525 58744.60625 2010-03-24 55279.001389
+zcv1959bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-24 55279.001389
+zcv1959ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-25 55280.001389
+39i1617ji_dkc.fits 2019-09-18 2019-09-18 58744.511806 58744.60625 2010-03-25 55280.001389
+39i1636mi_dkc.fits 2019-09-18 2019-09-18 58744.525 58744.60625 2010-03-26 55281.001389
+zcv1959di_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-26 55281.001389
+39i1635ei_dkc.fits 2019-09-18 2019-09-18 58744.524306 58744.60625 2010-03-27 55282.001389
+zcv1959ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-27 55282.001389
+39i16299i_dkc.fits 2019-09-18 2019-09-18 58744.520139 58744.60625 2010-03-28 55283.001389
+zcv1959fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-28 55283.001389
+zcv1959gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-03-31 55286.740972
+39i16277i_dkc.fits 2019-09-18 2019-09-18 58744.51875 58744.60625 2010-03-31 55286.740972
+39i1659si_dkc.fits 2019-09-18 2019-09-18 58744.541667 58744.60625 2010-04-02 55288.302083
+zcv1959hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-02 55288.302083
+39i1636di_dkc.fits 2019-09-18 2019-09-18 58744.525 58744.60625 2010-04-04 55290.10625
+zcv1959ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-04 55290.10625
+39i16464i_dkc.fits 2019-09-18 2019-09-18 58744.531944 58744.60625 2010-04-04 55290.436111
+zcv1959ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-04 55290.436111
+39i17007i_dkc.fits 2019-09-18 2019-09-18 58744.541667 58744.60625 2010-04-05 55291.7
+zcv1959ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-05 55291.7
+39i1702oi_dkc.fits 2019-09-18 2019-09-18 58744.543056 58744.60625 2010-04-06 55292.161111
+zcv1959li_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-06 55292.161111
+zcv1959mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-07 55293.155556
+39i1633si_dkc.fits 2019-09-18 2019-09-18 58744.523611 58744.60625 2010-04-07 55293.155556
+39i17017i_dkc.fits 2019-09-18 2019-09-18 58744.542361 58744.60625 2010-04-08 55294.152083
+zcv1959ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-08 55294.152083
+zcv1959oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-09 55295.60625
+39i1651pi_dkc.fits 2019-09-18 2019-09-18 58744.535417 58744.60625 2010-04-09 55295.60625
+zcv1959pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-11 55297.093056
+39i16513i_dkc.fits 2019-09-18 2019-09-18 58744.535417 58744.60625 2010-04-11 55297.093056
+zcv1959qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-11 55297.145833
+39i1624ri_dkc.fits 2019-09-18 2019-09-18 58744.516667 58744.60625 2010-04-11 55297.145833
+39i1655ci_dkc.fits 2019-09-18 2019-09-18 58744.538194 58744.60625 2010-04-12 55298.14375
+39i1652ki_dkc.fits 2019-09-18 2019-09-18 58744.536111 58744.60625 2010-04-14 55300.070833
+39i1616fi_dkc.fits 2019-09-18 2019-09-18 58744.511111 58744.60625 2010-04-14 55300.279167
+39i1646ti_dkc.fits 2019-09-18 2019-09-18 58744.532639 58744.60625 2010-04-15 55301.438889
+zcv1959ri_dkc.fits 2016-01-15 2016-02-23 57402.026389 57441.766667 2010-04-16 55302.20625
+39i16199i_dkc.fits 2019-09-18 2019-09-18 58744.513194 58744.60625 2010-04-16 55302.218056
+39i16388i_dkc.fits 2019-09-18 2019-09-18 58744.526389 58744.60625 2010-04-17 55303.204167
+zcv1959si_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-17 55303.204167
+zcv1959ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-18 55304.334722
+39i1703ci_dkc.fits 2019-09-18 2019-09-18 58744.54375 58744.60625 2010-04-18 55304.334722
+zcv20000i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-19 55305.35
+39i1617ni_dkc.fits 2019-09-18 2019-09-18 58744.511806 58744.60625 2010-04-19 55305.35
+zcv20001i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-20 55306.199306
+39i16314i_dkc.fits 2019-09-18 2019-09-18 58744.521528 58744.60625 2010-04-20 55306.199306
+zcv20002i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-21 55307.405556
+39i1627ji_dkc.fits 2019-09-18 2019-09-18 58744.51875 58744.60625 2010-04-21 55307.405556
+39i1644ki_dkc.fits 2019-09-18 2019-09-18 58744.530556 58744.60625 2010-04-22 55308.125694
+zcv2002hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-22 55308.125694
+39i1620li_dkc.fits 2019-09-18 2019-09-18 58744.513889 58744.60625 2010-04-23 55309.222222
+zcv2002ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-23 55309.222222
+zcv1957ji_dkc.fits 2016-01-21 2016-02-23 57408.621528 57441.766667 2010-04-24 55310.124306
+39i1654fi_dkc.fits 2019-09-18 2019-09-18 58744.5375 58744.60625 2010-04-25 55311.059028
+39i16533i_dkc.fits 2019-09-18 2019-09-18 58744.536806 58744.60625 2010-04-25 55311.334028
+zcv2002ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-25 55311.334028
+zcv2002ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-26 55312.300694
+39i1653ki_dkc.fits 2019-09-18 2019-09-18 58744.536806 58744.60625 2010-04-26 55312.300694
+39i16378i_dkc.fits 2019-09-18 2019-09-18 58744.525694 58744.60625 2010-04-30 55316.64375
+zcv2002li_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-04-30 55316.64375
+zcv2002mi_dkc.fits 2016-01-15 2016-02-23 57402.484028 57441.766667 2010-05-02 55318.119444
+39i16319i_dkc.fits 2019-09-18 2019-09-18 58744.521528 58744.60625 2010-05-02 55318.15
+39i1702fi_dkc.fits 2019-09-18 2019-09-18 58744.543056 58744.60625 2010-05-03 55319.439583
+zcv2002ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-03 55319.439583
+39i16191i_dkc.fits 2019-09-18 2019-09-18 58744.513194 58744.60625 2010-05-04 55320.059028
+zcv2002oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-04 55320.059028
+39i1619hi_dkc.fits 2019-09-18 2019-09-18 58744.513194 58744.60625 2010-05-05 55321.145139
+zcv2002pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-05 55321.145139
+zcv2002qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-06 55322.048611
+39i1617ai_dkc.fits 2019-09-18 2019-09-18 58744.511806 58744.60625 2010-05-06 55322.048611
+zcv2002ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-07 55323.013194
+39i1627ri_dkc.fits 2019-09-18 2019-09-18 58744.51875 58744.60625 2010-05-07 55323.013194
+zcv2002si_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-08 55324.184028
+39i16493i_dkc.fits 2019-09-18 2019-09-18 58744.534028 58744.60625 2010-05-08 55324.184028
+zcv2002ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-09 55325.291667
+39i1703pi_dkc.fits 2019-09-18 2019-09-18 58744.54375 58744.60625 2010-05-09 55325.291667
+zcv20030i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-10 55326.022222
+39i16255i_dkc.fits 2019-09-18 2019-09-18 58744.517361 58744.60625 2010-05-10 55326.022222
+zcv20031i_dkc.fits 2016-01-15 2016-02-23 57402.484722 57441.766667 2010-05-11 55327.324306
+39i16185i_dkc.fits 2019-09-18 2019-09-18 58744.5125 58744.60625 2010-05-11 55327.770833
+39i1651ci_dkc.fits 2019-09-18 2019-09-18 58744.535417 58744.60625 2010-05-12 55328.017361
+zcv20032i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-12 55328.017361
+zcv20033i_dkc.fits 2016-01-15 2016-02-23 57402.484722 57441.766667 2010-05-13 55329.049306
+39i1627fi_dkc.fits 2019-09-18 2019-09-18 58744.51875 58744.60625 2010-05-13 55329.061111
+39i1639hi_dkc.fits 2019-09-18 2019-09-18 58744.527083 58744.60625 2010-05-14 55330.175
+zcv20034i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-14 55330.175
+39i16588i_dkc.fits 2019-09-18 2019-09-18 58744.540278 58744.60625 2010-05-15 55331.013194
+zcv20035i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-15 55331.013194
+zcv20036i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-16 55332.020139
+39i1654si_dkc.fits 2019-09-18 2019-09-18 58744.538194 58744.60625 2010-05-16 55332.020139
+zcv20037i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-17 55333.022222
+39i1619qi_dkc.fits 2019-09-18 2019-09-18 58744.513194 58744.60625 2010-05-17 55333.022222
+zcv20038i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-18 55334.029861
+39i1631di_dkc.fits 2019-09-18 2019-09-18 58744.521528 58744.60625 2010-05-18 55334.029861
+zcv20039i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-19 55335.027778
+39i16259i_dkc.fits 2019-09-18 2019-09-18 58744.517361 58744.60625 2010-05-19 55335.027778
+39i1639ci_dkc.fits 2019-09-18 2019-09-18 58744.527083 58744.60625 2010-05-20 55336.311111
+zcv2003ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-20 55336.311111
+39i1631hi_dkc.fits 2019-09-18 2019-09-18 58744.521528 58744.60625 2010-05-21 55337.043056
+zcv2003bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-21 55337.043056
+zcv20058i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-22 55338.05625
+39i1646li_dkc.fits 2019-09-18 2019-09-18 58744.531944 58744.60625 2010-05-22 55338.05625
+39i1629hi_dkc.fits 2019-09-18 2019-09-18 58744.520139 58744.60625 2010-05-23 55339.0375
+zcv20059i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-23 55339.0375
+39i16246i_dkc.fits 2019-09-18 2019-09-18 58744.516667 58744.60625 2010-05-26 55342.952083
+zcv2005ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-26 55342.952083
+39i1616ji_dkc.fits 2019-09-18 2019-09-18 58744.511111 58744.60625 2010-05-28 55344.586111
+zcv2005bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-28 55344.586111
+39i1630qi_dkc.fits 2019-09-18 2019-09-18 58744.520833 58744.60625 2010-05-30 55346.015972
+zcv2005ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-30 55346.015972
+39i1636qi_dkc.fits 2019-09-18 2019-09-18 58744.525 58744.60625 2010-05-30 55346.361111
+zcv2005di_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-30 55346.361111
+zcv1957ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-05-31 55347.501389
+39i17033i_dkc.fits 2019-09-18 2019-09-18 58744.54375 58744.60625 2010-05-31 55347.501389
+zcv1957li_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-02 55349.028472
+39i1634oi_dkc.fits 2019-09-18 2019-09-18 58744.523611 58744.60625 2010-06-02 55349.028472
+zcv1957mi_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2010-06-03 55350.284028
+39i1637ci_dkc.fits 2019-09-18 2019-09-18 58744.525694 58744.60625 2010-06-03 55350.315278
+zcv19263i_dkc.fits 2016-01-08 2016-02-23 57395.570833 57441.766667 2010-06-04 55351.009028
+39i16424i_dkc.fits 2019-09-18 2019-09-18 58744.529167 58744.60625 2010-06-04 55351.028472
+zcv19264i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-05 55352.003472
+39i1649gi_dkc.fits 2019-09-18 2019-09-18 58744.534028 58744.60625 2010-06-05 55352.003472
+39i1648ci_dkc.fits 2019-09-18 2019-09-18 58744.533333 58744.60625 2010-06-06 55353.001389
+zcv19265i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-06 55353.001389
+zcv19266i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-07 55354.022222
+39i1648hi_dkc.fits 2019-09-18 2019-09-18 58744.533333 58744.60625 2010-06-07 55354.022222
+zcv19267i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-07 55354.393056
+39i1621pi_dkc.fits 2019-09-18 2019-09-18 58744.514583 58744.60625 2010-06-07 55354.393056
+39i1642hi_dkc.fits 2019-09-18 2019-09-18 58744.529167 58744.60625 2010-06-09 55356.002778
+zcv19268i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-09 55356.002778
+39i16223i_dkc.fits 2019-09-18 2019-09-18 58744.515278 58744.60625 2010-06-10 55357.029861
+zcv19269i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-10 55357.029861
+zcv1926ai_dkc.fits 2016-01-08 2016-02-23 57395.570833 57441.766667 2010-06-11 55358.071528
+39i16204i_dkc.fits 2019-09-18 2019-09-18 58744.513889 58744.60625 2010-06-11 55358.206944
+zcv1926bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-12 55359.066667
+39i1632ti_dkc.fits 2019-09-18 2019-09-18 58744.522917 58744.60625 2010-06-12 55359.066667
+zcv1926ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-12 55359.472917
+39i1622gi_dkc.fits 2019-09-18 2019-09-18 58744.515278 58744.60625 2010-06-12 55359.472917
+39i16448i_dkc.fits 2019-09-18 2019-09-18 58744.530556 58744.60625 2010-06-14 55361.270833
+zcv1926ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-14 55361.270833
+zcv1926di_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-14 55361.403472
+39i16488i_dkc.fits 2019-09-18 2019-09-18 58744.533333 58744.60625 2010-06-14 55361.403472
+zcv1954di_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-16 55363.060417
+39i16580i_dkc.fits 2019-09-18 2019-09-18 58744.540278 58744.60625 2010-06-16 55363.060417
+zcv1954ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-17 55364.001389
+39i16468i_dkc.fits 2019-09-18 2019-09-18 58744.531944 58744.60625 2010-06-17 55364.001389
+zcv1954fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-18 55365.557639
+39i16563i_dkc.fits 2019-09-18 2019-09-18 58744.538889 58744.60625 2010-06-18 55365.557639
+zcv1954gi_dkc.fits 2016-01-14 2016-02-23 57401.675 57441.766667 2010-06-21 55368.981944
+39i1622ki_dkc.fits 2019-09-18 2019-09-18 58744.515278 58744.60625 2010-06-22 55369.981944
+zcv1926fi_dkc.fits 2016-01-08 2016-02-23 57395.571528 57441.766667 2010-06-23 55370.358333
+39i1645pi_dkc.fits 2019-09-18 2019-09-18 58744.53125 58744.60625 2010-06-24 55371.547917
+zcv1926gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-24 55371.547917
+zcv1926hi_dkc.fits 2016-01-08 2016-02-23 57395.571528 57441.766667 2010-06-25 55372.259028
+zcv1926ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-26 55373.077778
+39i1641pi_dkc.fits 2019-09-18 2019-09-18 58744.528472 58744.60625 2010-06-26 55373.077778
+39i1656ci_dkc.fits 2019-09-18 2019-09-18 58744.538889 58744.60625 2010-06-27 55374.088889
+zcv1926ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-27 55374.088889
+39i1632ki_dkc.fits 2019-09-18 2019-09-18 58744.522222 58744.60625 2010-06-28 55375.816667
+zcv1926ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-28 55375.816667
+zcv1926li_dkc.fits 2016-01-08 2016-02-23 57395.572222 57441.766667 2010-06-29 55376.047222
+zcv1926mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-06-30 55377.042361
+39i16273i_dkc.fits 2019-09-18 2019-09-18 58744.51875 58744.60625 2010-06-30 55377.042361
+39i1701oi_dkc.fits 2019-09-18 2019-09-18 58744.542361 58744.60625 2010-07-01 55378.001389
+zcv1926ni_dkc.fits 2016-01-08 2016-02-23 57395.572222 57441.766667 2010-07-01 55378.036806
+39i1648li_dkc.fits 2019-09-18 2019-09-18 58744.533333 58744.60625 2010-07-02 55379.195139
+zcv1926oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-02 55379.195139
+39i1642mi_dkc.fits 2019-09-18 2019-09-18 58744.529167 58744.60625 2010-07-02 55379.401389
+zcv1926pi_dkc.fits 2016-01-08 2016-02-23 57395.572222 57441.766667 2010-07-03 55380.134028
+39i1646pi_dkc.fits 2019-09-18 2019-09-18 58744.531944 58744.60625 2010-07-04 55381.001389
+zcv1926qi_dkc.fits 2016-01-08 2016-02-23 57395.572222 57441.766667 2010-07-04 55381.020139
+39i1657gi_dkc.fits 2019-09-18 2019-09-18 58744.539583 58744.60625 2010-07-04 55381.393056
+zcv1926ri_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-07-05 55382.18125
+39i1623ei_dkc.fits 2019-09-18 2019-09-18 58744.515972 58744.60625 2010-07-05 55382.465972
+zcv1929di_dkc.fits 2016-01-11 2016-02-23 57398.597222 57441.766667 2010-07-06 55383.048611
+zcv1929ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-07 55384.640278
+39i1649ci_dkc.fits 2019-09-18 2019-09-18 58744.534028 58744.60625 2010-07-07 55384.640278
+zcv1929fi_dkc.fits 2016-01-11 2016-02-23 57398.597917 57441.766667 2010-07-08 55385.013194
+zcv1929gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-09 55386.006944
+39i1645ti_dkc.fits 2019-09-18 2019-09-18 58744.531944 58744.60625 2010-07-09 55386.006944
+39i1655ti_dkc.fits 2019-09-18 2019-09-18 58744.538889 58744.60625 2010-07-09 55386.704861
+zcv1929hi_dkc.fits 2016-01-11 2016-02-23 57398.597917 57441.766667 2010-07-10 55387.033333
+39i16418i_dkc.fits 2019-09-18 2019-09-18 58744.528472 58744.60625 2010-07-10 55387.536111
+zcv1929ii_dkc.fits 2016-01-11 2016-02-23 57398.597917 57441.766667 2010-07-11 55388.025694
+zcv1929ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-12 55389.456944
+39i1649pi_dkc.fits 2019-09-18 2019-09-18 58744.534028 58744.60625 2010-07-12 55389.456944
+zcv1929ki_dkc.fits 2016-01-11 2016-02-23 57398.597917 57441.766667 2010-07-13 55390.313194
+39i1659oi_dkc.fits 2019-09-18 2019-09-18 58744.540972 58744.60625 2010-07-13 55390.375
+zcv1929li_dkc.fits 2016-01-11 2016-02-23 57398.597917 57441.766667 2010-07-14 55391.165972
+39i1637hi_dkc.fits 2019-09-18 2019-09-18 58744.525694 58744.60625 2010-07-14 55391.508333
+zcv1929mi_dkc.fits 2016-01-11 2016-02-23 57398.597917 57441.766667 2010-07-15 55392.093056
+39i17013i_dkc.fits 2019-09-18 2019-09-18 58744.542361 58744.60625 2010-07-16 55393.369444
+zcv1929ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-16 55393.369444
+zcv1929oi_dkc.fits 2016-01-11 2016-02-23 57398.598611 57441.766667 2010-07-17 55394.019444
+39i1619di_dkc.fits 2019-09-18 2019-09-18 58744.513194 58744.60625 2010-07-18 55395.364583
+39i1626gi_dkc.fits 2019-09-18 2019-09-18 58744.518056 58744.60625 2010-07-21 55398.277083
+zcv1929pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-21 55398.277083
+zcv1929qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-23 55400.45625
+39i16285i_dkc.fits 2019-09-18 2019-09-18 58744.519444 58744.60625 2010-07-23 55400.45625
+39i1656gi_dkc.fits 2019-09-18 2019-09-18 58744.538889 58744.60625 2010-07-24 55401.335417
+zcv1929ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-24 55401.335417
+zcv1929si_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-25 55402.473611
+39i1638pi_dkc.fits 2019-09-18 2019-09-18 58744.526389 58744.60625 2010-07-25 55402.473611
+zcv1929ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-26 55403.638889
+39i16458i_dkc.fits 2019-09-18 2019-09-18 58744.53125 58744.60625 2010-07-26 55403.638889
+zcv19300i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-26 55403.651389
+39i1623ni_dkc.fits 2019-09-18 2019-09-18 58744.515972 58744.60625 2010-07-26 55403.651389
+39i1640pi_dkc.fits 2019-09-18 2019-09-18 58744.527778 58744.60625 2010-07-28 55405.334722
+zcv19301i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-28 55405.334722
+zcv19302i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-29 55406.001389
+39i16320i_dkc.fits 2019-09-18 2019-09-18 58744.522222 58744.60625 2010-07-29 55406.001389
+zcv19303i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-30 55407.239583
+39i1632pi_dkc.fits 2019-09-18 2019-09-18 58744.522222 58744.60625 2010-07-30 55407.239583
+zcv19304i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-07-31 55408.063889
+39i17027i_dkc.fits 2019-09-18 2019-09-18 58744.543056 58744.60625 2010-07-31 55408.063889
+zcv19305i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-01 55409.130556
+39i1652ti_dkc.fits 2019-09-18 2019-09-18 58744.536806 58744.60625 2010-08-01 55409.130556
+zcv19306i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-02 55410.027778
+39i1620hi_dkc.fits 2019-09-18 2019-09-18 58744.513889 58744.60625 2010-08-02 55410.027778
+39i1637ti_dkc.fits 2019-09-18 2019-09-18 58744.526389 58744.60625 2010-08-03 55411.082639
+zcv20003i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-03 55411.082639
+39i16484i_dkc.fits 2019-09-18 2019-09-18 58744.533333 58744.60625 2010-08-04 55412.249306
+zcv20004i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-04 55412.249306
+zcv20006i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-05 55413.46875
+39i1633oi_dkc.fits 2019-09-18 2019-09-18 58744.522917 58744.60625 2010-08-05 55413.46875
+zcv20005i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-05 55413.721528
+39i1635ii_dkc.fits 2019-09-18 2019-09-18 58744.524306 58744.60625 2010-08-05 55413.721528
+zcv20007i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-08 55416.122222
+39i1633gi_dkc.fits 2019-09-18 2019-09-18 58744.522917 58744.60625 2010-08-08 55416.122222
+zcv20008i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-09 55417.102778
+39i16236i_dkc.fits 2019-09-18 2019-09-18 58744.515972 58744.60625 2010-08-09 55417.102778
+zcv20009i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-10 55418.595833
+39i16242i_dkc.fits 2019-09-18 2019-09-18 58744.516667 58744.60625 2010-08-10 55418.595833
+39i1659ki_dkc.fits 2019-09-18 2019-09-18 58744.540972 58744.60625 2010-08-10 55418.932639
+zcv2000ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-10 55418.932639
+39i16497i_dkc.fits 2019-09-18 2019-09-18 58744.534028 58744.60625 2010-08-12 55420.189583
+zcv2000bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-12 55420.189583
+zcv2000ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-13 55421.253472
+39i1650ti_dkc.fits 2019-09-18 2019-09-18 58744.535417 58744.60625 2010-08-13 55421.253472
+zcv2000di_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-14 55422.167361
+39i1643di_dkc.fits 2019-09-18 2019-09-18 58744.529861 58744.60625 2010-08-14 55422.167361
+zcv2000ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-14 55422.690972
+39i1618ei_dkc.fits 2019-09-18 2019-09-18 58744.5125 58744.60625 2010-08-14 55422.690972
+39i1634si_dkc.fits 2019-09-18 2019-09-18 58744.524306 58744.60625 2010-08-15 55423.947222
+zcv2000fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-15 55423.947222
+zcv2000gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-17 55425.218056
+39i1656ti_dkc.fits 2019-09-18 2019-09-18 58744.539583 58744.60625 2010-08-17 55425.218056
+39i1621ki_dkc.fits 2019-09-18 2019-09-18 58744.514583 58744.60625 2010-08-20 55428.338889
+zcv2000hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-20 55428.338889
+39i1641li_dkc.fits 2019-09-18 2019-09-18 58744.528472 58744.60625 2010-08-22 55430.001389
+zcv2000ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-22 55430.001389
+39i1656ki_dkc.fits 2019-09-18 2019-09-18 58744.538889 58744.60625 2010-08-23 55431.73125
+zcv2000ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-23 55431.73125
+zcv2000ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-25 55433.220833
+39i1643pi_dkc.fits 2019-09-18 2019-09-18 58744.529861 58744.60625 2010-08-25 55433.220833
+39i1650ci_dkc.fits 2019-09-18 2019-09-18 58744.534722 58744.60625 2010-08-26 55434.028472
+zcv2000li_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-26 55434.028472
+zcv2000mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-27 55435.116667
+39i1635ri_dkc.fits 2019-09-18 2019-09-18 58744.524306 58744.60625 2010-08-27 55435.116667
+39i1644gi_dkc.fits 2019-09-18 2019-09-18 58744.530556 58744.60625 2010-08-28 55436.315972
+zcv2000ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-28 55436.315972
+39i1623si_dkc.fits 2019-09-18 2019-09-18 58744.516667 58744.60625 2010-08-29 55437.545139
+zcv2000oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-29 55437.545139
+39i17037i_dkc.fits 2019-09-18 2019-09-18 58744.54375 58744.60625 2010-08-30 55438.033333
+zcv2000pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-30 55438.033333
+39i1654bi_dkc.fits 2019-09-18 2019-09-18 58744.5375 58744.60625 2010-08-31 55439.135417
+zcv2000qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-08-31 55439.135417
+zcv2000ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-01 55440.110417
+39i1657pi_dkc.fits 2019-09-18 2019-09-18 58744.539583 58744.60625 2010-09-01 55440.110417
+zcv2003ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-02 55441.169444
+39i1642qi_dkc.fits 2019-09-18 2019-09-18 58744.529167 58744.60625 2010-09-02 55441.169444
+39i1620ti_dkc.fits 2019-09-18 2019-09-18 58744.514583 58744.60625 2010-09-03 55442.097917
+zcv2003di_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-03 55442.097917
+39i1646ci_dkc.fits 2019-09-18 2019-09-18 58744.531944 58744.60625 2010-09-04 55443.103472
+zcv2003ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-04 55443.103472
+zcv2003fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-05 55444.025694
+39i1625qi_dkc.fits 2019-09-18 2019-09-18 58744.517361 58744.60625 2010-09-05 55444.025694
+39i16290i_dkc.fits 2019-09-18 2019-09-18 58744.520139 58744.60625 2010-09-06 55445.265972
+zcv2003gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-06 55445.265972
+zcv2003hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-07 55446.019444
+39i1701bi_dkc.fits 2019-09-18 2019-09-18 58744.542361 58744.60625 2010-09-07 55446.019444
+zcv2003ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-08 55447.047917
+39i16361i_dkc.fits 2019-09-18 2019-09-18 58744.525 58744.60625 2010-09-08 55447.047917
+zcv2003ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-09 55448.017361
+39i1639ti_dkc.fits 2019-09-18 2019-09-18 58744.527778 58744.60625 2010-09-09 55448.017361
+39i1634fi_dkc.fits 2019-09-18 2019-09-18 58744.523611 58744.60625 2010-09-12 55451.08125
+zcv2003ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-12 55451.08125
+39i1633ci_dkc.fits 2019-09-18 2019-09-18 58744.522917 58744.60625 2010-09-13 55452.293056
+zcv2003li_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-13 55452.293056
+39i16337i_dkc.fits 2019-09-18 2019-09-18 58744.522917 58744.60625 2010-09-14 55453.008333
+zcv2003mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-14 55453.008333
+39i16408i_dkc.fits 2019-09-18 2019-09-18 58744.527778 58744.60625 2010-09-18 55457.157639
+zcv2003ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-18 55457.157639
+zcv2003oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-19 55458.756944
+39i16294i_dkc.fits 2019-09-18 2019-09-18 58744.520139 58744.60625 2010-09-19 55458.756944
+zcv2003pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-20 55459.585417
+39i1653fi_dkc.fits 2019-09-18 2019-09-18 58744.536806 58744.60625 2010-09-20 55459.585417
+zcv2003qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-22 55461.017361
+39i1624ii_dkc.fits 2019-09-18 2019-09-18 58744.516667 58744.60625 2010-09-22 55461.017361
+zcv2003ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-23 55462.173611
+39i16217i_dkc.fits 2019-09-18 2019-09-18 58744.514583 58744.60625 2010-09-23 55462.173611
+39i1619li_dkc.fits 2019-09-18 2019-09-18 58744.513194 58744.60625 2010-09-24 55463.501389
+zcv2003si_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-24 55463.501389
+zcv2003ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-25 55464.00625
+39i16309i_dkc.fits 2019-09-18 2019-09-18 58744.520833 58744.60625 2010-09-25 55464.00625
+39i1700ci_dkc.fits 2019-09-18 2019-09-18 58744.541667 58744.60625 2010-09-26 55465.10625
+zcv20040i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-26 55465.10625
+39i16370i_dkc.fits 2019-09-18 2019-09-18 58744.525694 58744.60625 2010-09-27 55466.002778
+zcv20041i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-27 55466.002778
+zcv20042i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-28 55467.153472
+39i16310i_dkc.fits 2019-09-18 2019-09-18 58744.521528 58744.60625 2010-09-28 55467.153472
+zcv20043i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-29 55468.0875
+39i1653bi_dkc.fits 2019-09-18 2019-09-18 58744.536806 58744.60625 2010-09-29 55468.0875
+39i16574i_dkc.fits 2019-09-18 2019-09-18 58744.539583 58744.60625 2010-09-30 55469.150694
+zcv20044i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-09-30 55469.150694
+39i1702bi_dkc.fits 2019-09-18 2019-09-18 58744.543056 58744.60625 2010-10-01 55470.163194
+zcv20045i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-01 55470.163194
+39i1637li_dkc.fits 2019-09-18 2019-09-18 58744.525694 58744.60625 2010-10-02 55471.001389
+zcv20046i_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-02 55471.001389
+zcv2005ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-03 55472.099306
+39i16547i_dkc.fits 2019-09-18 2019-09-18 58744.5375 58744.60625 2010-10-03 55472.099306
+39i1623ji_dkc.fits 2019-09-18 2019-09-18 58744.515972 58744.60625 2010-10-04 55473.188889
+zcv2005fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-04 55473.188889
+39i1648ti_dkc.fits 2019-09-18 2019-09-18 58744.534028 58744.60625 2010-10-06 55475.011806
+zcv2005gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-06 55475.011806
+zcv2005hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-06 55475.622222
+39i1639li_dkc.fits 2019-09-18 2019-09-18 58744.527083 58744.60625 2010-10-06 55475.622222
+zcv2005ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-08 55477.078472
+39i1640li_dkc.fits 2019-09-18 2019-09-18 58744.527778 58744.60625 2010-10-08 55477.078472
+39i1700oi_dkc.fits 2019-09-18 2019-09-18 58744.541667 58744.60625 2010-10-09 55478.297917
+zcv2005ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-09 55478.297917
+39i1650pi_dkc.fits 2019-09-18 2019-09-18 58744.534722 58744.60625 2010-10-10 55479.117361
+zcv2005ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-10 55479.117361
+39i1625ii_dkc.fits 2019-09-18 2019-09-18 58744.517361 58744.60625 2010-10-11 55480.5375
+zcv2005li_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-11 55480.5375
+zcv2005mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2010-10-11 55480.564583
+39i1627ni_dkc.fits 2019-09-18 2019-09-18 58744.51875 58744.60625 2010-10-11 55480.564583
+zcv1957ni_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2010-10-15 55484.568056
+zcv1957oi_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2010-10-17 55486.179167
+zcv1957pi_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2010-10-18 55487.700694
+zcv1926si_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-10-19 55488.035417
+zcv1926ti_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-10-20 55489.105556
+zcv19270i_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-10-21 55490.002778
+zcv19271i_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-10-22 55491.031944
+zcv19273i_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-10-23 55492.194444
+zcv19274i_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-10-24 55493.236806
+zcv19275i_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-10-25 55494.026389
+zcv19276i_dkc.fits 2016-01-08 2016-02-23 57395.572917 57441.766667 2010-10-26 55495.035417
+zcv19277i_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-10-27 55496.454167
+zcv19278i_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-10-28 55497.088889
+zcv19279i_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-10-29 55498.020833
+zcv1927ai_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-10-30 55499.096528
+01e1848ai_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2010-10-31 55500.092361
+zcv1954hi_dkc.fits 2016-01-14 2016-02-23 57401.675 57441.766667 2010-11-01 55501.218056
+zcv1954ii_dkc.fits 2016-01-14 2016-02-23 57401.675694 57441.766667 2010-11-03 55503.046528
+zcv1954ji_dkc.fits 2016-01-14 2016-02-23 57401.675694 57441.766667 2010-11-04 55504.216667
+zcv1954ki_dkc.fits 2016-01-14 2016-02-23 57401.675694 57441.766667 2010-11-05 55505.219444
+zcv1927bi_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-11-06 55506.168056
+zcv1927ci_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-11-07 55507.261111
+zcv1927di_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-11-09 55509.088889
+zcv1927ei_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-11-10 55510.334722
+zcv1927fi_dkc.fits 2016-01-08 2016-02-23 57395.573611 57441.766667 2010-11-14 55514.407639
+zcv1927gi_dkc.fits 2016-01-08 2016-02-23 57395.574306 57441.766667 2010-11-16 55516.646528
+zcv1927hi_dkc.fits 2016-01-08 2016-02-23 57395.574306 57441.766667 2010-11-16 55516.942361
+zcv1927ii_dkc.fits 2016-01-08 2016-02-23 57395.574306 57441.766667 2010-11-18 55518.061806
+zcv1927ji_dkc.fits 2016-01-08 2016-02-23 57395.574306 57441.766667 2010-11-19 55519.148611
+zcv1927ki_dkc.fits 2016-01-08 2016-02-23 57395.574306 57441.766667 2010-11-20 55520.00625
+zcv1927li_dkc.fits 2016-01-08 2016-02-23 57395.574306 57441.766667 2010-11-21 55521.002778
+zcv19307i_dkc.fits 2016-01-11 2016-02-23 57398.599306 57441.766667 2010-11-22 55522.020833
+zcv19308i_dkc.fits 2016-01-11 2016-02-23 57398.599306 57441.766667 2010-11-23 55523.013194
+zcv19309i_dkc.fits 2016-01-11 2016-02-23 57398.6 57441.766667 2010-11-24 55524.113889
+zcv1930ai_dkc.fits 2016-01-11 2016-02-23 57398.6 57441.766667 2010-11-25 55525.002778
+zcv1930bi_dkc.fits 2016-01-11 2016-02-23 57398.6 57441.766667 2010-11-26 55526.036111
+zcv1930ci_dkc.fits 2016-01-11 2016-02-23 57398.6 57441.766667 2010-11-27 55527.011111
+zcv1930di_dkc.fits 2016-01-11 2016-02-23 57398.6 57441.766667 2010-11-28 55528.197917
+zcv1930ei_dkc.fits 2016-01-11 2016-02-23 57398.6 57441.766667 2010-11-29 55529.010417
+zcv1930fi_dkc.fits 2016-01-11 2016-02-23 57398.6 57441.766667 2010-11-30 55530.048611
+zcv1930gi_dkc.fits 2016-01-11 2016-02-23 57398.6 57441.766667 2010-12-01 55531.013194
+zcv1930hi_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-02 55532.014583
+zcv1930ii_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-03 55533.188194
+zcv1930ji_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-04 55534.009722
+zcv1930ki_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-05 55535.065972
+zcv1930li_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-06 55536.426389
+zcv1930mi_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-09 55539.588194
+zcv1930ni_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-11 55541.248611
+zcv1930oi_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-12 55542.197222
+zcv1930pi_dkc.fits 2016-01-11 2016-02-23 57398.600694 57441.766667 2010-12-13 55543.252778
+zcv1930qi_dkc.fits 2016-01-11 2016-02-23 57398.601389 57441.766667 2010-12-14 55544.0375
+zcv1930ri_dkc.fits 2016-01-11 2016-02-23 57398.601389 57441.766667 2010-12-15 55545.045139
+zcv1930si_dkc.fits 2016-01-11 2016-02-23 57398.601389 57441.766667 2010-12-16 55546.160417
+zcv1930ti_dkc.fits 2016-01-11 2016-02-23 57398.601389 57441.766667 2010-12-17 55547.038194
+zcv19310i_dkc.fits 2016-01-11 2016-02-23 57398.601389 57441.766667 2010-12-18 55548.284722
+zcv19311i_dkc.fits 2016-01-11 2016-02-23 57398.601389 57441.766667 2010-12-19 55549.046528
+zcv2000si_dkc.fits 2016-01-15 2016-02-23 57402.029167 57441.766667 2010-12-20 55550.040278
+zcv2000ti_dkc.fits 2016-01-15 2016-02-23 57402.029167 57441.766667 2010-12-21 55551.220833
+zcv20010i_dkc.fits 2016-01-15 2016-02-23 57402.029167 57441.766667 2010-12-22 55552.227083
+zcv20011i_dkc.fits 2016-01-15 2016-02-23 57402.029167 57441.766667 2010-12-23 55553.052083
+zcv20012i_dkc.fits 2016-01-15 2016-02-23 57402.029167 57441.766667 2010-12-24 55554.073611
+zcv20013i_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2010-12-25 55555.09375
+zcv20014i_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2010-12-26 55556.742361
+zcv20015i_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2010-12-27 55557.173611
+zcv20016i_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2010-12-28 55558.09375
+zcv20017i_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2010-12-29 55559.150694
+zcv20018i_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2010-12-30 55560.809028
+zcv20019i_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2010-12-31 55561.091667
+zcv2001ai_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2011-01-01 55562.680556
+zcv2001bi_dkc.fits 2016-01-15 2016-02-23 57402.029861 57441.766667 2011-01-02 55563.882639
+zcv2001ci_dkc.fits 2016-01-15 2016-02-23 57402.030556 57441.766667 2011-01-03 55564.253472
+zcv2001di_dkc.fits 2016-01-15 2016-02-23 57402.030556 57441.766667 2011-01-07 55568.279861
+zcv2001ei_dkc.fits 2016-01-15 2016-02-23 57402.030556 57441.766667 2011-01-08 55569.658333
+zcv2001fi_dkc.fits 2016-01-15 2016-02-23 57402.030556 57441.766667 2011-01-10 55571.656944
+zcv2001gi_dkc.fits 2016-01-15 2016-02-23 57402.030556 57441.766667 2011-01-12 55573.140972
+zcv2001ii_dkc.fits 2016-01-15 2016-02-23 57402.030556 57441.766667 2011-01-13 55574.061111
+zcv2001hi_dkc.fits 2016-01-15 2016-02-23 57402.030556 57441.766667 2011-01-13 55574.927778
+zcv2001ji_dkc.fits 2016-01-15 2016-02-23 57402.03125 57441.766667 2011-01-15 55576.549306
+zcv2001ki_dkc.fits 2016-01-15 2016-02-23 57402.03125 57441.766667 2011-01-16 55577.127083
+zcv2001li_dkc.fits 2016-01-15 2016-02-23 57402.03125 57441.766667 2011-01-17 55578.73125
+zcv2001mi_dkc.fits 2016-01-15 2016-02-23 57402.03125 57441.766667 2011-01-18 55579.780556
+zcv20047i_dkc.fits 2016-01-15 2016-02-23 57402.4875 57441.766667 2011-01-20 55581.004167
+zcv20048i_dkc.fits 2016-01-15 2016-02-23 57402.4875 57441.766667 2011-01-21 55582.579167
+zcv20049i_dkc.fits 2016-01-15 2016-02-23 57402.4875 57441.766667 2011-01-21 55582.865278
+zcv2004ai_dkc.fits 2016-01-15 2016-02-23 57402.4875 57441.766667 2011-01-23 55584.140278
+zcv2004bi_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-01-24 55585.261111
+zcv2004ci_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-01-25 55586.451389
+zcv2004di_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-01-25 55586.868056
+zcv2004ei_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-01-27 55588.059028
+zcv2004fi_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-01-28 55589.342361
+zcv2004gi_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-01-29 55590.0
+zcv2004hi_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-01-30 55591.06875
+zcv2004ii_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-01-30 55591.888194
+zcv2004ji_dkc.fits 2016-01-15 2016-02-23 57402.488194 57441.766667 2011-02-01 55593.026389
+zcv2004ki_dkc.fits 2016-01-15 2016-02-23 57402.488889 57441.766667 2011-02-02 55594.029861
+zcv2004li_dkc.fits 2016-01-15 2016-02-23 57402.488889 57441.766667 2011-02-05 55597.391667
+zcv2004mi_dkc.fits 2016-01-15 2016-02-23 57402.488889 57441.766667 2011-02-07 55599.261806
+zcv2004ni_dkc.fits 2016-01-15 2016-02-23 57402.488889 57441.766667 2011-02-08 55600.630556
+zcv2004oi_dkc.fits 2016-01-15 2016-02-23 57402.488889 57441.766667 2011-02-09 55601.120833
+zcv2004pi_dkc.fits 2016-01-15 2016-02-23 57402.488889 57441.766667 2011-02-10 55602.016667
+zcv2004qi_dkc.fits 2016-01-15 2016-02-23 57402.488889 57441.766667 2011-02-11 55603.019444
+zcv2004ri_dkc.fits 2016-01-15 2016-02-23 57402.488889 57441.766667 2011-02-12 55604.070833
+zcv2004si_dkc.fits 2016-01-15 2016-02-23 57402.489583 57441.766667 2011-02-13 55605.084722
+zcv2004ti_dkc.fits 2016-01-15 2016-02-23 57402.489583 57441.766667 2011-02-14 55606.013889
+zcv20050i_dkc.fits 2016-01-15 2016-02-23 57402.489583 57441.766667 2011-02-15 55607.476389
+zcv20051i_dkc.fits 2016-01-15 2016-02-23 57402.489583 57441.766667 2011-02-16 55608.009028
+zcv2005ni_dkc.fits 2016-01-19 2016-02-23 57406.509028 57441.766667 2011-02-17 55609.011111
+zcv2005oi_dkc.fits 2016-01-19 2016-02-23 57406.509028 57441.766667 2011-02-18 55610.0
+zcv2005pi_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-19 55611.142361
+zcv2005qi_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-20 55612.0
+zcv2005ri_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-21 55613.215278
+zcv2005si_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-22 55614.014583
+zcv2005ti_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-23 55615.006944
+zcv20060i_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-24 55616.00625
+zcv20061i_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-25 55617.010417
+zcv20062i_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-26 55618.0
+zcv20063i_dkc.fits 2016-01-19 2016-02-23 57406.509722 57441.766667 2011-02-27 55619.094444
+zcv20064i_dkc.fits 2016-01-19 2016-02-23 57406.510417 57441.766667 2011-02-28 55620.207639
+zcv20065i_dkc.fits 2016-01-19 2016-02-23 57406.510417 57441.766667 2011-03-03 55623.672917
+zcv20066i_dkc.fits 2016-01-19 2016-02-23 57406.510417 57441.766667 2011-03-05 55625.057639
+zcv20067i_dkc.fits 2016-01-19 2016-02-23 57406.510417 57441.766667 2011-03-06 55626.050694
+zcv20068i_dkc.fits 2016-01-19 2016-02-23 57406.510417 57441.766667 2011-03-07 55627.055556
+zcv20069i_dkc.fits 2016-01-19 2016-02-23 57406.510417 57441.766667 2011-03-08 55628.469444
+zcv2006ai_dkc.fits 2016-01-19 2016-02-23 57406.510417 57441.766667 2011-03-09 55629.354167
+zcv2006bi_dkc.fits 2016-01-19 2016-02-23 57406.510417 57441.766667 2011-03-10 55630.198611
+zcv2006ci_dkc.fits 2016-01-19 2016-02-23 57406.511111 57441.766667 2011-03-11 55631.284722
+zcv2006di_dkc.fits 2016-01-19 2016-02-23 57406.511111 57441.766667 2011-03-12 55632.044444
+zcv2006ei_dkc.fits 2016-01-19 2016-02-23 57406.511111 57441.766667 2011-03-13 55633.132639
+zcv2006fi_dkc.fits 2016-01-19 2016-02-23 57406.511111 57441.766667 2011-03-14 55634.124306
+zcv2006gi_dkc.fits 2016-01-19 2016-02-23 57406.511111 57441.766667 2011-03-15 55635.249306
+zcv2006hi_dkc.fits 2016-01-19 2016-02-23 57406.511111 57441.766667 2011-03-16 55636.131944
+zcv2006ii_dkc.fits 2016-01-19 2016-02-23 57406.511111 57441.766667 2011-03-17 55637.311806
+zcv2006ji_dkc.fits 2016-01-19 2016-02-23 57406.511111 57441.766667 2011-03-18 55638.052778
+zcv2006ki_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-03-19 55639.242361
+01j1842ni_dkc.fits 2016-01-19 2016-02-23 57406.582639 57441.766667 2011-03-20 55640.240972
+zcv2008bi_dkc.fits 2016-01-19 2016-02-23 57406.582639 57441.766667 2011-03-21 55641.248611
+zcv2008ci_dkc.fits 2016-01-19 2016-02-23 57406.582639 57441.766667 2011-03-22 55642.111111
+zcv2008di_dkc.fits 2016-01-19 2016-02-23 57406.583333 57441.766667 2011-03-23 55643.263889
+zcv2008ei_dkc.fits 2016-01-19 2016-02-23 57406.583333 57441.766667 2011-03-24 55644.053472
+zcv2008fi_dkc.fits 2016-01-19 2016-02-23 57406.583333 57441.766667 2011-03-25 55645.088889
+zcv2008gi_dkc.fits 2016-01-19 2016-02-23 57406.583333 57441.766667 2011-03-26 55646.086806
+zcv2008hi_dkc.fits 2016-01-19 2016-02-23 57406.583333 57441.766667 2011-03-30 55650.66875
+zcv2008ii_dkc.fits 2016-01-19 2016-02-23 57406.583333 57441.766667 2011-04-01 55652.070833
+zcv2008ji_dkc.fits 2016-01-19 2016-02-23 57406.583333 57441.766667 2011-04-02 55653.038194
+zcv2008ki_dkc.fits 2016-01-19 2016-02-23 57406.584028 57441.766667 2011-04-03 55654.038889
+zcv2008li_dkc.fits 2016-01-19 2016-02-23 57406.584028 57441.766667 2011-04-04 55655.177083
+zcv2008mi_dkc.fits 2016-01-19 2016-02-23 57406.584028 57441.766667 2011-04-05 55656.043056
+zcv2008ni_dkc.fits 2016-01-19 2016-02-23 57406.584028 57441.766667 2011-04-06 55657.035417
+zcv2008oi_dkc.fits 2016-01-19 2016-02-23 57406.584028 57441.766667 2011-04-07 55658.069444
+zcv2008pi_dkc.fits 2016-01-19 2016-02-23 57406.584028 57441.766667 2011-04-08 55659.054861
+zcv2008qi_dkc.fits 2016-01-19 2016-02-23 57406.584028 57441.766667 2011-04-09 55660.043056
+zcv2008ri_dkc.fits 2016-01-19 2016-02-23 57406.584028 57441.766667 2011-04-10 55661.036806
+zcv2008ti_dkc.fits 2016-01-19 2016-02-23 57406.584722 57441.766667 2011-04-11 55662.159028
+zcv20090i_dkc.fits 2016-01-19 2016-02-23 57406.584722 57441.766667 2011-04-12 55663.463889
+zcv20091i_dkc.fits 2016-01-19 2016-02-23 57406.584722 57441.766667 2011-04-13 55664.046528
+zcv20092i_dkc.fits 2016-01-19 2016-02-23 57406.584722 57441.766667 2011-04-14 55665.040972
+zcv20093i_dkc.fits 2016-01-19 2016-02-23 57406.584722 57441.766667 2011-04-15 55666.35
+zcv20094i_dkc.fits 2016-01-19 2016-02-23 57406.584722 57441.766667 2011-04-16 55667.277083
+zcv20095i_dkc.fits 2016-01-19 2016-02-23 57406.584722 57441.766667 2011-04-17 55668.345833
+01j19376i_dkc.fits 2016-01-19 2016-02-23 57406.667361 57441.766667 2011-04-18 55669.34375
+zcv2011li_dkc.fits 2016-01-19 2016-02-23 57406.667361 57441.766667 2011-04-19 55670.047917
+zcv2011mi_dkc.fits 2016-01-19 2016-02-23 57406.667361 57441.766667 2011-04-20 55671.065278
+zcv2011ni_dkc.fits 2016-01-19 2016-02-23 57406.667361 57441.766667 2011-04-21 55672.272222
+zcv2011oi_dkc.fits 2016-01-19 2016-02-23 57406.667361 57441.766667 2011-04-22 55673.336111
+zcv2011pi_dkc.fits 2016-01-19 2016-02-23 57406.667361 57441.766667 2011-04-23 55674.0625
+zcv2011qi_dkc.fits 2016-01-19 2016-02-23 57406.667361 57441.766667 2011-04-24 55675.877778
+zcv2011ri_dkc.fits 2016-01-19 2016-02-23 57406.668056 57441.766667 2011-04-28 55679.213194
+zcv2011si_dkc.fits 2016-01-19 2016-02-23 57406.668056 57441.766667 2011-04-30 55681.253472
+zcv2011ti_dkc.fits 2016-01-19 2016-02-23 57406.668056 57441.766667 2011-05-01 55682.00625
+zcv20120i_dkc.fits 2016-01-19 2016-02-23 57406.668056 57441.766667 2011-05-02 55683.790972
+zcv20121i_dkc.fits 2016-01-19 2016-02-23 57406.668056 57441.766667 2011-05-04 55685.125694
+zcv20122i_dkc.fits 2016-01-19 2016-02-23 57406.668056 57441.766667 2011-05-05 55686.0
+zcv20123i_dkc.fits 2016-01-19 2016-02-23 57406.668056 57441.766667 2011-05-06 55687.177778
+zcv20124i_dkc.fits 2016-01-19 2016-02-23 57406.668056 57441.766667 2011-05-07 55688.065972
+zcv20125i_dkc.fits 2016-01-19 2016-02-23 57406.66875 57441.766667 2011-05-08 55689.164583
+zcv20126i_dkc.fits 2016-01-19 2016-02-23 57406.66875 57441.766667 2011-05-09 55690.229861
+zcv20127i_dkc.fits 2016-01-19 2016-02-23 57406.66875 57441.766667 2011-05-10 55691.05
+zcv20128i_dkc.fits 2016-01-19 2016-02-23 57406.66875 57441.766667 2011-05-11 55692.277083
+zcv20129i_dkc.fits 2016-01-19 2016-02-23 57406.66875 57441.766667 2011-05-12 55693.639583
+zcv2012ai_dkc.fits 2016-01-19 2016-02-23 57406.66875 57441.766667 2011-05-14 55695.093056
+zcv2012bi_dkc.fits 2016-01-19 2016-02-23 57406.66875 57441.766667 2011-05-15 55696.016667
+zcv2012ci_dkc.fits 2016-01-19 2016-02-23 57406.66875 57441.766667 2011-05-16 55697.088194
+zcv2012di_dkc.fits 2016-01-19 2016-02-23 57406.669444 57441.766667 2011-05-17 55698.074306
+zcv2012ei_dkc.fits 2016-01-19 2016-02-23 57406.669444 57441.766667 2011-05-18 55699.011111
+zcv2012fi_dkc.fits 2016-01-19 2016-02-23 57406.669444 57441.766667 2011-05-19 55700.007639
+01j21464i_dkc.fits 2016-01-19 2016-02-23 57406.716667 57441.766667 2011-05-20 55701.006944
+zcv20150i_dkc.fits 2016-01-19 2016-02-23 57406.716667 57441.766667 2011-05-21 55702.003472
+zcv20151i_dkc.fits 2016-01-19 2016-02-23 57406.716667 57441.766667 2011-05-22 55703.0125
+zcv20152i_dkc.fits 2016-01-19 2016-02-23 57406.717361 57441.766667 2011-05-23 55704.160417
+zcv20153i_dkc.fits 2016-01-19 2016-02-23 57406.717361 57441.766667 2011-05-26 55707.527083
+zcv20154i_dkc.fits 2016-01-19 2016-02-23 57406.717361 57441.766667 2011-05-28 55709.706944
+zcv20155i_dkc.fits 2016-01-19 2016-02-23 57406.717361 57441.766667 2011-05-29 55710.003472
+zcv20156i_dkc.fits 2016-01-19 2016-02-23 57406.717361 57441.766667 2011-05-30 55711.561111
+zcv20157i_dkc.fits 2016-01-19 2016-02-23 57406.717361 57441.766667 2011-05-30 55711.940278
+zcv20158i_dkc.fits 2016-01-19 2016-02-23 57406.717361 57441.766667 2011-06-01 55713.129861
+zcv20159i_dkc.fits 2016-01-19 2016-02-23 57406.718056 57441.766667 2011-06-02 55714.109722
+zcv2015ai_dkc.fits 2016-01-19 2016-02-23 57406.718056 57441.766667 2011-06-03 55715.009722
+zcv2015bi_dkc.fits 2016-01-19 2016-02-23 57406.718056 57441.766667 2011-06-04 55716.619444
+zcv2015ci_dkc.fits 2016-01-19 2016-02-23 57406.718056 57441.766667 2011-06-05 55717.093056
+zcv2015di_dkc.fits 2016-01-19 2016-02-23 57406.718056 57441.766667 2011-06-06 55718.268056
+zcv2015ei_dkc.fits 2016-01-19 2016-02-23 57406.718056 57441.766667 2011-06-07 55719.038889
+zcv2015fi_dkc.fits 2016-01-19 2016-02-23 57406.71875 57441.766667 2011-06-08 55720.19375
+zcv2015gi_dkc.fits 2016-01-19 2016-02-23 57406.71875 57441.766667 2011-06-09 55721.120833
+zcv2015hi_dkc.fits 2016-01-19 2016-02-23 57406.71875 57441.766667 2011-06-10 55722.013194
+zcv2015ii_dkc.fits 2016-01-19 2016-02-23 57406.71875 57441.766667 2011-06-11 55723.058333
+zcv2015ji_dkc.fits 2016-01-19 2016-02-23 57406.71875 57441.766667 2011-06-12 55724.115972
+zcv2015ki_dkc.fits 2016-01-19 2016-02-23 57406.71875 57441.766667 2011-06-13 55725.184028
+zcv2015li_dkc.fits 2016-01-19 2016-02-23 57406.719444 57441.766667 2011-06-14 55726.0
+zcv2015mi_dkc.fits 2016-01-19 2016-02-23 57406.719444 57441.766667 2011-06-15 55727.148611
+zcv2015ni_dkc.fits 2016-01-19 2016-02-23 57406.719444 57441.766667 2011-06-16 55728.065972
+zcv20189i_dkc.fits 2016-01-20 2016-02-23 57407.54375 57441.766667 2011-06-17 55729.0
+zcv2018ai_dkc.fits 2016-01-20 2016-02-23 57407.544444 57441.766667 2011-06-18 55730.034722
+zcv2018bi_dkc.fits 2016-01-20 2016-02-23 57407.544444 57441.766667 2011-06-19 55731.2
+zcv2018ci_dkc.fits 2016-01-20 2016-02-23 57407.544444 57441.766667 2011-06-20 55732.030556
+zcv2018di_dkc.fits 2016-01-20 2016-02-23 57407.544444 57441.766667 2011-06-24 55736.088194
+zcv2018ei_dkc.fits 2016-01-20 2016-02-23 57407.544444 57441.766667 2011-06-25 55737.495139
+zcv2018fi_dkc.fits 2016-01-20 2016-02-23 57407.544444 57441.766667 2011-06-26 55738.699306
+zcv2018gi_dkc.fits 2016-01-20 2016-02-23 57407.544444 57441.766667 2011-06-27 55739.55
+zcv2018hi_dkc.fits 2016-01-20 2016-02-23 57407.545139 57441.766667 2011-06-29 55741.01875
+zcv2018ii_dkc.fits 2016-01-20 2016-02-23 57407.545139 57441.766667 2011-06-30 55742.265278
+zcv2018ji_dkc.fits 2016-01-20 2016-02-23 57407.545139 57441.766667 2011-07-01 55743.022222
+zcv2018ki_dkc.fits 2016-01-20 2016-02-23 57407.545139 57441.766667 2011-07-01 55743.60625
+zcv2018li_dkc.fits 2016-01-20 2016-02-23 57407.545139 57441.766667 2011-07-02 55744.794444
+zcv2018mi_dkc.fits 2016-01-20 2016-02-23 57407.545139 57441.766667 2011-07-04 55746.1875
+zcv2018ni_dkc.fits 2016-01-20 2016-02-23 57407.545139 57441.766667 2011-07-04 55746.579167
+zcv2018oi_dkc.fits 2016-01-20 2016-02-23 57407.545833 57441.766667 2011-07-05 55747.545833
+zcv2018pi_dkc.fits 2016-01-20 2016-02-23 57407.545833 57441.766667 2011-07-07 55749.188889
+zcv2018qi_dkc.fits 2016-01-20 2016-02-23 57407.545833 57441.766667 2011-07-08 55750.00625
+zcv2018ri_dkc.fits 2016-01-20 2016-02-23 57407.545833 57441.766667 2011-07-09 55751.05625
+zcv2018si_dkc.fits 2016-01-20 2016-02-23 57407.545833 57441.766667 2011-07-10 55752.0
+zcv2006li_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-07-11 55753.023611
+zcv2006mi_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-07-12 55754.0
+zcv2006ni_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-07-13 55755.002778
+zcv2006oi_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-07-13 55755.90625
+zcv2006pi_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-07-15 55757.006944
+zcv2006qi_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-07-16 55758.259722
+zcv2006ri_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-07-16 55758.714583
+zcv2006si_dkc.fits 2016-01-19 2016-02-23 57406.511806 57441.766667 2011-07-18 55760.204167
+zcv2006ti_dkc.fits 2016-01-19 2016-02-23 57406.5125 57441.766667 2011-07-21 55763.702083
+zcv20070i_dkc.fits 2016-01-19 2016-02-23 57406.5125 57441.766667 2011-07-24 55766.00625
+zcv20071i_dkc.fits 2016-01-19 2016-02-23 57406.5125 57441.766667 2011-07-25 55767.432639
+zcv20072i_dkc.fits 2016-01-19 2016-02-23 57406.5125 57441.766667 2011-07-26 55768.0875
+zcv20073i_dkc.fits 2016-01-19 2016-02-23 57406.5125 57441.766667 2011-07-27 55769.463889
+zcv20074i_dkc.fits 2016-01-19 2016-02-23 57406.5125 57441.766667 2011-07-29 55771.390278
+zcv20075i_dkc.fits 2016-01-19 2016-02-23 57406.5125 57441.766667 2011-07-30 55772.567361
+zcv20076i_dkc.fits 2016-01-19 2016-02-23 57406.5125 57441.766667 2011-07-31 55773.252778
+zcv20077i_dkc.fits 2016-01-19 2016-02-23 57406.513194 57441.766667 2011-08-01 55774.175694
+zcv20078i_dkc.fits 2016-01-19 2016-02-23 57406.513194 57441.766667 2011-08-02 55775.261111
+zcv20096i_dkc.fits 2016-01-19 2016-02-23 57406.584722 57441.766667 2011-08-03 55776.588889
+zcv20097i_dkc.fits 2016-01-19 2016-02-23 57406.585417 57441.766667 2011-08-04 55777.502778
+zcv20098i_dkc.fits 2016-01-19 2016-02-23 57406.585417 57441.766667 2011-08-05 55778.167361
+zcv20099i_dkc.fits 2016-01-19 2016-02-23 57406.585417 57441.766667 2011-08-06 55779.392361
+zcv2009ai_dkc.fits 2016-01-19 2016-02-23 57406.585417 57441.766667 2011-08-07 55780.5
+zcv2009bi_dkc.fits 2016-01-19 2016-02-23 57406.585417 57441.766667 2011-08-08 55781.513889
+zcv2009ci_dkc.fits 2016-01-19 2016-02-23 57406.585417 57441.766667 2011-08-09 55782.386111
+zcv2009di_dkc.fits 2016-01-19 2016-02-23 57406.585417 57441.766667 2011-08-10 55783.094444
+zcv2009ei_dkc.fits 2016-01-19 2016-02-23 57406.586111 57441.766667 2011-08-11 55784.110417
+zcv2009fi_dkc.fits 2016-01-19 2016-02-23 57406.586111 57441.766667 2011-08-12 55785.447917
+zcv2009gi_dkc.fits 2016-01-19 2016-02-23 57406.586111 57441.766667 2011-08-13 55786.218056
+zcv2009hi_dkc.fits 2016-01-19 2016-02-23 57406.586111 57441.766667 2011-08-14 55787.099306
+zcv2009ii_dkc.fits 2016-01-19 2016-02-23 57406.586111 57441.766667 2011-08-15 55788.542361
+zcv2009ji_dkc.fits 2016-01-19 2016-02-23 57406.586111 57441.766667 2011-08-19 55792.527778
+zcv2009ki_dkc.fits 2016-01-19 2016-02-23 57406.586111 57441.766667 2011-08-21 55794.125694
+zcv2009li_dkc.fits 2016-01-19 2016-02-23 57406.586806 57441.766667 2011-08-22 55795.256944
+zcv2009mi_dkc.fits 2016-01-19 2016-02-23 57406.586806 57441.766667 2011-08-23 55796.56875
+zcv2009ni_dkc.fits 2016-01-19 2016-02-23 57406.586806 57441.766667 2011-08-24 55797.032639
+zcv2009oi_dkc.fits 2016-01-19 2016-02-23 57406.586806 57441.766667 2011-08-25 55798.565278
+zcv2009pi_dkc.fits 2016-01-19 2016-02-23 57406.586806 57441.766667 2011-08-26 55799.201389
+zcv2009qi_dkc.fits 2016-01-19 2016-02-23 57406.586806 57441.766667 2011-08-27 55800.0
+zcv2009ri_dkc.fits 2016-01-19 2016-02-23 57406.586806 57441.766667 2011-08-28 55801.002778
+zcv2009si_dkc.fits 2016-01-19 2016-02-23 57406.586806 57441.766667 2011-08-29 55802.020833
+zcv2009ti_dkc.fits 2016-01-19 2016-02-23 57406.5875 57441.766667 2011-08-30 55803.011806
+zcv20100i_dkc.fits 2016-01-19 2016-02-23 57406.5875 57441.766667 2011-08-31 55804.197917
+zcv2012gi_dkc.fits 2016-01-19 2016-02-23 57406.669444 57441.766667 2011-09-01 55805.053472
+zcv2012hi_dkc.fits 2016-01-19 2016-02-23 57406.669444 57441.766667 2011-09-02 55806.011111
+zcv2012ii_dkc.fits 2016-01-19 2016-02-23 57406.669444 57441.766667 2011-09-03 55807.340972
+zcv2012ji_dkc.fits 2016-01-19 2016-02-23 57406.669444 57441.766667 2011-09-04 55808.043056
+zcv2012ki_dkc.fits 2016-01-19 2016-02-23 57406.669444 57441.766667 2011-09-05 55809.222917
+zcv2012li_dkc.fits 2016-01-19 2016-02-23 57406.670139 57441.766667 2011-09-06 55810.200694
+zcv2012mi_dkc.fits 2016-01-19 2016-02-23 57406.670139 57441.766667 2011-09-07 55811.093056
+zcv2012ni_dkc.fits 2016-01-19 2016-02-23 57406.670139 57441.766667 2011-09-08 55812.0
+zcv2012oi_dkc.fits 2016-01-19 2016-02-23 57406.670139 57441.766667 2011-09-09 55813.285417
+zcv2012pi_dkc.fits 2016-01-19 2016-02-23 57406.670139 57441.766667 2011-09-10 55814.393056
+zcv2012qi_dkc.fits 2016-01-19 2016-02-23 57406.670139 57441.766667 2011-09-11 55815.070833
+zcv2012ri_dkc.fits 2016-01-19 2016-02-23 57406.670139 57441.766667 2011-09-12 55816.934028
+zcv2012si_dkc.fits 2016-01-19 2016-02-23 57406.670139 57441.766667 2011-09-12 55816.945833
+zcv2012ti_dkc.fits 2016-01-19 2016-02-23 57406.670833 57441.766667 2011-09-14 55818.034028
+zcv20130i_dkc.fits 2016-01-19 2016-02-23 57406.670833 57441.766667 2011-09-18 55822.211111
+zcv20131i_dkc.fits 2016-01-19 2016-02-23 57406.670833 57441.766667 2011-09-20 55824.032639
+zcv20132i_dkc.fits 2016-01-19 2016-02-23 57406.670833 57441.766667 2011-09-21 55825.022222
+zcv20133i_dkc.fits 2016-01-19 2016-02-23 57406.670833 57441.766667 2011-09-22 55826.088889
+zcv20134i_dkc.fits 2016-01-19 2016-02-23 57406.670833 57441.766667 2011-09-23 55827.023611
+zcv20135i_dkc.fits 2016-01-19 2016-02-23 57406.670833 57441.766667 2011-09-24 55828.014583
+zcv20136i_dkc.fits 2016-01-19 2016-02-23 57406.670833 57441.766667 2011-09-25 55829.089583
+zcv20137i_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2011-09-26 55830.15
+zcv20138i_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2011-09-27 55831.015972
+zcv20139i_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2011-09-29 55833.024306
+zcv2015oi_dkc.fits 2016-01-19 2016-02-23 57406.719444 57441.766667 2011-09-30 55834.025694
+zcv2015pi_dkc.fits 2016-01-19 2016-02-23 57406.719444 57441.766667 2011-10-01 55835.090278
+zcv2015qi_dkc.fits 2016-01-19 2016-02-23 57406.719444 57441.766667 2011-10-01 55835.999306
+zcv2015ri_dkc.fits 2016-01-19 2016-02-23 57406.719444 57441.766667 2011-10-03 55837.023611
+zcv2015si_dkc.fits 2016-01-19 2016-02-23 57406.720139 57441.766667 2011-10-04 55838.150694
+zcv2015ti_dkc.fits 2016-01-19 2016-02-23 57406.720139 57441.766667 2011-10-05 55839.127778
+zcv20160i_dkc.fits 2016-01-19 2016-02-23 57406.720139 57441.766667 2011-10-06 55840.238194
+zcv20161i_dkc.fits 2016-01-19 2016-02-23 57406.720139 57441.766667 2011-10-07 55841.009722
+zcv20162i_dkc.fits 2016-01-19 2016-02-23 57406.720139 57441.766667 2011-10-08 55842.079861
+zcv20163i_dkc.fits 2016-01-19 2016-02-23 57406.720139 57441.766667 2011-10-09 55843.008333
+zcv20164i_dkc.fits 2016-01-19 2016-02-23 57406.720139 57441.766667 2011-10-10 55844.19375
+zcv20165i_dkc.fits 2016-01-19 2016-02-23 57406.720833 57441.766667 2011-10-11 55845.097222
+zcv20166i_dkc.fits 2016-01-19 2016-02-23 57406.720833 57441.766667 2011-10-15 55849.260417
+zcv20167i_dkc.fits 2016-01-19 2016-02-23 57406.720833 57441.766667 2011-10-17 55851.252778
+zcv20168i_dkc.fits 2016-01-19 2016-02-23 57406.720833 57441.766667 2011-10-18 55852.003472
+zcv20169i_dkc.fits 2016-01-19 2016-02-23 57406.720833 57441.766667 2011-10-19 55853.004861
+zcv2016ai_dkc.fits 2016-01-19 2016-02-23 57406.720833 57441.766667 2011-10-20 55854.55
+zcv2016bi_dkc.fits 2016-01-19 2016-02-23 57406.721528 57441.766667 2011-10-21 55855.043056
+zcv2016ci_dkc.fits 2016-01-19 2016-02-23 57406.721528 57441.766667 2011-10-22 55856.009028
+zcv2016di_dkc.fits 2016-01-19 2016-02-23 57406.721528 57441.766667 2011-10-23 55857.120139
+zcv2016ei_dkc.fits 2016-01-19 2016-02-23 57406.721528 57441.766667 2011-10-24 55858.359028
+zcv2016fi_dkc.fits 2016-01-19 2016-02-23 57406.721528 57441.766667 2011-10-25 55859.027083
+zcv2016gi_dkc.fits 2016-01-19 2016-02-23 57406.721528 57441.766667 2011-10-26 55860.097222
+zcv2016hi_dkc.fits 2016-01-19 2016-02-23 57406.721528 57441.766667 2011-10-27 55861.019444
+zcv2016ii_dkc.fits 2016-01-19 2016-02-23 57406.722222 57441.766667 2011-10-29 55863.309028
+zcv2016ji_dkc.fits 2016-01-19 2016-02-23 57406.722222 57441.766667 2011-10-30 55864.0
+zcv2018ti_dkc.fits 2016-01-20 2016-02-23 57407.545833 57441.766667 2011-10-30 55864.718056
+zcv20190i_dkc.fits 2016-01-20 2016-02-23 57407.545833 57441.766667 2011-10-31 55865.639583
+zcv20191i_dkc.fits 2016-01-20 2016-02-23 57407.545833 57441.766667 2011-11-02 55867.022222
+zcv20192i_dkc.fits 2016-01-20 2016-02-23 57407.546528 57441.766667 2011-11-03 55868.014583
+zcv20193i_dkc.fits 2016-01-20 2016-02-23 57407.546528 57441.766667 2011-11-03 55868.843056
+zcv20194i_dkc.fits 2016-01-20 2016-02-23 57407.546528 57441.766667 2011-11-05 55870.442361
+zcv20195i_dkc.fits 2016-01-20 2016-02-23 57407.546528 57441.766667 2011-11-06 55871.084028
+zcv20196i_dkc.fits 2016-01-20 2016-02-23 57407.546528 57441.766667 2011-11-07 55872.690278
+zcv20197i_dkc.fits 2016-01-20 2016-02-23 57407.546528 57441.766667 2011-11-11 55876.292361
+zcv20198i_dkc.fits 2016-01-20 2016-02-23 57407.546528 57441.766667 2011-11-13 55878.010417
+zcv20199i_dkc.fits 2016-01-20 2016-02-23 57407.547222 57441.766667 2011-11-14 55879.419444
+zcv2019ai_dkc.fits 2016-01-20 2016-02-23 57407.547222 57441.766667 2011-11-15 55880.013889
+zcv2019bi_dkc.fits 2016-01-20 2016-02-23 57407.547222 57441.766667 2011-11-16 55881.09375
+zcv2019ci_dkc.fits 2016-01-20 2016-02-23 57407.547222 57441.766667 2011-11-17 55882.0
+zcv2019di_dkc.fits 2016-01-20 2016-02-23 57407.547222 57441.766667 2011-11-18 55883.161806
+zcv2019ei_dkc.fits 2016-01-20 2016-02-23 57407.547222 57441.766667 2011-11-19 55884.191667
+zcv2019fi_dkc.fits 2016-01-20 2016-02-23 57407.547222 57441.766667 2011-11-20 55885.065278
+zcv2019gi_dkc.fits 2016-01-20 2016-02-23 57407.547222 57441.766667 2011-11-21 55886.378472
+zcv2019hi_dkc.fits 2016-01-20 2016-02-23 57407.547917 57441.766667 2011-11-22 55887.002778
+zcv2019ii_dkc.fits 2016-01-20 2016-02-23 57407.547917 57441.766667 2011-11-23 55888.072222
+zcv2019ji_dkc.fits 2016-01-20 2016-02-23 57407.547917 57441.766667 2011-11-24 55889.011111
+zcv2019ki_dkc.fits 2016-01-20 2016-02-23 57407.547917 57441.766667 2011-11-25 55890.101389
+zcv20079i_dkc.fits 2016-01-19 2016-02-23 57406.513194 57441.766667 2011-11-26 55891.002778
+zcv2007ai_dkc.fits 2016-01-19 2016-02-23 57406.513194 57441.766667 2011-11-27 55892.178472
+zcv2007bi_dkc.fits 2016-01-19 2016-02-23 57406.513194 57441.766667 2011-11-28 55893.238194
+zcv2007ci_dkc.fits 2016-01-19 2016-02-23 57406.513194 57441.766667 2011-11-29 55894.095139
+zcv2007di_dkc.fits 2016-01-19 2016-02-23 57406.513194 57441.766667 2011-11-30 55895.258333
+zcv2007ei_dkc.fits 2016-01-19 2016-02-23 57406.513194 57441.766667 2011-11-30 55895.965972
+zcv2007fi_dkc.fits 2016-01-19 2016-02-23 57406.513889 57441.766667 2011-12-02 55897.171528
+zcv2007gi_dkc.fits 2016-01-19 2016-02-23 57406.513889 57441.766667 2011-12-05 55900.946528
+zcv2007hi_dkc.fits 2016-01-19 2016-02-23 57406.513889 57441.766667 2011-12-08 55903.825694
+zcv2007ii_dkc.fits 2016-01-19 2016-02-23 57406.513889 57441.766667 2011-12-10 55905.375694
+zcv2007ji_dkc.fits 2016-01-19 2016-02-23 57406.513889 57441.766667 2011-12-11 55906.5125
+zcv2007ki_dkc.fits 2016-01-19 2016-02-23 57406.513889 57441.766667 2011-12-12 55907.510417
+zcv2007li_dkc.fits 2016-01-19 2016-02-23 57406.513889 57441.766667 2011-12-13 55908.507639
+zcv2007mi_dkc.fits 2016-01-19 2016-02-23 57406.513889 57441.766667 2011-12-14 55909.840278
+zcv2007ni_dkc.fits 2016-01-19 2016-02-23 57406.514583 57441.766667 2011-12-15 55910.363194
+zcv2007oi_dkc.fits 2016-01-19 2016-02-23 57406.514583 57441.766667 2011-12-16 55911.564583
+zcv20101i_dkc.fits 2016-01-19 2016-02-23 57406.5875 57441.766667 2011-12-17 55912.561806
+zcv20102i_dkc.fits 2016-01-19 2016-02-23 57406.5875 57441.766667 2011-12-18 55913.925694
+zcv20103i_dkc.fits 2016-01-19 2016-02-23 57406.5875 57441.766667 2011-12-19 55914.445833
+zcv20104i_dkc.fits 2016-01-19 2016-02-23 57406.5875 57441.766667 2011-12-20 55915.552778
+zcv20105i_dkc.fits 2016-01-19 2016-02-23 57406.5875 57441.766667 2011-12-22 55917.097222
+zcv20106i_dkc.fits 2016-01-19 2016-02-23 57406.5875 57441.766667 2011-12-23 55918.532639
+zcv20107i_dkc.fits 2016-01-19 2016-02-23 57406.588194 57441.766667 2011-12-24 55919.532639
+zcv20108i_dkc.fits 2016-01-19 2016-02-23 57406.588194 57441.766667 2011-12-25 55920.46875
+zcv20109i_dkc.fits 2016-01-19 2016-02-23 57406.588194 57441.766667 2011-12-26 55921.411111
+zcv2010ai_dkc.fits 2016-01-19 2016-02-23 57406.588194 57441.766667 2011-12-28 55923.003472
+zcv2010bi_dkc.fits 2016-01-19 2016-02-23 57406.588194 57441.766667 2011-12-28 55923.4
+zcv2010ci_dkc.fits 2016-01-19 2016-02-23 57406.588194 57441.766667 2011-12-29 55924.400694
+zcv2010di_dkc.fits 2016-01-19 2016-02-23 57406.588194 57441.766667 2011-12-31 55926.218056
+zcv2010ei_dkc.fits 2016-01-19 2016-02-23 57406.588194 57441.766667 2011-12-31 55926.378472
+zcv2010fi_dkc.fits 2016-01-19 2016-02-23 57406.588889 57441.766667 2012-01-01 55927.317361
+zcv2010gi_dkc.fits 2016-01-19 2016-02-23 57406.588889 57441.766667 2012-01-04 55930.977083
+zcv2010hi_dkc.fits 2016-01-19 2016-02-23 57406.588889 57441.766667 2012-01-06 55932.497917
+zcv2010ii_dkc.fits 2016-01-19 2016-02-23 57406.588889 57441.766667 2012-01-08 55934.046528
+zcv2010ji_dkc.fits 2016-01-19 2016-02-23 57406.588889 57441.766667 2012-01-08 55934.510417
+zcv2010ki_dkc.fits 2016-01-19 2016-02-23 57406.588889 57441.766667 2012-01-09 55935.36875
+zcv2010li_dkc.fits 2016-01-19 2016-02-23 57406.588889 57441.766667 2012-01-11 55937.105556
+zcv2010mi_dkc.fits 2016-01-19 2016-02-23 57406.588889 57441.766667 2012-01-12 55938.013889
+zcv2010ni_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-01-12 55938.353472
+zcv2010oi_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-01-13 55939.490278
+zcv2010pi_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-01-14 55940.822917
+zcv2013ai_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2012-01-15 55941.381944
+zcv2013bi_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2012-01-17 55943.089583
+zcv2013ci_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2012-01-17 55943.354167
+zcv2013di_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2012-01-19 55945.009028
+zcv2013ei_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2012-01-20 55946.013194
+zcv2013fi_dkc.fits 2016-01-19 2016-02-23 57406.671528 57441.766667 2012-01-21 55947.004861
+zcv2013gi_dkc.fits 2016-01-19 2016-02-23 57406.672222 57441.766667 2012-01-22 55948.2
+zcv2013hi_dkc.fits 2016-01-19 2016-02-23 57406.672222 57441.766667 2012-01-22 55948.663889
+zcv2013ii_dkc.fits 2016-01-19 2016-02-23 57406.672222 57441.766667 2012-01-23 55949.873611
+zcv2013ji_dkc.fits 2016-01-19 2016-02-23 57406.672222 57441.766667 2012-01-25 55951.311111
+zcv2013ki_dkc.fits 2016-01-19 2016-02-23 57406.672222 57441.766667 2012-01-25 55951.347917
+zcv2013li_dkc.fits 2016-01-19 2016-02-23 57406.672222 57441.766667 2012-01-26 55952.815278
+zcv2013ni_dkc.fits 2016-01-19 2016-02-23 57406.672222 57441.766667 2012-01-28 55954.0
+zcv2013mi_dkc.fits 2016-01-19 2016-02-23 57406.672222 57441.766667 2012-01-28 55954.859028
+zcv2013oi_dkc.fits 2016-01-19 2016-02-23 57406.672917 57441.766667 2012-01-30 55956.475
+zcv2013pi_dkc.fits 2016-01-19 2016-02-23 57406.672917 57441.766667 2012-02-01 55958.488194
+zcv2013qi_dkc.fits 2016-01-19 2016-02-23 57406.672917 57441.766667 2012-02-04 55961.6375
+zcv2013ri_dkc.fits 2016-01-19 2016-02-23 57406.672917 57441.766667 2012-02-06 55963.327083
+zcv2013si_dkc.fits 2016-01-19 2016-02-23 57406.672917 57441.766667 2012-02-07 55964.111806
+zcv2013ti_dkc.fits 2016-01-19 2016-02-23 57406.672917 57441.766667 2012-02-08 55965.640278
+zcv20140i_dkc.fits 2016-01-19 2016-02-23 57406.672917 57441.766667 2012-02-09 55966.460417
+zcv20141i_dkc.fits 2016-01-19 2016-02-23 57406.672917 57441.766667 2012-02-10 55967.122222
+zcv20142i_dkc.fits 2016-01-19 2016-02-23 57406.673611 57441.766667 2012-02-11 55968.095833
+zcv20143i_dkc.fits 2016-01-19 2016-02-23 57406.673611 57441.766667 2012-02-12 55969.163194
+zcv20144i_dkc.fits 2016-01-19 2016-02-23 57406.673611 57441.766667 2012-02-13 55970.432639
+zcv20145i_dkc.fits 2016-01-19 2016-02-23 57406.673611 57441.766667 2012-02-14 55971.035417
+zcv2016ki_dkc.fits 2016-01-19 2016-02-23 57406.722222 57441.766667 2012-02-15 55972.320833
+zcv2016li_dkc.fits 2016-01-19 2016-02-23 57406.722222 57441.766667 2012-02-16 55973.086806
+zcv2016mi_dkc.fits 2016-01-19 2016-02-23 57406.722222 57441.766667 2012-02-17 55974.15
+zcv2016ni_dkc.fits 2016-01-19 2016-02-23 57406.722222 57441.766667 2012-02-18 55975.236806
+zcv2016oi_dkc.fits 2016-01-19 2016-02-23 57406.722917 57441.766667 2012-02-19 55976.038889
+zcv2016pi_dkc.fits 2016-01-19 2016-02-23 57406.722917 57441.766667 2012-02-20 55977.099306
+zcv2016qi_dkc.fits 2016-01-19 2016-02-23 57406.722917 57441.766667 2012-02-21 55978.034028
+zcv2016ri_dkc.fits 2016-01-19 2016-02-23 57406.722917 57441.766667 2012-02-22 55979.00625
+zcv2016si_dkc.fits 2016-01-19 2016-02-23 57406.722917 57441.766667 2012-02-23 55980.409028
+zcv2016ti_dkc.fits 2016-01-19 2016-02-23 57406.722917 57441.766667 2012-02-24 55981.2375
+zcv20170i_dkc.fits 2016-01-19 2016-02-23 57406.722917 57441.766667 2012-02-25 55982.102083
+zcv20171i_dkc.fits 2016-01-19 2016-02-23 57406.723611 57441.766667 2012-02-26 55983.002778
+zcv1957qi_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2012-02-29 55986.718056
+zcv20172i_dkc.fits 2016-01-19 2016-02-23 57406.723611 57441.766667 2012-03-02 55988.478472
+zcv20173i_dkc.fits 2016-01-19 2016-02-23 57406.723611 57441.766667 2012-03-03 55989.36875
+zcv20174i_dkc.fits 2016-01-19 2016-02-23 57406.723611 57441.766667 2012-03-04 55990.415278
+zcv20175i_dkc.fits 2016-01-19 2016-02-23 57406.723611 57441.766667 2012-03-05 55991.259028
+zcv20176i_dkc.fits 2016-01-19 2016-02-23 57406.723611 57441.766667 2012-03-06 55992.225694
+zcv20177i_dkc.fits 2016-01-19 2016-02-23 57406.724306 57441.766667 2012-03-08 55994.564583
+zcv20178i_dkc.fits 2016-01-19 2016-02-23 57406.724306 57441.766667 2012-03-09 55995.247222
+zcv20179i_dkc.fits 2016-01-19 2016-02-23 57406.724306 57441.766667 2012-03-10 55996.178472
+zcv2017ai_dkc.fits 2016-01-19 2016-02-23 57406.724306 57441.766667 2012-03-12 55998.092361
+zcv2017bi_dkc.fits 2016-01-19 2016-02-23 57406.724306 57441.766667 2012-03-14 56000.010417
+zcv2017ci_dkc.fits 2016-01-19 2016-02-23 57406.724306 57441.766667 2012-03-15 56001.095833
+zcv2019li_dkc.fits 2016-01-20 2016-02-23 57407.547917 57441.766667 2012-03-16 56002.131944
+zcv2019mi_dkc.fits 2016-01-20 2016-02-23 57407.547917 57441.766667 2012-03-18 56004.684722
+zcv2019ni_dkc.fits 2016-01-20 2016-02-23 57407.547917 57441.766667 2012-03-20 56006.101389
+zcv2019oi_dkc.fits 2016-01-20 2016-02-23 57407.548611 57441.766667 2012-03-21 56007.534722
+zcv2019pi_dkc.fits 2016-01-20 2016-02-23 57407.548611 57441.766667 2012-03-22 56008.588194
+zcv2019qi_dkc.fits 2016-01-20 2016-02-23 57407.548611 57441.766667 2012-03-23 56009.255556
+zcv2019ri_dkc.fits 2016-01-20 2016-02-23 57407.548611 57441.766667 2012-03-24 56010.25625
+zcv2019si_dkc.fits 2016-01-20 2016-02-23 57407.548611 57441.766667 2012-03-28 56014.498611
+zcv2019ti_dkc.fits 2016-01-20 2016-02-23 57407.548611 57441.766667 2012-03-30 56016.472917
+zcv20200i_dkc.fits 2016-01-20 2016-02-23 57407.548611 57441.766667 2012-03-31 56017.128472
+zcv20201i_dkc.fits 2016-01-20 2016-02-23 57407.548611 57441.766667 2012-04-01 56018.199306
+zcv20202i_dkc.fits 2016-01-20 2016-02-23 57407.549306 57441.766667 2012-04-02 56019.023611
+zcv20203i_dkc.fits 2016-01-20 2016-02-23 57407.549306 57441.766667 2012-04-03 56020.366667
+zcv20204i_dkc.fits 2016-01-20 2016-02-23 57407.549306 57441.766667 2012-04-04 56021.204861
+zcv20205i_dkc.fits 2016-01-20 2016-02-23 57407.549306 57441.766667 2012-04-05 56022.142361
+zcv20206i_dkc.fits 2016-01-20 2016-02-23 57407.549306 57441.766667 2012-04-06 56023.119444
+zcv20207i_dkc.fits 2016-01-20 2016-02-23 57407.549306 57441.766667 2012-04-07 56024.00625
+zcv20208i_dkc.fits 2016-01-20 2016-02-23 57407.549306 57441.766667 2012-04-08 56025.175694
+zcv20209i_dkc.fits 2016-01-20 2016-02-23 57407.549306 57441.766667 2012-04-09 56026.05625
+zcv2020ai_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-04-10 56027.031944
+zcv2020bi_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-04-11 56028.097917
+zcv2020ci_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-04-12 56029.057639
+zcv2020di_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-04-13 56030.170833
+zcv2020ei_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-04-14 56031.063194
+zcv2007pi_dkc.fits 2016-01-19 2016-02-23 57406.514583 57441.766667 2012-04-15 56032.114583
+zcv2007qi_dkc.fits 2016-01-19 2016-02-23 57406.514583 57441.766667 2012-04-16 56033.026389
+zcv2007ri_dkc.fits 2016-01-19 2016-02-23 57406.514583 57441.766667 2012-04-17 56034.170833
+zcv2007si_dkc.fits 2016-01-19 2016-02-23 57406.514583 57441.766667 2012-04-18 56035.049306
+zcv2007ti_dkc.fits 2016-01-19 2016-02-23 57406.514583 57441.766667 2012-04-19 56036.098611
+zcv20080i_dkc.fits 2016-01-19 2016-02-23 57406.514583 57441.766667 2012-04-20 56037.00625
+zcv20081i_dkc.fits 2016-01-19 2016-02-23 57406.515278 57441.766667 2012-04-21 56038.102778
+zcv20082i_dkc.fits 2016-01-19 2016-02-23 57406.515278 57441.766667 2012-04-22 56039.111806
+zcv20083i_dkc.fits 2016-01-19 2016-02-23 57406.515278 57441.766667 2012-04-25 56042.928472
+zcv20084i_dkc.fits 2016-01-19 2016-02-23 57406.515278 57441.766667 2012-04-28 56045.024306
+zcv20085i_dkc.fits 2016-01-19 2016-02-23 57406.515278 57441.766667 2012-04-29 56046.032639
+zcv20086i_dkc.fits 2016-01-19 2016-02-23 57406.515278 57441.766667 2012-04-30 56047.385417
+zcv20087i_dkc.fits 2016-01-19 2016-02-23 57406.515278 57441.766667 2012-05-01 56048.363889
+zcv20088i_dkc.fits 2016-01-19 2016-02-23 57406.515278 57441.766667 2012-05-01 56048.809028
+zcv20089i_dkc.fits 2016-01-19 2016-02-23 57406.515972 57441.766667 2012-05-03 56050.859722
+zcv2008ai_dkc.fits 2016-01-19 2016-02-23 57406.515972 57441.766667 2012-05-05 56052.498611
+zcv2010qi_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-05-05 56052.713889
+zcv2010ri_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-05-06 56053.818056
+zcv2010si_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-05-08 56055.013889
+zcv2010ti_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-05-09 56056.502083
+zcv20110i_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-05-10 56057.014583
+zcv20111i_dkc.fits 2016-01-19 2016-02-23 57406.589583 57441.766667 2012-05-11 56058.808333
+zcv20112i_dkc.fits 2016-01-19 2016-02-23 57406.590278 57441.766667 2012-05-13 56060.835417
+zcv20113i_dkc.fits 2016-01-19 2016-02-23 57406.590278 57441.766667 2012-05-15 56062.166667
+zcv20114i_dkc.fits 2016-01-19 2016-02-23 57406.590278 57441.766667 2012-05-15 56062.706944
+zcv20115i_dkc.fits 2016-01-19 2016-02-23 57406.590278 57441.766667 2012-05-17 56064.101389
+zcv20116i_dkc.fits 2016-01-19 2016-02-23 57406.590278 57441.766667 2012-05-18 56065.01875
+zcv20117i_dkc.fits 2016-01-19 2016-02-23 57406.590278 57441.766667 2012-05-19 56066.114583
+zcv20118i_dkc.fits 2016-01-19 2016-02-23 57406.590278 57441.766667 2012-05-20 56067.229167
+zcv20119i_dkc.fits 2016-01-19 2016-02-23 57406.590278 57441.766667 2012-05-21 56068.455556
+zcv2011ai_dkc.fits 2016-01-19 2016-02-23 57406.590972 57441.766667 2012-05-23 56070.977083
+zcv2011bi_dkc.fits 2016-01-19 2016-02-23 57406.590972 57441.766667 2012-05-26 56073.020139
+zcv2011ci_dkc.fits 2016-01-19 2016-02-23 57406.590972 57441.766667 2012-05-27 56074.155556
+zcv2011di_dkc.fits 2016-01-19 2016-02-23 57406.590972 57441.766667 2012-05-28 56075.327778
+zcv2011ei_dkc.fits 2016-01-19 2016-02-23 57406.590972 57441.766667 2012-05-28 56075.849306
+zcv2011fi_dkc.fits 2016-01-19 2016-02-23 57406.590972 57441.766667 2012-05-30 56077.0
+zcv2011gi_dkc.fits 2016-01-19 2016-02-23 57406.590972 57441.766667 2012-05-31 56078.00625
+zcv2011hi_dkc.fits 2016-01-19 2016-02-23 57406.590972 57441.766667 2012-06-01 56079.283333
+zcv2011ii_dkc.fits 2016-01-19 2016-02-23 57406.591667 57441.766667 2012-06-01 56079.877778
+zcv2011ji_dkc.fits 2016-01-19 2016-02-23 57406.591667 57441.766667 2012-06-04 56082.215972
+zcv2011ki_dkc.fits 2016-01-19 2016-02-23 57406.591667 57441.766667 2012-06-05 56083.191667
+zcv20146i_dkc.fits 2016-01-19 2016-02-23 57406.673611 57441.766667 2012-06-07 56085.563194
+zcv20147i_dkc.fits 2016-01-19 2016-02-23 57406.673611 57441.766667 2012-06-08 56086.051389
+zcv20148i_dkc.fits 2016-01-19 2016-02-23 57406.673611 57441.766667 2012-06-09 56087.116667
+zcv20149i_dkc.fits 2016-01-19 2016-02-23 57406.673611 57441.766667 2012-06-09 56087.999306
+zcv2014ai_dkc.fits 2016-01-19 2016-02-23 57406.674306 57441.766667 2012-06-11 56089.140972
+zcv2014bi_dkc.fits 2016-01-19 2016-02-23 57406.674306 57441.766667 2012-06-12 56090.313889
+zcv2014ci_dkc.fits 2016-01-19 2016-02-23 57406.674306 57441.766667 2012-06-12 56090.805556
+zcv2014di_dkc.fits 2016-01-19 2016-02-23 57406.674306 57441.766667 2012-06-14 56092.661111
+zcv2014ei_dkc.fits 2016-01-19 2016-02-23 57406.674306 57441.766667 2012-06-15 56093.0375
+zcv2014fi_dkc.fits 2016-01-19 2016-02-23 57406.674306 57441.766667 2012-06-16 56094.088889
+zcv2014gi_dkc.fits 2016-01-19 2016-02-23 57406.674306 57441.766667 2012-06-17 56095.05625
+zcv2014hi_dkc.fits 2016-01-19 2016-02-23 57406.674306 57441.766667 2012-06-20 56098.294444
+zcv2014ii_dkc.fits 2016-01-19 2016-02-23 57406.675 57441.766667 2012-06-22 56100.290278
+zcv2014ji_dkc.fits 2016-01-19 2016-02-23 57406.675 57441.766667 2012-06-24 56102.090278
+zcv2014ki_dkc.fits 2016-01-19 2016-02-23 57406.675 57441.766667 2012-06-25 56103.451389
+zcv2014li_dkc.fits 2016-01-19 2016-02-23 57406.675 57441.766667 2012-06-26 56104.138889
+zcv2014mi_dkc.fits 2016-01-19 2016-02-23 57406.675 57441.766667 2012-06-27 56105.302083
+zcv2014ni_dkc.fits 2016-01-19 2016-02-23 57406.675 57441.766667 2012-06-28 56106.061806
+zcv2014oi_dkc.fits 2016-01-19 2016-02-23 57406.675 57441.766667 2012-06-29 56107.226389
+zcv2014pi_dkc.fits 2016-01-19 2016-02-23 57406.675694 57441.766667 2012-06-30 56108.152082
+zcv2014qi_dkc.fits 2016-01-19 2016-02-23 57406.675694 57441.766667 2012-07-01 56109.14375
+zcv2014ri_dkc.fits 2016-01-19 2016-02-23 57406.675694 57441.766667 2012-07-02 56110.052778
+zcv2014si_dkc.fits 2016-01-19 2016-02-23 57406.675694 57441.766667 2012-07-03 56111.05
+zcv2014ti_dkc.fits 2016-01-19 2016-02-23 57406.675694 57441.766667 2012-07-04 56112.25625
+zcv2017di_dkc.fits 2016-01-19 2016-02-23 57406.724306 57441.766667 2012-07-05 56113.522222
+zcv2017ei_dkc.fits 2016-01-19 2016-02-23 57406.725 57441.766667 2012-07-06 56114.135417
+zcv2017fi_dkc.fits 2016-01-19 2016-02-23 57406.725 57441.766667 2012-07-07 56115.130556
+zcv2017gi_dkc.fits 2016-01-19 2016-02-23 57406.725 57441.766667 2012-07-08 56116.495833
+zcv2017hi_dkc.fits 2016-01-19 2016-02-23 57406.725 57441.766667 2012-07-09 56117.308333
+zcv2017ii_dkc.fits 2016-01-19 2016-02-23 57406.725 57441.766667 2012-07-10 56118.05
+zcv2017ji_dkc.fits 2016-01-19 2016-02-23 57406.725 57441.766667 2012-07-11 56119.350694
+zcv2017ki_dkc.fits 2016-01-19 2016-02-23 57406.725 57441.766667 2012-07-12 56120.09375
+zcv2017li_dkc.fits 2016-01-19 2016-02-23 57406.725 57441.766667 2012-07-13 56121.558333
+zcv2017mi_dkc.fits 2016-01-19 2016-02-23 57406.725694 57441.766667 2012-07-14 56122.0875
+zcv2017ni_dkc.fits 2016-01-19 2016-02-23 57406.725694 57441.766667 2012-07-17 56125.461806
+zcv2017oi_dkc.fits 2016-01-19 2016-02-23 57406.725694 57441.766667 2012-07-19 56127.5125
+zcv2017pi_dkc.fits 2016-01-19 2016-02-23 57406.725694 57441.766667 2012-07-20 56128.444444
+zcv2017qi_dkc.fits 2016-01-19 2016-02-23 57406.725694 57441.766667 2012-07-22 56130.64375
+zcv2017ri_dkc.fits 2016-01-19 2016-02-23 57406.725694 57441.766667 2012-07-24 56132.020833
+zcv2017si_dkc.fits 2016-01-19 2016-02-23 57406.725694 57441.766667 2012-07-24 56132.538889
+zcv2017ti_dkc.fits 2016-01-19 2016-02-23 57406.726389 57441.766667 2012-07-26 56134.329167
+zcv20180i_dkc.fits 2016-01-19 2016-02-23 57406.726389 57441.766667 2012-07-26 56134.341667
+zcv20181i_dkc.fits 2016-01-19 2016-02-23 57406.726389 57441.766667 2012-07-28 56136.088889
+zcv20182i_dkc.fits 2016-01-19 2016-02-23 57406.726389 57441.766667 2012-07-29 56137.036111
+zcv20183i_dkc.fits 2016-01-19 2016-02-23 57406.726389 57441.766667 2012-07-30 56138.027083
+zcv20184i_dkc.fits 2016-01-19 2016-02-23 57406.726389 57441.766667 2012-07-31 56139.080556
+zcv20185i_dkc.fits 2016-01-19 2016-02-23 57406.726389 57441.766667 2012-08-01 56140.231944
+zcv20186i_dkc.fits 2016-01-19 2016-02-23 57406.726389 57441.766667 2012-08-01 56140.365972
+zcv20187i_dkc.fits 2016-01-19 2016-02-23 57406.727083 57441.766667 2012-08-03 56142.0
+zcv20188i_dkc.fits 2016-01-19 2016-02-23 57406.727083 57441.766667 2012-08-04 56143.134028
+zcv2020fi_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-08-05 56144.209028
+zcv2020gi_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-08-05 56144.934028
+zcv2020hi_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-08-07 56146.0
+zcv2020ii_dkc.fits 2016-01-20 2016-02-23 57407.55 57441.766667 2012-08-08 56147.252778
+zcv2020ji_dkc.fits 2016-01-20 2016-02-23 57407.550694 57441.766667 2012-08-08 56147.665972
+zcv2020ki_dkc.fits 2016-01-20 2016-02-23 57407.550694 57441.766667 2012-08-09 56148.452083
+zcv2020li_dkc.fits 2016-01-20 2016-02-23 57407.550694 57441.766667 2012-08-11 56150.0
+zcv2020mi_dkc.fits 2016-01-20 2016-02-23 57407.550694 57441.766667 2012-08-12 56151.03125
+zcv2020ni_dkc.fits 2016-01-20 2016-02-23 57407.550694 57441.766667 2012-08-13 56152.629167
+zcv2020oi_dkc.fits 2016-01-20 2016-02-23 57407.550694 57441.766667 2012-08-15 56154.626389
+zcv2020pi_dkc.fits 2016-01-20 2016-02-23 57407.550694 57441.766667 2012-08-17 56156.359028
+zcv2020qi_dkc.fits 2016-01-20 2016-02-23 57407.551389 57441.766667 2012-08-19 56158.24375
+zcv2020ri_dkc.fits 2016-01-20 2016-02-23 57407.551389 57441.766667 2012-08-19 56158.366667
+zcv2020si_dkc.fits 2016-01-20 2016-02-23 57407.551389 57441.766667 2012-08-21 56160.238194
+zcv2020ti_dkc.fits 2016-01-20 2016-02-23 57407.551389 57441.766667 2012-08-21 56160.356944
+zcv20210i_dkc.fits 2016-01-20 2016-02-23 57407.551389 57441.766667 2012-08-23 56162.1625
+zcv20211i_dkc.fits 2016-01-20 2016-02-23 57407.551389 57441.766667 2012-08-24 56163.157639
+zcv20212i_dkc.fits 2016-01-20 2016-02-23 57407.551389 57441.766667 2012-08-24 56163.454167
+zcv20213i_dkc.fits 2016-01-20 2016-02-23 57407.552083 57441.766667 2012-08-25 56164.410417
+zcv20214i_dkc.fits 2016-01-20 2016-02-23 57407.552083 57441.766667 2012-08-27 56166.020833
+zcv20215i_dkc.fits 2016-01-20 2016-02-23 57407.552083 57441.766667 2012-08-27 56166.600694
+zcv20216i_dkc.fits 2016-01-20 2016-02-23 57407.552083 57441.766667 2012-08-28 56167.394444
+zcv20217i_dkc.fits 2016-01-20 2016-02-23 57407.552083 57441.766667 2012-08-29 56168.997222
+zcv20218i_dkc.fits 2016-01-20 2016-02-23 57407.552083 57441.766667 2012-08-31 56170.132639
+zcv2021ai_dkc.fits 2016-01-20 2016-02-23 57407.552083 57441.766667 2012-09-01 56171.172917
+zcv20219i_dkc.fits 2016-01-20 2016-02-23 57407.552083 57441.766667 2012-09-01 56171.341667
+zcv2021bi_dkc.fits 2016-01-20 2016-02-23 57407.552778 57441.766667 2012-09-03 56173.029861
+zcv2021ci_dkc.fits 2016-01-20 2016-02-23 57407.552778 57441.766667 2012-09-04 56174.027083
+zcv2021di_dkc.fits 2016-01-20 2016-02-23 57407.552778 57441.766667 2012-09-04 56174.885417
+01k19352i_dkc.fits 2016-01-20 2016-02-23 57407.618056 57441.766667 2012-09-06 56176.044444
+zcv2021ei_dkc.fits 2016-01-20 2016-02-23 57407.552778 57441.766667 2012-09-06 56176.354861
+zcv2021ji_dkc.fits 2016-01-20 2016-02-23 57407.618056 57441.766667 2012-09-08 56178.079861
+zcv2021ki_dkc.fits 2016-01-20 2016-02-23 57407.618056 57441.766667 2012-09-11 56181.19375
+zcv2021li_dkc.fits 2016-01-20 2016-02-23 57407.61875 57441.766667 2012-09-13 56183.388194
+zcv2021mi_dkc.fits 2016-01-20 2016-02-23 57407.61875 57441.766667 2012-09-15 56185.020833
+zcv2021ni_dkc.fits 2016-01-20 2016-02-23 57407.61875 57441.766667 2012-09-16 56186.00625
+zcv2021oi_dkc.fits 2016-01-20 2016-02-23 57407.61875 57441.766667 2012-09-17 56187.023611
+zcv2021pi_dkc.fits 2016-01-20 2016-02-23 57407.61875 57441.766667 2012-09-18 56188.190972
+zcv2021qi_dkc.fits 2016-01-20 2016-02-23 57407.61875 57441.766667 2012-09-19 56189.196528
+zcv2021ri_dkc.fits 2016-01-20 2016-02-23 57407.61875 57441.766667 2012-09-20 56190.348611
+zcv2021si_dkc.fits 2016-01-20 2016-02-23 57407.61875 57441.766667 2012-09-20 56190.925694
+zcv2021ti_dkc.fits 2016-01-20 2016-02-23 57407.619444 57441.766667 2012-09-21 56191.999306
+zcv20220i_dkc.fits 2016-01-20 2016-02-23 57407.619444 57441.766667 2012-09-23 56193.068056
+zcv20221i_dkc.fits 2016-01-20 2016-02-23 57407.619444 57441.766667 2012-09-24 56194.020833
+zcv20222i_dkc.fits 2016-01-20 2016-02-23 57407.619444 57441.766667 2012-09-25 56195.049306
+zcv20223i_dkc.fits 2016-01-20 2016-02-23 57407.619444 57441.766667 2012-09-26 56196.0
+zcv20224i_dkc.fits 2016-01-20 2016-02-23 57407.619444 57441.766667 2012-09-27 56197.604861
+zcv20225i_dkc.fits 2016-01-20 2016-02-23 57407.619444 57441.766667 2012-09-28 56198.00625
+zcv20226i_dkc.fits 2016-01-20 2016-02-23 57407.620139 57441.766667 2012-09-29 56199.002778
+zcv20227i_dkc.fits 2016-01-20 2016-02-23 57407.620139 57441.766667 2012-09-30 56200.339583
+zcv20228i_dkc.fits 2016-01-20 2016-02-23 57407.620139 57441.766667 2012-09-30 56200.905556
+zcv20229i_dkc.fits 2016-01-20 2016-02-23 57407.620139 57441.766667 2012-10-02 56202.0
+zcv2022ai_dkc.fits 2016-01-20 2016-02-23 57407.620139 57441.766667 2012-10-03 56203.040278
+zcv2022bi_dkc.fits 2016-01-20 2016-02-23 57407.620139 57441.766667 2012-10-04 56204.2375
+zcv2022ci_dkc.fits 2016-01-20 2016-02-23 57407.620139 57441.766667 2012-10-05 56205.024306
+01c1540ti_dkc.fits 2016-01-12 2016-02-23 57399.459028 57441.766667 2012-10-06 56206.022222
+zcv19312i_dkc.fits 2016-01-12 2016-02-23 57399.459028 57441.766667 2012-10-07 56207.098611
+zcv19313i_dkc.fits 2016-01-12 2016-02-23 57399.459028 57441.766667 2012-10-08 56208.383333
+zcv19314i_dkc.fits 2016-01-12 2016-02-23 57399.459028 57441.766667 2012-10-11 56211.729167
+zcv19315i_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-14 56214.222222
+zcv19316i_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-15 56215.273611
+zcv19317i_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-16 56216.081944
+zcv19318i_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-17 56217.216667
+zcv1931ai_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-18 56218.0
+zcv19319i_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-18 56218.452083
+zcv1931bi_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-20 56220.161111
+zcv1931ci_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-20 56220.469444
+zcv1931di_dkc.fits 2016-01-12 2016-02-23 57399.459722 57441.766667 2012-10-22 56222.527083
+zcv1931ei_dkc.fits 2016-01-12 2016-02-23 57399.460417 57441.766667 2012-10-24 56224.058333
+zcv1931fi_dkc.fits 2016-01-12 2016-02-23 57399.460417 57441.766667 2012-10-25 56225.189583
+zcv1931gi_dkc.fits 2016-01-12 2016-02-23 57399.460417 57441.766667 2012-10-26 56226.272917
+zcv1931hi_dkc.fits 2016-01-12 2016-02-23 57399.460417 57441.766667 2012-10-27 56227.024306
+zcv1931ii_dkc.fits 2016-01-12 2016-02-23 57399.460417 57441.766667 2012-10-28 56228.05
+zcv1931ji_dkc.fits 2016-01-12 2016-02-23 57399.460417 57441.766667 2012-10-29 56229.275694
+zcv1931ki_dkc.fits 2016-01-12 2016-02-23 57399.460417 57441.766667 2012-10-30 56230.019444
+zcv1931li_dkc.fits 2016-01-12 2016-02-23 57399.460417 57441.766667 2012-10-31 56231.016667
+zcv1931mi_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2012-11-01 56232.0
+zcv1931ni_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2012-11-02 56233.518056
+zcv1931oi_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2012-11-05 56236.136806
+zcv1931pi_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2012-11-08 56239.124306
+zcv1931qi_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2012-11-10 56241.210417
+01c1656bi_dkc.fits 2016-01-12 2016-02-23 57399.574306 57441.766667 2012-11-11 56242.208333
+zcv1934bi_dkc.fits 2016-01-12 2016-02-23 57399.574306 57441.766667 2012-11-12 56243.4375
+zcv1934ci_dkc.fits 2016-01-12 2016-02-23 57399.574306 57441.766667 2012-11-12 56243.897222
+zcv1934di_dkc.fits 2016-01-12 2016-02-23 57399.574306 57441.766667 2012-11-13 56244.940972
+zcv1934ei_dkc.fits 2016-01-12 2016-02-23 57399.574306 57441.766667 2012-11-16 56247.066667
+zcv1934fi_dkc.fits 2016-01-12 2016-02-23 57399.574306 57441.766667 2012-11-17 56248.261806
+zcv1934gi_dkc.fits 2016-01-12 2016-02-23 57399.574306 57441.766667 2012-11-18 56249.138194
+zcv1934hi_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-19 56250.130556
+zcv1934ii_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-20 56251.004861
+zcv1934ji_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-21 56252.117361
+zcv1934ki_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-22 56253.315278
+zcv1934li_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-23 56254.0
+zcv1934mi_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-24 56255.279167
+zcv1934ni_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-25 56256.345139
+zcv1934oi_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-26 56257.125694
+zcv1934pi_dkc.fits 2016-01-12 2016-02-23 57399.575 57441.766667 2012-11-27 56258.027083
+zcv1934qi_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2012-11-28 56259.036111
+zcv1934ri_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2012-11-29 56260.239583
+zcv1934si_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2012-11-30 56261.301389
+zcv1934ti_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2012-12-01 56262.040278
+zcv19350i_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2012-12-02 56263.009722
+zcv19351i_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2012-12-03 56264.027083
+zcv1957ri_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2012-12-06 56267.690278
+zcv19352i_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2012-12-09 56270.065278
+zcv19353i_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2012-12-10 56271.234028
+zcv1937ki_dkc.fits 2016-01-12 2016-02-23 57399.663889 57441.766667 2012-12-11 56272.0
+01c1944qi_dkc.fits 2016-01-12 2016-02-23 57399.663889 57441.766667 2012-12-11 56272.377083
+zcv1937li_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-12 56273.620833
+zcv1937mi_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-14 56275.13125
+zcv1937ni_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-15 56276.750694
+zcv1937oi_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-17 56278.071528
+zcv1937pi_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-17 56278.420139
+zcv1937qi_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-19 56280.108333
+zcv1937ri_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-20 56281.49375
+zcv1937si_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-22 56283.044444
+zcv1937ti_dkc.fits 2016-01-12 2016-02-23 57399.664583 57441.766667 2012-12-25 56286.254861
+zcv19380i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2012-12-26 56287.229861
+zcv19381i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2012-12-27 56288.742361
+zcv19382i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2012-12-28 56289.900694
+zcv19383i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2012-12-31 56292.0
+zcv19384i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2013-01-01 56293.675694
+zcv19385i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2013-01-03 56295.614583
+zcv19386i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2013-01-04 56296.566667
+zcv19387i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2013-01-05 56297.909028
+zcv19388i_dkc.fits 2016-01-12 2016-02-23 57399.665278 57441.766667 2013-01-06 56298.888194
+zcv19389i_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-01-07 56299.625
+zcv1938ai_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-01-08 56300.647222
+zcv1938bi_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-01-09 56301.868056
+zcv1938ci_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-01-10 56302.529861
+zcv1938di_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-01-11 56303.918056
+01c2149di_dkc.fits 2016-01-13 2016-02-23 57400.488889 57441.766667 2013-01-13 56305.099306
+zcv1940ti_dkc.fits 2016-01-13 2016-02-23 57400.488889 57441.766667 2013-01-14 56306.095833
+zcv19410i_dkc.fits 2016-01-13 2016-02-23 57400.489583 57441.766667 2013-01-15 56307.030556
+zcv19411i_dkc.fits 2016-01-13 2016-02-23 57400.489583 57441.766667 2013-01-16 56308.946528
+zcv19412i_dkc.fits 2016-01-13 2016-02-23 57400.489583 57441.766667 2013-01-17 56309.41875
+zcv19413i_dkc.fits 2016-01-13 2016-02-23 57400.489583 57441.766667 2013-01-19 56311.8
+zcv19414i_dkc.fits 2016-01-13 2016-02-23 57400.489583 57441.766667 2013-01-21 56313.361111
+zcv19415i_dkc.fits 2016-01-13 2016-02-23 57400.489583 57441.766667 2013-01-22 56314.565972
+zcv2021fi_dkc.fits 2016-01-20 2016-02-23 57407.552778 57441.766667 2013-01-24 56316.105556
+zcv2021gi_dkc.fits 2016-01-20 2016-02-23 57407.552778 57441.766667 2013-01-25 56317.276389
+zcv2021hi_dkc.fits 2016-01-20 2016-02-23 57407.552778 57441.766667 2013-01-25 56317.421528
+zcv2022di_dkc.fits 2016-01-20 2016-02-23 57407.620833 57441.766667 2013-01-28 56320.470139
+zcv2022ei_dkc.fits 2016-01-20 2016-02-23 57407.620833 57441.766667 2013-01-31 56323.153472
+zcv2022fi_dkc.fits 2016-01-20 2016-02-23 57407.620833 57441.766667 2013-02-02 56325.054167
+zcv2022gi_dkc.fits 2016-01-20 2016-02-23 57407.620833 57441.766667 2013-02-03 56326.073611
+zcv2022hi_dkc.fits 2016-01-20 2016-02-23 57407.620833 57441.766667 2013-02-04 56327.604861
+zcv2022ii_dkc.fits 2016-01-20 2016-02-23 57407.620833 57441.766667 2013-02-05 56328.498611
+zcv2022ji_dkc.fits 2016-01-20 2016-02-23 57407.620833 57441.766667 2013-02-07 56330.054861
+zcv2022ki_dkc.fits 2016-01-20 2016-02-23 57407.620833 57441.766667 2013-02-08 56331.0
+zcv2022li_dkc.fits 2016-01-20 2016-02-23 57407.621528 57441.766667 2013-02-09 56332.220139
+zcv2022mi_dkc.fits 2016-01-20 2016-02-23 57407.621528 57441.766667 2013-02-10 56333.267361
+zcv2022ni_dkc.fits 2016-01-20 2016-02-23 57407.621528 57441.766667 2013-02-11 56334.025694
+zcv2022pi_dkc.fits 2016-01-20 2016-02-23 57407.621528 57441.766667 2013-02-13 56336.820833
+zcv2022oi_dkc.fits 2016-01-20 2016-02-23 57407.621528 57441.766667 2013-02-13 56336.832639
+zcv2022qi_dkc.fits 2016-01-20 2016-02-23 57407.621528 57441.766667 2013-02-14 56337.885417
+zcv2022ri_dkc.fits 2016-01-20 2016-02-23 57407.621528 57441.766667 2013-02-20 56343.166667
+zcv2022si_dkc.fits 2016-01-20 2016-02-23 57407.621528 57441.766667 2013-02-21 56344.056944
+zcv2022ti_dkc.fits 2016-01-20 2016-02-23 57407.622222 57441.766667 2013-02-22 56345.054861
+zcv20230i_dkc.fits 2016-01-20 2016-02-23 57407.622222 57441.766667 2013-02-23 56346.004861
+zcv20231i_dkc.fits 2016-01-20 2016-02-23 57407.622222 57441.766667 2013-02-23 56346.950694
+zcv20232i_dkc.fits 2016-01-20 2016-02-23 57407.622222 57441.766667 2013-02-25 56348.394444
+zcv20233i_dkc.fits 2016-01-20 2016-02-23 57407.622222 57441.766667 2013-02-28 56351.532639
+zcv20234i_dkc.fits 2016-01-20 2016-02-23 57407.622222 57441.766667 2013-03-02 56353.717361
+zcv20235i_dkc.fits 2016-01-20 2016-02-23 57407.622222 57441.766667 2013-03-03 56354.331944
+zcv20236i_dkc.fits 2016-01-20 2016-02-23 57407.622222 57441.766667 2013-03-04 56355.431944
+zcv20237i_dkc.fits 2016-01-20 2016-02-23 57407.622917 57441.766667 2013-03-05 56356.755556
+zcv1931ri_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2013-03-07 56358.106944
+zcv1931si_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2013-03-07 56358.245139
+zcv1931ti_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2013-03-08 56359.628472
+zcv19320i_dkc.fits 2016-01-12 2016-02-23 57399.461111 57441.766667 2013-03-09 56360.367361
+zcv19321i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-10 56361.227083
+zcv19322i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-11 56362.420139
+zcv19323i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-12 56363.275
+zcv19324i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-13 56364.2
+zcv19325i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-14 56365.347222
+zcv19326i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-15 56366.3625
+zcv19327i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-17 56368.786806
+zcv19328i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-19 56370.065278
+zcv19329i_dkc.fits 2016-01-12 2016-02-23 57399.461806 57441.766667 2013-03-19 56370.266667
+zcv1932ai_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-20 56371.473611
+zcv1932bi_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-21 56372.839583
+zcv1932di_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-23 56374.031944
+zcv1932ci_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-23 56374.247222
+zcv1932ei_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-26 56377.535417
+zcv1932fi_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-29 56380.065278
+zcv1932gi_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-30 56381.068056
+zcv1932ii_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-31 56382.115972
+zcv1932hi_dkc.fits 2016-01-12 2016-02-23 57399.4625 57441.766667 2013-03-31 56382.370833
+zcv1932ji_dkc.fits 2016-01-12 2016-02-23 57399.463194 57441.766667 2013-04-02 56384.178472
+zcv1932ki_dkc.fits 2016-01-12 2016-02-23 57399.463194 57441.766667 2013-04-03 56385.642361
+zcv1932li_dkc.fits 2016-01-12 2016-02-23 57399.463194 57441.766667 2013-04-05 56387.009722
+zcv1932mi_dkc.fits 2016-01-12 2016-02-23 57399.463194 57441.766667 2013-04-06 56388.022222
+zcv19354i_dkc.fits 2016-01-12 2016-02-23 57399.575694 57441.766667 2013-04-07 56389.139583
+zcv19355i_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-07 56389.877083
+zcv19356i_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-09 56391.009722
+zcv19357i_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-10 56392.278472
+zcv19358i_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-11 56393.267361
+zcv19359i_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-12 56394.26875
+zcv1935ai_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-14 56396.113889
+zcv1935bi_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-15 56397.25
+zcv1935ci_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-17 56399.110417
+zcv1935di_dkc.fits 2016-01-12 2016-02-23 57399.576389 57441.766667 2013-04-18 56400.20625
+zcv1935ei_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-18 56400.238889
+zcv1935fi_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-19 56401.371528
+zcv1935gi_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-20 56402.488194
+zcv1935hi_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-21 56403.296528
+zcv1935ii_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-22 56404.363194
+zcv1935ji_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-26 56408.314583
+zcv1935ki_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-28 56410.011806
+zcv1935li_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-29 56411.129167
+zcv1935mi_dkc.fits 2016-01-12 2016-02-23 57399.577083 57441.766667 2013-04-30 56412.129861
+zcv1935ni_dkc.fits 2016-01-12 2016-02-23 57399.577778 57441.766667 2013-05-01 56413.150694
+zcv1935oi_dkc.fits 2016-01-12 2016-02-23 57399.577778 57441.766667 2013-05-02 56414.121528
+zcv1935pi_dkc.fits 2016-01-12 2016-02-23 57399.577778 57441.766667 2013-05-03 56415.1125
+zcv1935qi_dkc.fits 2016-01-12 2016-02-23 57399.577778 57441.766667 2013-05-04 56416.0875
+zcv1935ri_dkc.fits 2016-01-12 2016-02-23 57399.577778 57441.766667 2013-05-05 56417.390972
+zcv1935si_dkc.fits 2016-01-12 2016-02-23 57399.577778 57441.766667 2013-05-06 56418.036111
+zcv1935ti_dkc.fits 2016-01-12 2016-02-23 57399.577778 57441.766667 2013-05-07 56419.345833
+zcv1938ei_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-05-08 56420.111111
+zcv1938fi_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-05-09 56421.042361
+zcv1938gi_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-05-10 56422.004861
+zcv1938hi_dkc.fits 2016-01-12 2016-02-23 57399.665972 57441.766667 2013-05-11 56423.029861
+zcv1938ii_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-12 56424.040972
+zcv1938ji_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-13 56425.209028
+zcv1938ki_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-14 56426.086806
+zcv1938li_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-15 56427.135417
+zcv1938mi_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-16 56428.092361
+zcv1938ni_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-17 56429.008333
+zcv1938oi_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-18 56430.094444
+zcv1938pi_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-19 56431.088889
+zcv1938qi_dkc.fits 2016-01-12 2016-02-23 57399.666667 57441.766667 2013-05-22 56434.842361
+zcv1938ri_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-05-25 56437.063194
+zcv1938si_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-05-25 56437.934722
+zcv1938ti_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-05-26 56438.652083
+zcv19390i_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-05-28 56440.220833
+zcv19391i_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-05-28 56440.553472
+zcv19392i_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-05-30 56442.011806
+zcv19393i_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-05-30 56442.999306
+zcv19394i_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-06-01 56444.315278
+zcv19395i_dkc.fits 2016-01-12 2016-02-23 57399.667361 57441.766667 2013-06-01 56444.588889
+zcv19396i_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-06-03 56446.032639
+zcv19397i_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-06-04 56447.534028
+zcv19398i_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-06-06 56449.086806
+zcv19416i_dkc.fits 2016-01-13 2016-02-23 57400.489583 57441.766667 2013-06-07 56450.248611
+zcv19417i_dkc.fits 2016-01-13 2016-02-23 57400.489583 57441.766667 2013-06-07 56450.556944
+zcv19418i_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-06-08 56451.749306
+zcv19419i_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-06-10 56453.027083
+zcv1941ai_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-06-11 56454.109028
+zcv1941bi_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-06-12 56455.222222
+zcv1941ci_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-06-12 56455.801389
+zcv1941di_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-06-14 56457.151389
+zcv1941ei_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-06-15 56458.140972
+zcv1941fi_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-06-16 56459.422222
+zcv2021ii_dkc.fits 2016-01-20 2016-02-23 57407.552778 57441.766667 2013-06-17 56460.046528
+zcv20238i_dkc.fits 2016-01-20 2016-02-23 57407.622917 57441.766667 2013-06-20 56463.388194
+zcv20239i_dkc.fits 2016-01-20 2016-02-23 57407.622917 57441.766667 2013-06-23 56466.063194
+zcv2023ai_dkc.fits 2016-01-20 2016-02-23 57407.622917 57441.766667 2013-06-24 56467.020833
+zcv2023bi_dkc.fits 2016-01-20 2016-02-23 57407.622917 57441.766667 2013-06-25 56468.24375
+zcv2023ci_dkc.fits 2016-01-20 2016-02-23 57407.622917 57441.766667 2013-06-25 56468.350694
+zcv2023di_dkc.fits 2016-01-20 2016-02-23 57407.622917 57441.766667 2013-06-27 56470.095139
+zcv2023ei_dkc.fits 2016-01-20 2016-02-23 57407.622917 57441.766667 2013-06-28 56471.175694
+zcv2023fi_dkc.fits 2016-01-20 2016-02-23 57407.623611 57441.766667 2013-06-29 56472.111111
+zcv2023gi_dkc.fits 2016-01-20 2016-02-23 57407.623611 57441.766667 2013-06-30 56473.103472
+zcv2023hi_dkc.fits 2016-01-20 2016-02-23 57407.623611 57441.766667 2013-07-02 56475.01875
+zcv2023ii_dkc.fits 2016-01-20 2016-02-23 57407.623611 57441.766667 2013-07-04 56477.79375
+zcv2023ji_dkc.fits 2016-01-20 2016-02-23 57407.623611 57441.766667 2013-07-06 56479.640278
+zcv2023ki_dkc.fits 2016-01-20 2016-02-23 57407.623611 57441.766667 2013-07-07 56480.833333
+zcv2023li_dkc.fits 2016-01-20 2016-02-23 57407.623611 57441.766667 2013-07-09 56482.038889
+zcv2023mi_dkc.fits 2016-01-20 2016-02-23 57407.623611 57441.766667 2013-07-09 56482.730556
+zcv2023ni_dkc.fits 2016-01-20 2016-02-23 57407.624306 57441.766667 2013-07-10 56483.434722
+zcv2023oi_dkc.fits 2016-01-20 2016-02-23 57407.624306 57441.766667 2013-07-11 56484.541667
+zcv2023pi_dkc.fits 2016-01-20 2016-02-23 57407.624306 57441.766667 2013-07-13 56486.035417
+zcv2023qi_dkc.fits 2016-01-20 2016-02-23 57407.624306 57441.766667 2013-07-14 56487.3875
+zcv2023ri_dkc.fits 2016-01-20 2016-02-23 57407.624306 57441.766667 2013-07-18 56491.172917
+zcv2023si_dkc.fits 2016-01-20 2016-02-23 57407.624306 57441.766667 2013-07-20 56493.554167
+zcv2023ti_dkc.fits 2016-01-20 2016-02-23 57407.624306 57441.766667 2013-07-21 56494.297222
+zcv20240i_dkc.fits 2016-01-20 2016-02-23 57407.624306 57441.766667 2013-07-22 56495.550694
+zcv20241i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-07-23 56496.352778
+zcv20242i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-07-24 56497.042361
+zcv1932ni_dkc.fits 2016-01-12 2016-02-23 57399.463194 57441.766667 2013-07-25 56498.093056
+zcv1932oi_dkc.fits 2016-01-12 2016-02-23 57399.463194 57441.766667 2013-07-27 56500.6125
+zcv1932pi_dkc.fits 2016-01-12 2016-02-23 57399.463194 57441.766667 2013-07-27 56500.997222
+zcv1932qi_dkc.fits 2016-01-12 2016-02-23 57399.463194 57441.766667 2013-07-29 56502.225
+zcv1932ri_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-07-30 56503.079861
+zcv1932si_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-07-31 56504.25
+zcv1932ti_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-08-01 56505.0
+zcv19330i_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-08-02 56506.004861
+zcv19331i_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-08-03 56507.140972
+zcv19332i_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-08-04 56508.3
+zcv19333i_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-08-05 56509.027083
+zcv19334i_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-08-06 56510.090972
+zcv19335i_dkc.fits 2016-01-12 2016-02-23 57399.463889 57441.766667 2013-08-07 56511.808333
+zcv19336i_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-07 56511.946528
+zcv19337i_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-09 56513.086806
+zcv19338i_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-10 56514.055556
+zcv19339i_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-11 56515.113889
+zcv1933ai_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-12 56516.03125
+zcv1933bi_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-15 56519.090278
+zcv1933ci_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-16 56520.841667
+zcv1933di_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-18 56522.066667
+zcv1933ei_dkc.fits 2016-01-12 2016-02-23 57399.464583 57441.766667 2013-08-19 56523.276389
+zcv1933fi_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-08-20 56524.081944
+zcv1933gi_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-08-21 56525.195139
+zcv1933hi_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-08-22 56526.014583
+zcv19360i_dkc.fits 2016-01-12 2016-02-23 57399.577778 57441.766667 2013-08-23 56527.171528
+zcv19361i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-24 56528.604861
+zcv19362i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-25 56529.252778
+zcv19363i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-26 56530.025694
+zcv19364i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-27 56531.175
+zcv19365i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-28 56532.008333
+zcv19366i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-29 56533.168056
+zcv19367i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-30 56534.053472
+zcv19369i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-31 56535.632639
+zcv19368i_dkc.fits 2016-01-12 2016-02-23 57399.578472 57441.766667 2013-08-31 56535.788889
+zcv1936ai_dkc.fits 2016-01-12 2016-02-23 57399.579167 57441.766667 2013-09-03 56538.154861
+zcv1936bi_dkc.fits 2016-01-12 2016-02-23 57399.579167 57441.766667 2013-09-03 56538.842361
+zcv1936ci_dkc.fits 2016-01-12 2016-02-23 57399.579167 57441.766667 2013-09-05 56540.104861
+zcv1936di_dkc.fits 2016-01-12 2016-02-23 57399.579167 57441.766667 2013-09-06 56541.480556
+zcv1936ei_dkc.fits 2016-01-12 2016-02-23 57399.579167 57441.766667 2013-09-07 56542.174306
+zcv1936fi_dkc.fits 2016-01-12 2016-02-23 57399.579167 57441.766667 2013-09-08 56543.005556
+zcv1936gi_dkc.fits 2016-01-12 2016-02-23 57399.579167 57441.766667 2013-09-09 56544.479167
+zcv1936hi_dkc.fits 2016-01-12 2016-02-23 57399.579167 57441.766667 2013-09-12 56547.305556
+zcv1936ii_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2013-09-14 56549.113194
+zcv1936ji_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2013-09-15 56550.315278
+zcv1936ki_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2013-09-16 56551.776389
+zcv1936li_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2013-09-17 56552.244444
+zcv1936mi_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2013-09-18 56553.023611
+zcv1936ni_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2013-09-19 56554.097917
+zcv1936oi_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2013-09-20 56555.211111
+zcv1936pi_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2013-09-21 56556.1625
+zcv19399i_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-09-22 56557.025694
+zcv1939ai_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-09-23 56558.186111
+zcv1939bi_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-09-24 56559.067361
+zcv1939ci_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-09-25 56560.257639
+zcv1939di_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-09-26 56561.070833
+zcv1939ei_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-09-27 56562.469444
+zcv1939fi_dkc.fits 2016-01-12 2016-02-23 57399.668056 57441.766667 2013-09-28 56563.08125
+zcv1939gi_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-09-29 56564.020139
+zcv1939hi_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-09-30 56565.083333
+zcv1939ii_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-10-01 56566.083333
+zcv1939ji_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-10-02 56567.159028
+zcv1939ki_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-10-03 56568.122917
+zcv1939li_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-10-04 56569.113889
+zcv1939mi_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-10-05 56570.070833
+zcv1939ni_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-10-06 56571.011111
+zcv1939oi_dkc.fits 2016-01-12 2016-02-23 57399.66875 57441.766667 2013-10-07 56572.140278
+zcv1939pi_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-10 56575.975
+zcv1939qi_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-12 56577.673611
+zcv1939ri_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-14 56579.120833
+zcv1939si_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-15 56580.013889
+zcv1939ti_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-16 56581.009722
+zcv19400i_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-17 56582.039583
+zcv19401i_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-18 56583.030556
+zcv19402i_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-19 56584.729861
+zcv19403i_dkc.fits 2016-01-12 2016-02-23 57399.669444 57441.766667 2013-10-21 56586.025694
+zcv1941gi_dkc.fits 2016-01-13 2016-02-23 57400.490278 57441.766667 2013-10-22 56587.0
+zcv1941hi_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-23 56588.125
+zcv1941ii_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-23 56588.999306
+zcv1941ji_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-25 56590.004861
+zcv1941ki_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-26 56591.038889
+zcv1941li_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-27 56592.035417
+zcv1941mi_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-28 56593.193056
+zcv1941ni_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-29 56594.168056
+zcv1941oi_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-30 56595.564583
+zcv1941pi_dkc.fits 2016-01-13 2016-02-23 57400.490972 57441.766667 2013-10-30 56595.702083
+zcv1941qi_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2013-11-01 56597.022222
+zcv1941ri_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2013-11-02 56598.218056
+zcv1941si_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2013-11-03 56599.094444
+zcv20243i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-11-05 56601.336806
+zcv20244i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-11-06 56602.369444
+zcv20245i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-11-07 56603.790278
+zcv20246i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-11-10 56606.090278
+zcv20247i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-11-17 56613.0
+zcv1957si_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2013-11-18 56614.03125
+zcv20248i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-11-19 56615.259028
+zcv20249i_dkc.fits 2016-01-20 2016-02-23 57407.625 57441.766667 2013-11-20 56616.736111
+zcv2024ai_dkc.fits 2016-01-20 2016-02-23 57407.625694 57441.766667 2013-11-21 56617.102778
+zcv2024bi_dkc.fits 2016-01-20 2016-02-23 57407.625694 57441.766667 2013-11-22 56618.188194
+zcv2024ci_dkc.fits 2016-01-20 2016-02-23 57407.625694 57441.766667 2013-11-23 56619.0
+zcv2024di_dkc.fits 2016-01-20 2016-02-23 57407.625694 57441.766667 2013-11-23 56619.869444
+zcv2024ei_dkc.fits 2016-01-20 2016-02-23 57407.625694 57441.766667 2013-11-26 56622.002778
+zcv2024fi_dkc.fits 2016-01-20 2016-02-23 57407.625694 57441.766667 2013-11-27 56623.021528
+zcv2024gi_dkc.fits 2016-01-20 2016-02-23 57407.625694 57441.766667 2013-11-28 56624.506944
+zcv2024hi_dkc.fits 2016-01-20 2016-02-23 57407.625694 57441.766667 2013-11-29 56625.145139
+zcv2024ii_dkc.fits 2016-01-20 2016-02-23 57407.626389 57441.766667 2013-11-30 56626.20625
+zcv2024ji_dkc.fits 2016-01-20 2016-02-23 57407.626389 57441.766667 2013-11-30 56626.9375
+zcv2024ki_dkc.fits 2016-01-20 2016-02-23 57407.626389 57441.766667 2013-12-04 56630.627778
+zcv2024li_dkc.fits 2016-01-20 2016-02-23 57407.626389 57441.766667 2013-12-06 56632.399306
+zcv2024mi_dkc.fits 2016-01-20 2016-02-23 57407.626389 57441.766667 2013-12-07 56633.449306
+zcv2024ni_dkc.fits 2016-01-20 2016-02-23 57407.626389 57441.766667 2013-12-08 56634.777778
+zcv2024oi_dkc.fits 2016-01-20 2016-02-23 57407.626389 57441.766667 2013-12-09 56635.906944
+zcv2024pi_dkc.fits 2016-01-20 2016-02-23 57407.626389 57441.766667 2013-12-10 56636.322917
+zcv2024qi_dkc.fits 2016-01-20 2016-02-23 57407.627083 57441.766667 2013-12-11 56637.557639
+zcv2024ri_dkc.fits 2016-01-20 2016-02-23 57407.627083 57441.766667 2013-12-13 56639.014583
+zcv1933ii_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-12-13 56639.36875
+zcv1933ji_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-12-15 56641.477778
+zcv1933ki_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-12-17 56643.154861
+zcv1933li_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-12-17 56643.492361
+zcv1933mi_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-12-18 56644.394444
+zcv1933ni_dkc.fits 2016-01-12 2016-02-23 57399.465278 57441.766667 2013-12-19 56645.606944
+zcv1933oi_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2013-12-21 56647.133333
+zcv1933pi_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2013-12-22 56648.122917
+zcv1933qi_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2013-12-23 56649.105556
+zcv1933ri_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2013-12-25 56651.163194
+zcv1933si_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2013-12-27 56653.167361
+zcv1933ti_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2013-12-27 56653.636806
+zcv19340i_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2013-12-28 56654.498611
+zcv19341i_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2013-12-30 56656.020833
+zcv19342i_dkc.fits 2016-01-12 2016-02-23 57399.465972 57441.766667 2014-01-02 56659.311111
+zcv19343i_dkc.fits 2016-01-12 2016-02-23 57399.466667 57441.766667 2014-01-04 56661.036806
+zcv19344i_dkc.fits 2016-01-12 2016-02-23 57399.466667 57441.766667 2014-01-05 56662.071528
+zcv19345i_dkc.fits 2016-01-12 2016-02-23 57399.466667 57441.766667 2014-01-06 56663.027083
+zcv19346i_dkc.fits 2016-01-12 2016-02-23 57399.466667 57441.766667 2014-01-08 56665.074306
+zcv19347i_dkc.fits 2016-01-12 2016-02-23 57399.466667 57441.766667 2014-01-09 56666.009722
+zcv19348i_dkc.fits 2016-01-12 2016-02-23 57399.466667 57441.766667 2014-01-10 56667.0
+zcv19349i_dkc.fits 2016-01-12 2016-02-23 57399.466667 57441.766667 2014-01-11 56668.0
+zcv1934ai_dkc.fits 2016-01-12 2016-02-23 57399.466667 57441.766667 2014-01-12 56669.40625
+zcv1936qi_dkc.fits 2016-01-12 2016-02-23 57399.579861 57441.766667 2014-01-13 56670.006944
+zcv1936ri_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-14 56671.0
+zcv1936si_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-16 56673.0
+zcv1936ti_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-17 56674.944444
+zcv19370i_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-18 56675.075694
+zcv19371i_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-19 56676.026389
+zcv19372i_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-20 56677.359722
+zcv19373i_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-21 56678.223611
+zcv19374i_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-22 56679.18125
+zcv19375i_dkc.fits 2016-01-12 2016-02-23 57399.580556 57441.766667 2014-01-23 56680.025694
+zcv19376i_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-01-24 56681.00625
+zcv19377i_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-01-25 56682.066667
+zcv19378i_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-01-26 56683.0
+zcv19379i_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-01-27 56684.146528
+zcv1937ai_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-01-30 56687.469444
+zcv1937bi_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-02-01 56689.705556
+zcv1937ci_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-02-02 56690.124306
+zcv1937di_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-02-03 56691.166667
+zcv1937ei_dkc.fits 2016-01-12 2016-02-23 57399.58125 57441.766667 2014-02-04 56692.117361
+zcv1937fi_dkc.fits 2016-01-12 2016-02-23 57399.581944 57441.766667 2014-02-05 56693.624306
+zcv1937gi_dkc.fits 2016-01-12 2016-02-23 57399.581944 57441.766667 2014-02-06 56694.178472
+zcv1937hi_dkc.fits 2016-01-12 2016-02-23 57399.581944 57441.766667 2014-02-07 56695.186111
+zcv1937ii_dkc.fits 2016-01-12 2016-02-23 57399.581944 57441.766667 2014-02-09 56697.735417
+zcv1937ji_dkc.fits 2016-01-12 2016-02-23 57399.581944 57441.766667 2014-02-10 56698.194444
+zcv19404i_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-11 56699.130556
+zcv19405i_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-12 56700.138194
+zcv19406i_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-13 56701.206944
+zcv19407i_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-14 56702.622222
+zcv19408i_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-15 56703.113889
+zcv19409i_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-17 56705.380556
+zcv1940ai_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-18 56706.376389
+zcv1940bi_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-19 56707.757639
+zcv1940ci_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-20 56708.115972
+zcv1940di_dkc.fits 2016-01-12 2016-02-23 57399.670139 57441.766667 2014-02-21 56709.452083
+zcv1940ei_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-02-22 56710.115972
+zcv1940fi_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-02-24 56712.649306
+zcv1940gi_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-02-26 56714.752778
+zcv1940hi_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-03-01 56717.277778
+zcv1940ii_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-03-02 56718.002778
+zcv1940ji_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-03-03 56719.020833
+zcv1940ki_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-03-04 56720.48125
+zcv1940li_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-03-05 56721.559028
+zcv1940mi_dkc.fits 2016-01-12 2016-02-23 57399.670833 57441.766667 2014-03-06 56722.603472
+zcv1940ni_dkc.fits 2016-01-12 2016-02-23 57399.671528 57441.766667 2014-03-09 56725.103472
+zcv1940oi_dkc.fits 2016-01-12 2016-02-23 57399.671528 57441.766667 2014-03-09 56725.525
+zcv1940pi_dkc.fits 2016-01-12 2016-02-23 57399.671528 57441.766667 2014-03-10 56726.447222
+zcv1940qi_dkc.fits 2016-01-12 2016-02-23 57399.671528 57441.766667 2014-03-12 56728.369444
+zcv1940ri_dkc.fits 2016-01-12 2016-02-23 57399.671528 57441.766667 2014-03-13 56729.226389
+zcv1940si_dkc.fits 2016-01-12 2016-02-23 57399.671528 57441.766667 2014-03-14 56730.539583
+zcv1941ti_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2014-03-15 56731.435417
+zcv19420i_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2014-03-17 56733.290972
+zcv19421i_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2014-03-18 56734.279861
+zcv19422i_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2014-03-19 56735.296528
+zcv19423i_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2014-03-20 56736.0
+zcv19424i_dkc.fits 2016-01-13 2016-02-23 57400.491667 57441.766667 2014-03-21 56737.120833
+zcv19425i_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-03-22 56738.002778
+zcv19426i_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-03-23 56739.111806
+zcv19427i_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-03-23 56739.46875
+zcv19428i_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-03-25 56741.238889
+zcv19429i_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-03-28 56744.193056
+zcv1942ai_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-03-30 56746.103472
+zcv1942bi_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-03-31 56747.345833
+zcv1942ci_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-04-01 56748.445833
+zcv1942di_dkc.fits 2016-01-13 2016-02-23 57400.492361 57441.766667 2014-04-02 56749.791667
+zcv1942ei_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-03 56750.188194
+zcv1942fi_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-04 56751.013194
+zcv1942gi_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-05 56752.486111
+zcv1942hi_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-06 56753.00625
+zcv1942ii_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-07 56754.064583
+zcv1942ji_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-08 56755.302778
+zcv1942ki_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-09 56756.627778
+zcv1942li_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-10 56757.194444
+zcv1942mi_dkc.fits 2016-01-13 2016-02-23 57400.493056 57441.766667 2014-04-11 56758.263889
+zcv1942ni_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-12 56759.230556
+zcv1942oi_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-13 56760.116667
+zcv1942pi_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-14 56761.020833
+zcv1942qi_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-15 56762.381944
+zcv1942ri_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-16 56763.097917
+zcv1942si_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-17 56764.163889
+zcv1942ti_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-18 56765.136111
+zcv19430i_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-19 56766.013889
+zcv19431i_dkc.fits 2016-01-13 2016-02-23 57400.49375 57441.766667 2014-04-20 56767.0
+zcv19432i_dkc.fits 2016-01-13 2016-02-23 57400.494444 57441.766667 2014-04-23 56770.831944
+01d1719gi_dkc.fits 2016-01-13 2016-02-23 57400.599306 57441.766667 2014-04-26 56773.397222
+zcv19448i_dkc.fits 2016-01-13 2016-02-23 57400.599306 57441.766667 2014-04-27 56774.059722
+zcv19449i_dkc.fits 2016-01-13 2016-02-23 57400.599306 57441.766667 2014-04-28 56775.032639
+zcv1944ai_dkc.fits 2016-01-13 2016-02-23 57400.599306 57441.766667 2014-04-29 56776.0
+zcv1944bi_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-04-30 56777.025
+zcv1944ci_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-04-30 56777.895139
+zcv1944di_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-05-01 56778.696528
+zcv1944ei_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-05-03 56780.011806
+zcv1944fi_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-05-04 56781.170139
+zcv1944gi_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-05-04 56781.820139
+zcv1944hi_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-05-06 56783.421528
+zcv1944ii_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-05-07 56784.202083
+zcv1944ji_dkc.fits 2016-01-13 2016-02-23 57400.6 57441.766667 2014-05-08 56785.000694
+zcv1944ki_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-09 56786.202778
+zcv1944li_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-09 56786.7375
+zcv1944mi_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-11 56788.04375
+zcv1944ni_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-12 56789.177083
+zcv1944oi_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-13 56790.002778
+zcv1944pi_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-14 56791.114583
+zcv1944qi_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-15 56792.325694
+zcv1944ri_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-16 56793.088889
+zcv1944si_dkc.fits 2016-01-13 2016-02-23 57400.600694 57441.766667 2014-05-17 56794.450694
+zcv1944ti_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-05-18 56795.145139
+zcv19450i_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-05-20 56797.871528
+01d2021fi_dkc.fits 2016-01-13 2016-02-23 57400.685417 57441.766667 2014-05-23 56800.110417
+zcv1947hi_dkc.fits 2016-01-13 2016-02-23 57400.685417 57441.766667 2014-05-24 56801.052083
+zcv1947ii_dkc.fits 2016-01-13 2016-02-23 57400.685417 57441.766667 2014-05-25 56802.034722
+zcv1947ji_dkc.fits 2016-01-13 2016-02-23 57400.685417 57441.766667 2014-05-26 56803.020833
+zcv1947ki_dkc.fits 2016-01-13 2016-02-23 57400.685417 57441.766667 2014-05-27 56804.445139
+zcv1947li_dkc.fits 2016-01-13 2016-02-23 57400.685417 57441.766667 2014-05-29 56806.641667
+zcv1947mi_dkc.fits 2016-01-13 2016-02-23 57400.685417 57441.766667 2014-05-31 56808.605556
+zcv1947ni_dkc.fits 2016-01-13 2016-02-23 57400.686111 57441.766667 2014-06-01 56809.757639
+zcv1947oi_dkc.fits 2016-01-13 2016-02-23 57400.686111 57441.766667 2014-06-03 56811.526389
+zcv1947pi_dkc.fits 2016-01-13 2016-02-23 57400.686111 57441.766667 2014-06-04 56812.455556
+zcv1947qi_dkc.fits 2016-01-13 2016-02-23 57400.686111 57441.766667 2014-06-05 56813.583333
+zcv1947ri_dkc.fits 2016-01-13 2016-02-23 57400.686111 57441.766667 2014-06-07 56815.73125
+zcv1947si_dkc.fits 2016-01-13 2016-02-23 57400.686111 57441.766667 2014-06-09 56817.014583
+zcv1947ti_dkc.fits 2016-01-13 2016-02-23 57400.686111 57441.766667 2014-06-09 56817.619444
+zcv19480i_dkc.fits 2016-01-13 2016-02-23 57400.686111 57441.766667 2014-06-11 56819.263889
+zcv19481i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-06-12 56820.781944
+zcv19482i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-06-14 56822.322222
+zcv19483i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-06-15 56823.122917
+zcv19484i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-06-16 56824.029167
+zcv19485i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-06-18 56826.806944
+zcv19486i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-06-21 56829.026389
+zcv19487i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-06-22 56830.008333
+zcv19488i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-06-23 56831.136111
+zcv1950ri_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2014-06-24 56832.008333
+zcv1950si_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2014-06-25 56833.056944
+zcv1950ti_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2014-06-26 56834.010417
+zcv19510i_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2014-06-27 56835.047222
+zcv19511i_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2014-06-28 56836.061806
+zcv19512i_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2014-06-29 56837.114583
+zcv19513i_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2014-06-30 56838.204167
+zcv19514i_dkc.fits 2016-01-14 2016-02-23 57401.58125 57441.766667 2014-06-30 56838.709028
+zcv19515i_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-01 56839.529167
+zcv19516i_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-03 56841.031944
+zcv19517i_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-04 56842.045833
+zcv19518i_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-05 56843.007639
+zcv19519i_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-05 56843.625
+zcv1951ai_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-07 56845.020833
+zcv1951bi_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-08 56846.00625
+zcv1951ci_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-08 56846.542361
+zcv1951di_dkc.fits 2016-01-14 2016-02-23 57401.581944 57441.766667 2014-07-10 56848.0
+zcv1951ei_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-07-11 56849.156944
+zcv1951fi_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-07-11 56849.494444
+zcv1951gi_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-07-13 56851.084722
+zcv1951hi_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-07-15 56853.713889
+zcv1951ii_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-07-18 56856.0
+zcv1951ji_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-07-19 56857.008333
+zcv1951ki_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-07-20 56858.107639
+zcv1954li_dkc.fits 2016-01-14 2016-02-23 57401.675694 57441.766667 2014-07-21 56859.020833
+zcv1954mi_dkc.fits 2016-01-14 2016-02-23 57401.675694 57441.766667 2014-07-22 56860.092361
+zcv1954ni_dkc.fits 2016-01-14 2016-02-23 57401.675694 57441.766667 2014-07-23 56861.0
+zcv1954oi_dkc.fits 2016-01-14 2016-02-23 57401.675694 57441.766667 2014-07-24 56862.0
+zcv1954pi_dkc.fits 2016-01-14 2016-02-23 57401.675694 57441.766667 2014-07-25 56863.00625
+zcv1954qi_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-07-26 56864.207639
+zcv1954ri_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-07-27 56865.084028
+zcv1954si_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-07-28 56866.023611
+zcv1954ti_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-07-29 56867.00625
+zcv19550i_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-07-31 56869.036111
+zcv19551i_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-08-01 56870.035417
+zcv19552i_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-08-02 56871.264583
+zcv19553i_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-08-02 56871.4125
+zcv19554i_dkc.fits 2016-01-14 2016-02-23 57401.676389 57441.766667 2014-08-04 56873.118056
+zcv19555i_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-08-05 56874.020139
+zcv19556i_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-08-06 56875.105556
+zcv19557i_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-08-07 56876.0125
+zcv19558i_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-08-08 56877.095833
+zcv19559i_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-08-08 56877.41875
+zcv1955ai_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-08-09 56878.461111
+zcv1955bi_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-08-13 56882.363889
+zcv1955ci_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-08-15 56884.200694
+zcv1957ti_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2014-08-16 56885.03125
+zcv19580i_dkc.fits 2016-01-21 2016-02-23 57408.622222 57441.766667 2014-08-17 56886.095139
+zcv19581i_dkc.fits 2016-01-21 2016-02-23 57408.622917 57441.766667 2014-08-18 56887.021528
+zcv19582i_dkc.fits 2016-01-21 2016-02-23 57408.622917 57441.766667 2014-08-19 56888.044444
+zcv19583i_dkc.fits 2016-01-21 2016-02-23 57408.622917 57441.766667 2014-08-20 56889.296528
+zcv19433i_dkc.fits 2016-01-13 2016-02-23 57400.494444 57441.766667 2014-08-21 56890.118056
+zcv19434i_dkc.fits 2016-01-13 2016-02-23 57400.494444 57441.766667 2014-08-22 56891.110417
+zcv19435i_dkc.fits 2016-01-13 2016-02-23 57400.494444 57441.766667 2014-08-23 56892.063889
+zcv19436i_dkc.fits 2016-01-13 2016-02-23 57400.494444 57441.766667 2014-08-24 56893.847917
+zcv19437i_dkc.fits 2016-01-13 2016-02-23 57400.494444 57441.766667 2014-08-25 56894.027083
+zcv19438i_dkc.fits 2016-01-13 2016-02-23 57400.494444 57441.766667 2014-08-27 56896.832639
+zcv19439i_dkc.fits 2016-01-13 2016-02-23 57400.494444 57441.766667 2014-08-28 56897.038889
+zcv1943ai_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2014-08-29 56898.304861
+zcv1943bi_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2014-08-30 56899.279861
+zcv1943ci_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2014-08-31 56900.342361
+zcv1943di_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2014-09-01 56901.0
+zcv1943ei_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2014-09-02 56902.036111
+zcv1943fi_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2014-09-03 56903.727778
+zcv1943gi_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2014-09-04 56904.155556
+zcv1943hi_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2014-09-05 56905.0
+zcv19451i_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-09-06 56906.175
+zcv19452i_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-09-07 56907.0
+zcv19453i_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-09-08 56908.020833
+zcv19454i_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-09-11 56911.646528
+zcv19455i_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-09-14 56914.002083
+zcv19456i_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-09-14 56914.741667
+zcv19457i_dkc.fits 2016-01-13 2016-02-23 57400.601389 57441.766667 2014-09-15 56915.652083
+zcv19458i_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-17 56917.0
+zcv19459i_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-18 56918.023611
+zcv1945ai_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-19 56919.019444
+zcv1945bi_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-20 56920.253472
+zcv1945ci_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-21 56921.0875
+zcv1945di_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-22 56922.179167
+zcv1945ei_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-23 56923.071528
+zcv1945fi_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-24 56924.0
+zcv1945gi_dkc.fits 2016-01-13 2016-02-23 57400.602083 57441.766667 2014-09-25 56925.145139
+zcv19584i_dkc.fits 2016-01-21 2016-02-23 57408.622917 57441.766667 2014-09-26 56926.15
+zcv1945hi_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-09-26 56926.672917
+zcv1945ii_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-09-28 56928.775
+zcv1945ji_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-09-30 56930.39375
+zcv1945ki_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-10-01 56931.451389
+zcv1945li_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-10-03 56933.225694
+zcv1945mi_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-10-04 56934.152778
+zcv1945ni_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-10-04 56934.584028
+zcv1945oi_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-10-05 56935.939583
+zcv1945pi_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2014-10-07 56937.0
+zcv19489i_dkc.fits 2016-01-13 2016-02-23 57400.686806 57441.766667 2014-10-10 56940.198611
+zcv1948bi_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-12 56942.182639
+zcv1948ci_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-13 56943.513194
+zcv1948di_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-13 56943.961111
+zcv1948ei_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-15 56945.020139
+zcv1948fi_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-16 56946.003472
+zcv1948hi_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-17 56947.244444
+zcv1948gi_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-17 56947.914583
+zcv1948ii_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-19 56949.142361
+zcv1948ji_dkc.fits 2016-01-13 2016-02-23 57400.6875 57441.766667 2014-10-20 56950.015278
+zcv1948ki_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-22 56952.301389
+zcv1948li_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-23 56953.051389
+zcv1948mi_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-24 56954.002778
+zcv1948ni_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-25 56955.025694
+zcv1948oi_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-26 56956.26875
+zcv1948pi_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-27 56957.020833
+zcv1948qi_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-28 56958.0
+zcv1948ri_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-29 56959.0
+zcv1948si_dkc.fits 2016-01-13 2016-02-23 57400.688194 57441.766667 2014-10-30 56960.027083
+zcv1948ti_dkc.fits 2016-01-13 2016-02-23 57400.688889 57441.766667 2014-10-31 56961.0
+zcv19490i_dkc.fits 2016-01-13 2016-02-23 57400.688889 57441.766667 2014-11-01 56962.041667
+zcv19491i_dkc.fits 2016-01-13 2016-02-23 57400.688889 57441.766667 2014-11-02 56963.0125
+zcv19492i_dkc.fits 2016-01-13 2016-02-23 57400.688889 57441.766667 2014-11-05 56966.73125
+zcv19493i_dkc.fits 2016-01-13 2016-02-23 57400.688889 57441.766667 2014-11-08 56969.152083
+zcv19494i_dkc.fits 2016-01-13 2016-02-23 57400.688889 57441.766667 2014-11-09 56970.002778
+zcv19495i_dkc.fits 2016-01-13 2016-02-23 57400.688889 57441.766667 2014-11-10 56971.204167
+zcv1951li_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-11-11 56972.185417
+zcv1951mi_dkc.fits 2016-01-14 2016-02-23 57401.582639 57441.766667 2014-11-12 56973.126389
+zcv1951ni_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-13 56974.004167
+zcv1951oi_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-14 56975.169444
+zcv1951pi_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-15 56976.04375
+zcv1951qi_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-16 56977.040972
+zcv1951ri_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-17 56978.589583
+zcv1951si_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-19 56980.022917
+zcv1951ti_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-20 56981.142361
+zcv19520i_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-21 56982.532639
+zcv19521i_dkc.fits 2016-01-14 2016-02-23 57401.583333 57441.766667 2014-11-21 56982.550694
+zcv19522i_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-11-23 56984.130556
+zcv19523i_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-11-24 56985.157639
+zcv19524i_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-11-25 56986.069444
+zcv19525i_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-11-26 56987.034028
+zcv19526i_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-11-27 56988.0
+zcv19527i_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-11-28 56989.022222
+zcv19528i_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-11-29 56990.019444
+zcv19529i_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-11-30 56991.047222
+zcv1952ai_dkc.fits 2016-01-14 2016-02-23 57401.584028 57441.766667 2014-12-01 56992.522917
+zcv1952bi_dkc.fits 2016-01-14 2016-02-23 57401.584722 57441.766667 2014-12-04 56995.479861
+zcv1952ci_dkc.fits 2016-01-14 2016-02-23 57401.584722 57441.766667 2014-12-07 56998.003472
+zcv1952di_dkc.fits 2016-01-14 2016-02-23 57401.584722 57441.766667 2014-12-08 56999.00625
+zcv1952ei_dkc.fits 2016-01-14 2016-02-23 57401.584722 57441.766667 2014-12-08 56999.30625
+zcv1952fi_dkc.fits 2016-01-14 2016-02-23 57401.584722 57441.766667 2014-12-10 57001.786111
+zcv1955di_dkc.fits 2016-01-14 2016-02-23 57401.677083 57441.766667 2014-12-12 57003.002083
+zcv1955ei_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-13 57004.172222
+zcv1955fi_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-14 57005.161806
+zcv1955gi_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-15 57006.251389
+zcv1955hi_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-17 57008.186111
+zcv1955ii_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-18 57009.015278
+zcv1955ji_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-19 57010.347917
+zcv1955ki_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-21 57012.475
+zcv1955li_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-22 57013.331944
+zcv1955mi_dkc.fits 2016-01-14 2016-02-23 57401.677778 57441.766667 2014-12-24 57015.0125
+zcv1955ni_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2014-12-24 57015.573611
+zcv1955oi_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2014-12-26 57017.115972
+zcv1955pi_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2014-12-27 57018.095139
+zcv1955qi_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2014-12-28 57019.177778
+zcv1955ri_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2014-12-31 57022.720139
+zcv1955si_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2015-01-03 57025.146528
+zcv1955ti_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2015-01-04 57026.014583
+zcv19560i_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2015-01-05 57027.647222
+zcv19561i_dkc.fits 2016-01-14 2016-02-23 57401.678472 57441.766667 2015-01-07 57029.033333
+zcv19562i_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-01-08 57030.027083
+zcv19563i_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-01-09 57031.173611
+zcv19585i_dkc.fits 2016-01-21 2016-02-23 57408.622917 57441.766667 2015-01-10 57032.084722
+zcv19586i_dkc.fits 2016-01-21 2016-02-23 57408.622917 57441.766667 2015-01-11 57033.101389
+zcv1943ii_dkc.fits 2016-01-13 2016-02-23 57400.495139 57441.766667 2015-01-12 57034.14375
+zcv1943ji_dkc.fits 2016-01-13 2016-02-23 57400.495833 57441.766667 2015-01-12 57034.520139
+zcv1943ki_dkc.fits 2016-01-13 2016-02-23 57400.495833 57441.766667 2015-01-13 57035.4
+zcv1943li_dkc.fits 2016-01-13 2016-02-23 57400.495833 57441.766667 2015-01-15 57037.077083
+zcv1943mi_dkc.fits 2016-01-13 2016-02-23 57400.495833 57441.766667 2015-01-16 57038.025
+zcv1943ni_dkc.fits 2016-01-13 2016-02-23 57400.495833 57441.766667 2015-01-17 57039.0
+zcv1943oi_dkc.fits 2016-01-13 2016-02-23 57400.495833 57441.766667 2015-01-18 57040.0
+zcv1943pi_dkc.fits 2016-01-13 2016-02-23 57400.495833 57441.766667 2015-01-19 57041.126389
+zcv1943qi_dkc.fits 2016-01-13 2016-02-23 57400.495833 57441.766667 2015-01-20 57042.011806
+zcv1943ri_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-01-21 57043.297917
+zcv1943si_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-01-21 57043.620833
+zcv1943ti_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-01-23 57045.15625
+zcv1945qi_dkc.fits 2016-01-13 2016-02-23 57400.602778 57441.766667 2015-01-24 57046.021528
+zcv1945ri_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-01-25 57047.146528
+zcv1945si_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-01-26 57048.05625
+zcv1945ti_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-01-29 57051.391667
+zcv19460i_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-01-31 57053.751389
+zcv19461i_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-02-01 57054.074306
+zcv19462i_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-02-02 57055.290972
+zcv19463i_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-02-04 57057.05625
+zcv19464i_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-02-04 57057.068056
+zcv19465i_dkc.fits 2016-01-13 2016-02-23 57400.603472 57441.766667 2015-02-05 57058.172222
+zcv19466i_dkc.fits 2016-01-13 2016-02-23 57400.604167 57441.766667 2015-02-06 57059.090972
+zcv19468i_dkc.fits 2016-01-13 2016-02-23 57400.604167 57441.766667 2015-02-08 57061.007639
+zcv19467i_dkc.fits 2016-01-13 2016-02-23 57400.604167 57441.766667 2015-02-08 57061.328472
+zcv19469i_dkc.fits 2016-01-13 2016-02-23 57400.604167 57441.766667 2015-02-09 57062.463889
+zcv1946ai_dkc.fits 2016-01-13 2016-02-23 57400.604167 57441.766667 2015-02-10 57063.06875
+zcv1946bi_dkc.fits 2016-01-13 2016-02-23 57400.604167 57441.766667 2015-02-11 57064.409722
+zcv1946ci_dkc.fits 2016-01-13 2016-02-23 57400.604167 57441.766667 2015-02-12 57065.508333
+zcv1946di_dkc.fits 2016-01-13 2016-02-23 57400.604167 57441.766667 2015-02-14 57067.363889
+zcv19587i_dkc.fits 2016-01-21 2016-02-23 57408.622917 57441.766667 2015-02-15 57068.435417
+zcv1946ei_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-02-16 57069.445833
+zcv1946fi_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-02-17 57070.177083
+zcv1946gi_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-02-18 57071.178472
+zcv1946hi_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-02-19 57072.113194
+zcv1946ii_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-02-20 57073.404167
+zcv1946ji_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-02-21 57074.075
+zcv1946ki_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-02-22 57075.069444
+zcv19496i_dkc.fits 2016-01-13 2016-02-23 57400.688889 57441.766667 2015-02-24 57077.0125
+zcv1946li_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-02-24 57077.069444
+zcv19497i_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-02-28 57081.15
+zcv19498i_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-03-02 57083.092361
+zcv19499i_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-03-03 57084.014583
+zcv1949ai_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-03-04 57085.0125
+zcv1949bi_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-03-05 57086.015972
+zcv1949ci_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-03-06 57087.089583
+zcv1949di_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-03-07 57088.0
+zcv1949ei_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-03-08 57089.006944
+zcv1949fi_dkc.fits 2016-01-13 2016-02-23 57400.689583 57441.766667 2015-03-09 57090.259722
+zcv1949gi_dkc.fits 2016-01-13 2016-02-23 57400.690278 57441.766667 2015-03-10 57091.143056
+zcv1949hi_dkc.fits 2016-01-13 2016-02-23 57400.690278 57441.766667 2015-03-11 57092.046528
+zcv1949ii_dkc.fits 2016-01-13 2016-02-23 57400.690278 57441.766667 2015-03-12 57093.0
+zcv1949ji_dkc.fits 2016-01-13 2016-02-23 57400.690278 57441.766667 2015-03-13 57094.057639
+zcv1949ki_dkc.fits 2016-01-13 2016-02-23 57400.690278 57441.766667 2015-03-14 57095.011806
+zcv1949li_dkc.fits 2016-01-13 2016-02-23 57400.690278 57441.766667 2015-03-15 57096.227778
+zcv1949mi_dkc.fits 2016-01-13 2016-02-23 57400.690278 57441.766667 2015-03-16 57097.020833
+zcv1949ni_dkc.fits 2016-01-13 2016-02-23 57400.690278 57441.766667 2015-03-17 57098.209028
+zcv1949oi_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-03-18 57099.0
+zcv1949pi_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-03-19 57100.193056
+zcv1949qi_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-03-20 57101.697917
+zcv1949ri_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-03-23 57104.709722
+zcv1949si_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-03-26 57107.00625
+zcv1949ti_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-03-27 57108.404167
+zcv19500i_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-03-28 57109.0
+zcv19501i_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-03-29 57110.438194
+zcv1952gi_dkc.fits 2016-01-14 2016-02-23 57401.584722 57441.766667 2015-03-30 57111.020833
+zcv1952hi_dkc.fits 2016-01-14 2016-02-23 57401.584722 57441.766667 2015-03-31 57112.104861
+zcv1952ii_dkc.fits 2016-01-14 2016-02-23 57401.584722 57441.766667 2015-04-01 57113.213889
+zcv1952ji_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-02 57114.172917
+zcv1952ki_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-03 57115.019444
+zcv1952li_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-04 57116.440278
+zcv1952mi_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-05 57117.152083
+zcv1952ni_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-06 57118.057639
+zcv1952oi_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-06 57118.608333
+zcv1952pi_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-08 57120.30625
+zcv1952qi_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-09 57121.299306
+zcv1952ri_dkc.fits 2016-01-14 2016-02-23 57401.585417 57441.766667 2015-04-10 57122.233333
+zcv1952si_dkc.fits 2016-01-14 2016-02-23 57401.586111 57441.766667 2015-04-11 57123.014583
+zcv1952ti_dkc.fits 2016-01-14 2016-02-23 57401.586111 57441.766667 2015-04-12 57124.009028
+zcv19530i_dkc.fits 2016-01-14 2016-02-23 57401.586111 57441.766667 2015-04-13 57125.027083
+zcv19531i_dkc.fits 2016-01-14 2016-02-23 57401.586111 57441.766667 2015-04-14 57126.018056
+zcv19532i_dkc.fits 2016-01-14 2016-02-23 57401.586111 57441.766667 2015-04-15 57127.325
+zcv19533i_dkc.fits 2016-01-14 2016-02-23 57401.586111 57441.766667 2015-04-16 57128.059028
+zcv19534i_dkc.fits 2016-01-14 2016-02-23 57401.586111 57441.766667 2015-04-17 57129.238889
+zcv19535i_dkc.fits 2016-01-14 2016-02-23 57401.586111 57441.766667 2015-04-18 57130.124306
+zcv19536i_dkc.fits 2016-01-14 2016-02-23 57401.586806 57441.766667 2015-04-19 57131.070139
+zcv19537i_dkc.fits 2016-01-14 2016-02-23 57401.586806 57441.766667 2015-04-22 57134.832639
+zcv19538i_dkc.fits 2016-01-14 2016-02-23 57401.586806 57441.766667 2015-04-25 57137.231944
+zcv19539i_dkc.fits 2016-01-14 2016-02-23 57401.586806 57441.766667 2015-04-26 57138.222917
+zcv1953ai_dkc.fits 2016-01-14 2016-02-23 57401.586806 57441.766667 2015-04-27 57139.125
+zcv19564i_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-04-28 57140.060417
+zcv19565i_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-04-29 57141.259028
+zcv19566i_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-04-30 57142.002778
+zcv19567i_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-05-01 57143.05
+zcv19568i_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-05-02 57144.0
+zcv19569i_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-05-03 57145.047222
+zcv1956ai_dkc.fits 2016-01-14 2016-02-23 57401.679167 57441.766667 2015-05-04 57146.107639
+zcv1956bi_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-05 57147.109722
+zcv1956ci_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-06 57148.609028
+zcv1956di_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-07 57149.0
+zcv1956ei_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-08 57150.023611
+zcv1956fi_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-09 57151.111111
+zcv1956gi_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-10 57152.219444
+zcv1956hi_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-11 57153.020833
+zcv1956ii_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-12 57154.011111
+zcv1956ji_dkc.fits 2016-01-14 2016-02-23 57401.679861 57441.766667 2015-05-13 57155.00625
+zcv1956ki_dkc.fits 2016-01-14 2016-02-23 57401.680556 57441.766667 2015-05-14 57156.970139
+zcv1956li_dkc.fits 2016-01-14 2016-02-23 57401.680556 57441.766667 2015-05-16 57158.103472
+zcv1956mi_dkc.fits 2016-01-14 2016-02-23 57401.680556 57441.766667 2015-05-17 57159.024306
+zcv1956ni_dkc.fits 2016-01-14 2016-02-23 57401.680556 57441.766667 2015-05-20 57162.476389
+zcv19588i_dkc.fits 2016-01-21 2016-02-23 57408.622917 57441.766667 2015-05-22 57164.202083
+zcv19589i_dkc.fits 2016-01-21 2016-02-23 57408.623611 57441.766667 2015-05-24 57166.010417
+zcv1958ai_dkc.fits 2016-01-21 2016-02-23 57408.623611 57441.766667 2015-05-25 57167.129861
+zcv1958bi_dkc.fits 2016-01-21 2016-02-23 57408.623611 57441.766667 2015-05-25 57167.141667
+zcv1958ci_dkc.fits 2016-01-21 2016-02-23 57408.623611 57441.766667 2015-05-27 57169.19375
+zcv19440i_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-05-28 57170.299306
+zcv19441i_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-05-30 57172.019444
+zcv19443i_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-05-31 57173.013194
+zcv19442i_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-05-31 57173.338194
+zcv19444i_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-06-01 57174.283333
+zcv19445i_dkc.fits 2016-01-13 2016-02-23 57400.496528 57441.766667 2015-06-02 57175.143056
+zcv19446i_dkc.fits 2016-01-13 2016-02-23 57400.497222 57441.766667 2015-06-06 57179.043056
+zcv19447i_dkc.fits 2016-01-13 2016-02-23 57400.497222 57441.766667 2015-06-06 57179.152778
+zcv1946mi_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-06-08 57181.3
+zcv1946ni_dkc.fits 2016-01-13 2016-02-23 57400.604861 57441.766667 2015-06-09 57182.346528
+zcv1946oi_dkc.fits 2016-01-13 2016-02-23 57400.605556 57441.766667 2015-06-11 57184.069444
+zcv1946pi_dkc.fits 2016-01-13 2016-02-23 57400.605556 57441.766667 2015-06-12 57185.006944
+zcv1946qi_dkc.fits 2016-01-13 2016-02-23 57400.605556 57441.766667 2015-06-13 57186.018056
+zcv1946ri_dkc.fits 2016-01-13 2016-02-23 57400.605556 57441.766667 2015-06-14 57187.281944
+zcv1946si_dkc.fits 2016-01-13 2016-02-23 57400.605556 57441.766667 2015-06-16 57189.006944
+zcv1946ti_dkc.fits 2016-01-13 2016-02-23 57400.605556 57441.766667 2015-06-17 57190.094444
+zcv19470i_dkc.fits 2016-01-13 2016-02-23 57400.605556 57441.766667 2015-06-17 57190.269444
+zcv19471i_dkc.fits 2016-01-13 2016-02-23 57400.605556 57441.766667 2015-06-20 57193.720139
+zcv19472i_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-06-23 57196.158333
+zcv19473i_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-06-24 57197.026389
+zcv19474i_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-06-25 57198.016667
+zcv19476i_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-06-26 57199.283333
+zcv19475i_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-06-26 57199.961111
+zcv19477i_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-06-29 57202.027778
+zcv19478i_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-06-30 57203.119443
+zcv19479i_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-07-01 57204.590972
+zcv1947ai_dkc.fits 2016-01-13 2016-02-23 57400.60625 57441.766667 2015-07-02 57205.588194
+zcv1947bi_dkc.fits 2016-01-13 2016-02-23 57400.606944 57441.766667 2015-07-03 57206.066667
+zcv1947ci_dkc.fits 2016-01-13 2016-02-23 57400.606944 57441.766667 2015-07-04 57207.024306
+zcv1947di_dkc.fits 2016-01-13 2016-02-23 57400.606944 57441.766667 2015-07-05 57208.890972
+zcv1947ei_dkc.fits 2016-01-13 2016-02-23 57400.606944 57441.766667 2015-07-07 57210.08125
+zcv1947fi_dkc.fits 2016-01-13 2016-02-23 57400.606944 57441.766667 2015-07-07 57210.929861
+zcv1947gi_dkc.fits 2016-01-13 2016-02-23 57400.606944 57441.766667 2015-07-09 57212.3375
+zcv19502i_dkc.fits 2016-01-13 2016-02-23 57400.690972 57441.766667 2015-07-10 57213.056944
+zcv19503i_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-11 57214.325694
+zcv19504i_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-12 57215.064583
+zcv19505i_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-15 57218.817361
+zcv19506i_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-18 57221.097917
+zcv19507i_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-19 57222.163889
+zcv19508i_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-19 57222.569444
+zcv19509i_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-21 57224.1
+zcv1950ai_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-22 57225.113889
+zcv1950bi_dkc.fits 2016-01-13 2016-02-23 57400.691667 57441.766667 2015-07-23 57226.133333
+zcv1950ci_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-07-24 57227.0
+zcv1950di_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-07-24 57227.835417
+zcv1950ei_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-07-26 57229.265278
+zcv1950fi_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-07-27 57230.236806
+zcv1950gi_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-07-28 57231.072917
+zcv1950hi_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-07-28 57231.595139
+zcv1950ii_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-07-29 57232.659028
+zcv1950ji_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-07-30 57233.577083
+zcv1950ki_dkc.fits 2016-01-13 2016-02-23 57400.692361 57441.766667 2015-08-01 57235.033333
+zcv1950li_dkc.fits 2016-01-13 2016-02-23 57400.693056 57441.766667 2015-08-02 57236.0
+zcv1950mi_dkc.fits 2016-01-13 2016-02-23 57400.693056 57441.766667 2015-08-03 57237.6375
+zcv1950ni_dkc.fits 2016-01-13 2016-02-23 57400.693056 57441.766667 2015-08-05 57239.0
+zcv1950oi_dkc.fits 2016-01-13 2016-02-23 57400.693056 57441.766667 2015-08-06 57240.738194
+zcv1950pi_dkc.fits 2016-01-13 2016-02-23 57400.693056 57441.766667 2015-08-08 57242.029167
+zcv1950qi_dkc.fits 2016-01-13 2016-02-23 57400.693056 57441.766667 2015-08-09 57243.0
+zcv1958di_dkc.fits 2016-01-21 2016-02-23 57408.623611 57441.766667 2015-08-12 57246.166667
+zcv1953bi_dkc.fits 2016-01-14 2016-02-23 57401.586806 57441.766667 2015-08-14 57248.152083
+zcv1953ci_dkc.fits 2016-01-14 2016-02-23 57401.586806 57441.766667 2015-08-15 57249.011806
+zcv1953di_dkc.fits 2016-01-14 2016-02-23 57401.586806 57441.766667 2015-08-16 57250.052083
+zcv1953ei_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-17 57251.184722
+zcv1953fi_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-18 57252.0
+zcv1953gi_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-19 57253.241667
+zcv1953hi_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-20 57254.035417
+zcv1953ii_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-21 57255.619444
+zcv1953ji_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-22 57256.360417
+zcv1953ki_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-23 57257.424306
+zcv1953li_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-24 57258.353472
+zcv1953mi_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-25 57259.202778
+zcv1953ni_dkc.fits 2016-01-14 2016-02-23 57401.5875 57441.766667 2015-08-26 57260.127778
+zcv1953oi_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-08-27 57261.213194
+zcv1953pi_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-08-28 57262.013194
+zcv1953qi_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-08-29 57263.899306
+zcv1953ri_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-08-31 57265.026389
+zcv1953si_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-09-01 57266.050694
+zcv1953ti_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-09-02 57267.185417
+zcv19540i_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-09-03 57268.226389
+zcv19541i_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-09-04 57269.013194
+zcv19542i_dkc.fits 2016-01-14 2016-02-23 57401.588194 57441.766667 2015-09-05 57270.002778
+zcv19543i_dkc.fits 2016-01-14 2016-02-23 57401.588889 57441.766667 2015-09-08 57273.190278
+zcv19544i_dkc.fits 2016-01-14 2016-02-23 57401.588889 57441.766667 2015-09-10 57275.226389
+zcv19545i_dkc.fits 2016-01-14 2016-02-23 57401.588889 57441.766667 2015-09-11 57276.047222
+zcv1956oi_dkc.fits 2016-01-14 2016-02-23 57401.680556 57441.766667 2015-09-12 57277.013889
+zcv1956pi_dkc.fits 2016-01-14 2016-02-23 57401.680556 57441.766667 2015-09-13 57278.051389
+zcv1956qi_dkc.fits 2016-01-14 2016-02-23 57401.680556 57441.766667 2015-09-14 57279.034722
+zcv1956ri_dkc.fits 2016-01-14 2016-02-23 57401.680556 57441.766667 2015-09-14 57279.93125
+zcv1956si_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-16 57281.0
+zcv1956ti_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-17 57282.036111
+zcv19570i_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-18 57283.0
+zcv19571i_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-19 57284.070139
+zcv19572i_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-20 57285.146528
+zcv19573i_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-21 57286.40625
+zcv19574i_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-22 57287.025694
+zcv19575i_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-23 57288.735417
+zcv19576i_dkc.fits 2016-01-14 2016-02-23 57401.68125 57441.766667 2015-09-24 57289.164583
+zcv19577i_dkc.fits 2016-01-14 2016-02-23 57401.681944 57441.766667 2015-09-25 57290.033333
+zcv19578i_dkc.fits 2016-01-14 2016-02-23 57401.681944 57441.766667 2015-09-26 57291.575
+zcv19579i_dkc.fits 2016-01-14 2016-02-23 57401.681944 57441.766667 2015-09-27 57292.840972
+zcv1957ai_dkc.fits 2016-01-14 2016-02-23 57401.681944 57441.766667 2015-09-28 57293.083333
+zcv1957bi_dkc.fits 2016-01-14 2016-02-23 57401.681944 57441.766667 2015-09-29 57294.009722
+zcv1957ci_dkc.fits 2016-01-14 2016-02-23 57401.681944 57441.766667 2015-09-30 57295.202778
+zcv1957di_dkc.fits 2016-01-14 2016-02-23 57401.681944 57441.766667 2015-10-01 57296.026389
+zcv1957ei_dkc.fits 2016-01-14 2016-02-23 57401.681944 57441.766667 2015-10-02 57297.0
+01k1949hi_dkc.fits 2016-01-21 2016-02-23 57408.615278 57441.766667 2015-10-05 57300.852778
+01k1949ii_dkc.fits 2016-01-21 2016-02-23 57408.615278 57441.766667 2015-10-08 57303.1625
+01k1949ji_dkc.fits 2016-01-21 2016-02-23 57408.615278 57441.766667 2015-10-09 57304.00625
+01k1949ki_dkc.fits 2016-01-21 2016-02-23 57408.615278 57441.766667 2015-10-10 57305.138889
+01k1949li_dkc.fits 2016-01-21 2016-02-23 57408.615278 57441.766667 2015-10-11 57306.002778
+01k1949mi_dkc.fits 2016-01-21 2016-02-23 57408.615278 57441.766667 2015-10-12 57307.125694
+01k1949ni_dkc.fits 2016-01-21 2016-02-23 57408.615278 57441.766667 2015-10-13 57308.119444
+01k1949oi_dkc.fits 2016-01-21 2016-02-23 57408.615972 57441.766667 2015-10-14 57309.181944
+01k1949pi_dkc.fits 2016-01-21 2016-02-23 57408.615972 57441.766667 2015-10-15 57310.005556
+01k1949ri_dkc.fits 2016-01-21 2016-02-23 57408.615972 57441.766667 2015-10-16 57311.2625
+01k1949qi_dkc.fits 2016-01-21 2016-02-23 57408.615972 57441.766667 2015-10-16 57311.642361
+01k1949si_dkc.fits 2016-01-21 2016-02-23 57408.615972 57441.766667 2015-10-17 57312.532639
+01k1949ti_dkc.fits 2016-01-21 2016-02-23 57408.615972 57441.766667 2015-10-19 57314.288889
+01k19500i_dkc.fits 2016-01-21 2016-02-23 57408.615972 57441.766667 2015-10-20 57315.004861
+01k19501i_dkc.fits 2016-01-21 2016-02-23 57408.615972 57441.766667 2015-10-21 57316.066667
+01k19502i_dkc.fits 2016-01-21 2016-02-23 57408.616667 57441.766667 2015-10-22 57317.078472
+01k19503i_dkc.fits 2016-01-21 2016-02-23 57408.616667 57441.766667 2015-10-23 57318.068056
+01k19504i_dkc.fits 2016-01-21 2016-02-23 57408.616667 57441.766667 2015-10-24 57319.0
+01k19505i_dkc.fits 2016-01-21 2016-02-23 57408.616667 57441.766667 2015-10-25 57320.0
+01k19506i_dkc.fits 2016-01-21 2016-02-23 57408.616667 57441.766667 2015-10-26 57321.252778
+01k19507i_dkc.fits 2016-01-21 2016-02-23 57408.616667 57441.766667 2015-10-27 57322.025694
+01k19508i_dkc.fits 2016-01-21 2016-02-23 57408.616667 57441.766667 2015-10-28 57323.370833
+01k19509i_dkc.fits 2016-01-21 2016-02-23 57408.616667 57441.766667 2015-10-29 57324.074306
+01k1950ai_dkc.fits 2016-01-21 2016-02-23 57408.617361 57441.766667 2015-10-30 57325.554861
+01k1950bi_dkc.fits 2016-01-21 2016-02-23 57408.617361 57441.766667 2015-11-04 57330.020139
+01k1950ci_dkc.fits 2016-01-21 2016-02-23 57408.617361 57441.766667 2015-11-06 57332.036111
+01k1950di_dkc.fits 2016-01-21 2016-02-23 57408.617361 57441.766667 2015-11-07 57333.06875
+01k1950fi_dkc.fits 2016-01-21 2016-02-23 57408.617361 57441.766667 2015-11-08 57334.245833
+01k1950ei_dkc.fits 2016-01-21 2016-02-23 57408.617361 57441.766667 2015-11-08 57334.924306
+01k1950hi_dkc.fits 2016-01-21 2016-02-23 57408.617361 57441.766667 2015-11-10 57336.0
+01k1950gi_dkc.fits 2016-01-21 2016-02-23 57408.617361 57441.766667 2015-11-10 57336.724306
+01k1950ii_dkc.fits 2016-01-21 2016-02-23 57408.618056 57441.766667 2015-11-12 57338.052083
+01k1950ji_dkc.fits 2016-01-21 2016-02-23 57408.618056 57441.766667 2015-11-13 57339.002778
+01k1950ki_dkc.fits 2016-01-21 2016-02-23 57408.618056 57441.766667 2015-11-14 57340.880556
+01k1950li_dkc.fits 2016-01-21 2016-02-23 57408.618056 57441.766667 2015-11-16 57342.020833
+01k1950mi_dkc.fits 2016-01-21 2016-02-23 57408.618056 57441.766667 2015-11-17 57343.004167
+01k1950ni_dkc.fits 2016-01-21 2016-02-23 57408.618056 57441.766667 2015-11-18 57344.051389
+01k1950oi_dkc.fits 2016-01-21 2016-02-23 57408.618056 57441.766667 2015-11-19 57345.136111
+01k1950pi_dkc.fits 2016-01-21 2016-02-23 57408.618056 57441.766667 2015-11-20 57346.004861
+01k1950qi_dkc.fits 2016-01-21 2016-02-23 57408.61875 57441.766667 2015-11-21 57347.114583
+01k1950ri_dkc.fits 2016-01-21 2016-02-23 57408.61875 57441.766667 2015-11-22 57348.366667
+01k1950si_dkc.fits 2016-01-21 2016-02-23 57408.61875 57441.766667 2015-11-23 57349.375694
+01k1950ti_dkc.fits 2016-01-21 2016-02-23 57408.61875 57441.766667 2015-11-24 57350.550694
+01k19510i_dkc.fits 2016-01-21 2016-02-23 57408.61875 57441.766667 2015-11-25 57351.151389
+01k19511i_dkc.fits 2016-01-21 2016-02-23 57408.61875 57441.766667 2015-11-26 57352.286806
+01k19512i_dkc.fits 2016-01-21 2016-02-23 57408.61875 57441.766667 2015-11-27 57353.355556
+01k19513i_dkc.fits 2016-01-21 2016-02-23 57408.61875 57441.766667 2015-11-28 57354.0
+01k19514i_dkc.fits 2016-01-21 2016-02-23 57408.619444 57441.766667 2015-11-29 57355.002778
+01k19515i_dkc.fits 2016-01-21 2016-02-23 57408.619444 57441.766667 2015-12-02 57358.422917
+01k19516i_dkc.fits 2016-01-21 2016-02-23 57408.619444 57441.766667 2015-12-04 57360.099306
+01k19517i_dkc.fits 2016-01-21 2016-02-23 57408.619444 57441.766667 2015-12-05 57361.209028
+01k19518i_dkc.fits 2016-01-21 2016-02-23 57408.619444 57441.766667 2015-12-06 57362.224306
+01k19519i_dkc.fits 2016-01-21 2016-02-23 57408.619444 57441.766667 2015-12-07 57363.099306
+01k1951ai_dkc.fits 2016-01-21 2016-02-23 57408.619444 57441.766667 2015-12-08 57364.134722
+01k1951bi_dkc.fits 2016-01-21 2016-02-23 57408.619444 57441.766667 2015-12-10 57366.206944
+01k1951ci_dkc.fits 2016-01-21 2016-02-23 57408.620139 57441.766667 2015-12-11 57367.152778
+01k1951di_dkc.fits 2016-01-21 2016-02-23 57408.620139 57441.766667 2015-12-12 57368.400694
+01k1951ei_dkc.fits 2016-01-21 2016-02-23 57408.620139 57441.766667 2015-12-13 57369.095833
+01k1951fi_dkc.fits 2016-01-21 2016-02-23 57408.620139 57441.766667 2015-12-14 57370.110417
+01k1951gi_dkc.fits 2016-01-21 2016-02-23 57408.620139 57441.766667 2015-12-15 57371.181944
+01k1951hi_dkc.fits 2016-01-21 2016-02-23 57408.620139 57441.766667 2015-12-17 57373.006944
+01k1951ii_dkc.fits 2016-01-21 2016-02-23 57408.620139 57441.766667 2015-12-18 57374.194444
+01k1951ji_dkc.fits 2016-01-21 2016-02-23 57408.620833 57441.766667 2015-12-19 57375.875
+01k1951ki_dkc.fits 2016-01-21 2016-02-23 57408.620833 57441.766667 2015-12-20 57376.16875
+01k1951li_dkc.fits 2016-01-21 2016-02-23 57408.620833 57441.766667 2015-12-21 57377.683333
+01k1951mi_dkc.fits 2016-01-21 2016-02-23 57408.620833 57441.766667 2015-12-23 57379.002778
+01k1951ni_dkc.fits 2016-01-21 2016-02-23 57408.620833 57441.766667 2015-12-24 57380.00625
+01k1951oi_dkc.fits 2016-01-21 2016-02-23 57408.620833 57441.766667 2015-12-25 57381.223611
+01k1951qi_dkc.fits 2016-01-21 2016-02-23 57408.620833 57441.766667 2015-12-27 57383.011111
+01k1951pi_dkc.fits 2016-01-21 2016-02-23 57408.620833 57441.766667 2015-12-27 57383.615278
+0382041mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2015-12-30 57386.302778
+0ar21457i_dkc.fits 2016-10-28 2016-11-01 57689.579167 57693.4875 2015-12-30 57386.302778
+0ar21459i_dkc.fits 2016-10-28 2016-11-01 57689.551389 57693.4875 2016-01-01 57388.120139
+0382041oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-01 57388.120139
+0ar2145bi_dkc.fits 2016-10-28 2016-11-01 57689.654167 57693.4875 2016-01-02 57389.644444
+0382041qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-02 57389.644444
+0ar2145di_dkc.fits 2016-10-28 2016-11-01 57689.649306 57693.4875 2016-01-03 57390.065278
+0382041si_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-03 57390.065278
+0ar2145fi_dkc.fits 2016-10-28 2016-11-01 57689.624306 57693.4875 2016-01-04 57391.071528
+03820420i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-04 57391.071528
+0ar2145hi_dkc.fits 2016-10-28 2016-11-01 57689.559722 57693.4875 2016-01-05 57392.096528
+03820422i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-05 57392.096528
+0ar2145ji_dkc.fits 2016-10-28 2016-11-01 57689.6125 57693.4875 2016-01-06 57393.630556
+03820424i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-06 57393.630556
+0ar2145li_dkc.fits 2016-10-28 2016-11-01 57689.6 57693.4875 2016-01-07 57394.011806
+03820426i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-07 57394.011806
+0ar2145ni_dkc.fits 2016-10-28 2016-11-01 57689.544444 57693.4875 2016-01-08 57395.015278
+03820428i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-08 57395.015278
+0ar2145pi_dkc.fits 2016-10-28 2016-11-01 57689.620139 57693.4875 2016-01-09 57396.088194
+0382042ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-09 57396.088194
+0382042ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-10 57397.476389
+0ar2145ri_dkc.fits 2016-10-28 2016-11-01 57689.588194 57693.4875 2016-01-10 57397.476389
+0382042ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-11 57398.519444
+0ar2145ti_dkc.fits 2016-10-28 2016-11-01 57689.652778 57693.4875 2016-01-11 57398.519444
+0382042gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-12 57399.067361
+0ar21461i_dkc.fits 2016-10-28 2016-11-01 57689.593056 57693.4875 2016-01-12 57399.067361
+0ar21463i_dkc.fits 2016-10-28 2016-11-01 57689.660417 57693.4875 2016-01-13 57400.08125
+0382042ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-13 57400.08125
+0ar21465i_dkc.fits 2016-10-28 2016-11-01 57689.624306 57693.4875 2016-01-14 57401.107639
+0382042ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-14 57401.107639
+0382042mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-15 57402.0
+0ar21467i_dkc.fits 2016-10-28 2016-11-01 57689.577778 57693.4875 2016-01-15 57402.0
+0ar21469i_dkc.fits 2016-10-28 2016-11-01 57689.5625 57693.4875 2016-01-16 57403.117361
+0382042oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-16 57403.117361
+0382042qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-17 57404.024306
+0ar2146bi_dkc.fits 2016-10-28 2016-11-01 57689.660417 57693.4875 2016-01-17 57404.024306
+0ar2146di_dkc.fits 2016-10-28 2016-11-01 57689.608333 57693.4875 2016-01-18 57405.285417
+0382042si_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-18 57405.285417
+0ar2146fi_dkc.fits 2016-10-28 2016-11-01 57689.615278 57693.4875 2016-01-19 57406.017361
+03820430i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-19 57406.017361
+03820432i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-20 57407.03125
+0ar2146hi_dkc.fits 2016-10-28 2016-11-01 57689.604167 57693.4875 2016-01-20 57407.03125
+0ar2146ji_dkc.fits 2016-10-28 2016-11-01 57689.600694 57693.4875 2016-01-21 57408.060417
+03820434i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-21 57408.060417
+03820436i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-22 57409.1625
+0ar2146li_dkc.fits 2016-10-28 2016-11-01 57689.656944 57693.4875 2016-01-22 57409.1625
+0ar2146ni_dkc.fits 2016-10-28 2016-11-01 57689.620833 57693.4875 2016-01-25 57412.727778
+04f1409ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-25 57412.727778
+04f1409si_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-28 57415.084028
+0ar2146pi_dkc.fits 2016-10-28 2016-11-01 57689.609028 57693.4875 2016-01-28 57415.084028
+04f1409ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-29 57416.09375
+0ar2146ri_dkc.fits 2016-10-28 2016-11-01 57689.561806 57693.4875 2016-01-29 57416.09375
+04f14100i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-30 57417.0
+0ar2146ti_dkc.fits 2016-10-28 2016-11-01 57689.611806 57693.4875 2016-01-30 57417.0
+0ar21471i_dkc.fits 2016-10-28 2016-11-01 57689.590972 57693.4875 2016-01-31 57418.397917
+04f14101i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-01-31 57418.397917
+0ar21473i_dkc.fits 2016-10-28 2016-11-01 57689.6375 57693.4875 2016-02-01 57419.023611
+04f14102i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-01 57419.023611
+0ar21475i_dkc.fits 2016-10-28 2016-11-01 57689.544444 57693.4875 2016-02-02 57420.140972
+04f14103i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-02 57420.140972
+04f14104i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-03 57421.160417
+0ar21477i_dkc.fits 2016-10-28 2016-11-01 57689.640278 57693.4875 2016-02-03 57421.160417
+0ar21479i_dkc.fits 2016-10-28 2016-11-01 57689.543056 57693.4875 2016-02-04 57422.085417
+04f14105i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-04 57422.085417
+0ar2147bi_dkc.fits 2016-10-28 2016-11-01 57689.583333 57693.4875 2016-02-05 57423.002778
+04f14106i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-05 57423.002778
+04f14107i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-06 57424.167361
+0ar2147di_dkc.fits 2016-10-28 2016-11-01 57689.633333 57693.4875 2016-02-06 57424.167361
+0ar2147fi_dkc.fits 2016-10-28 2016-11-01 57689.563194 57693.4875 2016-02-06 57424.530556
+04f14108i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-06 57424.530556
+0ar2147hi_dkc.fits 2016-10-28 2016-11-01 57689.594444 57693.4875 2016-02-08 57426.020833
+04f14109i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-08 57426.020833
+04f1410bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-09 57427.370833
+0ar2147li_dkc.fits 2016-10-28 2016-11-01 57689.632639 57693.4875 2016-02-09 57427.370833
+04f1410ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-09 57427.895833
+0ar2147ji_dkc.fits 2016-10-28 2016-11-01 57689.659722 57693.4875 2016-02-09 57427.895833
+0ar2147ni_dkc.fits 2016-10-28 2016-11-01 57689.618056 57693.4875 2016-02-11 57429.296528
+04f1410ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-11 57429.296528
+0ar2147pi_dkc.fits 2016-10-28 2016-11-01 57689.571528 57693.4875 2016-02-12 57430.094444
+04f1410di_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-12 57430.094444
+0ar2147ri_dkc.fits 2016-10-28 2016-11-01 57689.621528 57693.4875 2016-02-13 57431.555556
+04f1410ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-13 57431.555556
+0ar2147ti_dkc.fits 2016-10-28 2016-11-01 57689.607639 57693.4875 2016-02-15 57433.020833
+04f1410fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-15 57433.020833
+0ar21481i_dkc.fits 2016-10-28 2016-11-01 57689.635417 57693.4875 2016-02-16 57434.00625
+04f1410gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-16 57434.00625
+04f1410hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-17 57435.002778
+0ar21483i_dkc.fits 2016-10-28 2016-11-01 57689.626389 57693.4875 2016-02-17 57435.002778
+04f1410ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-18 57436.029861
+0ar21485i_dkc.fits 2016-10-28 2016-11-01 57689.581944 57693.4875 2016-02-18 57436.029861
+04f1410ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-18 57436.45
+0ar21487i_dkc.fits 2016-10-28 2016-11-01 57689.629861 57693.4875 2016-02-18 57436.45
+04f1410ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-22 57440.506944
+0ar21489i_dkc.fits 2016-10-28 2016-11-01 57689.636806 57693.4875 2016-02-22 57440.506944
+04f1410li_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-24 57442.340278
+0ar2148bi_dkc.fits 2016-10-28 2016-11-01 57689.58125 57693.4875 2016-02-24 57442.340278
+04f1410mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-25 57443.268056
+0ar2148di_dkc.fits 2016-10-28 2016-11-01 57689.597917 57693.4875 2016-02-25 57443.268056
+04f1410ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-26 57444.326389
+0ar2148fi_dkc.fits 2016-10-28 2016-11-01 57689.546528 57693.4875 2016-02-26 57444.326389
+04f1410oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-28 57446.120139
+0ar2148hi_dkc.fits 2016-10-28 2016-11-01 57689.550694 57693.4875 2016-02-28 57446.120139
+0ar2148ji_dkc.fits 2016-10-28 2016-11-01 57689.554167 57693.4875 2016-02-28 57446.380556
+04f1410pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-28 57446.380556
+04f1410qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-02-29 57447.41875
+0ar2148li_dkc.fits 2016-10-28 2016-11-01 57689.59375 57693.4875 2016-02-29 57447.41875
+0ar2148ni_dkc.fits 2016-10-28 2016-11-01 57689.64375 57693.4875 2016-03-02 57449.291667
+04f1410ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-02 57449.291667
+0ar2148pi_dkc.fits 2016-10-28 2016-11-01 57689.571528 57693.4875 2016-03-04 57451.313194
+04f1410si_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-04 57451.313194
+0ar2148ri_dkc.fits 2016-10-28 2016-11-01 57689.586111 57693.4875 2016-03-06 57453.0
+04f1410ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-06 57453.0
+04f14110i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-06 57453.672222
+0ar2148ti_dkc.fits 2016-10-28 2016-11-01 57689.556944 57693.4875 2016-03-06 57453.672222
+04f14111i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-07 57454.215972
+0ar21491i_dkc.fits 2016-10-28 2016-11-01 57689.548611 57693.4875 2016-03-07 57454.215972
+04f14112i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-09 57456.056944
+0ar21493i_dkc.fits 2016-10-28 2016-11-01 57689.63125 57693.4875 2016-03-09 57456.056944
+0ar21495i_dkc.fits 2016-10-28 2016-11-01 57689.638194 57693.4875 2016-03-09 57456.208333
+04f14113i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-09 57456.208333
+0ar21497i_dkc.fits 2016-10-28 2016-11-01 57689.638889 57693.4875 2016-03-10 57457.268056
+04f14114i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-10 57457.268056
+04f14115i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-12 57459.1125
+0ar21499i_dkc.fits 2016-10-28 2016-11-01 57689.588194 57693.4875 2016-03-12 57459.1125
+04f14116i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-13 57460.052083
+0ar2149bi_dkc.fits 2016-10-28 2016-11-01 57689.566667 57693.4875 2016-03-13 57460.052083
+04f14117i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-14 57461.027083
+0ar2149di_dkc.fits 2016-10-28 2016-11-01 57689.650694 57693.4875 2016-03-14 57461.027083
+04f14118i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-15 57462.063889
+0ar2149fi_dkc.fits 2016-10-28 2016-11-01 57689.647222 57693.4875 2016-03-15 57462.063889
+0ar2149hi_dkc.fits 2016-10-28 2016-11-01 57689.585417 57693.4875 2016-03-16 57463.0
+04f14119i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-16 57463.0
+04f1411bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-17 57464.077778
+0ar2149li_dkc.fits 2016-10-28 2016-11-01 57689.625 57693.4875 2016-03-17 57464.077778
+0ar2149ji_dkc.fits 2016-10-28 2016-11-01 57689.552778 57693.4875 2016-03-17 57464.407639
+04f1411ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-17 57464.407639
+04f1411ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-19 57466.191667
+0ar2149ni_dkc.fits 2016-10-28 2016-11-01 57689.619444 57693.4875 2016-03-19 57466.191667
+04f1411di_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-20 57467.252778
+0ar2149pi_dkc.fits 2016-10-28 2016-11-01 57689.647222 57693.4875 2016-03-20 57467.252778
+04f1411ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-21 57468.357639
+0ar2149ri_dkc.fits 2016-10-28 2016-11-01 57689.570139 57693.4875 2016-03-21 57468.357639
+0ar2149ti_dkc.fits 2016-10-28 2016-11-01 57689.577778 57693.4875 2016-03-24 57471.467361
+04f1411fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-24 57471.467361
+0ar21501i_dkc.fits 2016-10-28 2016-11-01 57689.555556 57693.4875 2016-03-26 57473.429167
+04f1411gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-26 57473.429167
+04f1411hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-28 57475.020833
+0ar21503i_dkc.fits 2016-10-28 2016-11-01 57689.580556 57693.4875 2016-03-28 57475.020833
+04f1411ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-29 57476.026389
+0ar21505i_dkc.fits 2016-10-28 2016-11-01 57689.546528 57693.4875 2016-03-29 57476.026389
+0ar21507i_dkc.fits 2016-10-28 2016-11-01 57689.553472 57693.4875 2016-03-29 57476.214583
+04f1411ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-29 57476.214583
+0ar21509i_dkc.fits 2016-10-28 2016-11-01 57689.644444 57693.4875 2016-03-30 57477.79375
+04f1411ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-03-30 57477.79375
+0ar2150bi_dkc.fits 2016-10-28 2016-11-01 57689.575694 57693.4875 2016-04-01 57479.00625
+04f1411li_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-01 57479.00625
+04f1411mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-02 57480.002778
+0ar2150di_dkc.fits 2016-10-28 2016-11-01 57689.634028 57693.4875 2016-04-02 57480.002778
+0ar2150fi_dkc.fits 2016-10-28 2016-11-01 57689.55 57693.4875 2016-04-03 57481.104167
+04j1837fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-03 57481.104167
+04j1837hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-03 57481.163194
+0ar2150hi_dkc.fits 2016-10-28 2016-11-01 57689.55625 57693.4875 2016-04-03 57481.163194
+04j1837ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-05 57483.040972
+0ar2150ji_dkc.fits 2016-10-28 2016-11-01 57689.606944 57693.4875 2016-04-05 57483.040972
+0c11534fi_dkc.fits 2016-12-01 2016-12-01 57723.463194 57723.497222 2016-04-05 57483.150694
+04j1837li_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-05 57483.150694
+0c11534hi_dkc.fits 2016-12-01 2016-12-01 57723.461806 57723.497222 2016-04-06 57484.145833
+04j1837ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-06 57484.145833
+0c11534ji_dkc.fits 2016-12-01 2016-12-01 57723.466667 57723.497222 2016-04-07 57485.175
+04j1837qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-07 57485.175
+0c11534li_dkc.fits 2016-12-01 2016-12-01 57723.471528 57723.497222 2016-04-09 57487.027083
+04j1837si_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-09 57487.027083
+0ar2150li_dkc.fits 2016-10-28 2016-11-01 57689.652083 57693.4875 2016-04-10 57488.070139
+04j18380i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-10 57488.070139
+0ar2150ni_dkc.fits 2016-10-28 2016-11-01 57689.580556 57693.4875 2016-04-11 57489.913194
+04t13065i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-11 57489.913194
+04t13067i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-12 57490.175694
+0ar2150pi_dkc.fits 2016-10-28 2016-11-01 57689.654167 57693.4875 2016-04-12 57490.175694
+04t13069i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-13 57491.24375
+0ar2150ri_dkc.fits 2016-10-28 2016-11-01 57689.642361 57693.4875 2016-04-13 57491.24375
+04t1306bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-15 57493.821528
+0ar2150ti_dkc.fits 2016-10-28 2016-11-01 57689.628472 57693.4875 2016-04-15 57493.821528
+0ar21511i_dkc.fits 2016-10-28 2016-11-01 57689.645833 57693.4875 2016-04-16 57494.247917
+04t1306di_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-16 57494.247917
+05920445i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-19 57497.966667
+0ar21513i_dkc.fits 2016-10-28 2016-11-01 57689.623611 57693.4875 2016-04-19 57497.966667
+05920447i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-21 57499.670833
+0ar21515i_dkc.fits 2016-10-28 2016-11-01 57689.558333 57693.4875 2016-04-21 57499.670833
+05920449i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-23 57501.236111
+0ar21517i_dkc.fits 2016-10-28 2016-11-01 57689.54375 57693.4875 2016-04-23 57501.236111
+0592044bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-24 57502.195139
+0ar21519i_dkc.fits 2016-10-28 2016-11-01 57689.573611 57693.4875 2016-04-24 57502.195139
+0592044di_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-25 57503.363889
+0ar2151bi_dkc.fits 2016-10-28 2016-11-01 57689.559028 57693.4875 2016-04-25 57503.363889
+0592044fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-26 57504.35625
+0ar2151di_dkc.fits 2016-10-28 2016-11-01 57689.575694 57693.4875 2016-04-26 57504.35625
+0ar2151fi_dkc.fits 2016-10-28 2016-11-01 57689.565972 57693.4875 2016-04-27 57505.317361
+0592044hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-27 57505.317361
+0ar2151hi_dkc.fits 2016-10-28 2016-11-01 57689.613889 57693.4875 2016-04-28 57506.313889
+0592044ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-28 57506.313889
+0592044li_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-29 57507.125
+0ar2151ji_dkc.fits 2016-10-28 2016-11-01 57689.560417 57693.4875 2016-04-29 57507.125
+0ar2151li_dkc.fits 2016-10-28 2016-11-01 57689.564583 57693.4875 2016-04-30 57508.088194
+0592044ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-04-30 57508.088194
+05o1257gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-01 57509.073611
+0ar2151ni_dkc.fits 2016-10-28 2016-11-01 57689.560417 57693.4875 2016-05-01 57509.073611
+05o1257ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-02 57510.061806
+0ar2151pi_dkc.fits 2016-10-28 2016-11-01 57689.589583 57693.4875 2016-05-02 57510.061806
+05o1257ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-03 57511.0
+0ar2151ri_dkc.fits 2016-10-28 2016-11-01 57689.641667 57693.4875 2016-05-03 57511.0
+05o1257mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-04 57512.022917
+0ar2151ti_dkc.fits 2016-10-28 2016-11-01 57689.585417 57693.4875 2016-05-04 57512.022917
+05o1257pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-05 57513.014583
+0ar21521i_dkc.fits 2016-10-28 2016-11-01 57689.630556 57693.4875 2016-05-05 57513.014583
+0ar21523i_dkc.fits 2016-10-28 2016-11-01 57689.584028 57693.4875 2016-05-06 57514.006944
+05o1257ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-06 57514.006944
+0ar21525i_dkc.fits 2016-10-28 2016-11-01 57689.604167 57693.4875 2016-05-07 57515.824306
+05o1257ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-07 57515.824306
+05o12581i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-09 57517.251389
+0ar21527i_dkc.fits 2016-10-28 2016-11-01 57689.568056 57693.4875 2016-05-09 57517.251389
+05o12583i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-10 57518.629861
+0ar21529i_dkc.fits 2016-10-28 2016-11-01 57689.659028 57693.4875 2016-05-10 57518.629861
+0ar2152bi_dkc.fits 2016-10-28 2016-11-01 57689.545833 57693.4875 2016-05-10 57518.641667
+05o12585i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-10 57518.641667
+0ar2152di_dkc.fits 2016-10-28 2016-11-01 57689.613194 57693.4875 2016-05-12 57520.064583
+05o12587i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-12 57520.064583
+05o12589i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-13 57521.163889
+0ar2152fi_dkc.fits 2016-10-28 2016-11-01 57689.596528 57693.4875 2016-05-13 57521.163889
+0ar2152hi_dkc.fits 2016-10-28 2016-11-01 57689.565278 57693.4875 2016-05-14 57522.00625
+05o1258bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-14 57522.00625
+0621449qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-15 57523.127083
+0ar2152ji_dkc.fits 2016-10-28 2016-11-01 57689.632639 57693.4875 2016-05-15 57523.127083
+0ar2152li_dkc.fits 2016-10-28 2016-11-01 57689.591667 57693.4875 2016-05-16 57524.063194
+0621449si_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-16 57524.063194
+06214500i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-17 57525.0
+0ar2152ni_dkc.fits 2016-10-28 2016-11-01 57689.610417 57693.4875 2016-05-17 57525.0
+06214502i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-18 57526.710417
+0ar2152pi_dkc.fits 2016-10-28 2016-11-01 57689.643056 57693.4875 2016-05-18 57526.710417
+0ar2152ri_dkc.fits 2016-10-28 2016-11-01 57689.622917 57693.4875 2016-05-21 57529.499306
+06214504i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-21 57529.499306
+0ar2152ti_dkc.fits 2016-10-28 2016-11-01 57689.589583 57693.4875 2016-05-23 57531.353472
+06214506i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-23 57531.353472
+0ar21531i_dkc.fits 2016-10-28 2016-11-01 57689.572917 57693.4875 2016-05-25 57533.00625
+06214508i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-25 57533.00625
+0ar21533i_dkc.fits 2016-10-28 2016-11-01 57689.575 57693.4875 2016-05-26 57534.196528
+0621450ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-26 57534.196528
+0ar21535i_dkc.fits 2016-10-28 2016-11-01 57689.567361 57693.4875 2016-05-26 57534.241667
+0621450ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-26 57534.241667
+0ar21539i_dkc.fits 2016-10-28 2016-11-01 57689.590278 57693.4875 2016-05-28 57536.019444
+0621450ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-28 57536.019444
+0ar21537i_dkc.fits 2016-10-28 2016-11-01 57689.556944 57693.4875 2016-05-28 57536.503472
+0ar2153bi_dkc.fits 2016-10-28 2016-11-01 57689.557639 57693.4875 2016-05-29 57537.495833
+06d15383i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-29 57537.495833
+0ar2153ei_dkc.fits 2016-10-28 2016-11-01 57689.658333 57693.4875 2016-05-30 57538.2375
+06d15385i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-30 57538.2375
+06d15387i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-05-31 57539.484722
+0ar2153gi_dkc.fits 2016-10-28 2016-11-01 57689.59375 57693.4875 2016-05-31 57539.484722
+06d15389i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-02 57541.021528
+0ar2153ii_dkc.fits 2016-10-28 2016-11-01 57689.549306 57693.4875 2016-06-02 57541.021528
+0ar2153ki_dkc.fits 2016-10-28 2016-11-01 57689.595833 57693.4875 2016-06-02 57541.463194
+06d1538bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-02 57541.463194
+06d1538di_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-04 57543.180556
+0ar2153oi_dkc.fits 2016-10-28 2016-11-01 57689.563889 57693.4875 2016-06-04 57543.180556
+0781813fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-04 57543.350694
+0ar2153mi_dkc.fits 2016-10-28 2016-11-01 57689.629861 57693.4875 2016-06-04 57543.350694
+06h1803ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-05 57544.2125
+0ar2153qi_dkc.fits 2016-10-28 2016-11-01 57689.643056 57693.4875 2016-06-05 57544.2125
+06h1803li_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-06 57545.33125
+0ar2153si_dkc.fits 2016-10-28 2016-11-01 57689.561806 57693.4875 2016-06-06 57545.33125
+0ar21540i_dkc.fits 2016-10-28 2016-11-01 57689.615972 57693.4875 2016-06-08 57547.318056
+06h1803ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-08 57547.318056
+06h1803ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-10 57549.138194
+0ar21544i_dkc.fits 2016-10-28 2016-11-01 57689.550694 57693.4875 2016-06-10 57549.138194
+0ar21542i_dkc.fits 2016-10-28 2016-11-01 57689.631944 57693.4875 2016-06-10 57549.20625
+06h1803pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-10 57549.20625
+0ar21546i_dkc.fits 2016-10-28 2016-11-01 57689.570833 57693.4875 2016-06-12 57551.279167
+06h1803ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-12 57551.279167
+06n19333i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-15 57554.666667
+0ar21548i_dkc.fits 2016-10-28 2016-11-01 57689.598611 57693.4875 2016-06-15 57554.666667
+0ar2154ai_dkc.fits 2016-10-28 2016-11-01 57689.622222 57693.4875 2016-06-18 57557.019444
+06n19335i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-18 57557.019444
+0781813gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-19 57558.00625
+0ar2154ci_dkc.fits 2016-10-28 2016-11-01 57689.555556 57693.4875 2016-06-19 57558.00625
+0ar2154ei_dkc.fits 2016-10-28 2016-11-01 57689.578472 57693.4875 2016-06-20 57559.043056
+0781813ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-20 57559.043056
+0781813ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-21 57560.056944
+0ar2154gi_dkc.fits 2016-10-28 2016-11-01 57689.584722 57693.4875 2016-06-21 57560.056944
+0ar2154ii_dkc.fits 2016-10-28 2016-11-01 57689.627083 57693.4875 2016-06-22 57561.18125
+0781813mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-22 57561.18125
+0ar2154ki_dkc.fits 2016-10-28 2016-11-01 57689.576389 57693.4875 2016-06-23 57562.117361
+0781813oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-23 57562.117361
+0ar2154mi_dkc.fits 2016-10-28 2016-11-01 57689.634722 57693.4875 2016-06-24 57563.575
+0781813qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-24 57563.575
+0ar2154oi_dkc.fits 2016-10-28 2016-11-01 57689.611806 57693.4875 2016-06-25 57564.581944
+07i1834fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-25 57564.581944
+07i1834hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-26 57565.74375
+0ar2154qi_dkc.fits 2016-10-28 2016-11-01 57689.581944 57693.4875 2016-06-26 57565.74375
+07i1834ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-28 57567.0
+0ar2154si_dkc.fits 2016-10-28 2016-11-01 57689.645139 57693.4875 2016-06-28 57567.0
+0ar21550i_dkc.fits 2016-10-28 2016-11-01 57689.648611 57693.4875 2016-06-29 57568.002778
+07i1834li_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-29 57568.002778
+0ar21552i_dkc.fits 2016-10-28 2016-11-01 57689.552083 57693.4875 2016-06-30 57569.086111
+07i1834ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-06-30 57569.086111
+0ar21554i_dkc.fits 2016-10-28 2016-11-01 57689.616667 57693.4875 2016-07-01 57570.214583
+07i1834pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-01 57570.214583
+07i1834ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-02 57571.017361
+0ar21556i_dkc.fits 2016-10-28 2016-11-01 57689.625694 57693.4875 2016-07-02 57571.017361
+0ar21558i_dkc.fits 2016-10-28 2016-11-01 57689.579861 57693.4875 2016-07-03 57572.077083
+07i1834ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-03 57572.077083
+07i18351i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-04 57573.020833
+0ar2155ai_dkc.fits 2016-10-28 2016-11-01 57689.627778 57693.4875 2016-07-04 57573.020833
+07i18353i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-05 57574.061806
+0ar2155ci_dkc.fits 2016-10-28 2016-11-01 57689.601389 57693.4875 2016-07-05 57574.061806
+07i18355i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-06 57575.027083
+0ar2155ei_dkc.fits 2016-10-28 2016-11-01 57689.56875 57693.4875 2016-07-06 57575.027083
+07i18357i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-07 57576.050694
+0ar2155gi_dkc.fits 2016-10-28 2016-11-01 57689.650694 57693.4875 2016-07-07 57576.050694
+0c11534ni_dkc.fits 2016-12-01 2016-12-01 57723.463889 57723.497222 2016-07-08 57577.03125
+07i18359i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-08 57577.03125
+0c11534pi_dkc.fits 2016-12-01 2016-12-01 57723.471528 57723.497222 2016-07-09 57578.167361
+07i1835bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-09 57578.167361
+07i1835ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-09 57578.377083
+0c11534ri_dkc.fits 2016-12-01 2016-12-01 57723.46875 57723.497222 2016-07-09 57578.377083
+07t1644ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-13 57582.196528
+0ar2155ii_dkc.fits 2016-10-28 2016-11-01 57689.655556 57693.4875 2016-07-13 57582.196528
+07t1644li_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-15 57584.152778
+0ar2155ki_dkc.fits 2016-10-28 2016-11-01 57689.614583 57693.4875 2016-07-15 57584.152778
+07t1644ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-16 57585.067361
+0ar2155mi_dkc.fits 2016-10-28 2016-11-01 57689.579167 57693.4875 2016-07-16 57585.067361
+07t1644pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-17 57586.082639
+0ar2155oi_dkc.fits 2016-10-28 2016-11-01 57689.5875 57693.4875 2016-07-17 57586.082639
+0ar2155qi_dkc.fits 2016-10-28 2016-11-01 57689.603472 57693.4875 2016-07-18 57587.135417
+07t1644ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-18 57587.135417
+07t16450i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-19 57588.129167
+0ar2155si_dkc.fits 2016-10-28 2016-11-01 57689.586806 57693.4875 2016-07-19 57588.129167
+0ar21560i_dkc.fits 2016-10-28 2016-11-01 57689.620833 57693.4875 2016-07-20 57589.036111
+07t16452i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-20 57589.036111
+07t16454i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-21 57590.155556
+0ar21562i_dkc.fits 2016-10-28 2016-11-01 57689.627083 57693.4875 2016-07-21 57590.155556
+0ar21564i_dkc.fits 2016-10-28 2016-11-01 57689.569444 57693.4875 2016-07-22 57591.108333
+0841759gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-22 57591.108333
+0841759ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-23 57592.283333
+0ar21566i_dkc.fits 2016-10-28 2016-11-01 57689.577083 57693.4875 2016-07-23 57592.283333
+0841759ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-24 57593.203472
+0ar21568i_dkc.fits 2016-10-28 2016-11-01 57689.542361 57693.4875 2016-07-24 57593.203472
+0ar2156ai_dkc.fits 2016-10-28 2016-11-01 57689.60625 57693.4875 2016-07-25 57594.020833
+0841759mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-25 57594.020833
+0ar2156ci_dkc.fits 2016-10-28 2016-11-01 57689.656944 57693.4875 2016-07-26 57595.01875
+0841759oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-26 57595.01875
+0841759qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-27 57596.345139
+0ar2156ei_dkc.fits 2016-10-28 2016-11-01 57689.640278 57693.4875 2016-07-27 57596.345139
+0841759si_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-07-28 57597.336806
+0ar2156gi_dkc.fits 2016-10-28 2016-11-01 57689.547222 57693.4875 2016-07-28 57597.336806
+0ar2156ii_dkc.fits 2016-10-28 2016-11-01 57689.564583 57693.4875 2016-07-29 57598.122917
+0ar2156ki_dkc.fits 2016-10-28 2016-11-01 57689.652083 57693.4875 2016-07-30 57599.226389
+0ar2156mi_dkc.fits 2016-10-28 2016-11-01 57689.613194 57693.4875 2016-07-31 57600.098611
+0ar2156oi_dkc.fits 2016-10-28 2016-11-01 57689.609028 57693.4875 2016-08-01 57601.145833
+0ar2156qi_dkc.fits 2016-10-28 2016-11-01 57689.638194 57693.4875 2016-08-02 57602.138194
+0ar2156si_dkc.fits 2016-10-28 2016-11-01 57689.617361 57693.4875 2016-08-03 57603.130556
+0ar21570i_dkc.fits 2016-10-28 2016-11-01 57689.552083 57693.4875 2016-08-04 57604.101389
+0ar21572i_dkc.fits 2016-10-28 2016-11-01 57689.614583 57693.4875 2016-08-05 57605.158333
+0ar21574i_dkc.fits 2016-10-28 2016-11-01 57689.588889 57693.4875 2016-08-06 57606.0
+0ar21576i_dkc.fits 2016-10-28 2016-11-01 57689.610417 57693.4875 2016-08-07 57607.034028
+0ar21578i_dkc.fits 2016-10-28 2016-11-01 57689.655556 57693.4875 2016-08-08 57608.138194
+0ar2157ai_dkc.fits 2016-10-28 2016-11-01 57689.559028 57693.4875 2016-08-09 57609.336111
+0ar2157ci_dkc.fits 2016-10-28 2016-11-01 57689.609722 57693.4875 2016-08-12 57612.136111
+0ar2157ei_dkc.fits 2016-10-28 2016-11-01 57689.595139 57693.4875 2016-08-14 57614.00625
+0ar2157gi_dkc.fits 2016-10-28 2016-11-01 57689.573611 57693.4875 2016-08-15 57615.039583
+0ar2157ii_dkc.fits 2016-10-28 2016-11-01 57689.65 57693.4875 2016-08-16 57616.759028
+0ar2157ki_dkc.fits 2016-10-28 2016-11-01 57689.654861 57693.4875 2016-08-16 57616.826389
+0ar2157mi_dkc.fits 2016-10-28 2016-11-01 57689.582639 57693.4875 2016-08-18 57618.0
+0ar2157oi_dkc.fits 2016-10-28 2016-11-01 57689.657639 57693.4875 2016-08-19 57619.008333
+0ar2157qi_dkc.fits 2016-10-28 2016-11-01 57689.547917 57693.4875 2016-08-20 57620.013194
+0ar2157si_dkc.fits 2016-10-28 2016-11-01 57689.636806 57693.4875 2016-08-21 57621.309028
+0ar21580i_dkc.fits 2016-10-28 2016-11-01 57689.65625 57693.4875 2016-08-22 57622.020833
+0ar21582i_dkc.fits 2016-10-28 2016-11-01 57689.604861 57693.4875 2016-08-23 57623.123611
+0ar21584i_dkc.fits 2016-10-28 2016-11-01 57689.635417 57693.4875 2016-08-24 57624.041667
+0ar21586i_dkc.fits 2016-10-28 2016-11-01 57689.566667 57693.4875 2016-08-25 57625.0
+0ar21588i_dkc.fits 2016-10-28 2016-11-01 57689.629167 57693.4875 2016-08-26 57626.0875
+0ar2158ai_dkc.fits 2016-10-28 2016-11-01 57689.602083 57693.4875 2016-08-27 57627.09375
+0ar2158ci_dkc.fits 2016-10-28 2016-11-01 57689.605556 57693.4875 2016-08-28 57628.0
+0ar2158ei_dkc.fits 2016-10-28 2016-11-01 57689.554861 57693.4875 2016-08-29 57629.040972
+0ar2158gi_dkc.fits 2016-10-28 2016-11-01 57689.55 57693.4875 2016-08-30 57630.0
+0ar2158ii_dkc.fits 2016-10-28 2016-11-01 57689.658333 57693.4875 2016-08-31 57631.261111
+0ar2158ki_dkc.fits 2016-10-28 2016-11-01 57689.543056 57693.4875 2016-09-01 57632.551389
+0ar2158mi_dkc.fits 2016-10-28 2016-11-01 57689.563194 57693.4875 2016-09-02 57633.016667
+0ar2158oi_dkc.fits 2016-10-28 2016-11-01 57689.599306 57693.4875 2016-09-03 57634.035417
+0ar2158qi_dkc.fits 2016-10-28 2016-11-01 57689.61875 57693.4875 2016-09-04 57635.038194
+0ar2158si_dkc.fits 2016-10-28 2016-11-01 57689.561111 57693.4875 2016-09-07 57638.086806
+0ar21590i_dkc.fits 2016-10-28 2016-11-01 57689.586111 57693.4875 2016-09-09 57640.313194
+0ar21592i_dkc.fits 2016-10-28 2016-11-01 57689.648611 57693.4875 2016-09-10 57641.979167
+0ar21594i_dkc.fits 2016-10-28 2016-11-01 57689.553472 57693.4875 2016-09-12 57643.023611
+0ar21596i_dkc.fits 2016-10-28 2016-11-01 57689.574306 57693.4875 2016-09-13 57644.020139
+0ar21598i_dkc.fits 2016-10-28 2016-11-01 57689.547917 57693.4875 2016-09-14 57645.209028
+0ar2159ai_dkc.fits 2016-10-28 2016-11-01 57689.640972 57693.4875 2016-09-15 57646.025694
+0ar2159ci_dkc.fits 2016-10-28 2016-11-01 57689.60625 57693.4875 2016-09-16 57647.058333
+0ar2159ei_dkc.fits 2016-10-28 2016-11-01 57689.592361 57693.4875 2016-09-17 57648.011806
+0ar2159gi_dkc.fits 2016-10-28 2016-11-01 57689.554167 57693.4875 2016-09-18 57649.129861
+0ar2159ii_dkc.fits 2016-10-28 2016-11-01 57689.602083 57693.4875 2016-09-19 57650.169444
+0ar2159ki_dkc.fits 2016-10-28 2016-11-01 57689.639583 57693.4875 2016-09-20 57651.049306
+0ar2159mi_dkc.fits 2016-10-28 2016-11-01 57689.661111 57693.4875 2016-09-21 57652.09375
+0ar2159oi_dkc.fits 2016-10-28 2016-11-01 57689.645833 57693.4875 2016-09-22 57653.110417
+0ar2159qi_dkc.fits 2016-10-28 2016-11-01 57689.651389 57693.4875 2016-09-23 57654.043056
+0ar2159si_dkc.fits 2016-10-28 2016-11-01 57689.602778 57693.4875 2016-09-24 57655.025694
+0ar22000i_dkc.fits 2016-10-28 2016-11-01 57689.644444 57693.4875 2016-09-25 57656.00625
+0ar22002i_dkc.fits 2016-10-28 2016-11-01 57689.606944 57693.4875 2016-09-26 57657.020833
+0ar22004i_dkc.fits 2016-10-28 2016-11-01 57689.541667 57693.4875 2016-09-27 57658.878472
+0ar22006i_dkc.fits 2016-10-28 2016-11-01 57689.545139 57693.4875 2016-09-29 57660.281944
+0ar22008i_dkc.fits 2016-10-28 2016-11-01 57689.56875 57693.4875 2016-09-30 57661.058333
+0ar2200ai_dkc.fits 2016-10-28 2016-11-01 57689.636111 57693.4875 2016-10-01 57662.213194
+0ar2200ci_dkc.fits 2016-10-28 2016-11-01 57689.592361 57693.4875 2016-10-02 57663.134028
+0ar2200ei_dkc.fits 2016-10-28 2016-11-01 57689.557639 57693.4875 2016-10-03 57664.064583
+0ar2200gi_dkc.fits 2016-10-28 2016-11-01 57689.646528 57693.4875 2016-10-04 57665.035417
+0ar2200ii_dkc.fits 2016-10-28 2016-11-01 57689.545139 57693.4875 2016-10-05 57666.18125
+0ar2200ki_dkc.fits 2016-10-28 2016-11-01 57689.653472 57693.4875 2016-10-08 57669.625
+0ar2200mi_dkc.fits 2016-10-28 2016-11-01 57689.641667 57693.4875 2016-10-10 57671.967361
+0ar2200oi_dkc.fits 2016-10-28 2016-11-01 57689.597222 57693.4875 2016-10-11 57672.894444
+0ar2200ri_dkc.fits 2016-10-28 2016-11-01 57689.572222 57693.4875 2016-10-13 57674.00625
+0ar2200ti_dkc.fits 2016-10-28 2016-11-01 57689.595833 57693.4875 2016-10-13 57674.584028
+0ar22011i_dkc.fits 2016-10-28 2016-11-01 57689.661806 57693.4875 2016-10-15 57676.084722
+0ar22013i_dkc.fits 2016-10-28 2016-11-01 57689.611111 57693.4875 2016-10-16 57677.538889
+0ar22015i_dkc.fits 2016-10-28 2016-11-01 57689.590972 57693.4875 2016-10-17 57678.422917
+0ar22019i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-10-19 57680.011111
+0bf16038i_dkc.fits 2016-11-15 2016-11-15 57707.472222 57707.493056 2016-10-19 57680.011111
+0bf16036i_dkc.fits 2016-11-15 2016-11-15 57707.470139 57707.493056 2016-10-19 57680.472222
+0ar22017i_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-10-19 57680.472222
+0bf1603ai_dkc.fits 2016-11-15 2016-11-15 57707.470833 57707.493056 2016-10-20 57681.649306
+0bf1603ci_dkc.fits 2016-11-15 2016-11-15 57707.470833 57707.493056 2016-10-21 57682.593056
+0c11534ti_dkc.fits 2016-12-01 2016-12-01 57723.467361 57723.497222 2016-10-22 57683.568056
+0c115351i_dkc.fits 2016-12-01 2016-12-01 57723.468056 57723.497222 2016-10-23 57684.492361
+0c115353i_dkc.fits 2016-12-01 2016-12-01 57723.464583 57723.497222 2016-10-25 57686.022917
+0c115355i_dkc.fits 2016-12-01 2016-12-01 57723.470139 57723.497222 2016-10-26 57687.0125
+0bf1603ei_dkc.fits 2016-11-15 2016-11-15 57707.469444 57707.493056 2016-10-27 57688.376389
+0bf1603gi_dkc.fits 2016-11-15 2016-11-15 57707.471528 57707.493056 2016-10-29 57690.079167
+0bf1603ii_dkc.fits 2016-11-15 2016-11-15 57707.467361 57707.493056 2016-10-30 57691.466667
+0bf1603ki_dkc.fits 2016-11-15 2016-11-15 57707.46875 57707.493056 2016-11-01 57693.130556
+0bf1603mi_dkc.fits 2016-11-15 2016-11-15 57707.471528 57707.493056 2016-11-02 57694.063194
+0bm14086i_dkc.fits 2016-11-22 2016-11-22 57714.388889 57714.429167 2016-11-05 57697.05625
+0bm14088i_dkc.fits 2016-11-22 2016-11-22 57714.3875 57714.429167 2016-11-08 57700.177083
+0bm1408ai_dkc.fits 2016-11-22 2016-11-22 57714.386806 57714.429167 2016-11-09 57701.336111
+0c115357i_dkc.fits 2016-12-01 2016-12-01 57723.468056 57723.497222 2016-11-11 57703.06875
+0c115359i_dkc.fits 2016-12-01 2016-12-01 57723.46875 57723.497222 2016-11-12 57704.022917
+0c11535bi_dkc.fits 2016-12-01 2016-12-01 57723.465972 57723.497222 2016-11-13 57705.075694
+0bm1408ci_dkc.fits 2016-11-22 2016-11-22 57714.388194 57714.429167 2016-11-14 57706.033333
+0bm1408ei_dkc.fits 2016-11-22 2016-11-22 57714.388194 57714.429167 2016-11-15 57707.00625
+0bm1408gi_dkc.fits 2016-11-22 2016-11-22 57714.3875 57714.429167 2016-11-16 57708.321528
+0bm1408ii_dkc.fits 2016-11-22 2016-11-22 57714.388889 57714.429167 2016-11-17 57709.0
+0c11535di_dkc.fits 2016-12-01 2016-12-01 57723.461806 57723.497222 2016-11-18 57710.113194
+0c11535fi_dkc.fits 2016-12-01 2016-12-01 57723.464583 57723.497222 2016-11-19 57711.733333
+0c11535hi_dkc.fits 2016-12-01 2016-12-01 57723.471528 57723.497222 2016-11-21 57713.864583
+0c11535ji_dkc.fits 2016-12-01 2016-12-01 57723.467361 57723.497222 2016-11-23 57715.838194
+0c11535li_dkc.fits 2016-12-01 2016-12-01 57723.465278 57723.497222 2016-11-25 57717.057639
+0cc19157i_dkc.fits 2016-12-13 2016-12-13 57735.434028 57735.45 2016-11-30 57722.306944
+0cc1915mi_dkc.fits 2016-12-13 2016-12-13 57735.434028 57735.45 2016-12-02 57724.288889
+0cf1753fi_dkc.fits 2016-12-15 2016-12-15 57737.560417 57737.607639 2016-12-03 57725.270139
+0cf17540i_dkc.fits 2016-12-15 2016-12-15 57737.561111 57737.607639 2016-12-04 57726.484028
+0cf1754fi_dkc.fits 2016-12-15 2016-12-15 57737.560417 57737.607639 2016-12-05 57727.377778
+0cf1754ti_dkc.fits 2016-12-15 2016-12-15 57737.561806 57737.607639 2016-12-06 57728.599306
+0cf1755ei_dkc.fits 2016-12-15 2016-12-15 57737.561111 57737.607639 2016-12-07 57729.179861
+0cf1755ti_dkc.fits 2016-12-15 2016-12-15 57737.560417 57737.607639 2016-12-08 57730.214583
+0cf1756ei_dkc.fits 2016-12-15 2016-12-15 57737.5625 57737.607639 2016-12-09 57731.138194
+1141601ai_dkc.fits 2017-01-04 2017-01-04 57757.488194 57757.5375 2016-12-10 57732.755556
+0cf1756ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2016-12-10 57732.755556
+11416020i_dkc.fits 2017-01-04 2017-01-04 57757.490278 57757.5375 2016-12-11 57733.690278
+1141602ki_dkc.fits 2017-01-04 2017-01-04 57757.492361 57757.5375 2016-12-12 57734.13125
+1141603ai_dkc.fits 2017-01-04 2017-01-04 57757.496528 57757.5375 2016-12-13 57735.065278
+11416042i_dkc.fits 2017-01-04 2017-01-04 57757.4875 57757.5375 2016-12-14 57736.134722
+1141604mi_dkc.fits 2017-01-04 2017-01-04 57757.493056 57757.5375 2016-12-15 57737.134028
+1141605fi_dkc.fits 2017-01-04 2017-01-04 57757.488194 57757.5375 2016-12-16 57738.232639
+11416063i_dkc.fits 2017-01-04 2017-01-04 57757.488889 57757.5375 2016-12-17 57739.289583
+1141606ii_dkc.fits 2017-01-04 2017-01-04 57757.493056 57757.5375 2016-12-18 57740.143056
+11416075i_dkc.fits 2017-01-04 2017-01-04 57757.491667 57757.5375 2016-12-19 57741.032639
+1141607ki_dkc.fits 2017-01-04 2017-01-04 57757.488889 57757.5375 2016-12-20 57742.546528
+11416086i_dkc.fits 2017-01-04 2017-01-04 57757.49375 57757.5375 2016-12-21 57743.052778
+1141608mi_dkc.fits 2017-01-04 2017-01-04 57757.491667 57757.5375 2016-12-22 57744.136806
+11416098i_dkc.fits 2017-01-04 2017-01-04 57757.495139 57757.5375 2016-12-23 57745.1875
+1141609oi_dkc.fits 2017-01-04 2017-01-04 57757.495139 57757.5375 2016-12-24 57746.293056
+1141610ci_dkc.fits 2017-01-04 2017-01-04 57757.489583 57757.5375 2016-12-25 57747.103472
+1141610si_dkc.fits 2017-01-04 2017-01-04 57757.495833 57757.5375 2016-12-26 57748.419444
+11i19438i_dkc.fits 2017-01-18 2017-01-18 57771.656944 57771.685417 2016-12-29 57751.796528
+11i1943si_dkc.fits 2017-01-18 2017-01-18 57771.657639 57771.685417 2016-12-31 57753.796519
+11i1944ji_dkc.fits 2017-01-18 2017-01-18 57771.655556 57771.685417 2017-01-02 57755.084028
+11i19459i_dkc.fits 2017-01-18 2017-01-18 57771.656944 57771.685417 2017-01-03 57756.0
+11i19460i_dkc.fits 2017-01-18 2017-01-18 57771.661806 57771.685417 2017-01-04 57757.690278
+11i1946ki_dkc.fits 2017-01-18 2017-01-18 57771.659028 57771.685417 2017-01-06 57759.097917
+11i1947bi_dkc.fits 2017-01-18 2017-01-18 57771.659722 57771.685417 2017-01-07 57760.025
+11i19482i_dkc.fits 2017-01-18 2017-01-18 57771.658333 57771.685417 2017-01-08 57761.010417
+11i1948ni_dkc.fits 2017-01-18 2017-01-18 57771.654861 57771.685417 2017-01-08 57761.670833
+11i19504i_dkc.fits 2017-01-18 2017-01-18 57771.661806 57771.685417 2017-01-10 57763.373611
+11i1949di_dkc.fits 2017-01-18 2017-01-18 57771.659028 57771.685417 2017-01-10 57763.724306
+11i1950pi_dkc.fits 2017-01-18 2017-01-18 57771.661806 57771.685417 2017-01-12 57765.229167
+11i1951gi_dkc.fits 2017-01-18 2017-01-18 57771.657639 57771.685417 2017-01-13 57766.093056
+11r20435i_dkc.fits 2017-01-27 2017-01-27 57780.668056 57780.715278 2017-01-15 57768.384722
+11i19527i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-01-15 57768.384722
+11r2043ni_dkc.fits 2017-01-27 2017-01-27 57780.667361 57780.715278 2017-01-16 57769.238889
+11r20449i_dkc.fits 2017-01-27 2017-01-27 57780.668056 57780.715278 2017-01-17 57770.060417
+11r2044qi_dkc.fits 2017-01-27 2017-01-27 57780.667361 57780.715278 2017-01-18 57771.29375
+11r2045di_dkc.fits 2017-01-27 2017-01-27 57780.666667 57780.715278 2017-01-19 57772.036806
+1221411oi_dkc.fits 2017-02-02 2017-02-02 57786.627778 57786.651389 2017-01-23 57776.84375
+12214129i_dkc.fits 2017-02-02 2017-02-02 57786.627778 57786.651389 2017-01-25 57778.720833
+1221412mi_dkc.fits 2017-02-02 2017-02-02 57786.628472 57786.651389 2017-01-27 57780.022222
+12214137i_dkc.fits 2017-02-02 2017-02-02 57786.627778 57786.651389 2017-01-28 57781.084722
+12e1423ei_dkc.fits 2017-02-14 2017-02-14 57798.406944 57798.426389 2017-01-29 57782.23125
+12e1423si_dkc.fits 2017-02-14 2017-02-14 57798.404167 57798.426389 2017-01-30 57783.020833
+12e1424ci_dkc.fits 2017-02-14 2017-02-14 57798.404861 57798.426389 2017-01-31 57784.008333
+12e1424qi_dkc.fits 2017-02-14 2017-02-14 57798.405556 57798.426389 2017-02-01 57785.00625
+12e1425ai_dkc.fits 2017-02-14 2017-02-14 57798.404167 57798.426389 2017-02-02 57786.014583
+12e1425pi_dkc.fits 2017-02-14 2017-02-14 57798.402778 57798.426389 2017-02-03 57787.0
+12e1426bi_dkc.fits 2017-02-14 2017-02-14 57798.406944 57798.426389 2017-02-04 57788.054861
+12k14206i_dkc.fits 2017-02-20 2017-02-20 57804.4 57804.422222 2017-02-05 57789.027778
+12k1420mi_dkc.fits 2017-02-20 2017-02-20 57804.399306 57804.422222 2017-02-06 57790.027083
+12k14218i_dkc.fits 2017-02-20 2017-02-20 57804.399306 57804.422222 2017-02-07 57791.149306
+12k1421oi_dkc.fits 2017-02-20 2017-02-20 57804.398611 57804.422222 2017-02-08 57792.00625
+12k1422ai_dkc.fits 2017-02-20 2017-02-20 57804.399306 57804.422222 2017-02-09 57793.0
+12k1422qi_dkc.fits 2017-02-20 2017-02-20 57804.398611 57804.422222 2017-02-10 57794.070139
+1382037ri_dkc.fits 2017-03-08 2017-03-09 57820.672917 57821.424306 2017-02-11 57795.068056
+1382038ai_dkc.fits 2017-03-08 2017-03-09 57820.674306 57821.424306 2017-02-12 57796.021528
+1382038oi_dkc.fits 2017-03-08 2017-03-09 57820.672222 57821.424306 2017-02-13 57797.059028
+13820397i_dkc.fits 2017-03-08 2017-03-09 57820.675694 57821.424306 2017-02-13 57797.91875
+1382039ki_dkc.fits 2017-03-08 2017-03-09 57820.670833 57821.424306 2017-02-15 57799.0
+13820404i_dkc.fits 2017-03-08 2017-03-09 57820.668056 57821.424306 2017-02-16 57800.011111
+1382040ii_dkc.fits 2017-03-08 2017-03-09 57820.66875 57821.424306 2017-02-17 57801.0
+13820411i_dkc.fits 2017-03-08 2017-03-09 57820.672917 57821.424306 2017-02-18 57802.009722
+1382041fi_dkc.fits 2017-03-08 2017-03-09 57820.673611 57821.424306 2017-02-19 57803.013194
+1382041ti_dkc.fits 2017-03-08 2017-03-09 57820.669444 57821.424306 2017-02-20 57804.0
+1382042di_dkc.fits 2017-03-08 2017-03-09 57820.671528 57821.424306 2017-02-21 57805.0
+1382042qi_dkc.fits 2017-03-08 2017-03-09 57820.673611 57821.424306 2017-02-23 57807.919444
+1382043ai_dkc.fits 2017-03-08 2017-03-09 57820.675 57821.424306 2017-02-26 57810.034722
+1382043oi_dkc.fits 2017-03-08 2017-03-09 57820.670139 57821.424306 2017-02-27 57811.120833
+13820447i_dkc.fits 2017-03-08 2017-03-09 57820.66875 57821.424306 2017-02-28 57812.156944
+1382044li_dkc.fits 2017-03-08 2017-03-09 57820.671528 57821.424306 2017-03-01 57813.0
+13k1845ei_dkc.fits 2017-03-20 2017-03-20 57832.645833 57832.69375 2017-03-02 57814.002778
+13k18467i_dkc.fits 2017-03-20 2017-03-20 57832.645833 57832.69375 2017-03-03 57815.010417
+13k18470i_dkc.fits 2017-03-20 2017-03-20 57832.65 57832.69375 2017-03-04 57816.0
+13k1847ni_dkc.fits 2017-03-20 2017-03-20 57832.648611 57832.69375 2017-03-05 57817.0
+13k1848fi_dkc.fits 2017-03-20 2017-03-20 57832.646528 57832.69375 2017-03-06 57818.072917
+13k18498i_dkc.fits 2017-03-20 2017-03-20 57832.644444 57832.69375 2017-03-07 57819.0
+13k1849ti_dkc.fits 2017-03-20 2017-03-20 57832.647222 57832.69375 2017-03-08 57820.0
+13k1850mi_dkc.fits 2017-03-20 2017-03-20 57832.645139 57832.69375 2017-03-09 57821.029167
+13k1851fi_dkc.fits 2017-03-20 2017-03-20 57832.649306 57832.69375 2017-03-10 57822.063194
+13k18527i_dkc.fits 2017-03-20 2017-03-20 57832.645139 57832.69375 2017-03-11 57823.015972
+13t18236i_dkc.fits 2017-03-29 2017-03-29 57841.619444 57841.659028 2017-03-12 57824.102778
+13t1823oi_dkc.fits 2017-03-29 2017-03-29 57841.615972 57841.659028 2017-03-13 57825.023611
+13t1824bi_dkc.fits 2017-03-29 2017-03-29 57841.621528 57841.659028 2017-03-14 57826.013889
+13t1824ti_dkc.fits 2017-03-29 2017-03-29 57841.615972 57841.659028 2017-03-15 57827.00625
+13t1825ii_dkc.fits 2017-03-29 2017-03-29 57841.620139 57841.659028 2017-03-16 57828.120139
+13t18266i_dkc.fits 2017-03-29 2017-03-29 57841.617361 57841.659028 2017-03-17 57829.254861
+13t1826ni_dkc.fits 2017-03-29 2017-03-29 57841.616667 57841.659028 2017-03-20 57832.648611
+13t1827ci_dkc.fits 2017-03-29 2017-03-29 57841.618056 57841.659028 2017-03-22 57834.305556
+14a1406pi_dkc.fits 2017-04-10 2017-04-10 57853.4375 57853.53125 2017-03-24 57836.198611
+14a14076i_dkc.fits 2017-04-10 2017-04-10 57853.435417 57853.53125 2017-03-25 57837.079167
+14a1407ii_dkc.fits 2017-04-10 2017-04-10 57853.435417 57853.53125 2017-03-26 57838.19375
+14a14080i_dkc.fits 2017-04-10 2017-04-10 57853.436111 57853.53125 2017-03-27 57839.13125
+14a1408bi_dkc.fits 2017-04-10 2017-04-10 57853.438194 57853.53125 2017-03-28 57840.129167
+14a1408oi_dkc.fits 2017-04-10 2017-04-10 57853.436806 57853.53125 2017-03-29 57841.141667
+14a14096i_dkc.fits 2017-04-10 2017-04-10 57853.4375 57853.53125 2017-03-30 57842.048611
+14a1409ji_dkc.fits 2017-04-10 2017-04-10 57853.436806 57853.53125 2017-03-31 57843.091667
+14a14103i_dkc.fits 2017-04-10 2017-04-10 57853.434722 57853.53125 2017-04-01 57844.004167
+14d19179i_dkc.fits 2017-04-13 2017-04-13 57856.655556 57856.674306 2017-04-02 57845.016667
+14d19180i_dkc.fits 2017-04-13 2017-04-13 57856.656944 57856.674306 2017-04-03 57846.080556
+14d1918ji_dkc.fits 2017-04-13 2017-04-13 57856.653472 57856.674306 2017-04-04 57847.0
+14d19198i_dkc.fits 2017-04-13 2017-04-13 57856.654167 57856.674306 2017-04-05 57848.009028
+14d1919ri_dkc.fits 2017-04-13 2017-04-13 57856.655556 57856.674306 2017-04-06 57849.002778
+14d1920ii_dkc.fits 2017-04-13 2017-04-13 57856.653472 57856.674306 2017-04-07 57850.0
+14d19217i_dkc.fits 2017-04-13 2017-04-13 57856.654861 57856.674306 2017-04-08 57851.184028
+14s1437gi_dkc.fits 2017-04-28 2017-04-28 57871.48125 57871.629861 2017-04-09 57852.0
+14s1437mi_dkc.fits 2017-04-28 2017-04-28 57871.481944 57871.629861 2017-04-10 57853.036806
+14s1437si_dkc.fits 2017-04-28 2017-04-28 57871.482639 57871.629861 2017-04-11 57854.00625
+14s14385i_dkc.fits 2017-04-28 2017-04-28 57871.483333 57871.629861 2017-04-12 57855.0
+14s1438bi_dkc.fits 2017-04-28 2017-04-28 57871.480556 57871.629861 2017-04-13 57856.144444
+14s1438hi_dkc.fits 2017-04-28 2017-04-28 57871.482639 57871.629861 2017-04-14 57857.155556
+14s1438ni_dkc.fits 2017-04-28 2017-04-28 57871.481944 57871.629861 2017-04-15 57858.043056
+14s1438ti_dkc.fits 2017-04-28 2017-04-28 57871.481944 57871.629861 2017-04-16 57859.054167
+14s14395i_dkc.fits 2017-04-28 2017-04-28 57871.482639 57871.629861 2017-04-19 57862.638194
+14s1439bi_dkc.fits 2017-04-28 2017-04-28 57871.48125 57871.629861 2017-04-21 57864.313889
+1551352hi_dkc.fits 2017-05-05 2017-05-05 57878.420833 57878.477083 2017-04-22 57865.383333
+1551352oi_dkc.fits 2017-05-05 2017-05-05 57878.421528 57878.477083 2017-04-24 57867.215278
+15513534i_dkc.fits 2017-05-05 2017-05-05 57878.420833 57878.477083 2017-04-25 57868.0
+1551353bi_dkc.fits 2017-05-05 2017-05-05 57878.421528 57878.477083 2017-04-26 57869.0125
+1551353ki_dkc.fits 2017-05-05 2017-05-05 57878.422222 57878.477083 2017-04-27 57870.120139
+1551353ri_dkc.fits 2017-05-05 2017-05-05 57878.422222 57878.477083 2017-04-28 57871.0
+15g1655fi_dkc.fits 2017-05-16 2017-05-16 57889.547222 57889.570139 2017-04-29 57872.05625
+15g1655pi_dkc.fits 2017-05-16 2017-05-16 57889.547222 57889.570139 2017-04-30 57873.045833
+15g16568i_dkc.fits 2017-05-16 2017-05-16 57889.546528 57889.570139 2017-05-01 57874.111806
+15g1656ji_dkc.fits 2017-05-16 2017-05-16 57889.546528 57889.570139 2017-05-01 57874.497917
+15g16570i_dkc.fits 2017-05-16 2017-05-16 57889.547917 57889.570139 2017-05-03 57876.008333
+15g1657bi_dkc.fits 2017-05-16 2017-05-16 57889.546528 57889.570139 2017-05-04 57877.088194
+15g1657mi_dkc.fits 2017-05-16 2017-05-16 57889.548611 57889.570139 2017-05-05 57878.084722
+15g16583i_dkc.fits 2017-05-16 2017-05-16 57889.548611 57889.570139 2017-05-06 57879.0
+15g1658ei_dkc.fits 2017-05-16 2017-05-16 57889.547222 57889.570139 2017-05-07 57880.0
+1661412li_dkc.fits 2017-06-06 2017-06-06 57910.4375 57910.478472 2017-05-08 57881.718056
+1661412si_dkc.fits 2017-06-06 2017-06-06 57910.438889 57910.478472 2017-05-10 57883.05625
+16614135i_dkc.fits 2017-06-06 2017-06-06 57910.438194 57910.478472 2017-05-11 57884.026389
+1661413di_dkc.fits 2017-06-06 2017-06-06 57910.438194 57910.478472 2017-05-12 57885.053472
+1661413li_dkc.fits 2017-06-06 2017-06-06 57910.4375 57910.478472 2017-05-13 57886.005556
+1661413si_dkc.fits 2017-06-06 2017-06-06 57910.436111 57910.478472 2017-05-14 57887.00625
+16614146i_dkc.fits 2017-06-06 2017-06-06 57910.439583 57910.478472 2017-05-15 57888.020833
+1661414di_dkc.fits 2017-06-06 2017-06-06 57910.436806 57910.478472 2017-05-16 57889.002778
+1661414ki_dkc.fits 2017-06-06 2017-06-06 57910.4375 57910.478472 2017-05-18 57891.548611
+1661414ri_dkc.fits 2017-06-06 2017-06-06 57910.438889 57910.478472 2017-05-21 57894.0125
+16614154i_dkc.fits 2017-06-06 2017-06-06 57910.436111 57910.478472 2017-05-22 57895.004167
+1661415bi_dkc.fits 2017-06-06 2017-06-06 57910.439583 57910.478472 2017-05-23 57896.00625
+1661415ii_dkc.fits 2017-06-06 2017-06-06 57910.439583 57910.478472 2017-05-24 57897.149306
+1661415pi_dkc.fits 2017-06-06 2017-06-06 57910.439583 57910.478472 2017-05-25 57898.0
+16e1625ji_dkc.fits 2017-06-14 2017-06-14 57918.53125 57918.549306 2017-05-26 57899.009028
+16e1625si_dkc.fits 2017-06-14 2017-06-14 57918.53125 57918.549306 2017-05-27 57900.0
+16e1626ai_dkc.fits 2017-06-14 2017-06-14 57918.53125 57918.549306 2017-05-28 57901.014583
+16e16264i_dkc.fits 2017-06-14 2017-06-14 57918.530556 57918.549306 2017-05-28 57901.251389
+16e1626ii_dkc.fits 2017-06-14 2017-06-14 57918.531944 57918.549306 2017-05-30 57903.320833
+16e1626qi_dkc.fits 2017-06-14 2017-06-14 57918.530556 57918.549306 2017-05-31 57904.523611
+16e16274i_dkc.fits 2017-06-14 2017-06-14 57918.529861 57918.549306 2017-06-02 57906.068056
+16e1627ci_dkc.fits 2017-06-14 2017-06-14 57918.529167 57918.549306 2017-06-03 57907.0
+16e1627ki_dkc.fits 2017-06-14 2017-06-14 57918.529861 57918.549306 2017-06-04 57908.023611
+16e1627si_dkc.fits 2017-06-14 2017-06-14 57918.531944 57918.549306 2017-06-04 57908.494444
+16e16286i_dkc.fits 2017-06-14 2017-06-14 57918.531944 57918.549306 2017-06-05 57909.348611
+17512564i_dkc.fits 2017-07-05 2017-07-05 57939.441667 57939.56875 2017-06-07 57911.007639
+1751256ei_dkc.fits 2017-07-05 2017-07-05 57939.434722 57939.56875 2017-06-08 57912.156944
+1751256oi_dkc.fits 2017-07-05 2017-07-05 57939.440972 57939.56875 2017-06-08 57912.257639
+17512574i_dkc.fits 2017-07-05 2017-07-05 57939.439583 57939.56875 2017-06-10 57914.009028
+1751257ei_dkc.fits 2017-07-05 2017-07-05 57939.434028 57939.56875 2017-06-13 57917.661806
+1751257oi_dkc.fits 2017-07-05 2017-07-05 57939.442361 57939.56875 2017-06-16 57920.009028
+17512584i_dkc.fits 2017-07-05 2017-07-05 57939.436806 57939.56875 2017-06-17 57921.054167
+1751258ei_dkc.fits 2017-07-05 2017-07-05 57939.433333 57939.56875 2017-06-18 57922.186111
+1751258oi_dkc.fits 2017-07-05 2017-07-05 57939.432639 57939.56875 2017-06-19 57923.203472
+17512594i_dkc.fits 2017-07-05 2017-07-05 57939.441667 57939.56875 2017-06-20 57924.0
+1751259ei_dkc.fits 2017-07-05 2017-07-05 57939.432639 57939.56875 2017-06-22 57926.157639
+1751259oi_dkc.fits 2017-07-05 2017-07-05 57939.436111 57939.56875 2017-06-23 57927.256944
+17513004i_dkc.fits 2017-07-05 2017-07-05 57939.439583 57939.56875 2017-06-24 57928.004861
+17l1508si_dkc.fits 2017-07-21 2017-07-21 57955.464583 57955.490972 2017-06-25 57929.202778
+17l14537i_dkc.fits 2017-07-21 2017-07-21 57955.453472 57955.490972 2017-06-25 57929.552083
+17l1512ki_dkc.fits 2017-07-21 2017-07-21 57955.466667 57955.490972 2017-06-26 57930.545139
+17l1501hi_dkc.fits 2017-07-21 2017-07-21 57955.459722 57955.490972 2017-06-28 57932.510417
+17l1513hi_dkc.fits 2017-07-21 2017-07-21 57955.467361 57955.490972 2017-06-30 57934.109028
+17l1504fi_dkc.fits 2017-07-21 2017-07-21 57955.461111 57955.490972 2017-07-01 57935.022917
+17l15068i_dkc.fits 2017-07-21 2017-07-21 57955.4625 57955.490972 2017-07-02 57936.015972
+17l14580i_dkc.fits 2017-07-21 2017-07-21 57955.456944 57955.490972 2017-07-03 57937.173611
+17l1500ki_dkc.fits 2017-07-21 2017-07-21 57955.458333 57955.490972 2017-07-04 57938.091667
+17l1505ci_dkc.fits 2017-07-21 2017-07-21 57955.461806 57955.490972 2017-07-05 57939.0
+17l1449gi_dkc.fits 2017-07-21 2017-07-21 57955.450694 57955.490972 2017-07-06 57940.050694
+17l1455ri_dkc.fits 2017-07-21 2017-07-21 57955.455556 57955.490972 2017-07-07 57941.058333
+17l1450di_dkc.fits 2017-07-21 2017-07-21 57955.451389 57955.490972 2017-07-08 57942.013889
+17l1448ji_dkc.fits 2017-07-21 2017-07-21 57955.45 57955.490972 2017-07-09 57943.05
+1891652ti_dkc.fits 2017-08-09 2017-08-10 57974.705556 57975.360417 2017-07-10 57944.009028
+18916532i_dkc.fits 2017-08-09 2017-08-10 57974.702083 57975.360417 2017-07-11 57945.027778
+18916535i_dkc.fits 2017-08-09 2017-08-10 57974.702778 57975.360417 2017-07-12 57946.0
+18916524i_dkc.fits 2017-08-09 2017-08-10 57974.698611 57975.360417 2017-07-14 57948.961806
+18916527i_dkc.fits 2017-08-09 2017-08-10 57974.697917 57975.360417 2017-07-17 57951.0
+1891652ai_dkc.fits 2017-08-09 2017-08-10 57974.706944 57975.360417 2017-07-18 57952.0
+1891652ci_dkc.fits 2017-08-09 2017-08-10 57974.70625 57975.360417 2017-07-19 57953.056944
+1891652fi_dkc.fits 2017-08-09 2017-08-10 57974.704861 57975.360417 2017-07-20 57954.0
+1891652ii_dkc.fits 2017-08-09 2017-08-10 57974.697222 57975.360417 2017-07-21 57955.0
+1891652li_dkc.fits 2017-08-09 2017-08-10 57974.706944 57975.360417 2017-07-22 57956.009722
+1891652ni_dkc.fits 2017-08-09 2017-08-10 57974.699306 57975.360417 2017-07-23 57957.080556
+1891652qi_dkc.fits 2017-08-09 2017-08-10 57974.70625 57975.360417 2017-07-24 57958.085417
+18p14343i_dkc.fits 2017-08-25 2017-08-25 57990.470833 57990.504167 2017-07-25 57959.00625
+18p14347i_dkc.fits 2017-08-25 2017-08-25 57990.474306 57990.504167 2017-07-26 57960.0
+18p1434bi_dkc.fits 2017-08-25 2017-08-25 57990.465278 57990.504167 2017-07-27 57961.002778
+18p1434fi_dkc.fits 2017-08-25 2017-08-25 57990.470833 57990.504167 2017-07-28 57962.058333
+18p1434ji_dkc.fits 2017-08-25 2017-08-25 57990.463889 57990.504167 2017-07-29 57963.134722
+18p1434ni_dkc.fits 2017-08-25 2017-08-25 57990.459722 57990.504167 2017-07-30 57964.06875
+18p1434ri_dkc.fits 2017-08-25 2017-08-25 57990.472222 57990.504167 2017-07-31 57965.384722
+18p14352i_dkc.fits 2017-08-25 2017-08-25 57990.45625 57990.504167 2017-08-01 57966.11875
+18p14356i_dkc.fits 2017-08-25 2017-08-25 57990.460417 57990.504167 2017-08-02 57967.778472
+18p1435ai_dkc.fits 2017-08-25 2017-08-25 57990.465972 57990.504167 2017-08-04 57969.386111
+18p1435ei_dkc.fits 2017-08-25 2017-08-25 57990.461111 57990.504167 2017-08-05 57970.076389
+18p1435ii_dkc.fits 2017-08-25 2017-08-25 57990.457639 57990.504167 2017-08-06 57971.00625
+18p1435mi_dkc.fits 2017-08-25 2017-08-25 57990.4625 57990.504167 2017-08-07 57972.331944
+25g1804oi_dkc.fits 2018-05-16 2018-05-16 58254.596528 58254.61875 2017-08-10 57975.368056
+18p1430qi_dkc.fits 2017-08-25 2017-08-25 57990.473611 57990.504167 2017-08-10 57975.749306
+25g1806ei_dkc.fits 2018-05-16 2018-05-16 58254.593056 58254.61875 2017-08-12 57977.173611
+18p1430ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-12 57977.173611
+18p14314i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-13 57978.222917
+25g1807ei_dkc.fits 2018-05-16 2018-05-16 58254.594444 58254.61875 2017-08-13 57978.222917
+18p14318i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-14 57979.032639
+25g1805si_dkc.fits 2018-05-16 2018-05-16 58254.593056 58254.61875 2017-08-14 57979.032639
+18p1431ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-15 57980.09375
+25g18040i_dkc.fits 2018-05-16 2018-05-16 58254.598611 58254.61875 2017-08-15 57980.09375
+25g1806ri_dkc.fits 2018-05-16 2018-05-16 58254.594444 58254.61875 2017-08-16 57981.081944
+18p1431fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-16 57981.081944
+18p1431ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-17 57982.054167
+25g1805pi_dkc.fits 2018-05-16 2018-05-16 58254.595139 58254.61875 2017-08-17 57982.054167
+18p1431pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-19 57984.0
+25g1805mi_dkc.fits 2018-05-16 2018-05-16 58254.6 58254.61875 2017-08-19 57984.0
+25g1804ri_dkc.fits 2018-05-16 2018-05-16 58254.596528 58254.61875 2017-08-19 57984.038889
+19f1417bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-19 57984.038889
+25g18060i_dkc.fits 2018-05-16 2018-05-16 58254.595139 58254.61875 2017-08-20 57985.145139
+19f1422fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-20 57985.145139
+25g18084i_dkc.fits 2018-05-16 2018-05-16 58254.599306 58254.61875 2017-08-21 57986.146528
+19f1422mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-21 57986.146528
+19f1422ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-23 57988.21875
+25g1807ii_dkc.fits 2018-05-16 2018-05-16 58254.59375 58254.61875 2017-08-23 57988.21875
+19f14237i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-24 57989.16875
+25g18063i_dkc.fits 2018-05-16 2018-05-16 58254.597222 58254.61875 2017-08-24 57989.16875
+19f1423ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-25 57990.0375
+25g1804li_dkc.fits 2018-05-16 2018-05-16 58254.598611 58254.61875 2017-08-25 57990.0375
+19f1423li_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-26 57991.065278
+25g1807bi_dkc.fits 2018-05-16 2018-05-16 58254.597917 58254.61875 2017-08-26 57991.065278
+25g1806oi_dkc.fits 2018-05-16 2018-05-16 58254.59375 58254.61875 2017-08-27 57992.069444
+19f1423ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-27 57992.069444
+19f14246i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-28 57993.042361
+25g18053i_dkc.fits 2018-05-16 2018-05-16 58254.59375 58254.61875 2017-08-28 57993.042361
+25g18067i_dkc.fits 2018-05-16 2018-05-16 58254.597222 58254.61875 2017-08-29 57994.042361
+19f1424di_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-29 57994.042361
+19f1424li_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-31 57996.0
+25g1805di_dkc.fits 2018-05-16 2018-05-16 58254.596528 58254.61875 2017-08-31 57996.0
+19f1424si_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-08-31 57996.031944
+25g1807oi_dkc.fits 2018-05-16 2018-05-16 58254.595833 58254.61875 2017-08-31 57996.031944
+19f14256i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-01 57997.052083
+25g1806ai_dkc.fits 2018-05-16 2018-05-16 58254.597917 58254.61875 2017-09-01 57997.052083
+19f1425di_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-02 57998.038194
+19f1425li_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-04 58000.011111
+19f1425ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-04 58000.034722
+1ab12345i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-04 58000.461806
+26s1550si_dkc.fits 2018-06-28 2018-06-28 58297.504167 58297.529167 2017-09-04 58000.461806
+19f14267i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-05 58001.135417
+19f1426fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-06 58002.039583
+1ab1234ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-07 58003.0
+26s1554oi_dkc.fits 2018-06-28 2018-06-28 58297.502778 58297.529167 2017-09-07 58003.0
+19f14271i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-08 58004.009028
+26s1549ti_dkc.fits 2018-06-28 2018-06-28 58297.502083 58297.529167 2017-09-08 58004.009028
+1ab1234gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-08 58004.009028
+19f1426mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-08 58004.065278
+1ab1234ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-09 58005.043056
+26s1553fi_dkc.fits 2018-06-28 2018-06-28 58297.505556 58297.529167 2017-09-09 58005.043056
+26s1554fi_dkc.fits 2018-06-28 2018-06-28 58297.500694 58297.529167 2017-09-10 58006.0
+1ab1234ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-10 58006.0
+26s15553i_dkc.fits 2018-06-28 2018-06-28 58297.501389 58297.529167 2017-09-11 58007.027083
+1ab12355i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-11 58007.027083
+1ab1235bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-12 58008.057639
+26s1553qi_dkc.fits 2018-06-28 2018-06-28 58297.501389 58297.529167 2017-09-12 58008.057639
+1ab1235hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-12 58008.190972
+26s1553ji_dkc.fits 2018-06-28 2018-06-28 58297.505556 58297.529167 2017-09-12 58008.190972
+26s1551si_dkc.fits 2018-06-28 2018-06-28 58297.500694 58297.529167 2017-09-13 58009.504861
+1ab1235oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-13 58009.504861
+26s15522i_dkc.fits 2018-06-28 2018-06-28 58297.501389 58297.529167 2017-09-15 58011.3
+1ab1235ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-15 58011.3
+26s1550bi_dkc.fits 2018-06-28 2018-06-28 58297.505556 58297.529167 2017-09-16 58012.277083
+1ab12365i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-16 58012.277083
+1ab1236bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-17 58013.200694
+26s15507i_dkc.fits 2018-06-28 2018-06-28 58297.501389 58297.529167 2017-09-17 58013.200694
+26s1555bi_dkc.fits 2018-06-28 2018-06-28 58297.503472 58297.529167 2017-09-18 58014.2625
+1ab1236hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-18 58014.2625
+1ab1236mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-20 58016.00625
+26s15517i_dkc.fits 2018-06-28 2018-06-28 58297.502083 58297.529167 2017-09-20 58016.00625
+1ab12375i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-21 58017.002778
+26s1554ti_dkc.fits 2018-06-28 2018-06-28 58297.502083 58297.529167 2017-09-21 58017.002778
+1ab1236ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-21 58017.779861
+26s1552di_dkc.fits 2018-06-28 2018-06-28 58297.503472 58297.529167 2017-09-21 58017.779861
+26s15569i_dkc.fits 2018-06-28 2018-06-28 58297.502778 58297.529167 2017-09-22 58018.36875
+1ab1237bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-22 58018.36875
+1ab1237ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-24 58020.179167
+26s15560i_dkc.fits 2018-06-28 2018-06-28 58297.504167 58297.529167 2017-09-24 58020.179167
+26s15513i_dkc.fits 2018-06-28 2018-06-28 58297.505556 58297.529167 2017-09-25 58021.240278
+1ab1237oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-25 58021.240278
+1ab12381i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-26 58022.204167
+26s1554ki_dkc.fits 2018-06-28 2018-06-28 58297.503472 58297.529167 2017-09-26 58022.204167
+26s1551bi_dkc.fits 2018-06-28 2018-06-28 58297.501389 58297.529167 2017-09-27 58023.290278
+1ab12386i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-27 58023.290278
+26s1553ti_dkc.fits 2018-06-28 2018-06-28 58297.502083 58297.529167 2017-09-28 58024.188889
+1ab1238bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-09-28 58024.188889
+26s15548i_dkc.fits 2018-06-28 2018-06-28 58297.50625 58297.529167 2017-09-29 58025.154861
+26s1551pi_dkc.fits 2018-06-28 2018-06-28 58297.502083 58297.529167 2017-10-01 58027.138194
+1ak1754ai_dkc.fits 2017-10-23 2017-10-23 58049.373611 58049.39375 2017-10-04 58030.40625
+1ak1754fi_dkc.fits 2017-10-23 2017-10-23 58049.372917 58049.39375 2017-10-06 58032.076389
+1ak1754ki_dkc.fits 2017-10-23 2017-10-23 58049.373611 58049.39375 2017-10-07 58033.08125
+1ak1754qi_dkc.fits 2017-10-23 2017-10-23 58049.373611 58049.39375 2017-10-08 58034.625694
+1ak17551i_dkc.fits 2017-10-23 2017-10-23 58049.372917 58049.39375 2017-10-10 58036.079167
+1ak17555i_dkc.fits 2017-10-23 2017-10-23 58049.372917 58049.39375 2017-10-12 58038.101389
+1ak1755ai_dkc.fits 2017-10-23 2017-10-23 58049.372917 58049.39375 2017-10-14 58040.00625
+1b614480i_dkc.fits 2017-11-06 2017-11-06 58063.423611 58063.467361 2017-10-15 58041.061111
+1b61450ri_dkc.fits 2017-11-06 2017-11-06 58063.423611 58063.467361 2017-10-15 58041.190278
+1b61447oi_dkc.fits 2017-11-06 2017-11-06 58063.422222 58063.467361 2017-10-17 58043.009722
+1b614478i_dkc.fits 2017-11-06 2017-11-06 58063.422222 58063.467361 2017-10-18 58044.0
+1b61449ei_dkc.fits 2017-11-06 2017-11-06 58063.423611 58063.467361 2017-10-18 58044.072917
+1b61448ai_dkc.fits 2017-11-06 2017-11-06 58063.422222 58063.467361 2017-10-20 58046.00625
+1b614505i_dkc.fits 2017-11-06 2017-11-06 58063.422917 58063.467361 2017-10-20 58046.075
+1b614492i_dkc.fits 2017-11-06 2017-11-06 58063.422222 58063.467361 2017-10-22 58048.0
+1b614500i_dkc.fits 2017-11-06 2017-11-06 58063.422917 58063.467361 2017-10-23 58049.029861
+1b61446mi_dkc.fits 2017-11-06 2017-11-06 58063.423611 58063.467361 2017-10-24 58050.0
+1b61448fi_dkc.fits 2017-11-06 2017-11-06 58063.422917 58063.467361 2017-10-25 58051.116667
+1b614485i_dkc.fits 2017-11-06 2017-11-06 58063.422222 58063.467361 2017-10-26 58052.085417
+1b61450mi_dkc.fits 2017-11-06 2017-11-06 58063.422222 58063.467361 2017-10-27 58053.0875
+1bs1416di_dkc.fits 2017-11-28 2017-11-28 58085.394444 58085.520833 2017-11-03 58060.00625
+1bs1417mi_dkc.fits 2017-11-28 2017-11-28 58085.395139 58085.520833 2017-11-05 58062.474306
+1bs1416mi_dkc.fits 2017-11-28 2017-11-28 58085.393056 58085.520833 2017-11-06 58063.020833
+1bs1417qi_dkc.fits 2017-11-28 2017-11-28 58085.39375 58085.520833 2017-11-07 58064.269444
+1bs1415ci_dkc.fits 2017-11-28 2017-11-28 58085.394444 58085.520833 2017-11-09 58066.344444
+1bs14181i_dkc.fits 2017-11-28 2017-11-28 58085.394444 58085.520833 2017-11-10 58067.2
+1bs14171i_dkc.fits 2017-11-28 2017-11-28 58085.395139 58085.520833 2017-11-12 58069.269444
+1bs1416qi_dkc.fits 2017-11-28 2017-11-28 58085.395139 58085.520833 2017-11-13 58070.108333
+1bs14179i_dkc.fits 2017-11-28 2017-11-28 58085.393056 58085.520833 2017-11-14 58071.23125
+1bs14189i_dkc.fits 2017-11-28 2017-11-28 58085.393056 58085.520833 2017-11-15 58072.161111
+1bs1417ii_dkc.fits 2017-11-28 2017-11-28 58085.39375 58085.520833 2017-11-16 58073.00625
+1bs14175i_dkc.fits 2017-11-28 2017-11-28 58085.394444 58085.520833 2017-11-17 58074.19375
+1cl2051mi_dkc.fits 2017-12-21 2017-12-21 58108.674306 58108.69375 2017-11-18 58075.133333
+1cl2055bi_dkc.fits 2017-12-21 2017-12-21 58108.677083 58108.69375 2017-11-19 58076.016667
+1cl2053ci_dkc.fits 2017-12-21 2017-12-21 58108.670139 58108.69375 2017-11-20 58077.0
+1cl2052ji_dkc.fits 2017-12-21 2017-12-21 58108.677083 58108.69375 2017-11-21 58078.309028
+1cl2054ii_dkc.fits 2017-12-21 2017-12-21 58108.676389 58108.69375 2017-11-22 58079.020833
+1cl2050gi_dkc.fits 2017-12-21 2017-12-21 58108.678472 58108.69375 2017-11-23 58080.095139
+1cl2049si_dkc.fits 2017-12-21 2017-12-21 58108.677778 58108.69375 2017-11-24 58081.005556
+1cl2052si_dkc.fits 2017-12-21 2017-12-21 58108.674306 58108.69375 2017-11-25 58082.019444
+1cl2052ai_dkc.fits 2017-12-21 2017-12-21 58108.673611 58108.69375 2017-11-26 58083.307639
+1cl20545i_dkc.fits 2017-12-21 2017-12-21 58108.676389 58108.69375 2017-11-28 58085.985417
+1cl2050bi_dkc.fits 2017-12-21 2017-12-21 58108.674306 58108.69375 2017-12-01 58088.134722
+22e1301bi_dkc.fits 2018-02-14 2018-02-14 58163.340972 58163.357639 2017-12-02 58089.188889
+1cl2051di_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-12-02 58089.188889
+1cl2054ni_dkc.fits 2017-12-21 2017-12-21 58108.677778 58108.69375 2017-12-03 58090.0
+1cl20552i_dkc.fits 2017-12-21 2017-12-21 58108.670139 58108.69375 2017-12-04 58091.186806
+1cl20549i_dkc.fits 2017-12-21 2017-12-21 58108.678472 58108.69375 2017-12-05 58092.002778
+1cl20533i_dkc.fits 2017-12-21 2017-12-21 58108.66875 58108.69375 2017-12-06 58093.872917
+1cl20510i_dkc.fits 2017-12-21 2017-12-21 58108.671528 58108.69375 2017-12-08 58095.58125
+1cl2051qi_dkc.fits 2017-12-21 2017-12-21 58108.675 58108.69375 2017-12-08 58095.802083
+1cl2055fi_dkc.fits 2017-12-21 2017-12-21 58108.675694 58108.69375 2017-12-10 58097.107639
+1cl20514i_dkc.fits 2017-12-21 2017-12-21 58108.678472 58108.69375 2017-12-11 58098.104861
+22e1300oi_dkc.fits 2018-02-14 2018-02-14 58163.339583 58163.357639 2017-12-12 58099.0
+22e1300ei_dkc.fits 2018-02-14 2018-02-14 58163.341667 58163.357639 2017-12-13 58100.00625
+22e1300li_dkc.fits 2018-02-14 2018-02-14 58163.341667 58163.357639 2017-12-14 58101.0
+22e13014i_dkc.fits 2018-02-14 2018-02-14 58163.340278 58163.357639 2017-12-15 58102.0
+22e13001i_dkc.fits 2018-02-14 2018-02-14 58163.340972 58163.357639 2017-12-16 58103.367361
+22e1300hi_dkc.fits 2018-02-14 2018-02-14 58163.340278 58163.357639 2017-12-17 58104.022917
+22e1300bi_dkc.fits 2018-02-14 2018-02-14 58163.340278 58163.357639 2017-12-18 58105.020833
+22e1259li_dkc.fits 2018-02-14 2018-02-14 58163.342361 58163.357639 2017-12-19 58106.013889
+22e1259ii_dkc.fits 2018-02-14 2018-02-14 58163.341667 58163.357639 2017-12-20 58107.490278
+22e1258ci_dkc.fits 2018-02-14 2018-02-14 58163.340972 58163.357639 2017-12-21 58108.128472
+22e1258mi_dkc.fits 2018-02-14 2018-02-14 58163.340972 58163.357639 2017-12-22 58109.446528
+22e1259si_dkc.fits 2018-02-14 2018-02-14 58163.342361 58163.357639 2017-12-23 58110.061806
+2cd1643si_dkc.fits 2018-12-13 2018-12-14 58465.534722 58466.401389 2017-12-26 58113.434722
+2272020oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-12-26 58113.434722
+2cd1619mi_dkc.fits 2018-12-13 2018-12-14 58465.554861 58466.401389 2017-12-28 58115.463889
+2272020ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-12-28 58115.463889
+2cd1644pi_dkc.fits 2018-12-13 2018-12-14 58465.535417 58466.401389 2017-12-29 58116.1625
+22720221i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-12-29 58116.1625
+2cd1631ni_dkc.fits 2018-12-13 2018-12-14 58465.525694 58466.401389 2017-12-30 58117.319444
+22720208i_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-12-30 58117.319444
+2cd16226i_dkc.fits 2018-12-13 2018-12-14 58465.528472 58466.401389 2017-12-31 58118.435417
+2272020li_dkc.fits 0000-00-00 0000-00-00 NA NA 2017-12-31 58118.435417
+3371703gi_dkc.fits 2019-03-07 2019-03-07 58549.559722 58549.64375 2018-01-01 58119.108333
+33717099i_dkc.fits 2019-03-07 2019-03-07 58549.545139 58549.64375 2018-01-02 58120.159722
+33716543i_dkc.fits 2019-03-07 2019-03-07 58549.580556 58549.64375 2018-01-03 58121.126389
+3371708pi_dkc.fits 2019-03-07 2019-03-07 58549.588194 58549.64375 2018-01-04 58122.109028
+3371655ai_dkc.fits 2019-03-07 2019-03-07 58549.547222 58549.64375 2018-01-05 58123.164583
+3371652ti_dkc.fits 2019-03-07 2019-03-07 58549.575694 58549.64375 2018-01-06 58124.304861
+33717003i_dkc.fits 2019-03-07 2019-03-07 58549.575 58549.64375 2018-01-07 58125.132639
+3371707si_dkc.fits 2019-03-07 2019-03-07 58549.551389 58549.64375 2018-01-08 58126.922222
+33717035i_dkc.fits 2019-03-07 2019-03-07 58549.594444 58549.64375 2018-01-09 58127.161111
+3371707mi_dkc.fits 2019-03-07 2019-03-07 58549.577778 58549.64375 2018-01-10 58128.19375
+2cd1651gi_dkc.fits 2018-12-13 2018-12-14 58465.55 58466.401389 2018-01-11 58129.117361
+22720224i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-11 58129.117361
+2cd1636ei_dkc.fits 2018-12-13 2018-12-14 58465.547917 58466.401389 2018-01-12 58130.110417
+2272020ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-12 58130.110417
+2272021li_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-13 58131.203472
+2cd16543i_dkc.fits 2018-12-13 2018-12-14 58465.530556 58466.401389 2018-01-13 58131.203472
+2cd1659ni_dkc.fits 2018-12-13 2018-12-14 58465.5375 58466.401389 2018-01-14 58132.225
+2272021ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-14 58132.225
+22720211i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-15 58133.236806
+2cd1643ji_dkc.fits 2018-12-13 2018-12-14 58465.532639 58466.401389 2018-01-15 58133.236806
+2cd1655qi_dkc.fits 2018-12-13 2018-12-14 58465.551389 58466.401389 2018-01-17 58135.191667
+22720198i_dkc.fits 2018-02-07 2018-02-07 58156.64375 58156.671528 2018-01-18 58136.074306
+2cd1652bi_dkc.fits 2018-12-13 2018-12-14 58465.554861 58466.401389 2018-01-18 58136.103472
+2272021ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-18 58136.103472
+2cd16355i_dkc.fits 2018-12-13 2018-12-14 58465.559722 58466.401389 2018-01-19 58137.1125
+2272019pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-19 58137.1125
+2cd1638qi_dkc.fits 2018-12-13 2018-12-14 58465.53125 58466.401389 2018-01-21 58139.179861
+22720214i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-21 58139.179861
+2441508ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-25 58143.95625
+2cd1653si_dkc.fits 2018-12-13 2018-12-14 58465.554167 58466.401389 2018-01-25 58143.95625
+22e13017i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-25 58143.95625
+22e13004i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-28 58146.201389
+2441513ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-28 58146.201389
+2cd1649qi_dkc.fits 2018-12-13 2018-12-14 58465.526389 58466.401389 2018-01-28 58146.201389
+22e12591i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-29 58147.746528
+2441515ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-29 58147.746528
+2cd1617bi_dkc.fits 2018-12-13 2018-12-14 58465.559028 58466.401389 2018-01-29 58147.746528
+24415101i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-31 58149.526389
+2cd1632ji_dkc.fits 2018-12-13 2018-12-14 58465.556944 58466.401389 2018-01-31 58149.526389
+2cd1646qi_dkc.fits 2018-12-13 2018-12-14 58465.564583 58466.401389 2018-01-31 58149.679861
+2441510ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-01-31 58149.679861
+2441513gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-02 58151.021528
+2cd16486i_dkc.fits 2018-12-13 2018-12-14 58465.544444 58466.401389 2018-02-02 58151.021528
+2cd16403i_dkc.fits 2018-12-13 2018-12-14 58465.541667 58466.401389 2018-02-02 58151.640278
+2441511bi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-02 58151.640278
+2cd1659si_dkc.fits 2018-12-13 2018-12-14 58465.525 58466.401389 2018-02-03 58152.747222
+2441511si_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-03 58152.747222
+2441508li_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-05 58154.607639
+2cd16569i_dkc.fits 2018-12-13 2018-12-14 58465.533333 58466.401389 2018-02-05 58154.607639
+2cd1625ji_dkc.fits 2018-12-13 2018-12-14 58465.563889 58466.401389 2018-02-06 58155.292361
+2441509ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-06 58155.292361
+2441514ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-07 58156.147917
+2cd1624ki_dkc.fits 2018-12-13 2018-12-14 58465.545139 58466.401389 2018-02-07 58156.147917
+2cd16582i_dkc.fits 2018-12-13 2018-12-14 58465.55625 58466.401389 2018-02-08 58157.0875
+24415111i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-08 58157.0875
+2441511pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-09 58158.0
+2cd1651mi_dkc.fits 2018-12-13 2018-12-14 58465.534722 58466.401389 2018-02-09 58158.0
+2cd1629gi_dkc.fits 2018-12-13 2018-12-14 58465.549306 58466.401389 2018-02-10 58159.063889
+2441513ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-10 58159.063889
+2cd1642qi_dkc.fits 2018-12-13 2018-12-14 58465.552083 58466.401389 2018-02-11 58160.172222
+2441511ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-11 58160.172222
+2cd1628ti_dkc.fits 2018-12-13 2018-12-14 58465.527778 58466.401389 2018-02-12 58161.479861
+2441516si_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-12 58161.479861
+2cd1658bi_dkc.fits 2018-12-13 2018-12-14 58465.552778 58466.401389 2018-02-13 58162.569444
+2441516li_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-13 58162.569444
+24415114i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-14 58163.18125
+2cd16588i_dkc.fits 2018-12-13 2018-12-14 58465.558333 58466.401389 2018-02-14 58163.18125
+2441508ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-15 58164.139583
+2cd1632ti_dkc.fits 2018-12-13 2018-12-14 58465.552778 58466.401389 2018-02-15 58164.139583
+2cd16575i_dkc.fits 2018-12-13 2018-12-14 58465.544444 58466.401389 2018-02-16 58165.327778
+2441510ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-16 58165.327778
+2cd1648ji_dkc.fits 2018-12-13 2018-12-14 58465.539583 58466.401389 2018-02-17 58166.125694
+2441512gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-17 58166.125694
+24415167i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-18 58167.21875
+2cd1621ei_dkc.fits 2018-12-13 2018-12-14 58465.556944 58466.401389 2018-02-18 58167.21875
+2cd1705ci_dkc.fits 2018-12-13 2018-12-14 58465.532639 58466.401389 2018-02-21 58170.783333
+23e1533si_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-21 58170.783333
+2cd16329i_dkc.fits 2018-12-13 2018-12-14 58465.553472 58466.401389 2018-02-24 58173.004861
+23e15341i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-24 58173.004861
+23e1534ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-25 58174.088194
+2cd16595i_dkc.fits 2018-12-13 2018-12-14 58465.563194 58466.401389 2018-02-25 58174.088194
+2cd1647li_dkc.fits 2018-12-13 2018-12-14 58465.554167 58466.401389 2018-02-26 58175.070833
+23e1534oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-26 58175.070833
+23e1533oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-27 58176.06875
+2cd1619hi_dkc.fits 2018-12-13 2018-12-14 58465.55625 58466.401389 2018-02-27 58176.06875
+23e1532ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-02-28 58177.0
+2cd17038i_dkc.fits 2018-12-13 2018-12-14 58465.553472 58466.401389 2018-02-28 58177.0
+2cd1704si_dkc.fits 2018-12-13 2018-12-14 58465.529861 58466.401389 2018-03-01 58178.065278
+23e1532ci_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-01 58178.065278
+2cd16489i_dkc.fits 2018-12-13 2018-12-14 58465.563889 58466.401389 2018-03-02 58179.0
+23e15339i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-02 58179.0
+2cd1618gi_dkc.fits 2018-12-13 2018-12-14 58465.557639 58466.401389 2018-03-03 58180.072917
+23e1531ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-03 58180.072917
+23e15335i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-04 58181.00625
+2cd1649fi_dkc.fits 2018-12-13 2018-12-14 58465.534028 58466.401389 2018-03-04 58181.00625
+2cd1625qi_dkc.fits 2018-12-13 2018-12-14 58465.532639 58466.401389 2018-03-05 58182.290278
+23e15345i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-05 58182.290278
+23e1533ki_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-06 58183.100694
+2cd1629ni_dkc.fits 2018-12-13 2018-12-14 58465.546528 58466.401389 2018-03-06 58183.100694
+2cd1648fi_dkc.fits 2018-12-13 2018-12-14 58465.549306 58466.401389 2018-03-07 58184.048611
+23e1531gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-07 58184.048611
+23e1533di_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-08 58185.0
+2cd1649ci_dkc.fits 2018-12-13 2018-12-14 58465.53125 58466.401389 2018-03-08 58185.0
+2cd1653hi_dkc.fits 2018-12-13 2018-12-14 58465.543056 58466.401389 2018-03-09 58186.01875
+2441512ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-09 58186.01875
+2cd16418i_dkc.fits 2018-12-13 2018-12-14 58465.554861 58466.401389 2018-03-10 58187.015972
+2441513ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-10 58187.015972
+2441509ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-11 58188.017361
+2cd17026i_dkc.fits 2018-12-13 2018-12-14 58465.550694 58466.401389 2018-03-11 58188.017361
+24415108i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-12 58189.0
+2cd16249i_dkc.fits 2018-12-13 2018-12-14 58465.550694 58466.401389 2018-03-12 58189.0
+2cd1657gi_dkc.fits 2018-12-13 2018-12-14 58465.545139 58466.401389 2018-03-14 58191.450694
+24415105i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-14 58191.450694
+2cd1640gi_dkc.fits 2018-12-13 2018-12-14 58465.555556 58466.401389 2018-03-14 58191.478472
+24415139i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-14 58191.478472
+2441514ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-16 58193.010417
+2cd16191i_dkc.fits 2018-12-13 2018-12-14 58465.528472 58466.401389 2018-03-16 58193.010417
+24415175i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-17 58194.0
+2cd1659ai_dkc.fits 2018-12-13 2018-12-14 58465.553472 58466.401389 2018-03-17 58194.0
+2cd16511i_dkc.fits 2018-12-13 2018-12-14 58465.561111 58466.401389 2018-03-18 58195.026389
+2441512mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-18 58195.026389
+2441509hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-19 58196.00625
+2cd1620ai_dkc.fits 2018-12-13 2018-12-14 58465.539583 58466.401389 2018-03-19 58196.00625
+2cd1633ai_dkc.fits 2018-12-13 2018-12-14 58465.526389 58466.401389 2018-03-19 58196.59375
+24415122i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-19 58196.59375
+24415129i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-21 58198.620833
+2cd1638ci_dkc.fits 2018-12-13 2018-12-14 58465.553472 58466.401389 2018-03-21 58198.620833
+2441514hi_dkc.fits 2018-04-04 2018-04-04 58212.486111 58212.50625 2018-03-24 58201.360417
+2cd1656ti_dkc.fits 2018-12-13 2018-12-14 58465.529861 58466.401389 2018-03-24 58201.360417
+24415164i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-26 58203.027778
+2cd17015i_dkc.fits 2018-12-13 2018-12-14 58465.552083 58466.401389 2018-03-26 58203.027778
+2441516di_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-27 58204.0375
+2cd1650bi_dkc.fits 2018-12-13 2018-12-14 58465.525694 58466.401389 2018-03-27 58204.0375
+2cd16525i_dkc.fits 2018-12-13 2018-12-14 58465.55625 58466.401389 2018-03-28 58205.140278
+24k1933oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-28 58205.140278
+24k1934ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-29 58206.031944
+2cd1704ei_dkc.fits 2018-12-13 2018-12-14 58465.541667 58466.401389 2018-03-29 58206.031944
+2cd16393i_dkc.fits 2018-12-13 2018-12-14 58465.540972 58466.401389 2018-03-30 58207.194444
+24k1934qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-30 58207.194444
+24k19340i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-03-31 58208.191667
+2cd16197i_dkc.fits 2018-12-13 2018-12-14 58465.548611 58466.401389 2018-03-31 58208.191667
+2cd1622ti_dkc.fits 2018-12-13 2018-12-14 58465.53125 58466.401389 2018-04-01 58209.396528
+24k1934ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-01 58209.396528
+2cd1627qi_dkc.fits 2018-12-13 2018-12-14 58465.527778 58466.401389 2018-04-02 58210.308333
+24k1934ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-02 58210.308333
+24k19359i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-03 58211.028472
+2cd1618bi_dkc.fits 2018-12-13 2018-12-14 58465.534028 58466.401389 2018-04-03 58211.028472
+2cd16558i_dkc.fits 2018-12-13 2018-12-14 58465.526389 58466.401389 2018-04-04 58212.359028
+24k1933hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-04 58212.359028
+2cd16470i_dkc.fits 2018-12-13 2018-12-14 58465.546528 58466.401389 2018-04-05 58213.033333
+24k1933ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-05 58213.033333
+2cd1619si_dkc.fits 2018-12-13 2018-12-14 58465.540972 58466.401389 2018-04-06 58214.160417
+24k19347i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-06 58214.160417
+24p20511i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-07 58215.2625
+2cd1658qi_dkc.fits 2018-12-13 2018-12-14 58465.5625 58466.401389 2018-04-07 58215.2625
+24p2049ni_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-08 58216.236111
+2cd1700ci_dkc.fits 2018-12-13 2018-12-14 58465.534028 58466.401389 2018-04-08 58216.236111
+2cd1625bi_dkc.fits 2018-12-13 2018-12-14 58465.538889 58466.401389 2018-04-09 58217.241667
+24p2049ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-09 58217.241667
+2cd1658gi_dkc.fits 2018-12-13 2018-12-14 58465.55625 58466.401389 2018-04-10 58218.1125
+24p2050oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-10 58218.1125
+24p20517i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-11 58219.918056
+2cd1646gi_dkc.fits 2018-12-13 2018-12-14 58465.536111 58466.401389 2018-04-11 58219.918056
+24p2050ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-12 58220.4625
+2cd16380i_dkc.fits 2018-12-13 2018-12-14 58465.525694 58466.401389 2018-04-12 58220.4625
+2cd1637bi_dkc.fits 2018-12-13 2018-12-14 58465.550694 58466.401389 2018-04-13 58221.383333
+24p20496i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-13 58221.383333
+2cd1652ri_dkc.fits 2018-12-13 2018-12-14 58465.561111 58466.401389 2018-04-14 58222.025694
+24p2049ji_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-14 58222.025694
+2cd1647ti_dkc.fits 2018-12-13 2018-12-14 58465.543056 58466.401389 2018-04-15 58223.0375
+24p2049gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-15 58223.0375
+24p20506i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-16 58224.166667
+2cd16409i_dkc.fits 2018-12-13 2018-12-14 58465.534028 58466.401389 2018-04-16 58224.166667
+2cd1620ki_dkc.fits 2018-12-13 2018-12-14 58465.544444 58466.401389 2018-04-17 58225.084028
+24p2050hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-17 58225.084028
+2cd1645ei_dkc.fits 2018-12-13 2018-12-14 58465.538889 58466.401389 2018-04-20 58228.182639
+25g1735ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-20 58228.182639
+2cd1702ni_dkc.fits 2018-12-13 2018-12-14 58465.555556 58466.401389 2018-04-23 58231.023611
+25g17370i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-23 58231.023611
+25g17365i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-24 58232.888194
+2cd1648ti_dkc.fits 2018-12-13 2018-12-14 58465.564583 58466.401389 2018-04-24 58232.888194
+25g1735ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-25 58233.958333
+2cd1639ji_dkc.fits 2018-12-13 2018-12-14 58465.547917 58466.401389 2018-04-25 58233.958333
+2cd16181i_dkc.fits 2018-12-13 2018-12-14 58465.557639 58466.401389 2018-04-27 58235.146528
+25g1734li_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-27 58235.146528
+2cd1619ci_dkc.fits 2018-12-13 2018-12-14 58465.533333 58466.401389 2018-04-28 58236.815972
+25g1734oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-28 58236.815972
+25g17362i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-28 58236.925
+2cd1648pi_dkc.fits 2018-12-13 2018-12-14 58465.539583 58466.401389 2018-04-28 58236.925
+25g17353i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-04-30 58238.153472
+2cd16254i_dkc.fits 2018-12-13 2018-12-14 58465.545833 58466.401389 2018-04-30 58238.153472
+2cd17020i_dkc.fits 2018-12-13 2018-12-14 58465.540972 58466.401389 2018-05-01 58239.002778
+25g1736oi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-01 58239.002778
+2cd16429i_dkc.fits 2018-12-13 2018-12-14 58465.550694 58466.401389 2018-05-02 58240.120833
+25g1735li_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-02 58240.120833
+25g17373i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-03 58241.044444
+2cd1703ei_dkc.fits 2018-12-13 2018-12-14 58465.563889 58466.401389 2018-05-03 58241.044444
+2cd1622ii_dkc.fits 2018-12-13 2018-12-14 58465.561806 58466.401389 2018-05-04 58242.025
+25g17350i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-04 58242.025
+2cd16492i_dkc.fits 2018-12-13 2018-12-14 58465.540278 58466.401389 2018-05-05 58243.100694
+25g17369i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-05 58243.100694
+2cd1647hi_dkc.fits 2018-12-13 2018-12-14 58465.552083 58466.401389 2018-05-06 58244.08125
+26r16026i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-06 58244.08125
+26r1557fi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-07 58245.020833
+2cd1621ti_dkc.fits 2018-12-13 2018-12-14 58465.541667 58466.401389 2018-05-07 58245.020833
+26r15585i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-08 58246.108333
+2cd16283i_dkc.fits 2018-12-13 2018-12-14 58465.556944 58466.401389 2018-05-08 58246.108333
+2cd16362i_dkc.fits 2018-12-13 2018-12-14 58465.530556 58466.401389 2018-05-09 58247.200694
+26r16003i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-09 58247.200694
+26r1600mi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-10 58248.124306
+2cd1639bi_dkc.fits 2018-12-13 2018-12-14 58465.546528 58466.401389 2018-05-10 58248.124306
+26r1601qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-11 58249.461111
+2cd16464i_dkc.fits 2018-12-13 2018-12-14 58465.530556 58466.401389 2018-05-11 58249.461111
+2cd1636li_dkc.fits 2018-12-13 2018-12-14 58465.540278 58466.401389 2018-05-12 58250.386111
+26r16008i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-12 58250.386111
+26r1605ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-13 58251.272222
+2cd17019i_dkc.fits 2018-12-13 2018-12-14 58465.559028 58466.401389 2018-05-13 58251.272222
+26r1556si_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-14 58252.690278
+2cd1617hi_dkc.fits 2018-12-13 2018-12-14 58465.531944 58466.401389 2018-05-14 58252.690278
+2cd1649ki_dkc.fits 2018-12-13 2018-12-14 58465.552778 58466.401389 2018-05-15 58253.470833
+26r1602li_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-15 58253.470833
+26r1604ei_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-16 58254.227083
+2cd1656fi_dkc.fits 2018-12-13 2018-12-14 58465.560417 58466.401389 2018-05-16 58254.227083
+2cd1641qi_dkc.fits 2018-12-13 2018-12-14 58465.535417 58466.401389 2018-05-19 58257.74375
+26r16010i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-19 58257.74375
+26r1600qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-22 58260.308333
+2cd1640oi_dkc.fits 2018-12-13 2018-12-14 58465.554861 58466.401389 2018-05-22 58260.308333
+26r1600ii_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-23 58261.029167
+2cd1638ki_dkc.fits 2018-12-13 2018-12-14 58465.545833 58466.401389 2018-05-23 58261.029167
+26r15573i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-24 58262.021528
+2cd1617qi_dkc.fits 2018-12-13 2018-12-14 58465.560417 58466.401389 2018-05-24 58262.021528
+2cd1631hi_dkc.fits 2018-12-13 2018-12-14 58465.555556 58466.401389 2018-05-25 58263.020833
+26r1558ti_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-25 58263.020833
+26r16041i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-26 58264.209028
+2cd16549i_dkc.fits 2018-12-13 2018-12-14 58465.535417 58466.401389 2018-05-26 58264.209028
+2cd16553i_dkc.fits 2018-12-13 2018-12-14 58465.5625 58466.401389 2018-05-27 58265.135417
+26r1604ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-27 58265.135417
+2cd1631si_dkc.fits 2018-12-13 2018-12-14 58465.560417 58466.401389 2018-05-28 58266.020833
+26r15593i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-28 58266.020833
+2cd16301i_dkc.fits 2018-12-13 2018-12-14 58465.547222 58466.401389 2018-05-29 58267.129861
+26r1558hi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-29 58267.129861
+2cd1659ii_dkc.fits 2018-12-13 2018-12-14 58465.5375 58466.401389 2018-05-30 58268.357639
+26r1604ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-30 58268.357639
+2cd16347i_dkc.fits 2018-12-13 2018-12-14 58465.561111 58466.401389 2018-05-31 58269.15625
+26r1559qi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-05-31 58269.15625
+2cd1632fi_dkc.fits 2018-12-13 2018-12-14 58465.559028 58466.401389 2018-06-01 58270.230556
+26r1559ai_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-01 58270.230556
+26r1602gi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-02 58271.029167
+2cd1648ci_dkc.fits 2018-12-13 2018-12-14 58465.540972 58466.401389 2018-06-02 58271.029167
+26r1559di_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-03 58272.302778
+2cd16334i_dkc.fits 2018-12-13 2018-12-14 58465.558333 58466.401389 2018-06-03 58272.302778
+26r16034i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-04 58273.0375
+2cd16504i_dkc.fits 2018-12-13 2018-12-14 58465.538194 58466.401389 2018-06-04 58273.0375
+26r1557ri_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-05 58274.04375
+2cd1624fi_dkc.fits 2018-12-13 2018-12-14 58465.528472 58466.401389 2018-06-05 58274.04375
+2cd16316i_dkc.fits 2018-12-13 2018-12-14 58465.535417 58466.401389 2018-06-06 58275.009722
+26r1558pi_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-06 58275.009722
+26r16057i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-07 58276.022222
+2cd17007i_dkc.fits 2018-12-13 2018-12-14 58465.536111 58466.401389 2018-06-07 58276.022222
+26r16022i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-07 58276.53125
+2cd16475i_dkc.fits 2018-12-13 2018-12-14 58465.542361 58466.401389 2018-06-07 58276.53125
+26r16052i_dkc.fits 0000-00-00 0000-00-00 NA NA 2018-06-09 58278.0
+2cd1639qi_dkc.fits 2018-12-13 2018-12-14 58465.528472 58466.401389 2018-06-09 58278.0
+3371709ni_dkc.fits 2019-03-07 2019-03-07 58549.590972 58549.64375 2018-06-10 58279.094444
+3371653di_dkc.fits 2019-03-07 2019-03-07 58549.571528 58549.64375 2018-06-12 58281.926389
+33716594i_dkc.fits 2019-03-07 2019-03-07 58549.593056 58549.64375 2018-06-15 58284.0
+3371655oi_dkc.fits 2019-03-07 2019-03-07 58549.547917 58549.64375 2018-06-16 58285.704167
+33717056i_dkc.fits 2019-03-07 2019-03-07 58549.570833 58549.64375 2018-06-18 58287.107639
+33717015i_dkc.fits 2019-03-07 2019-03-07 58549.565972 58549.64375 2018-06-19 58288.0
+3371700ci_dkc.fits 2019-03-07 2019-03-07 58549.597222 58549.64375 2018-06-20 58289.009028
+3371702qi_dkc.fits 2019-03-07 2019-03-07 58549.560417 58549.64375 2018-06-21 58290.071528
+33717064i_dkc.fits 2019-03-07 2019-03-07 58549.606944 58549.64375 2018-06-22 58291.006944
+3371710ri_dkc.fits 2019-03-07 2019-03-07 58549.564583 58549.64375 2018-06-23 58292.098611
+3371704li_dkc.fits 2019-03-07 2019-03-07 58549.599306 58549.64375 2018-06-24 58293.0
+3371651qi_dkc.fits 2019-03-07 2019-03-07 58549.601389 58549.64375 2018-06-25 58294.011806
+33717040i_dkc.fits 2019-03-07 2019-03-07 58549.601389 58549.64375 2018-06-26 58295.084722
+3371652ii_dkc.fits 2019-03-07 2019-03-07 58549.576389 58549.64375 2018-06-27 58296.092361
+3371656si_dkc.fits 2019-03-07 2019-03-07 58549.561111 58549.64375 2018-06-28 58297.0
+3371702ci_dkc.fits 2019-03-07 2019-03-07 58549.602778 58549.64375 2018-06-29 58298.009028
+3371659ri_dkc.fits 2019-03-07 2019-03-07 58549.604861 58549.64375 2018-06-30 58299.052778
+33716587i_dkc.fits 2019-03-07 2019-03-07 58549.582639 58549.64375 2018-07-01 58300.111111
+3371654fi_dkc.fits 2019-03-07 2019-03-07 58549.544444 58549.64375 2018-07-02 58301.427083
+3371657ci_dkc.fits 2019-03-07 2019-03-07 58549.553472 58549.64375 2018-07-03 58302.108333
+33717037i_dkc.fits 2019-03-07 2019-03-07 58549.578472 58549.64375 2018-07-04 58303.026389
+3371708si_dkc.fits 2019-03-07 2019-03-07 58549.608333 58549.64375 2018-07-05 58304.050694
+33717096i_dkc.fits 2019-03-07 2019-03-07 58549.5375 58549.64375 2018-07-06 58305.160417
+3371654ni_dkc.fits 2019-03-07 2019-03-07 58549.576389 58549.64375 2018-07-07 58306.2375
+3371702ti_dkc.fits 2019-03-07 2019-03-07 58549.545833 58549.64375 2018-07-08 58307.097222
+3371703li_dkc.fits 2019-03-07 2019-03-07 58549.558333 58549.64375 2018-07-09 58308.523611
+3371659oi_dkc.fits 2019-03-07 2019-03-07 58549.569444 58549.64375 2018-07-10 58309.0
+3371709li_dkc.fits 2019-03-07 2019-03-07 58549.545833 58549.64375 2018-07-13 58312.611111
+3371655di_dkc.fits 2019-03-07 2019-03-07 58549.586111 58549.64375 2018-07-16 58315.023611
+3371704ni_dkc.fits 2019-03-07 2019-03-07 58549.55 58549.64375 2018-07-17 58316.075
+3371702ni_dkc.fits 2019-03-07 2019-03-07 58549.596528 58549.64375 2018-07-18 58317.0
+3371659ji_dkc.fits 2019-03-07 2019-03-07 58549.58125 58549.64375 2018-07-19 58318.044444
+3371704ii_dkc.fits 2019-03-07 2019-03-07 58549.58125 58549.64375 2018-07-20 58319.088194
+3371656qi_dkc.fits 2019-03-07 2019-03-07 58549.574306 58549.64375 2018-07-21 58320.0
+33717089i_dkc.fits 2019-03-07 2019-03-07 58549.571528 58549.64375 2018-07-22 58321.139583
+3371707bi_dkc.fits 2019-03-07 2019-03-07 58549.5625 58549.64375 2018-07-23 58322.26875
+3371704qi_dkc.fits 2019-03-07 2019-03-07 58549.610417 58549.64375 2018-07-23 58322.958333
+3371705qi_dkc.fits 2019-03-07 2019-03-07 58549.5625 58549.64375 2018-07-25 58324.0
+33717102i_dkc.fits 2019-03-07 2019-03-07 58549.596528 58549.64375 2018-07-26 58325.181944
+3371651si_dkc.fits 2019-03-07 2019-03-07 58549.586806 58549.64375 2018-07-27 58326.0
+33717029i_dkc.fits 2019-03-07 2019-03-07 58549.550694 58549.64375 2018-07-28 58327.063889
+3371706mi_dkc.fits 2019-03-07 2019-03-07 58549.573611 58549.64375 2018-07-29 58328.00625
+3371657hi_dkc.fits 2019-03-07 2019-03-07 58549.551389 58549.64375 2018-07-30 58329.020833
+33716568i_dkc.fits 2019-03-07 2019-03-07 58549.593056 58549.64375 2018-07-31 58330.295833
+33717070i_dkc.fits 2019-03-07 2019-03-07 58549.570139 58549.64375 2018-08-02 58332.452083
+33716540i_dkc.fits 2019-03-07 2019-03-07 58549.536806 58549.64375 2018-08-04 58334.031944
+3371655ji_dkc.fits 2019-03-07 2019-03-07 58549.567361 58549.64375 2018-08-06 58336.789583
+3371709ci_dkc.fits 2019-03-07 2019-03-07 58549.581944 58549.64375 2018-08-09 58339.005556
+33716584i_dkc.fits 2019-03-07 2019-03-07 58549.592361 58549.64375 2018-08-10 58340.115278
+33717026i_dkc.fits 2019-03-07 2019-03-07 58549.557639 58549.64375 2018-08-11 58341.522222
+33717108i_dkc.fits 2019-03-07 2019-03-07 58549.583333 58549.64375 2018-08-12 58342.309028
+33716551i_dkc.fits 2019-03-07 2019-03-07 58549.602083 58549.64375 2018-08-13 58343.113194
+3371705ei_dkc.fits 2019-03-07 2019-03-07 58549.59375 58549.64375 2018-08-14 58344.086111
+3371657pi_dkc.fits 2019-03-07 2019-03-07 58549.611806 58549.64375 2018-08-15 58345.148611
+33716576i_dkc.fits 2019-03-07 2019-03-07 58549.556944 58549.64375 2018-08-16 58346.173611
+3371706di_dkc.fits 2019-03-07 2019-03-07 58549.569444 58549.64375 2018-08-17 58347.100694
+3371704ci_dkc.fits 2019-03-07 2019-03-07 58549.554167 58549.64375 2018-08-18 58348.126389
+3371709qi_dkc.fits 2019-03-07 2019-03-07 58549.600694 58549.64375 2018-08-19 58349.068056
+3371708ei_dkc.fits 2019-03-07 2019-03-07 58549.563889 58549.64375 2018-08-20 58350.180556
+3371701mi_dkc.fits 2019-03-07 2019-03-07 58549.559028 58549.64375 2018-08-21 58351.002778
+3371706ai_dkc.fits 2019-03-07 2019-03-07 58549.553472 58549.64375 2018-08-22 58352.1125
+33717110i_dkc.fits 2019-03-07 2019-03-07 58549.561806 58549.64375 2018-08-23 58353.227083
+3371711ei_dkc.fits 2019-03-07 2019-03-07 58549.575 58549.64375 2018-08-24 58354.013194
+3371657si_dkc.fits 2019-03-07 2019-03-07 58549.558333 58549.64375 2018-08-25 58355.0375
+33716532i_dkc.fits 2019-03-07 2019-03-07 58549.577083 58549.64375 2018-08-26 58356.019444
+33716592i_dkc.fits 2019-03-07 2019-03-07 58549.578472 58549.64375 2018-08-27 58357.195833
+3371659ai_dkc.fits 2019-03-07 2019-03-07 58549.609722 58549.64375 2018-08-28 58358.188194
+3371701pi_dkc.fits 2019-03-07 2019-03-07 58549.548611 58549.64375 2018-08-29 58359.006944
+3371658ni_dkc.fits 2019-03-07 2019-03-07 58549.590278 58549.64375 2018-08-30 58360.171528
+3371657ei_dkc.fits 2019-03-07 2019-03-07 58549.5375 58549.64375 2018-08-31 58361.097917
+3371711pi_dkc.fits 2019-03-07 2019-03-07 58549.536111 58549.64375 2018-09-01 58362.109722
+33717049i_dkc.fits 2019-03-07 2019-03-07 58549.590972 58549.64375 2018-09-03 58364.835417
+3371707di_dkc.fits 2019-03-07 2019-03-07 58549.574306 58549.64375 2018-09-06 58367.064583
+33717012i_dkc.fits 2019-03-07 2019-03-07 58549.55625 58549.64375 2018-09-07 58368.791667
+33716527i_dkc.fits 2019-03-07 2019-03-07 58549.561111 58549.64375 2018-09-09 58370.115972
+33717080i_dkc.fits 2019-03-07 2019-03-07 58549.550694 58549.64375 2018-09-10 58371.023611
+3371652fi_dkc.fits 2019-03-07 2019-03-07 58549.549306 58549.64375 2018-09-11 58372.0
+3371708mi_dkc.fits 2019-03-07 2019-03-07 58549.609028 58549.64375 2018-09-12 58373.15625
+3371654ci_dkc.fits 2019-03-07 2019-03-07 58549.541667 58549.64375 2018-09-13 58374.0
+3371658ci_dkc.fits 2019-03-07 2019-03-07 58549.598611 58549.64375 2018-09-14 58375.006944
+3371656hi_dkc.fits 2019-03-07 2019-03-07 58549.611806 58549.64375 2018-09-15 58376.201389
+3371655ri_dkc.fits 2019-03-07 2019-03-07 58549.559028 58549.64375 2018-09-16 58377.420139
+33716554i_dkc.fits 2019-03-07 2019-03-07 58549.5875 58549.64375 2018-09-17 58378.346528
+3371709ii_dkc.fits 2019-03-07 2019-03-07 58549.561806 58549.64375 2018-09-17 58378.688889
+33717094i_dkc.fits 2019-03-07 2019-03-07 58549.591667 58549.64375 2018-09-18 58379.68125
+3371703oi_dkc.fits 2019-03-07 2019-03-07 58549.556944 58549.64375 2018-09-20 58381.0
+3371708ci_dkc.fits 2019-03-07 2019-03-07 58549.581944 58549.64375 2018-09-21 58382.774306
+3371652qi_dkc.fits 2019-03-07 2019-03-07 58549.552778 58549.64375 2018-09-23 58384.0
+33716537i_dkc.fits 2019-03-07 2019-03-07 58549.595139 58549.64375 2018-09-24 58385.570833
+3371710di_dkc.fits 2019-03-07 2019-03-07 58549.604167 58549.64375 2018-09-24 58385.582639
+3371710ai_dkc.fits 2019-03-07 2019-03-07 58549.55 58549.64375 2018-09-26 58387.006944
+33717120i_dkc.fits 2019-03-07 2019-03-07 58549.538194 58549.64375 2018-09-28 58389.001389
+33717118i_dkc.fits 2019-03-07 2019-03-07 58549.582639 58549.64375 2018-10-01 58392.479861
+33716535i_dkc.fits 2019-03-07 2019-03-07 58549.611111 58549.64375 2018-10-03 58394.88125
+3371653gi_dkc.fits 2019-03-07 2019-03-07 58549.590278 58549.64375 2018-10-27 58418.169444
+3371706gi_dkc.fits 2019-03-07 2019-03-07 58549.565972 58549.64375 2018-10-28 58419.477778
+33716571i_dkc.fits 2019-03-07 2019-03-07 58549.572222 58549.64375 2018-10-29 58420.172917
+3371711si_dkc.fits 2019-03-07 2019-03-07 58549.538889 58549.64375 2018-10-31 58422.525694
+34b2036ei_dkc.fits 2019-04-11 2019-04-12 58584.722917 58585.403472 2018-11-02 58424.609722
+34b20322i_dkc.fits 2019-04-11 2019-04-12 58584.721528 58585.403472 2018-11-05 58427.120139
+34b20285i_dkc.fits 2019-04-11 2019-04-12 58584.734028 58585.403472 2018-11-06 58428.002778
+34b2020oi_dkc.fits 2019-04-11 2019-04-12 58584.729167 58585.403472 2018-11-07 58429.767361
+34b20432i_dkc.fits 2019-04-11 2019-04-12 58584.722222 58585.403472 2018-11-09 58431.0
+34b2034ti_dkc.fits 2019-04-11 2019-04-12 58584.724306 58585.403472 2018-11-10 58432.002778
+34b2037ti_dkc.fits 2019-04-11 2019-04-12 58584.726389 58585.403472 2018-11-11 58433.0
+34b20125i_dkc.fits 2019-04-11 2019-04-12 58584.724306 58585.403472 2018-11-12 58434.020833
+34b2042ri_dkc.fits 2019-04-11 2019-04-12 58584.722222 58585.403472 2018-11-13 58435.161806
+34b20342i_dkc.fits 2019-04-11 2019-04-12 58584.734028 58585.403472 2018-11-14 58436.555556
+34b2035ri_dkc.fits 2019-04-11 2019-04-12 58584.729167 58585.403472 2018-11-16 58438.473611
+34b20310i_dkc.fits 2019-04-11 2019-04-12 58584.722917 58585.403472 2018-11-17 58439.523611
+34b20102i_dkc.fits 2019-04-11 2019-04-12 58584.722222 58585.403472 2018-11-22 58444.509722
+34b2024ri_dkc.fits 2019-04-11 2019-04-12 58584.725 58585.403472 2018-11-24 58446.519444
+34b2008gi_dkc.fits 2019-04-11 2019-04-12 58584.724306 58585.403472 2018-11-26 58448.020833
+34b2032di_dkc.fits 2019-04-11 2019-04-12 58584.733333 58585.403472 2018-11-27 58449.146528
+34b2029li_dkc.fits 2019-04-11 2019-04-12 58584.726389 58585.403472 2018-11-29 58451.451389
+34b2044li_dkc.fits 2019-04-11 2019-04-12 58584.733333 58585.403472 2018-12-01 58453.244444
+34b2012gi_dkc.fits 2019-04-11 2019-04-12 58584.724306 58585.403472 2018-12-02 58454.25
+34b2020hi_dkc.fits 2019-04-11 2019-04-12 58584.721528 58585.403472 2018-12-04 58456.09375
+34b2018ai_dkc.fits 2019-04-11 2019-04-12 58584.73125 58585.403472 2018-12-04 58456.13125
+34b20140i_dkc.fits 2019-04-11 2019-04-12 58584.725 58585.403472 2018-12-05 58457.122917
+34b2038ai_dkc.fits 2019-04-11 2019-04-12 58584.731944 58585.403472 2018-12-07 58459.088889
+34b2021ei_dkc.fits 2019-04-11 2019-04-12 58584.73125 58585.403472 2018-12-07 58459.136806
+34b20203i_dkc.fits 2019-04-11 2019-04-12 58584.732639 58585.403472 2018-12-08 58460.134028
+34b20261i_dkc.fits 2019-04-11 2019-04-12 58584.721528 58585.403472 2018-12-09 58461.371528
+34b20196i_dkc.fits 2019-04-11 2019-04-12 58584.730556 58585.403472 2018-12-11 58463.014583
+34b2035gi_dkc.fits 2019-04-11 2019-04-12 58584.722222 58585.403472 2018-12-12 58464.790278
+34b20116i_dkc.fits 2019-04-11 2019-04-12 58584.723611 58585.403472 2018-12-14 58466.706944
+34b20355i_dkc.fits 2019-04-11 2019-04-12 58584.722222 58585.403472 2018-12-16 58468.099306
+34b2015ji_dkc.fits 2019-04-11 2019-04-12 58584.722222 58585.403472 2018-12-16 58468.295833
+34b2014bi_dkc.fits 2019-04-11 2019-04-12 58584.732639 58585.403472 2018-12-17 58469.21875
+34b2013ei_dkc.fits 2019-04-11 2019-04-12 58584.726389 58585.403472 2018-12-19 58471.461806
+34b2024bi_dkc.fits 2019-04-11 2019-04-12 58584.729861 58585.403472 2018-12-20 58472.384722
+34b2045ci_dkc.fits 2019-04-11 2019-04-12 58584.723611 58585.403472 2018-12-22 58474.44375
+34b2007ji_dkc.fits 2019-04-11 2019-04-12 58584.725694 58585.403472 2018-12-24 58476.023611
+34b2013ji_dkc.fits 2019-04-11 2019-04-12 58584.727083 58585.403472 2018-12-27 58479.210417
+34b20238i_dkc.fits 2019-04-11 2019-04-12 58584.725694 58585.403472 2018-12-29 58481.00625
+34b2029qi_dkc.fits 2019-04-11 2019-04-12 58584.720833 58585.403472 2018-12-30 58482.009028
+34b20394i_dkc.fits 2019-04-11 2019-04-12 58584.728472 58585.403472 2018-12-31 58483.111806
+34b2033ai_dkc.fits 2019-04-11 2019-04-12 58584.732639 58585.403472 2019-01-01 58484.099306
+34b2040pi_dkc.fits 2019-04-11 2019-04-12 58584.722917 58585.403472 2019-01-02 58485.113194
+34b2037ci_dkc.fits 2019-04-11 2019-04-12 58584.726389 58585.403472 2019-01-03 58486.161111
+34b2042gi_dkc.fits 2019-04-11 2019-04-12 58584.722222 58585.403472 2019-01-04 58487.010417
+34b2007ei_dkc.fits 2019-04-11 2019-04-12 58584.727083 58585.403472 2019-01-05 58488.127083
+34b2030ei_dkc.fits 2019-04-11 2019-04-12 58584.730556 58585.403472 2019-01-06 58489.0
+34b20371i_dkc.fits 2019-04-11 2019-04-12 58584.733333 58585.403472 2019-01-07 58490.129167
+34b20420i_dkc.fits 2019-04-11 2019-04-12 58584.723611 58585.403472 2019-01-18 58501.184722
+34b2043oi_dkc.fits 2019-04-11 2019-04-12 58584.732639 58585.403472 2019-01-19 58502.107639
+34b2032oi_dkc.fits 2019-04-11 2019-04-12 58584.726389 58585.403472 2019-01-22 58505.634722
+34b20444i_dkc.fits 2019-04-11 2019-04-12 58584.723611 58585.403472 2019-01-25 58508.168056
+34b2017ii_dkc.fits 2019-04-11 2019-04-12 58584.730556 58585.403472 2019-01-28 58511.027083
+34b20218i_dkc.fits 2019-04-11 2019-04-12 58584.728472 58585.403472 2019-01-29 58512.127083
+34b20184i_dkc.fits 2019-04-11 2019-04-12 58584.725694 58585.403472 2019-01-30 58513.0
+34b20211i_dkc.fits 2019-04-11 2019-04-12 58584.729861 58585.403472 2019-01-31 58514.970833
+34b2040ji_dkc.fits 2019-04-11 2019-04-12 58584.722917 58585.403472 2019-02-02 58516.230556
+34b20301i_dkc.fits 2019-04-11 2019-04-12 58584.726389 58585.403472 2019-02-03 58517.00625
+34b2016qi_dkc.fits 2019-04-11 2019-04-12 58584.724306 58585.403472 2019-02-05 58519.059028
+34b2017ti_dkc.fits 2019-04-11 2019-04-12 58584.725 58585.403472 2019-02-06 58520.085417
+34b2045ni_dkc.fits 2019-04-11 2019-04-12 58584.729861 58585.403472 2019-02-07 58521.127778
+34b20257i_dkc.fits 2019-04-11 2019-04-12 58584.727083 58585.403472 2019-02-07 58521.389583
+34b2030oi_dkc.fits 2019-04-11 2019-04-12 58584.724306 58585.403472 2019-02-09 58523.054861
+34b2027ei_dkc.fits 2019-04-11 2019-04-12 58584.720833 58585.403472 2019-02-10 58524.002778
+34b2029ai_dkc.fits 2019-04-11 2019-04-12 58584.730556 58585.403472 2019-02-11 58525.0
+34b2037hi_dkc.fits 2019-04-11 2019-04-12 58584.730556 58585.403472 2019-02-12 58526.051389
+34b2008ri_dkc.fits 2019-04-11 2019-04-12 58584.724306 58585.403472 2019-02-13 58527.072917
+34b2019bi_dkc.fits 2019-04-11 2019-04-12 58584.729861 58585.403472 2019-02-13 58527.414583
+34b2043di_dkc.fits 2019-04-11 2019-04-12 58584.727083 58585.403472 2019-02-15 58529.009028
+34b2042ai_dkc.fits 2019-04-11 2019-04-12 58584.725694 58585.403472 2019-02-16 58530.0
+34b20233i_dkc.fits 2019-04-11 2019-04-12 58584.728472 58585.403472 2019-02-17 58531.005556
+34b2022ri_dkc.fits 2019-04-11 2019-04-12 58584.727778 58585.403472 2019-02-18 58532.099306
+34b2018qi_dkc.fits 2019-04-11 2019-04-12 58584.731944 58585.403472 2019-02-19 58533.021528
+34b20385i_dkc.fits 2019-04-11 2019-04-12 58584.723611 58585.403472 2019-02-21 58535.588889
+34b20402i_dkc.fits 2019-04-11 2019-04-12 58584.727778 58585.403472 2019-02-23 58537.535417
+34b2034di_dkc.fits 2019-04-11 2019-04-12 58584.723611 58585.403472 2019-02-25 58539.323611
+34b2044ri_dkc.fits 2019-04-11 2019-04-12 58584.727778 58585.403472 2019-02-27 58541.194444
+34b20294i_dkc.fits 2019-04-11 2019-04-12 58584.729167 58585.403472 2019-02-28 58542.383333
+34b2011ci_dkc.fits 2019-04-11 2019-04-12 58584.723611 58585.403472 2019-03-02 58544.285417
+34b20377i_dkc.fits 2019-04-11 2019-04-12 58584.733333 58585.403472 2019-03-02 58544.301389
+34b2017di_dkc.fits 2019-04-11 2019-04-12 58584.721528 58585.403472 2019-03-04 58546.265278
+34b2015oi_dkc.fits 2019-04-11 2019-04-12 58584.722917 58585.403472 2019-03-05 58547.086806
+34b20151i_dkc.fits 2019-04-11 2019-04-12 58584.720833 58585.403472 2019-03-06 58548.006944
+34b2037ni_dkc.fits 2019-04-11 2019-04-12 58584.731944 58585.403472 2019-03-07 58549.147222
+34b2009qi_dkc.fits 2019-04-11 2019-04-12 58584.721528 58585.403472 2019-03-08 58550.102778
+34b2011hi_dkc.fits 2019-04-11 2019-04-12 58584.725 58585.403472 2019-03-09 58551.095139
+34b2033li_dkc.fits 2019-04-11 2019-04-12 58584.724306 58585.403472 2019-03-10 58552.502778
+34b20139i_dkc.fits 2019-04-11 2019-04-12 58584.721528 58585.403472 2019-03-12 58554.2125
+34b2031li_dkc.fits 2019-04-11 2019-04-12 58584.727083 58585.403472 2019-03-13 58555.0
+34b20209i_dkc.fits 2019-04-11 2019-04-12 58584.731944 58585.403472 2019-03-14 58556.016667
+34b2026gi_dkc.fits 2019-04-11 2019-04-12 58584.727083 58585.403472 2019-03-15 58557.836806
+34b20191i_dkc.fits 2019-04-11 2019-04-12 58584.721528 58585.403472 2019-03-19 58561.859028
+34b20399i_dkc.fits 2019-04-11 2019-04-12 58584.729861 58585.403472 2019-03-22 58564.011806
+34b2012mi_dkc.fits 2019-04-11 2019-04-12 58584.725 58585.403472 2019-03-23 58565.027778
+34b2029gi_dkc.fits 2019-04-11 2019-04-12 58584.733333 58585.403472 2019-03-24 58566.423611
+34b2018fi_dkc.fits 2019-04-11 2019-04-12 58584.725694 58585.403472 2019-03-25 58567.085417
+34b20093i_dkc.fits 2019-04-11 2019-04-12 58584.725694 58585.403472 2019-03-26 58568.016667
+34b2023ji_dkc.fits 2019-04-11 2019-04-12 58584.727778 58585.403472 2019-03-27 58569.025
+34b20315i_dkc.fits 2019-04-11 2019-04-12 58584.721528 58585.403472 2019-03-28 58570.0
+34b2016li_dkc.fits 2019-04-11 2019-04-12 58584.733333 58585.403472 2019-03-29 58571.009028
+34b2041hi_dkc.fits 2019-04-11 2019-04-12 58584.727778 58585.403472 2019-03-30 58572.011806
+34b2018li_dkc.fits 2019-04-11 2019-04-12 58584.731944 58585.403472 2019-03-31 58573.0
+34b2008bi_dkc.fits 2019-04-11 2019-04-12 58584.731944 58585.403472 2019-04-01 58574.027083
+3591736ki_dkc.fits 2019-05-09 2019-05-09 58612.575694 58612.630556 2019-04-02 58575.0
+3591739gi_dkc.fits 2019-05-09 2019-05-09 58612.575694 58612.630556 2019-04-03 58576.006944
+3591739qi_dkc.fits 2019-05-09 2019-05-09 58612.575 58612.630556 2019-04-04 58577.00625
+35917400i_dkc.fits 2019-05-09 2019-05-09 58612.575694 58612.630556 2019-04-05 58578.054861
+3591738ci_dkc.fits 2019-05-09 2019-05-09 58612.575 58612.630556 2019-04-06 58579.0
+3591739si_dkc.fits 2019-05-09 2019-05-09 58612.575 58612.630556 2019-04-07 58580.009028
+3591737gi_dkc.fits 2019-05-09 2019-05-09 58612.573611 58612.630556 2019-04-08 58581.380556
+35917387i_dkc.fits 2019-05-09 2019-05-09 58612.572917 58612.630556 2019-04-09 58582.3125
+3591737li_dkc.fits 2019-05-09 2019-05-09 58612.574306 58612.630556 2019-04-10 58583.158333
+3591738gi_dkc.fits 2019-05-09 2019-05-09 58612.572917 58612.630556 2019-04-11 58584.034722
+35917370i_dkc.fits 2019-05-09 2019-05-09 58612.574306 58612.630556 2019-04-12 58585.097222
+3591737ti_dkc.fits 2019-05-09 2019-05-09 58612.575694 58612.630556 2019-04-12 58585.736806
+3591736hi_dkc.fits 2019-05-09 2019-05-09 58612.575 58612.630556 2019-04-14 58587.0
+35g1933mi_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-04-17 58590.475
+35g1934ri_dkc.fits 2019-05-16 2019-05-16 58619.652778 58619.711806 2019-04-19 58592.18125
+35g19341i_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-04-21 58594.178472
+35g1933pi_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-04-23 58596.194444
+35g19355i_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-04-24 58597.218056
+35g1934oi_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-04-26 58599.074306
+35g19353i_dkc.fits 2019-05-16 2019-05-16 58619.653472 58619.711806 2019-04-27 58600.029861
+35g1935ii_dkc.fits 2019-05-16 2019-05-16 58619.653472 58619.711806 2019-04-28 58601.022222
+35g1934ei_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-04-29 58602.020833
+35g19337i_dkc.fits 2019-05-16 2019-05-16 58619.652778 58619.711806 2019-04-30 58603.092361
+35g1935oi_dkc.fits 2019-05-16 2019-05-16 58619.653472 58619.711806 2019-05-01 58604.070139
+35g1932li_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-05-02 58605.006944
+35g19360i_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-05-03 58606.059722
+35g19331i_dkc.fits 2019-05-16 2019-05-16 58619.652778 58619.711806 2019-05-05 58608.143056
+35g19344i_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-05-05 58608.171528
+35g1932ri_dkc.fits 2019-05-16 2019-05-16 58619.653472 58619.711806 2019-05-07 58610.020833
+35g1933gi_dkc.fits 2019-05-16 2019-05-16 58619.654167 58619.711806 2019-05-08 58611.0
+35g1932ii_dkc.fits 2019-05-16 2019-05-16 58619.653472 58619.711806 2019-05-09 58612.054861
+35g1934ti_dkc.fits 2019-05-16 2019-05-16 58619.653472 58619.711806 2019-05-10 58613.009028
+3961711di_dkc.fits 2019-09-06 2019-09-09 58732.549306 58735.672917 2019-05-13 58616.211806
+3961722si_dkc.fits 2019-09-06 2019-09-09 58732.557639 58735.672917 2019-05-16 58619.053472
+39617344i_dkc.fits 2019-09-06 2019-09-09 58732.565278 58735.672917 2019-05-17 58620.002778
+3961704ci_dkc.fits 2019-09-06 2019-09-09 58732.544444 58735.672917 2019-05-18 58621.098611
+3961648ni_dkc.fits 2019-09-06 2019-09-09 58732.533333 58735.672917 2019-05-19 58622.00625
+3961749ai_dkc.fits 2019-09-06 2019-09-09 58732.575694 58735.672917 2019-05-20 58623.020833
+39617519i_dkc.fits 2019-09-06 2019-09-09 58732.577083 58735.672917 2019-05-21 58624.177778
+3961750gi_dkc.fits 2019-09-06 2019-09-09 58732.576389 58735.672917 2019-05-22 58625.663194
+3961736gi_dkc.fits 2019-09-06 2019-09-09 58732.566667 58735.672917 2019-05-23 58626.0
+3961703gi_dkc.fits 2019-09-06 2019-09-09 58732.54375 58735.672917 2019-05-24 58627.022917
+39617004i_dkc.fits 2019-09-06 2019-09-09 58732.541667 58735.672917 2019-05-25 58628.016667
+39617111i_dkc.fits 2019-09-06 2019-09-09 58732.549306 58735.672917 2019-05-26 58629.0
+3961742oi_dkc.fits 2019-09-06 2019-09-09 58732.570833 58735.672917 2019-05-27 58630.144444
+39618003i_dkc.fits 2019-09-06 2019-09-09 58732.583333 58735.672917 2019-05-28 58631.036111
+39616471i_dkc.fits 2019-09-06 2019-09-09 58732.532639 58735.672917 2019-05-29 58632.298611
+3961733ai_dkc.fits 2019-09-06 2019-09-09 58732.564583 58735.672917 2019-05-30 58633.031944
+39617106i_dkc.fits 2019-09-06 2019-09-09 58732.548611 58735.672917 2019-05-31 58634.016667
+3961745fi_dkc.fits 2019-09-06 2019-09-09 58732.572917 58735.672917 2019-06-01 58635.103472
+3961725bi_dkc.fits 2019-09-06 2019-09-09 58732.559028 58735.672917 2019-06-02 58636.334722
+3961707mi_dkc.fits 2019-09-06 2019-09-09 58732.546528 58735.672917 2019-06-03 58637.091667
+3961734fi_dkc.fits 2019-09-06 2019-09-09 58732.565278 58735.672917 2019-06-04 58638.759028
+3961644di_dkc.fits 2019-09-06 2019-09-09 58732.530556 58735.672917 2019-06-05 58639.0
+3961738qi_dkc.fits 2019-09-06 2019-09-09 58732.568056 58735.672917 2019-06-06 58640.031944
+3961759ki_dkc.fits 2019-09-06 2019-09-09 58732.582639 58735.672917 2019-06-07 58641.024306
+39616572i_dkc.fits 2019-09-06 2019-09-09 58732.539583 58735.672917 2019-06-08 58642.220139
+39617557i_dkc.fits 2019-09-06 2019-09-09 58732.579861 58735.672917 2019-06-11 58645.61875
+3961748hi_dkc.fits 2019-09-06 2019-09-09 58732.575 58735.672917 2019-06-13 58647.393056
+39617359i_dkc.fits 2019-09-06 2019-09-09 58732.565972 58735.672917 2019-06-15 58649.069444
+3961652ii_dkc.fits 2019-09-06 2019-09-09 58732.536111 58735.672917 2019-06-16 58650.076389
+39617182i_dkc.fits 2019-09-06 2019-09-09 58732.554167 58735.672917 2019-06-17 58651.020833
+3961744ai_dkc.fits 2019-09-06 2019-09-09 58732.572222 58735.672917 2019-06-18 58652.029167
+39617522i_dkc.fits 2019-09-06 2019-09-09 58732.577778 58735.672917 2019-06-19 58653.0
+39617198i_dkc.fits 2019-09-06 2019-09-09 58732.554861 58735.672917 2019-06-20 58654.096528
+3961711qi_dkc.fits 2019-09-06 2019-09-09 58732.549306 58735.672917 2019-06-21 58655.011111
+3961751li_dkc.fits 2019-09-06 2019-09-09 58732.577083 58735.672917 2019-06-22 58656.021528
+3961650ei_dkc.fits 2019-09-06 2019-09-09 58732.534722 58735.672917 2019-06-23 58657.185417
+3961746ji_dkc.fits 2019-09-06 2019-09-09 58732.573611 58735.672917 2019-06-24 58658.234028
+3961732hi_dkc.fits 2019-09-06 2019-09-09 58732.563889 58735.672917 2019-06-25 58659.011111
+3961754oi_dkc.fits 2019-09-06 2019-09-09 58732.579167 58735.672917 2019-06-26 58660.284722
+3961729ai_dkc.fits 2019-09-06 2019-09-09 58732.561806 58735.672917 2019-06-26 58660.839583
+3961758ri_dkc.fits 2019-09-06 2019-09-09 58732.581944 58735.672917 2019-06-27 58661.590278
+3961712li_dkc.fits 2019-09-06 2019-09-09 58732.55 58735.672917 2019-06-29 58663.0
+3961716pi_dkc.fits 2019-09-06 2019-09-09 58732.552778 58735.672917 2019-06-30 58664.015278
+39617079i_dkc.fits 2019-09-06 2019-09-09 58732.546528 58735.672917 2019-07-01 58665.0
+39617383i_dkc.fits 2019-09-06 2019-09-09 58732.568056 58735.672917 2019-07-01 58665.490972
+3961729mi_dkc.fits 2019-09-06 2019-09-09 58732.561806 58735.672917 2019-07-02 58666.80625
+3961654qi_dkc.fits 2019-09-06 2019-09-09 58732.5375 58735.672917 2019-07-03 58667.3375
+3961703ti_dkc.fits 2019-09-06 2019-09-09 58732.544444 58735.672917 2019-07-05 58669.0
+3961650ri_dkc.fits 2019-09-06 2019-09-09 58732.535417 58735.672917 2019-07-06 58670.00625
+3961721ai_dkc.fits 2019-09-06 2019-09-09 58732.55625 58735.672917 2019-07-07 58671.097917
+3961709oi_dkc.fits 2019-09-06 2019-09-09 58732.547917 58735.672917 2019-07-08 58672.023611
+3961709bi_dkc.fits 2019-09-06 2019-09-09 58732.547917 58735.672917 2019-07-09 58673.083333
+3961658pi_dkc.fits 2019-09-06 2019-09-09 58732.540278 58735.672917 2019-07-12 58676.183333
+39617034i_dkc.fits 2019-09-06 2019-09-09 58732.54375 58735.672917 2019-07-14 58678.008333
+3961738ei_dkc.fits 2019-09-06 2019-09-09 58732.568056 58735.672917 2019-07-15 58679.045833
+3961655ni_dkc.fits 2019-09-06 2019-09-09 58732.538194 58735.672917 2019-07-16 58680.192361
+39617504i_dkc.fits 2019-09-06 2019-09-09 58732.576389 58735.672917 2019-07-17 58681.166667
+39616495i_dkc.fits 2019-09-06 2019-09-09 58732.534028 58735.672917 2019-07-18 58682.086806
+39617486i_dkc.fits 2019-09-06 2019-09-09 58732.575 58735.672917 2019-07-19 58683.355556
+39617398i_dkc.fits 2019-09-06 2019-09-09 58732.56875 58735.672917 2019-07-20 58684.10625
+3961724gi_dkc.fits 2019-09-06 2019-09-09 58732.558333 58735.672917 2019-07-21 58685.175694
+3961723bi_dkc.fits 2019-09-06 2019-09-09 58732.557639 58735.672917 2019-07-22 58686.234722
+39617435i_dkc.fits 2019-09-06 2019-09-09 58732.571528 58735.672917 2019-07-23 58687.0
+3961651ni_dkc.fits 2019-09-06 2019-09-09 58732.535417 58735.672917 2019-07-24 58688.048611
+3961647ei_dkc.fits 2019-09-06 2019-09-09 58732.532639 58735.672917 2019-07-25 58689.170833
+39616540i_dkc.fits 2019-09-06 2019-09-09 58732.5375 58735.672917 2019-07-26 58690.026389
+3961735li_dkc.fits 2019-09-06 2019-09-09 58732.565972 58735.672917 2019-07-27 58691.154861
+3961719li_dkc.fits 2019-09-06 2019-09-09 58732.554861 58735.672917 2019-07-28 58692.014583
+3961736si_dkc.fits 2019-09-06 2019-09-09 58732.567361 58735.672917 2019-07-29 58693.755556
+3961731bi_dkc.fits 2019-09-06 2019-09-09 58732.563194 58735.672917 2019-07-30 58694.129861
+39616566i_dkc.fits 2019-09-06 2019-09-09 58732.538889 58735.672917 2019-07-31 58695.0
+3961706ri_dkc.fits 2019-09-06 2019-09-09 58732.545833 58735.672917 2019-08-01 58696.083333
+3961747oi_dkc.fits 2019-09-06 2019-09-09 58732.574306 58735.672917 2019-08-02 58697.059722
+39617062i_dkc.fits 2019-09-06 2019-09-09 58732.545833 58735.672917 2019-08-05 58700.580556
+39617379i_dkc.fits 2019-09-06 2019-09-09 58732.567361 58735.672917 2019-08-08 58703.095833
+39617364i_dkc.fits 2019-09-06 2019-09-09 58732.566667 58735.672917 2019-08-09 58704.002778
+3961720gi_dkc.fits 2019-09-06 2019-09-09 58732.555556 58735.672917 2019-08-10 58705.0
+3961704oi_dkc.fits 2019-09-06 2019-09-09 58732.544444 58735.672917 2019-08-11 58706.277778
+3961656ji_dkc.fits 2019-09-06 2019-09-09 58732.538889 58735.672917 2019-08-12 58707.020833
+39617562i_dkc.fits 2019-09-06 2019-09-09 58732.580556 58735.672917 2019-08-13 58708.002778
+3961658ci_dkc.fits 2019-09-06 2019-09-09 58732.540278 58735.672917 2019-08-14 58709.095833
+3961720si_dkc.fits 2019-09-06 2019-09-09 58732.55625 58735.672917 2019-08-15 58710.384028
+3961715ii_dkc.fits 2019-09-06 2019-09-09 58732.552083 58735.672917 2019-08-16 58711.175694
+39617155i_dkc.fits 2019-09-06 2019-09-09 58732.552083 58735.672917 2019-08-17 58712.047222
+3961725ni_dkc.fits 2019-09-06 2019-09-09 58732.559028 58735.672917 2019-08-17 58712.688889
+39617325i_dkc.fits 2019-09-06 2019-09-09 58732.563889 58735.672917 2019-08-19 58714.020833
+3961750ri_dkc.fits 2019-09-06 2019-09-09 58732.576389 58735.672917 2019-08-20 58715.008333
+3961644ri_dkc.fits 2019-09-06 2019-09-09 58732.530556 58735.672917 2019-08-21 58716.002778
+3961743hi_dkc.fits 2019-09-06 2019-09-09 58732.571528 58735.672917 2019-08-22 58717.0
+3961726ti_dkc.fits 2019-09-06 2019-09-09 58732.560417 58735.672917 2019-08-22 58717.605556
+3961802ei_dkc.fits 2019-09-06 2019-09-09 58732.584722 58735.672917 2019-08-24 58719.0
+39617453i_dkc.fits 2019-09-06 2019-09-09 58732.572917 58735.672917 2019-08-25 58720.002778
+39616532i_dkc.fits 2019-09-06 2019-09-09 58732.536806 58735.672917 2019-08-26 58721.121528
+3961730hi_dkc.fits 2019-09-06 2019-09-09 58732.5625 58735.672917 2019-08-26 58721.967361
+3961802qi_dkc.fits 2019-09-06 2019-09-09 58732.584722 58735.672917 2019-08-27 58722.821528
+3961732si_dkc.fits 2019-09-06 2019-09-09 58732.564583 58735.672917 2019-08-28 58723.833333
+3961718qi_dkc.fits 2019-09-06 2019-09-09 58732.554167 58735.672917 2019-08-29 58724.826389
+3aa18525i_dkc.fits 2019-10-10 2019-10-10 58766.619444 58766.6375 2019-09-04 58730.767361
+3aa1856ji_dkc.fits 2019-10-10 2019-10-10 58766.622222 58766.6375 2019-09-07 58733.010417
+3aa1854ri_dkc.fits 2019-10-10 2019-10-10 58766.621528 58766.6375 2019-09-08 58734.0
+3aa18589i_dkc.fits 2019-10-10 2019-10-10 58766.623611 58766.6375 2019-09-09 58735.195139
+3aa1851li_dkc.fits 2019-10-10 2019-10-10 58766.61875 58766.6375 2019-09-10 58736.083333
+3aa1852ai_dkc.fits 2019-10-10 2019-10-10 58766.619444 58766.6375 2019-09-11 58737.0
+3aa18580i_dkc.fits 2019-10-10 2019-10-10 58766.623611 58766.6375 2019-09-12 58738.104167
+3aa18534i_dkc.fits 2019-10-10 2019-10-10 58766.620139 58766.6375 2019-09-13 58739.173611
+3aa1850ii_dkc.fits 2019-10-10 2019-10-10 58766.618056 58766.6375 2019-09-14 58740.020139
+3aa1855hi_dkc.fits 2019-10-10 2019-10-10 58766.621528 58766.6375 2019-09-15 58741.0125
+3aa18558i_dkc.fits 2019-10-10 2019-10-10 58766.621528 58766.6375 2019-09-16 58742.358333
+3aa1857hi_dkc.fits 2019-10-10 2019-10-10 58766.622917 58766.6375 2019-09-17 58743.0
+3aa18521i_dkc.fits 2019-10-10 2019-10-10 58766.619444 58766.6375 2019-09-18 58744.006944
+3aa18530i_dkc.fits 2019-10-10 2019-10-10 58766.620139 58766.6375 2019-09-19 58745.164583
+3aa1855ci_dkc.fits 2019-10-10 2019-10-10 58766.621528 58766.6375 2019-09-20 58746.0
+3aa1857li_dkc.fits 2019-10-10 2019-10-10 58766.622917 58766.6375 2019-09-21 58747.0
+3aa1851gi_dkc.fits 2019-10-10 2019-10-10 58766.61875 58766.6375 2019-09-22 58748.206944
+3aa1856si_dkc.fits 2019-10-10 2019-10-10 58766.622917 58766.6375 2019-09-23 58749.074306
+3aa18561i_dkc.fits 2019-10-10 2019-10-10 58766.622222 58766.6375 2019-09-23 58749.846528
+3aa1856ai_dkc.fits 2019-10-10 2019-10-10 58766.622222 58766.6375 2019-09-25 58751.217361
+3aa1855qi_dkc.fits 2019-10-10 2019-10-10 58766.622222 58766.6375 2019-09-25 58751.445139
+3aa1857ci_dkc.fits 2019-10-10 2019-10-10 58766.622917 58766.6375 2019-09-27 58753.145139
+3aa1854mi_dkc.fits 2019-10-10 2019-10-10 58766.620833 58766.6375 2019-09-28 58754.809028
+3aa1853ji_dkc.fits 2019-10-10 2019-10-10 58766.620139 58766.6375 2019-09-30 58756.684028
+3b618316i_dkc.fits 2019-11-06 2019-11-07 58793.563194 58794.338889 2019-10-04 58760.265278
+3b61830li_dkc.fits 2019-11-06 2019-11-07 58793.5625 58794.338889 2019-10-06 58762.0
+3b61828pi_dkc.fits 2019-11-06 2019-11-07 58793.561111 58794.338889 2019-10-07 58763.4375
+3b61827ai_dkc.fits 2019-11-06 2019-11-07 58793.560417 58794.338889 2019-10-07 58763.958333
+3b61828si_dkc.fits 2019-11-06 2019-11-07 58793.561806 58794.338889 2019-10-09 58765.208333
+3b618312i_dkc.fits 2019-11-06 2019-11-07 58793.563194 58794.338889 2019-10-10 58766.833333
+3b61828mi_dkc.fits 2019-11-06 2019-11-07 58793.561111 58794.338889 2019-10-11 58767.530556
+3b61827hi_dkc.fits 2019-11-06 2019-11-07 58793.560417 58794.338889 2019-10-12 58768.181944
+3b61830ei_dkc.fits 2019-11-06 2019-11-07 58793.5625 58794.338889 2019-10-13 58769.515278
+3b618320i_dkc.fits 2019-11-06 2019-11-07 58793.563889 58794.338889 2019-10-14 58770.094444
+3b61830ai_dkc.fits 2019-11-06 2019-11-07 58793.5625 58794.338889 2019-10-15 58771.017361
+3b61831qi_dkc.fits 2019-11-06 2019-11-07 58793.563194 58794.338889 2019-10-16 58772.046528
+3b618296i_dkc.fits 2019-11-06 2019-11-07 58793.561806 58794.338889 2019-10-17 58773.415972
+3b61828ii_dkc.fits 2019-11-06 2019-11-07 58793.561111 58794.338889 2019-10-18 58774.148611
+3b61829ji_dkc.fits 2019-11-06 2019-11-07 58793.561806 58794.338889 2019-10-19 58775.00625
+3b61831gi_dkc.fits 2019-11-06 2019-11-07 58793.563194 58794.338889 2019-10-20 58776.0875
+3b618271i_dkc.fits 2019-11-06 2019-11-07 58793.560417 58794.338889 2019-10-21 58777.317361
+3b61831di_dkc.fits 2019-11-06 2019-11-07 58793.563194 58794.338889 2019-10-22 58778.183333
+3b61829di_dkc.fits 2019-11-06 2019-11-07 58793.561806 58794.338889 2019-10-23 58779.193056
+3b61827ri_dkc.fits 2019-11-06 2019-11-07 58793.560417 58794.338889 2019-10-24 58780.177778
+3b618276i_dkc.fits 2019-11-06 2019-11-07 58793.560417 58794.338889 2019-10-25 58781.284722
+3b618299i_dkc.fits 2019-11-06 2019-11-07 58793.561806 58794.338889 2019-10-26 58782.004861
+3c61712ci_dkc.fits 2019-12-06 2019-12-06 58823.508333 58823.6 2019-10-31 58787.711111
+3c617139i_dkc.fits 2019-12-06 2019-12-06 58823.509028 58823.6 2019-11-03 58790.019444
+3c61712li_dkc.fits 2019-12-06 2019-12-06 58823.508333 58823.6 2019-11-04 58791.020833
+3c61712fi_dkc.fits 2019-12-06 2019-12-06 58823.508333 58823.6 2019-11-05 58792.002778
+3c61715oi_dkc.fits 2019-12-06 2019-12-06 58823.510417 58823.6 2019-11-06 58793.009028
+3c617124i_dkc.fits 2019-12-06 2019-12-06 58823.508333 58823.6 2019-11-07 58794.002778
+3c617156i_dkc.fits 2019-12-06 2019-12-06 58823.510417 58823.6 2019-11-08 58795.0
+3c617133i_dkc.fits 2019-12-06 2019-12-06 58823.509028 58823.6 2019-11-09 58796.400694
+3c61714ti_dkc.fits 2019-12-06 2019-12-06 58823.510417 58823.6 2019-11-11 58798.392361
+3c61715ri_dkc.fits 2019-12-06 2019-12-06 58823.510417 58823.6 2019-11-13 58800.011111
+3c617163i_dkc.fits 2019-12-06 2019-12-06 58823.511111 58823.6 2019-11-14 58801.0
+3c61715li_dkc.fits 2019-12-06 2019-12-06 58823.510417 58823.6 2019-11-15 58802.00625
+3c61713hi_dkc.fits 2019-12-06 2019-12-06 58823.509028 58823.6 2019-11-16 58803.066667
+3c617121i_dkc.fits 2019-12-06 2019-12-06 58823.508333 58823.6 2019-11-17 58804.729167
+3c61714ni_dkc.fits 2019-12-06 2019-12-06 58823.509722 58823.6 2019-11-19 58806.190972
+3c61713di_dkc.fits 2019-12-06 2019-12-06 58823.509028 58823.6 2019-11-20 58807.0
+3c61712ii_dkc.fits 2019-12-06 2019-12-06 58823.508333 58823.6 2019-11-21 58808.021528
+3c617144i_dkc.fits 2019-12-06 2019-12-06 58823.509722 58823.6 2019-11-22 58809.0
+3c617160i_dkc.fits 2019-12-06 2019-12-06 58823.511111 58823.6 2019-11-23 58810.0
+3c617153i_dkc.fits 2019-12-06 2019-12-06 58823.510417 58823.6 2019-11-24 58811.055556
+41f20483i_dkc.fits 2020-01-15 2020-01-16 58863.658333 58864.395139 2019-11-27 58814.575694
+41f21073i_dkc.fits 2020-01-15 2020-01-16 58863.671528 58864.395139 2019-11-30 58817.045833
+41f2104fi_dkc.fits 2020-01-15 2020-01-16 58863.670139 58864.395139 2019-12-01 58818.172222
+41f2055fi_dkc.fits 2020-01-15 2020-01-16 58863.663889 58864.395139 2019-12-02 58819.198611
+41f2108ni_dkc.fits 2020-01-15 2020-01-16 58863.672917 58864.395139 2019-12-02 58819.504167
+41f2100oi_dkc.fits 2020-01-15 2020-01-16 58863.667361 58864.395139 2019-12-04 58821.856944
+41f2050gi_dkc.fits 2020-01-15 2020-01-16 58863.660417 58864.395139 2019-12-06 58823.00625
+41f2113gi_dkc.fits 2020-01-15 2020-01-16 58863.676389 58864.395139 2019-12-07 58824.397222
+41f2105di_dkc.fits 2020-01-15 2020-01-16 58863.670833 58864.395139 2019-12-09 58826.316667
+41f2053pi_dkc.fits 2020-01-15 2020-01-16 58863.6625 58864.395139 2019-12-11 58828.04375
+41f21039i_dkc.fits 2020-01-15 2020-01-16 58863.669444 58864.395139 2019-12-11 58828.310417
+41f21116i_dkc.fits 2020-01-15 2020-01-16 58863.674306 58864.395139 2019-12-13 58830.314583
+41f2049mi_dkc.fits 2020-01-15 2020-01-16 58863.659722 58864.395139 2019-12-15 58832.0125
+41f20479i_dkc.fits 2020-01-15 2020-01-16 58863.658333 58864.395139 2019-12-15 58832.336806
+41f20531i_dkc.fits 2020-01-15 2020-01-16 58863.661806 58864.395139 2019-12-18 58835.006944
+41f21068i_dkc.fits 2020-01-15 2020-01-16 58863.671528 58864.395139 2019-12-19 58836.072222
+41f2111ti_dkc.fits 2020-01-15 2020-01-16 58863.675 58864.395139 2019-12-20 58837.882639
+41f2107si_dkc.fits 2020-01-15 2020-01-16 58863.672222 58864.395139 2019-12-22 58839.011806
+41f2054ki_dkc.fits 2020-01-15 2020-01-16 58863.663194 58864.395139 2019-12-23 58840.252778
+41o1714ai_dkc.fits 2020-01-24 2020-01-24 58872.509722 58872.605556 2019-12-26 58843.338194
+41o1711ii_dkc.fits 2020-01-24 2020-01-24 58872.507639 58872.605556 2019-12-28 58845.0
+41o1712ei_dkc.fits 2020-01-24 2020-01-24 58872.508333 58872.605556 2019-12-29 58846.120833
+41o1714di_dkc.fits 2020-01-24 2020-01-24 58872.509722 58872.605556 2019-12-30 58847.208333
+41o1711ci_dkc.fits 2020-01-24 2020-01-24 58872.507639 58872.605556 2019-12-31 58848.05
+41o17153i_dkc.fits 2020-01-24 2020-01-24 58872.510417 58872.605556 2020-01-01 58849.125
+41o1712ti_dkc.fits 2020-01-24 2020-01-24 58872.509028 58872.605556 2020-01-02 58850.166667
+41o1710ri_dkc.fits 2020-01-24 2020-01-24 58872.506944 58872.605556 2020-01-03 58851.175694
+41o1713hi_dkc.fits 2020-01-24 2020-01-24 58872.509028 58872.605556 2020-01-04 58852.002778
+41o17124i_dkc.fits 2020-01-24 2020-01-24 58872.508333 58872.605556 2020-01-05 58853.346528
+41o1712ki_dkc.fits 2020-01-24 2020-01-24 58872.508333 58872.605556 2020-01-06 58854.477778
+41o17140i_dkc.fits 2020-01-24 2020-01-24 58872.509722 58872.605556 2020-01-07 58855.607639
+41o17144i_dkc.fits 2020-01-24 2020-01-24 58872.509722 58872.605556 2020-01-08 58856.142361
+41o17147i_dkc.fits 2020-01-24 2020-01-24 58872.509722 58872.605556 2020-01-09 58857.454861
+41o1712ni_dkc.fits 2020-01-24 2020-01-24 58872.508333 58872.605556 2020-01-09 58857.990278
+41o17150i_dkc.fits 2020-01-24 2020-01-24 58872.510417 58872.605556 2020-01-11 58859.00625
+41o1710oi_dkc.fits 2020-01-24 2020-01-24 58872.506944 58872.605556 2020-01-12 58860.040278
+41o1713oi_dkc.fits 2020-01-24 2020-01-24 58872.509028 58872.605556 2020-01-13 58861.216667
+41o17110i_dkc.fits 2020-01-24 2020-01-24 58872.507639 58872.605556 2020-01-14 58862.00625
+41o1713ri_dkc.fits 2020-01-24 2020-01-24 58872.509028 58872.605556 2020-01-15 58863.0
+41o1714ri_dkc.fits 2020-01-24 2020-01-24 58872.509722 58872.605556 2020-01-16 58864.016667
+41o1714gi_dkc.fits 2020-01-24 2020-01-24 58872.509722 58872.605556 2020-01-17 58865.190972
+43b1646fi_dkc.fits 2020-03-11 2020-03-11 58919.531944 58919.647917 2020-01-20 58868.647917
+43b1652bi_dkc.fits 2020-03-11 2020-03-11 58919.536111 58919.647917 2020-01-22 58870.583333
+43b16475i_dkc.fits 2020-03-11 2020-03-11 58919.532639 58919.647917 2020-01-24 58872.009028
+43b1649ci_dkc.fits 2020-03-11 2020-03-11 58919.534028 58919.647917 2020-01-24 58872.338889
+43b16503i_dkc.fits 2020-03-11 2020-03-11 58919.534722 58919.647917 2020-01-25 58873.4375
+43b1650ki_dkc.fits 2020-03-11 2020-03-11 58919.534722 58919.647917 2020-01-27 58875.14375
+43b16514i_dkc.fits 2020-03-11 2020-03-11 58919.535417 58919.647917 2020-01-28 58876.002778
+43b1647ni_dkc.fits 2020-03-11 2020-03-11 58919.532639 58919.647917 2020-01-29 58877.027083
+43b1651ci_dkc.fits 2020-03-11 2020-03-11 58919.535417 58919.647917 2020-01-30 58878.048611
+43b16518i_dkc.fits 2020-03-11 2020-03-11 58919.535417 58919.647917 2020-01-31 58879.040972
+43b16523i_dkc.fits 2020-03-11 2020-03-11 58919.536111 58919.647917 2020-02-01 58880.041667
+43b1646ri_dkc.fits 2020-03-11 2020-03-11 58919.531944 58919.647917 2020-02-02 58881.0
+43b1646bi_dkc.fits 2020-03-11 2020-03-11 58919.531944 58919.647917 2020-02-03 58882.088889
+43b1650ci_dkc.fits 2020-03-11 2020-03-11 58919.534722 58919.647917 2020-02-04 58883.696528
+43b1651ki_dkc.fits 2020-03-11 2020-03-11 58919.535417 58919.647917 2020-02-06 58885.0
+43b1650ti_dkc.fits 2020-03-11 2020-03-11 58919.535417 58919.647917 2020-02-07 58886.194444
+43b1648oi_dkc.fits 2020-03-11 2020-03-11 58919.533333 58919.647917 2020-02-08 58887.024306
+43b16463i_dkc.fits 2020-03-11 2020-03-11 58919.531944 58919.647917 2020-02-09 58888.0125
+43b1651ti_dkc.fits 2020-03-11 2020-03-11 58919.536111 58919.647917 2020-02-10 58889.229167
+43b1649ki_dkc.fits 2020-03-11 2020-03-11 58919.534028 58919.647917 2020-02-10 58889.333333
+43b16467i_dkc.fits 2020-03-11 2020-03-11 58919.531944 58919.647917 2020-02-11 58890.304167
+43b1649gi_dkc.fits 2020-03-11 2020-03-11 58919.534028 58919.647917 2020-02-12 58891.322222
+43b1649ti_dkc.fits 2020-03-11 2020-03-11 58919.534722 58919.647917 2020-02-13 58892.701389
+43b1648ti_dkc.fits 2020-03-11 2020-03-11 58919.534028 58919.647917 2020-02-14 58893.872222
+43b1648ai_dkc.fits 2020-03-11 2020-03-11 58919.533333 58919.647917 2020-02-15 58894.475
+43b1651pi_dkc.fits 2020-03-11 2020-03-11 58919.535417 58919.647917 2020-02-16 58895.467361
+43p19071i_dkc.fits 2020-03-25 2020-03-25 58933.629861 58933.672222 2020-02-19 58898.903472
+43p1906oi_dkc.fits 2020-03-25 2020-03-25 58933.629167 58933.672222 2020-02-22 58901.149306
+43p19082i_dkc.fits 2020-03-25 2020-03-25 58933.630556 58933.672222 2020-02-23 58902.0
+43p19064i_dkc.fits 2020-03-25 2020-03-25 58933.629167 58933.672222 2020-02-24 58903.020833
+43p1906hi_dkc.fits 2020-03-25 2020-03-25 58933.629167 58933.672222 2020-02-25 58904.200694
+43p1906si_dkc.fits 2020-03-25 2020-03-25 58933.629861 58933.672222 2020-02-26 58905.0
+43p1909li_dkc.fits 2020-03-25 2020-03-25 58933.63125 58933.672222 2020-02-27 58906.0
+43p19097i_dkc.fits 2020-03-25 2020-03-25 58933.63125 58933.672222 2020-02-28 58907.760417
+43p1909ei_dkc.fits 2020-03-25 2020-03-25 58933.63125 58933.672222 2020-03-01 58909.0
+43p19101i_dkc.fits 2020-03-25 2020-03-25 58933.631944 58933.672222 2020-03-02 58910.027083
+43p1910fi_dkc.fits 2020-03-25 2020-03-25 58933.631944 58933.672222 2020-03-03 58911.0
+43p19119i_dkc.fits 2020-03-25 2020-03-25 58933.632639 58933.672222 2020-03-04 58912.002778
+43p1908ri_dkc.fits 2020-03-25 2020-03-25 58933.630556 58933.672222 2020-03-04 58912.584722
+43p19104i_dkc.fits 2020-03-25 2020-03-25 58933.631944 58933.672222 2020-03-06 58914.145833
+43p1907si_dkc.fits 2020-03-25 2020-03-25 58933.630556 58933.672222 2020-03-07 58915.108333
+43p1907bi_dkc.fits 2020-03-25 2020-03-25 58933.629861 58933.672222 2020-03-08 58916.03125
+43p1908ji_dkc.fits 2020-03-25 2020-03-25 58933.630556 58933.672222 2020-03-09 58917.113889
+43p19078i_dkc.fits 2020-03-25 2020-03-25 58933.629861 58933.672222 2020-03-10 58918.0375
+43p1906ei_dkc.fits 2020-03-25 2020-03-25 58933.629167 58933.672222 2020-03-11 58919.017361
+43p19067i_dkc.fits 2020-03-25 2020-03-25 58933.629167 58933.672222 2020-03-12 58920.004167
+43p1906li_dkc.fits 2020-03-25 2020-03-25 58933.629167 58933.672222 2020-03-13 58921.023611
+43p19115i_dkc.fits 2020-03-25 2020-03-25 58933.632639 58933.672222 2020-03-14 58922.016667
+43p1909oi_dkc.fits 2020-03-25 2020-03-25 58933.63125 58933.672222 2020-03-15 58923.047917
+43p1908gi_dkc.fits 2020-03-25 2020-03-25 58933.630556 58933.672222 2020-03-16 58924.383333
+44k2053ci_dkc.fits 2020-04-20 2020-04-21 58959.703472 58960.445139 2020-03-19 58927.6625
+44k20500i_dkc.fits 2020-04-20 2020-04-21 58959.701389 58960.445139 2020-03-21 58929.888194
+44k2050ji_dkc.fits 2020-04-20 2020-04-21 58959.701389 58960.445139 2020-03-22 58930.470139
+44k20481i_dkc.fits 2020-04-20 2020-04-21 58959.7 58960.445139 2020-03-23 58931.345139
+44k2048fi_dkc.fits 2020-04-20 2020-04-21 58959.7 58960.445139 2020-03-24 58932.625
+44k2049li_dkc.fits 2020-04-20 2020-04-21 58959.700694 58960.445139 2020-03-25 58933.573611
+44k2050oi_dkc.fits 2020-04-20 2020-04-21 58959.701389 58960.445139 2020-03-26 58934.345139
+44k2054di_dkc.fits 2020-04-20 2020-04-21 58959.704167 58960.445139 2020-03-27 58935.811111
+44k20520i_dkc.fits 2020-04-20 2020-04-21 58959.702778 58960.445139 2020-03-28 58936.836806
+44k2047mi_dkc.fits 2020-04-20 2020-04-21 58959.699306 58960.445139 2020-03-30 58938.0
+44k20513i_dkc.fits 2020-04-20 2020-04-21 58959.702083 58960.445139 2020-03-31 58939.0
+44k2047qi_dkc.fits 2020-04-20 2020-04-21 58959.699306 58960.445139 2020-04-01 58940.053472
+44k2053pi_dkc.fits 2020-04-20 2020-04-21 58959.703472 58960.445139 2020-04-02 58941.0
+44k2050fi_dkc.fits 2020-04-20 2020-04-21 58959.701389 58960.445139 2020-04-03 58942.019444
+44k2049ci_dkc.fits 2020-04-20 2020-04-21 58959.700694 58960.445139 2020-04-04 58943.00625
+44k20544i_dkc.fits 2020-04-20 2020-04-21 58959.704167 58960.445139 2020-04-05 58944.002778
+44k20548i_dkc.fits 2020-04-20 2020-04-21 58959.704167 58960.445139 2020-04-06 58945.061806
+44k20518i_dkc.fits 2020-04-20 2020-04-21 58959.702083 58960.445139 2020-04-07 58946.00625
+44k2049pi_dkc.fits 2020-04-20 2020-04-21 58959.700694 58960.445139 2020-04-08 58947.074306
+44k2052ni_dkc.fits 2020-04-20 2020-04-21 58959.702778 58960.445139 2020-04-09 58948.104861
+44k20532i_dkc.fits 2020-04-20 2020-04-21 58959.703472 58960.445139 2020-04-10 58949.00625
+44k20505i_dkc.fits 2020-04-20 2020-04-21 58959.701389 58960.445139 2020-04-11 58950.154167
+44k20540i_dkc.fits 2020-04-20 2020-04-21 58959.704167 58960.445139 2020-04-12 58951.076389
+44k2046ti_dkc.fits 2020-04-20 2020-04-21 58959.699306 58960.445139 2020-04-13 58952.029861
+44k2051hi_dkc.fits 2020-04-20 2020-04-21 58959.702083 58960.445139 2020-04-14 58953.0
+45m1823si_dkc.fits 2020-05-22 2020-05-22 58991.599306 58991.661806 2020-04-16 58955.64375
+45m18256i_dkc.fits 2020-05-22 2020-05-22 58991.600694 58991.661806 2020-04-19 58958.081944
+45m18246i_dkc.fits 2020-05-22 2020-05-22 58991.6 58991.661806 2020-04-20 58959.316667
+45m1825pi_dkc.fits 2020-05-22 2020-05-22 58991.600694 58991.661806 2020-04-21 58960.308333
+45m1821mi_dkc.fits 2020-05-22 2020-05-22 58991.597917 58991.661806 2020-04-23 58962.195139
+45m1824si_dkc.fits 2020-05-22 2020-05-22 58991.6 58991.661806 2020-04-24 58963.13125
+45m1824pi_dkc.fits 2020-05-22 2020-05-22 58991.6 58991.661806 2020-04-25 58964.138194
+45m1823pi_dkc.fits 2020-05-22 2020-05-22 58991.599306 58991.661806 2020-04-26 58965.029861
+45m1822ai_dkc.fits 2020-05-22 2020-05-22 58991.598611 58991.661806 2020-04-27 58966.022222
+45m1825ci_dkc.fits 2020-05-22 2020-05-22 58991.600694 58991.661806 2020-04-28 58967.109722
+45m1822fi_dkc.fits 2020-05-22 2020-05-22 58991.598611 58991.661806 2020-04-29 58968.009722
+45m18225i_dkc.fits 2020-05-22 2020-05-22 58991.598611 58991.661806 2020-04-30 58969.0
+45m1822ni_dkc.fits 2020-05-22 2020-05-22 58991.598611 58991.661806 2020-05-01 58970.011111
+45m1824ki_dkc.fits 2020-05-22 2020-05-22 58991.6 58991.661806 2020-05-02 58971.0
+45m1825ni_dkc.fits 2020-05-22 2020-05-22 58991.600694 58991.661806 2020-05-03 58972.002778
+45m1825ki_dkc.fits 2020-05-22 2020-05-22 58991.600694 58991.661806 2020-05-04 58973.061806
+45m18236i_dkc.fits 2020-05-22 2020-05-22 58991.599306 58991.661806 2020-05-05 58974.498611
+45m1825fi_dkc.fits 2020-05-22 2020-05-22 58991.600694 58991.661806 2020-05-06 58975.5
+45m1824ni_dkc.fits 2020-05-22 2020-05-22 58991.6 58991.661806 2020-05-07 58976.625
+45m1825hi_dkc.fits 2020-05-22 2020-05-22 58991.600694 58991.661806 2020-05-08 58977.35625
+45m18241i_dkc.fits 2020-05-22 2020-05-22 58991.6 58991.661806 2020-05-09 58978.583333
+45m18231i_dkc.fits 2020-05-22 2020-05-22 58991.599306 58991.661806 2020-05-10 58979.50625
+45m1822ki_dkc.fits 2020-05-22 2020-05-22 58991.598611 58991.661806 2020-05-12 58981.252778
+45m1822ti_dkc.fits 2020-05-22 2020-05-22 58991.599306 58991.661806 2020-05-13 58982.178472
+46g15413i_dkc.fits 2020-06-16 2020-06-16 59016.486806 59016.595833 2020-05-16 58985.138889
+46g1544di_dkc.fits 2020-06-16 2020-06-16 59016.488889 59016.595833 2020-05-18 58987.0
+46g15441i_dkc.fits 2020-06-16 2020-06-16 59016.488889 59016.595833 2020-05-19 58988.221528
+46g15459i_dkc.fits 2020-06-16 2020-06-16 59016.489583 59016.595833 2020-05-20 58989.458333
+46g1543mi_dkc.fits 2020-06-16 2020-06-16 59016.488194 59016.595833 2020-05-21 58990.0
+46g1544ii_dkc.fits 2020-06-16 2020-06-16 59016.488889 59016.595833 2020-05-22 58991.007639
+46g1542di_dkc.fits 2020-06-16 2020-06-16 59016.4875 59016.595833 2020-05-23 58992.002778
+46g15450i_dkc.fits 2020-06-16 2020-06-16 59016.489583 59016.595833 2020-05-24 58993.0
+46g15424i_dkc.fits 2020-06-16 2020-06-16 59016.4875 59016.595833 2020-05-25 58994.027083
+46g15449i_dkc.fits 2020-06-16 2020-06-16 59016.488889 59016.595833 2020-05-26 58995.199306
+46g15417i_dkc.fits 2020-06-16 2020-06-16 59016.486806 59016.595833 2020-05-27 58996.040972
+46g1540oi_dkc.fits 2020-06-16 2020-06-16 59016.486111 59016.595833 2020-05-28 58997.00625
+46g1539ri_dkc.fits 2020-06-16 2020-06-16 59016.486111 59016.595833 2020-05-29 58998.215972
+46g15435i_dkc.fits 2020-06-16 2020-06-16 59016.488194 59016.595833 2020-05-30 58999.0
+46g1545pi_dkc.fits 2020-06-16 2020-06-16 59016.489583 59016.595833 2020-05-31 59000.009028
+46g1541gi_dkc.fits 2020-06-16 2020-06-16 59016.486806 59016.595833 2020-06-01 59001.020833
+46g15460i_dkc.fits 2020-06-16 2020-06-16 59016.490278 59016.595833 2020-06-02 59002.069444
+46g1544qi_dkc.fits 2020-06-16 2020-06-16 59016.488889 59016.595833 2020-06-03 59003.034028
+46g1540bi_dkc.fits 2020-06-16 2020-06-16 59016.486111 59016.595833 2020-06-04 59004.104167
+46g15402i_dkc.fits 2020-06-16 2020-06-16 59016.486111 59016.595833 2020-06-05 59005.0
+46g1545li_dkc.fits 2020-06-16 2020-06-16 59016.489583 59016.595833 2020-06-06 59006.093056
+46g1542hi_dkc.fits 2020-06-16 2020-06-16 59016.4875 59016.595833 2020-06-07 59007.356944
+46g1542li_dkc.fits 2020-06-16 2020-06-16 59016.4875 59016.595833 2020-06-08 59008.420139
+46g1543di_dkc.fits 2020-06-16 2020-06-16 59016.488194 59016.595833 2020-06-09 59009.00625
+47f1752ci_dkc.fits 2020-07-15 2020-07-15 59045.577778 59045.605556 2020-06-12 59012.504861
+47f17514i_dkc.fits 2020-07-15 2020-07-15 59045.577083 59045.605556 2020-06-15 59015.051389
+47f17520i_dkc.fits 2020-07-15 2020-07-15 59045.577778 59045.605556 2020-06-16 59016.149306
+47f1751ei_dkc.fits 2020-07-15 2020-07-15 59045.577083 59045.605556 2020-06-16 59016.185417
+47f1751ki_dkc.fits 2020-07-15 2020-07-15 59045.577083 59045.605556 2020-06-17 59017.277778
+47f1753hi_dkc.fits 2020-07-15 2020-07-15 59045.578472 59045.605556 2020-06-19 59019.127083
+47f17529i_dkc.fits 2020-07-15 2020-07-15 59045.577778 59045.605556 2020-06-19 59019.194444
+47f17510i_dkc.fits 2020-07-15 2020-07-15 59045.577083 59045.605556 2020-06-21 59021.381944
+47f1754ii_dkc.fits 2020-07-15 2020-07-15 59045.579167 59045.605556 2020-06-23 59023.0
+47f1752si_dkc.fits 2020-07-15 2020-07-15 59045.578472 59045.605556 2020-06-24 59024.022222
+47f1752ji_dkc.fits 2020-07-15 2020-07-15 59045.577778 59045.605556 2020-06-25 59025.467361
+47f1752pi_dkc.fits 2020-07-15 2020-07-15 59045.577778 59045.605556 2020-06-27 59027.134028
+47f1753qi_dkc.fits 2020-07-15 2020-07-15 59045.578472 59045.605556 2020-06-27 59027.178472
+47f17523i_dkc.fits 2020-07-15 2020-07-15 59045.577778 59045.605556 2020-06-28 59028.197917
+47f1753ni_dkc.fits 2020-07-15 2020-07-15 59045.578472 59045.605556 2020-06-29 59029.185417
+47f17532i_dkc.fits 2020-07-15 2020-07-15 59045.578472 59045.605556 2020-07-01 59031.751389
+47f1751ri_dkc.fits 2020-07-15 2020-07-15 59045.577083 59045.605556 2020-07-03 59033.00625
+47f1753ki_dkc.fits 2020-07-15 2020-07-15 59045.578472 59045.605556 2020-07-04 59034.018056
+47f1754ci_dkc.fits 2020-07-15 2020-07-15 59045.579167 59045.605556 2020-07-05 59035.040972
+49b18394i_dkc.fits 2020-09-11 2020-09-14 59103.610417 59106.417361 2020-07-07 59037.676389
+49b1835ki_dkc.fits 2020-09-11 2020-09-14 59103.607639 59106.417361 2020-07-10 59040.030556
+49b18347i_dkc.fits 2020-09-11 2020-09-14 59103.606944 59106.417361 2020-07-11 59041.0
+49b1835ai_dkc.fits 2020-09-11 2020-09-14 59103.607639 59106.417361 2020-07-12 59042.00625
+49b1836li_dkc.fits 2020-09-11 2020-09-14 59103.608333 59106.417361 2020-07-13 59043.020833
+49b18412i_dkc.fits 2020-09-11 2020-09-14 59103.611806 59106.417361 2020-07-14 59044.065278
+49b1833ai_dkc.fits 2020-09-11 2020-09-14 59103.60625 59106.417361 2020-07-15 59045.122917
+49b18371i_dkc.fits 2020-09-11 2020-09-14 59103.609028 59106.417361 2020-07-16 59046.109028
+49b18358i_dkc.fits 2020-09-11 2020-09-14 59103.607639 59106.417361 2020-07-17 59047.0
+49b1835ni_dkc.fits 2020-09-11 2020-09-14 59103.607639 59106.417361 2020-07-18 59048.009028
+49b18352i_dkc.fits 2020-09-11 2020-09-14 59103.607639 59106.417361 2020-07-19 59049.0
+49b1832pi_dkc.fits 2020-09-11 2020-09-14 59103.605556 59106.417361 2020-07-20 59050.079861
+49b18381i_dkc.fits 2020-09-11 2020-09-14 59103.609722 59106.417361 2020-07-21 59051.056944
+49b1839oi_dkc.fits 2020-09-11 2020-09-14 59103.610417 59106.417361 2020-07-22 59052.002778
+49b1838qi_dkc.fits 2020-09-11 2020-09-14 59103.609722 59106.417361 2020-07-23 59053.127083
+49b18344i_dkc.fits 2020-09-11 2020-09-14 59103.606944 59106.417361 2020-07-24 59054.118056
+49b1837li_dkc.fits 2020-09-11 2020-09-14 59103.609028 59106.417361 2020-07-25 59055.032639
+49b18330i_dkc.fits 2020-09-11 2020-09-14 59103.60625 59106.417361 2020-07-26 59056.239583
+49b18363i_dkc.fits 2020-09-11 2020-09-14 59103.608333 59106.417361 2020-07-27 59057.276389
+49b18368i_dkc.fits 2020-09-11 2020-09-14 59103.608333 59106.417361 2020-07-27 59057.357639
+49b18388i_dkc.fits 2020-09-11 2020-09-14 59103.609722 59106.417361 2020-07-29 59059.23125
+49b18333i_dkc.fits 2020-09-11 2020-09-14 59103.60625 59106.417361 2020-07-30 59060.388194
+49b18376i_dkc.fits 2020-09-11 2020-09-14 59103.609028 59106.417361 2020-07-31 59061.379861
+49b1833ri_dkc.fits 2020-09-11 2020-09-14 59103.60625 59106.417361 2020-08-02 59063.023611
+49b1836bi_dkc.fits 2020-09-11 2020-09-14 59103.608333 59106.417361 2020-08-02 59063.420139
+49b1833ei_dkc.fits 2020-09-11 2020-09-14 59103.60625 59106.417361 2020-08-05 59066.829167
+49b1840li_dkc.fits 2020-09-11 2020-09-14 59103.611111 59106.417361 2020-08-08 59069.00625
+49b1836di_dkc.fits 2020-09-11 2020-09-14 59103.608333 59106.417361 2020-08-09 59070.688194
+49b1839ji_dkc.fits 2020-09-11 2020-09-14 59103.610417 59106.417361 2020-08-11 59072.056944
+49b18355i_dkc.fits 2020-09-11 2020-09-14 59103.607639 59106.417361 2020-08-12 59073.015972
+49b18335i_dkc.fits 2020-09-11 2020-09-14 59103.60625 59106.417361 2020-08-13 59074.008333
+49b1833gi_dkc.fits 2020-09-11 2020-09-14 59103.60625 59106.417361 2020-08-14 59075.010417
+49b1837bi_dkc.fits 2020-09-11 2020-09-14 59103.609028 59106.417361 2020-08-15 59076.058333
+49b18402i_dkc.fits 2020-09-11 2020-09-14 59103.611111 59106.417361 2020-08-16 59077.101389
+49b1838ei_dkc.fits 2020-09-11 2020-09-14 59103.609722 59106.417361 2020-08-17 59078.06875
+49b1837ni_dkc.fits 2020-09-11 2020-09-14 59103.609028 59106.417361 2020-08-18 59079.050694
+49b1839ti_dkc.fits 2020-09-11 2020-09-14 59103.611111 59106.417361 2020-08-19 59080.075694
+49b18386i_dkc.fits 2020-09-11 2020-09-14 59103.609722 59106.417361 2020-08-20 59081.053472
+49b1834ci_dkc.fits 2020-09-11 2020-09-14 59103.606944 59106.417361 2020-08-21 59082.093056
+49b1838ji_dkc.fits 2020-09-11 2020-09-14 59103.609722 59106.417361 2020-08-22 59083.159028
+49b1838gi_dkc.fits 2020-09-11 2020-09-14 59103.609722 59106.417361 2020-08-23 59084.067361
+49b18407i_dkc.fits 2020-09-11 2020-09-14 59103.611111 59106.417361 2020-08-24 59085.167361
+49b1840ii_dkc.fits 2020-09-11 2020-09-14 59103.611111 59106.417361 2020-08-24 59085.598611
+49b1839ri_dkc.fits 2020-09-11 2020-09-14 59103.610417 59106.417361 2020-08-26 59087.009722
+49b1839ci_dkc.fits 2020-09-11 2020-09-14 59103.610417 59106.417361 2020-08-27 59088.002778
+49b1836qi_dkc.fits 2020-09-11 2020-09-14 59103.608333 59106.417361 2020-08-28 59089.184028
+49b1833ji_dkc.fits 2020-09-11 2020-09-14 59103.60625 59106.417361 2020-08-29 59090.00625
+49b1838oi_dkc.fits 2020-09-11 2020-09-14 59103.609722 59106.417361 2020-08-30 59091.317361
+49b1834mi_dkc.fits 2020-09-11 2020-09-14 59103.606944 59106.417361 2020-08-31 59092.054167
+4a90049qi_dkc.fits 2020-10-08 2020-10-09 59130.867361 59131.535417 2020-09-03 59095.225
+4a900536i_dkc.fits 2020-10-08 2020-10-09 59130.870139 59131.535417 2020-09-05 59097.95625
+4a90049bi_dkc.fits 2020-10-08 2020-10-09 59130.867361 59131.535417 2020-09-07 59099.117361
+4a900529i_dkc.fits 2020-10-08 2020-10-09 59130.869444 59131.535417 2020-09-08 59100.002778
+4a90050ti_dkc.fits 2020-10-08 2020-10-09 59130.86875 59131.535417 2020-09-09 59101.209028
+4a900519i_dkc.fits 2020-10-08 2020-10-09 59130.86875 59131.535417 2020-09-09 59101.274306
+4a900504i_dkc.fits 2020-10-08 2020-10-09 59130.868056 59131.535417 2020-09-11 59103.017361
+4a90052qi_dkc.fits 2020-10-08 2020-10-09 59130.869444 59131.535417 2020-09-12 59104.013194
+4a900496i_dkc.fits 2020-10-08 2020-10-09 59130.867361 59131.535417 2020-09-13 59105.009028
+4a900527i_dkc.fits 2020-10-08 2020-10-09 59130.869444 59131.535417 2020-09-14 59106.006944
+4a900499i_dkc.fits 2020-10-08 2020-10-09 59130.867361 59131.535417 2020-09-15 59107.0
+4a90052li_dkc.fits 2020-10-08 2020-10-09 59130.869444 59131.535417 2020-09-16 59108.009028
+4a900516i_dkc.fits 2020-10-08 2020-10-09 59130.86875 59131.535417 2020-09-17 59109.0
+4a90049ii_dkc.fits 2020-10-08 2020-10-09 59130.867361 59131.535417 2020-09-18 59110.103472
+4a90049ni_dkc.fits 2020-10-08 2020-10-09 59130.867361 59131.535417 2020-09-19 59111.300694
+4a900506i_dkc.fits 2020-10-08 2020-10-09 59130.868056 59131.535417 2020-09-21 59113.020833
+4a90051qi_dkc.fits 2020-10-08 2020-10-09 59130.86875 59131.535417 2020-09-21 59113.795139
+4a90052ci_dkc.fits 2020-10-08 2020-10-09 59130.869444 59131.535417 2020-09-23 59115.150694
+4a90051ti_dkc.fits 2020-10-08 2020-10-09 59130.869444 59131.535417 2020-09-23 59115.3
+4a90051li_dkc.fits 2020-10-08 2020-10-09 59130.86875 59131.535417 2020-09-24 59116.807639
+4a90050ei_dkc.fits 2020-10-08 2020-10-09 59130.868056 59131.535417 2020-09-26 59118.152083
+4a90052ti_dkc.fits 2020-10-08 2020-10-09 59130.870139 59131.535417 2020-09-27 59119.223611
+4a90053bi_dkc.fits 2020-10-08 2020-10-09 59130.870139 59131.535417 2020-09-27 59119.608333
+4a90050gi_dkc.fits 2020-10-08 2020-10-09 59130.868056 59131.535417 2020-09-29 59121.15625
+4a90049gi_dkc.fits 2020-10-08 2020-10-09 59130.867361 59131.535417 2020-09-29 59121.320139
+4b517110i_dkc.fits 2020-11-05 2020-11-05 59158.507639 59158.5875 2020-10-03 59125.416667
+4b51710pi_dkc.fits 2020-11-05 2020-11-05 59158.506944 59158.5875 2020-10-05 59127.729861
+4b51708gi_dkc.fits 2020-11-05 2020-11-05 59158.505556 59158.5875 2020-10-07 59129.081944
+4b517086i_dkc.fits 2020-11-05 2020-11-05 59158.505556 59158.5875 2020-10-07 59129.113889
+4b51710fi_dkc.fits 2020-11-05 2020-11-05 59158.506944 59158.5875 2020-10-09 59131.175694
+4b517098i_dkc.fits 2020-11-05 2020-11-05 59158.50625 59158.5875 2020-10-11 59133.0
+4b51709fi_dkc.fits 2020-11-05 2020-11-05 59158.50625 59158.5875 2020-10-12 59134.006944
+4b51708ki_dkc.fits 2020-11-05 2020-11-05 59158.505556 59158.5875 2020-10-13 59135.00625
+4b51709ri_dkc.fits 2020-11-05 2020-11-05 59158.50625 59158.5875 2020-10-14 59136.002778
+4b51709hi_dkc.fits 2020-11-05 2020-11-05 59158.50625 59158.5875 2020-10-15 59137.088194
+4b517088i_dkc.fits 2020-11-05 2020-11-05 59158.505556 59158.5875 2020-10-15 59137.1
+4b51709mi_dkc.fits 2020-11-05 2020-11-05 59158.50625 59158.5875 2020-10-16 59138.672917
+4b51711ai_dkc.fits 2020-11-05 2020-11-05 59158.507639 59158.5875 2020-10-17 59139.352083
+4b51709ci_dkc.fits 2020-11-05 2020-11-05 59158.50625 59158.5875 2020-10-19 59141.163889
+4b517093i_dkc.fits 2020-11-05 2020-11-05 59158.50625 59158.5875 2020-10-21 59143.073611
+4b51708pi_dkc.fits 2020-11-05 2020-11-05 59158.505556 59158.5875 2020-10-22 59144.018056
+4b517102i_dkc.fits 2020-11-05 2020-11-05 59158.506944 59158.5875 2020-10-23 59145.0
+4b517107i_dkc.fits 2020-11-05 2020-11-05 59158.506944 59158.5875 2020-10-23 59145.549306
+4b51708ni_dkc.fits 2020-11-05 2020-11-05 59158.505556 59158.5875 2020-10-24 59146.541667
+4b51708bi_dkc.fits 2020-11-05 2020-11-05 59158.505556 59158.5875 2020-10-25 59147.120139
+4cb2012gi_dkc.fits 2020-12-11 2020-12-11 59194.633333 59194.654167 2020-10-28 59150.717361
+4cb2012ji_dkc.fits 2020-12-11 2020-12-11 59194.633333 59194.654167 2020-10-31 59153.029861
+4cb2012si_dkc.fits 2020-12-11 2020-12-11 59194.634028 59194.654167 2020-11-01 59154.093056
+4cb2014ki_dkc.fits 2020-12-11 2020-12-11 59194.634722 59194.654167 2020-11-02 59155.597222
+4cb20150i_dkc.fits 2020-12-11 2020-12-11 59194.635417 59194.654167 2020-11-04 59157.131944
+4cb2013ci_dkc.fits 2020-12-11 2020-12-11 59194.634028 59194.654167 2020-11-05 59158.138889
+4cb20153i_dkc.fits 2020-12-11 2020-12-11 59194.635417 59194.654167 2020-11-06 59159.2
+4cb20121i_dkc.fits 2020-12-11 2020-12-11 59194.633333 59194.654167 2020-11-06 59159.495139
+4cb2014ai_dkc.fits 2020-12-11 2020-12-11 59194.634722 59194.654167 2020-11-08 59161.111111
+4cb20143i_dkc.fits 2020-12-11 2020-12-11 59194.634722 59194.654167 2020-11-09 59162.00625
+4cb2011qi_dkc.fits 2020-12-11 2020-12-11 59194.632639 59194.654167 2020-11-10 59163.263889
+4cb2012pi_dkc.fits 2020-12-11 2020-12-11 59194.633333 59194.654167 2020-11-11 59164.066667
+4cb2011ni_dkc.fits 2020-12-11 2020-12-11 59194.632639 59194.654167 2020-11-12 59165.269444
+4cb2012mi_dkc.fits 2020-12-11 2020-12-11 59194.633333 59194.654167 2020-11-13 59166.222222
+4cb2011di_dkc.fits 2020-12-11 2020-12-11 59194.632639 59194.654167 2020-11-14 59167.004861
+4cb2011fi_dkc.fits 2020-12-11 2020-12-11 59194.632639 59194.654167 2020-11-15 59168.2375
+4cb2011si_dkc.fits 2020-12-11 2020-12-11 59194.633333 59194.654167 2020-11-16 59169.023611
+4cb20145i_dkc.fits 2020-12-11 2020-12-11 59194.634722 59194.654167 2020-11-17 59170.0125
+4cb20117i_dkc.fits 2020-12-11 2020-12-11 59194.632639 59194.654167 2020-11-18 59171.070833
+4cb2015bi_dkc.fits 2020-12-11 2020-12-11 59194.635417 59194.654167 2020-11-19 59172.061806
+4cb2010oi_dkc.fits 2020-12-11 2020-12-11 59194.631944 59194.654167 2020-11-20 59173.14375
+4cb2011ki_dkc.fits 2020-12-11 2020-12-11 59194.632639 59194.654167 2020-11-21 59174.00625
+4cb20127i_dkc.fits 2020-12-11 2020-12-11 59194.633333 59194.654167 2020-11-22 59175.320139
+4cb2010li_dkc.fits 2020-12-11 2020-12-11 59194.631944 59194.654167 2020-11-23 59176.020833
+4cb20131i_dkc.fits 2020-12-11 2020-12-11 59194.634028 59194.654167 2020-11-24 59177.002778
+4cb20136i_dkc.fits 2020-12-11 2020-12-11 59194.634028 59194.654167 2020-11-25 59178.678472
+51c19486i_dkc.fits 2021-01-12 2021-01-13 59226.616667 59227.463889 2020-11-28 59181.246528
+51c1948ii_dkc.fits 2021-01-12 2021-01-13 59226.616667 59227.463889 2020-11-30 59183.833333
+51c19476i_dkc.fits 2021-01-12 2021-01-13 59226.615972 59227.463889 2020-12-01 59184.816667
+51c1950oi_dkc.fits 2021-01-12 2021-01-13 59226.618056 59227.463889 2020-12-02 59185.780556
+51c1947ci_dkc.fits 2021-01-12 2021-01-13 59226.615972 59227.463889 2020-12-03 59186.625
+51c1949pi_dkc.fits 2021-01-12 2021-01-13 59226.617361 59227.463889 2020-12-04 59187.976389
+51c1947li_dkc.fits 2021-01-12 2021-01-13 59226.615972 59227.463889 2020-12-06 59189.379167
+51c1948fi_dkc.fits 2021-01-12 2021-01-13 59226.616667 59227.463889 2020-12-07 59190.125
+51c19490i_dkc.fits 2021-01-12 2021-01-13 59226.617361 59227.463889 2020-12-08 59191.916667
+51c19502i_dkc.fits 2021-01-12 2021-01-13 59226.618056 59227.463889 2020-12-09 59192.916667
+51c1949gi_dkc.fits 2021-01-12 2021-01-13 59226.617361 59227.463889 2020-12-11 59194.290972
+51c19479i_dkc.fits 2021-01-12 2021-01-13 59226.615972 59227.463889 2020-12-11 59194.9625
+51c19514i_dkc.fits 2021-01-12 2021-01-13 59226.61875 59227.463889 2020-12-13 59196.147917
+51c1947ri_dkc.fits 2021-01-12 2021-01-13 59226.615972 59227.463889 2020-12-14 59197.842361
+51c19481i_dkc.fits 2021-01-12 2021-01-13 59226.616667 59227.463889 2020-12-14 59197.933333
+51c1951li_dkc.fits 2021-01-12 2021-01-13 59226.61875 59227.463889 2020-12-16 59199.583333
+51c1948li_dkc.fits 2021-01-12 2021-01-13 59226.616667 59227.463889 2020-12-17 59200.430556
+51c1948ci_dkc.fits 2021-01-12 2021-01-13 59226.616667 59227.463889 2020-12-18 59201.517361
+51c19489i_dkc.fits 2021-01-12 2021-01-13 59226.616667 59227.463889 2020-12-19 59202.086806
+51c1948ri_dkc.fits 2021-01-12 2021-01-13 59226.616667 59227.463889 2020-12-21 59204.906944
+51c19505i_dkc.fits 2021-01-12 2021-01-13 59226.618056 59227.463889 2020-12-21 59204.91875
+51c1949di_dkc.fits 2021-01-12 2021-01-13 59226.617361 59227.463889 2020-12-23 59206.198611
+51r19062i_dkc.fits 2021-01-27 2021-01-27 59241.5875 59241.669444 2020-12-26 59209.193056
+51r19087i_dkc.fits 2021-01-27 2021-01-27 59241.588889 59241.669444 2020-12-28 59211.020833
+51r1905ci_dkc.fits 2021-01-27 2021-01-27 59241.586806 59241.669444 2020-12-29 59212.0
+51r1909ri_dkc.fits 2021-01-27 2021-01-27 59241.589583 59241.669444 2020-12-30 59213.127778
+51r1907pi_dkc.fits 2021-01-27 2021-01-27 59241.588194 59241.669444 2020-12-31 59214.0
+51r1906gi_dkc.fits 2021-01-27 2021-01-27 59241.5875 59241.669444 2021-01-01 59215.054861
+51r1909mi_dkc.fits 2021-01-27 2021-01-27 59241.589583 59241.669444 2021-01-02 59216.470833
+51r1908ri_dkc.fits 2021-01-27 2021-01-27 59241.588889 59241.669444 2021-01-02 59216.888194
+51r19074i_dkc.fits 2021-01-27 2021-01-27 59241.588194 59241.669444 2021-01-04 59218.020833
+51r1910ji_dkc.fits 2021-01-27 2021-01-27 59241.590278 59241.669444 2021-01-05 59219.070139
+51r19082i_dkc.fits 2021-01-27 2021-01-27 59241.588889 59241.669444 2021-01-06 59220.036111
+51r19105i_dkc.fits 2021-01-27 2021-01-27 59241.590278 59241.669444 2021-01-07 59221.002778
+51r19059i_dkc.fits 2021-01-27 2021-01-27 59241.586806 59241.669444 2021-01-08 59222.0875
+51r1906ci_dkc.fits 2021-01-27 2021-01-27 59241.5875 59241.669444 2021-01-09 59223.0
+51r1908di_dkc.fits 2021-01-27 2021-01-27 59241.588889 59241.669444 2021-01-10 59224.333333
+51r1907mi_dkc.fits 2021-01-27 2021-01-27 59241.588194 59241.669444 2021-01-11 59225.045833
+51r19100i_dkc.fits 2021-01-27 2021-01-27 59241.590278 59241.669444 2021-01-12 59226.038889
+51r1905gi_dkc.fits 2021-01-27 2021-01-27 59241.586806 59241.669444 2021-01-14 59228.18125
+51r19098i_dkc.fits 2021-01-27 2021-01-27 59241.589583 59241.669444 2021-01-16 59230.360417
+51r19109i_dkc.fits 2021-01-27 2021-01-27 59241.590278 59241.669444 2021-01-16 59230.897222
+51r1906si_dkc.fits 2021-01-27 2021-01-27 59241.5875 59241.669444 2021-01-18 59232.626389
+51r1905si_dkc.fits 2021-01-27 2021-01-27 59241.5875 59241.669444 2021-01-18 59232.886806
+51r1908oi_dkc.fits 2021-01-27 2021-01-27 59241.588889 59241.669444 2021-01-20 59234.650694
+53304402i_dkc.fits 2021-03-02 2021-03-03 59275.986111 59276.406944 2021-01-23 59237.490972
+5330439pi_dkc.fits 2021-03-02 2021-03-03 59275.985417 59276.406944 2021-01-25 59239.222222
+5330437oi_dkc.fits 2021-03-02 2021-03-03 59275.984028 59276.406944 2021-01-26 59240.284028
+53304391i_dkc.fits 2021-03-02 2021-03-03 59275.985417 59276.406944 2021-01-28 59242.0
+5330440ei_dkc.fits 2021-03-02 2021-03-03 59275.986111 59276.406944 2021-01-29 59243.0
+5330437ji_dkc.fits 2021-03-02 2021-03-03 59275.984028 59276.406944 2021-01-30 59244.016667
+53304399i_dkc.fits 2021-03-02 2021-03-03 59275.985417 59276.406944 2021-01-30 59244.390972
+5330439ki_dkc.fits 2021-03-02 2021-03-03 59275.985417 59276.406944 2021-02-01 59246.722917
+5330438bi_dkc.fits 2021-03-02 2021-03-03 59275.984722 59276.406944 2021-02-03 59248.425694
+5330438oi_dkc.fits 2021-03-02 2021-03-03 59275.984722 59276.406944 2021-02-04 59249.354167
+53304389i_dkc.fits 2021-03-02 2021-03-03 59275.984722 59276.406944 2021-02-05 59250.343056
+5330440bi_dkc.fits 2021-03-02 2021-03-03 59275.986111 59276.406944 2021-02-06 59251.220833
+5330439ci_dkc.fits 2021-03-02 2021-03-03 59275.985417 59276.406944 2021-02-07 59252.213194
+5330437qi_dkc.fits 2021-03-02 2021-03-03 59275.984028 59276.406944 2021-02-08 59253.261111
+5330437ti_dkc.fits 2021-03-02 2021-03-03 59275.984722 59276.406944 2021-02-10 59255.300694
+53304394i_dkc.fits 2021-03-02 2021-03-03 59275.985417 59276.406944 2021-02-11 59256.227083
+53304400i_dkc.fits 2021-03-02 2021-03-03 59275.986111 59276.406944 2021-02-12 59257.226389
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/calwf3_with_v1.0_PCTE.ipynb b/notebooks/WFC3/calwf3_v1.0_cte/calwf3_with_v1.0_PCTE.ipynb
new file mode 100644
index 000000000..aafb0f594
--- /dev/null
+++ b/notebooks/WFC3/calwf3_v1.0_cte/calwf3_with_v1.0_PCTE.ipynb
@@ -0,0 +1,932 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "# Processing WFC3/UVIS Data with `calwf3` Using the v1.0 CTE-Correction \n",
+ "***\n",
+ "## Learning Goals\n",
+ "This notebook explains how to calibrate `raw` WFC3/UVIS data with the v1.0 pixel-based CTE correction within `calwf3`. \n",
+ "
\n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "\n",
+ "- Download a raw WFC3 image from MAST.\n",
+ "- Find the necessary reference files needed for calibration.\n",
+ "- Edit header keywords.\n",
+ "- Run `calwf3` `v3.5.2` to calibrate the raw image with the v1.0 pixel based CTE-correction.\n",
+ "- Compare v1.0 and v2.0 products. \n",
+ "\n",
+ "\n",
+ "Please make sure you have read the `README.md` file before continuing.\n",
+ "\n",
+ "## Table of Contents\n",
+ " [Introduction](#intro)
\n",
+ " \n",
+ " [1. Imports](#imports)
\n",
+ " [2. Verify `archived_drkcfiles.txt` is in CWD](#txtfile)
\n",
+ " [3. Check that `calwf3` Version is `v3.5.2`](#checkcalver)
\n",
+ " [4. Query MAST and Download a WFC3 `raw.fits` Image](#download)
\n",
+ " [4.1 Inspect Image Headers](#imageheaders)
\n",
+ " [5. Find the Correct `DRKCFILE`](#finddark)
\n",
+ " [6 Modify Image Header](#modhead)
\n",
+ " [6.1 `DRKCFILE`](#drkcfile)
\n",
+ " [6.2 `PCTETAB`](#pctetab)
\n",
+ "[7. Re-Inspect Image Header](#reinspect)
\n",
+ "[8. Set Environment Variables](#envvar)
\n",
+ "[9. Run `calwf3`](#runcal)
\n",
+ "[10. Inspect `FLC` Image Header](#inspectflc)
\n",
+ "[11. Investigate v1.0 and v2.0 Differences](#verdiffs)
\n",
+ " [11.1 Download the v2.0 FLC File](#downloadv2.0)
\n",
+ " [11.2 Open Files](#openfiles)
\n",
+ " [11.3 Display 50x50 Pixel Background Subsection](#bkgsub)
\n",
+ " [11.3.1 Pixel Distribution of Background Subsections](#bkgdist)
\n",
+ " [11.4 Display Image Subsection](#imgsub)
\n",
+ " [11.5 Aperture Photometry](#apphot)
\n",
+ "[12. Conclusions](#conclude)
\n",
+ "\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite) \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "## Introduction \n",
+ "\n",
+ "The v1.0 pixel-based Charge Transfer Efficiency (CTE) correction was first implemented into `calwf3` `v3.3` in 2016 ([Ryan et al. 2016](https://ui.adsabs.harvard.edu/abs/2016wfc..rept....1R/abstract),
[Anderson & Bedin 2010](https://ui.adsabs.harvard.edu/abs/2010PASP..122.1035A/abstract), [HSTCAL release notes](https://github.com/spacetelescope/hstcal/releases/tag/1.0.0)). This also marked the first time users could directly download CTE-corrected `flc & drc`
files from [MAST](https://mast.stsci.edu/search/hst/ui/#/). While the v1.0 correction was sufficient for many years, the degradation of CTE over time reduced the efficacy of the model
in treating low-level pixels. The v1.0 correction adversely impacts (overcorrects) both the image background and faint sources. In April 2021
the v2.0 pixel-based CTE correction was implemented in `calwf3` `v3.6.0` ([Anderson et al. 2021](https://ui.adsabs.harvard.edu/abs/2021wfc..rept....9A/abstract), [Kuhn & Anderson 2021](https://ui.adsabs.harvard.edu/abs/2021wfc..rept....6K/abstract), [HSTCAL release
notes](https://github.com/spacetelescope/hstcal/releases/tag/2.7.0)). Since MAST uses the latest release of `calwf3` for calibration, any WFC3/UVIS CTE corrected data retrieved from MAST, regardless of
observation date, will be calibrated with the v2.0 pixel-based CTE correction. Although v1.0 pixel-based CTE-corrected `flc & drc` files are
no longer accessable through MAST, this notebook steps through the procedure required to calibrate WFC3/UVIS images using the v1.0 CTE
correction.
\n",
+ "\n",
+ "\n",
+ "One of the limiting factors of using the v1.0 CTE correction are the CTE corrected dark current reference files (`DRKCFILE`). These dark
reference files are delivered to MAST by the WFC3 team and use the same pixel-based CTE correction within `calwf3`. Now that we
have switched to the v2.0 CTE correction there is a cut off for dark current reference files that use the v1.0 correction. Observations taken
after February 2021 will not have\n",
+ "CTE corrected dark files using the v1.0 algorithm, which means **applying the v1.0 CTE correction works
best for observations taken between May 2009 - February 2021.** If the observation being calibrated was taken after February 2021 there
are two options: **1)** use the last v1.0 CTE corrected dark reference file from February 2021 or **2)** use the v2.0 CTE corrected dark with the
most appropriate `USEAFTER` for the science exposure's observation date. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:
\n",
+ "
\n",
+ "**•** *glob* for creating list of files
\n",
+ "**•** *matplotlib.pyplot* for plotting and displaying images
\n",
+ "**•** *numpy* for finding indices and concatenating arrays
\n",
+ "**•** *os* for setting environment variables
\n",
+ "**•** *shutil* removing an empty directory
\n",
+ "\n",
+ "**•** *astropy.io.fits* for opening and modifying fits files
\n",
+ "**•** *astroquery.mast.Observations* for downloading data from MAST
\n",
+ "**•** *astropy.table.Table* for creating and manipulating data tables
\n",
+ "**•** *astropy.time.Time* for converting between time formats
\n",
+ "**•** *ginga.util.zscale* for finding scale limits when displaying images
\n",
+ "**•** *photutils.aperture.aperture_photometry* for performing aperture photometry
\n",
+ "**•** *photutils.aperture.CircularAperture* for creating circular apertures
\n",
+ "**•** *photutils.aperture.CircularAnnulus* for creating circular annuli
\n",
+ "**•** *wfc3tools.calwf3* for verifying the version and running pipeline
\n",
+ "\n",
+ "**•** *background_median.aperture_stats_tbl* for measuring background values within annuli
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import glob\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "import os\n",
+ "import shutil\n",
+ "\n",
+ "from astropy.io import fits\n",
+ "from astroquery.mast import Observations\n",
+ "from astropy.table import Table\n",
+ "from astropy.time import Time\n",
+ "from ginga.util import zscale\n",
+ "from photutils.aperture import aperture_photometry, CircularAperture, CircularAnnulus\n",
+ "from wfc3tools import calwf3\n",
+ "\n",
+ "from example.background_median import aperture_stats_tbl"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 2. Verify `archived_drkcfiles.txt` is in CWD\n",
+ "When you cloned/downloaded this notebook from [WFC3 Library](https://github.com/spacetelescope/WFC3Library), a .txt file should have been included. The file name is
`archived_drkcfiles.txt` and it is used later on in the notebook. This .txt file includes the file name, delivery date, activation
date, and USEAFTER date for every v1.0 CTE corrected dark reference file between May 2009 - February 2021. Below, we will use
this file in conjunction with the observation date of the file(s) being calibrated to pick out the most appropriate v1.0 CTE corrected
dark reference file(s).
\n",
+ "\n",
+ "Please make sure the file is in the current working directory before continuing."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# list cwd to verify txt file is there\n",
+ "!ls -l archived_drkcfiles.txt\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. Check that `calwf3` Version is `v3.5.2`\n",
+ "In April 2021, a new `calwf3` version was released that contains the v2.0 CTE-correction.\n",
+ "If you would like to use the v1.0 correction, your
current environment must be using `calwf3` versions equal to or between `3.3` - `3.5.2`. However, in order to get the best v1.0 calibrated
images we must use `calwf3` `v3.5.2`. This version of `calwf3` includes the recent ([~Jan 2021](https://github.com/spacetelescope/hstcal/releases/tag/2.5.0)) update that added MJD as a parameterized
variable for the `PHOTMODE` keyword, which enables a time-dependent photometric correction and zeropoint. If your version is `3.6.0` or higher,
you must downgrade the [`hstcal` package](https://github.com/spacetelescope/hstcal). The safer option, however, is to create a new environment such as:
\n",
+ "\n",
+ "* `$ conda config --add channels http://ssb.stsci.edu/astroconda`\n",
+ "* `$ conda create -n v1_PCTE hstcal==2.5.0 python=3.7 ginga stsci-hst notebook`\n",
+ "\n",
+ "`hstcal` `v2.5.0` provides version `3.5.2` of `calwf3`, which is the last version that offers the v1.0 pixel-based CTE correction.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# print calwf3 version to make sure its equal to or between 3.3 and 3.5.2 \n",
+ "!calwf3.e --version"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. Query MAST and Download a WFC3 `raw.fits` Image \n",
+ "Here, we download our image via `astroquery`. For more information, please look at the documentation for [Astroquery](https://astroquery.readthedocs.io/en/latest/),\n",
+ "[Astroquery.mast](https://astroquery.readthedocs.io/en/latest/mast/mast.html), and
\n",
+ "[CAOM Field Descriptions](https://mast.stsci.edu/api/v0/_c_a_o_mfields.html), which is used for the `obs_table` variable below. Additionally, you may download the data from MAST using either
the [HST MAST Search Engine](https://mast.stsci.edu/search/hst/ui/#/) or the more general [MAST Portal](https://mast.stsci.edu/portal/Mashup/Clients/Mast/Portal.html).\n",
+ "\n",
+ "We download a `raw` image of star cluster 47 Tucanae (47Tuc, NGC 104), offset from the core, from CAL proposal [15576](https://www.stsci.edu/cgi-bin/get-proposal-info?id=15576&submit=Go&observatory=HST) (July 2019).
\n",
+ "After downloading the image, we move it to the current working directory (cwd)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Edit this cell's first line if you would to download your own file(s)\n",
+ "# Get the observation records\n",
+ "obs_table = Observations.query_criteria(obs_id='idv404axq*',proposal_id=15576)\n",
+ "\n",
+ "# Get the listing of data products\n",
+ "products = Observations.get_product_list(obs_table)\n",
+ "\n",
+ "# Filter the products for the RAW files\n",
+ "filtered_products = Observations.filter_products(products, productSubGroupDescription='RAW')\n",
+ "\n",
+ "# Download all the images above\n",
+ "download_table = Observations.download_products(filtered_products, mrp_only=False)\n",
+ "\n",
+ "# For convenience move raws to cwd and remove empty download dir\n",
+ "for file in download_table['Local Path']:\n",
+ " filename = file.split('/')[-1]\n",
+ " os.rename(file, os.path.basename(file))\n",
+ " os.rmdir('mastDownload/HST/'+filename[:9])\n",
+ " \n",
+ "os.rmdir('mastDownload/HST/')\n",
+ "os.rmdir('mastDownload/')\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# show list of current dir to verify fits file is there\n",
+ "!ls -l *raw.fits\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4.1 Inspect Image Header\n",
+ "When processing a raw file through `calwf3` , the pipeline uses a few different header keywords to initiate and run the pixel-based CTE
correction. Here, we inspect the important header keywords from the raw file just downloaded.
\n",
+ "At this step, you should see:
\n",
+ "- `pctetab` set to `iref$54l1347ei_cte.fits`
\n",
+ "- `drkcfile` set to `iref$54n2022fi_dkc.fits`
\n",
+ "- `pctecorr` set to `PERFORM`.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Collect header keyword info from raw file\n",
+ "file, date, expstart, pctetab, drkcfile, pctecorr = [],[],[],[],[],[]\n",
+ "for f in glob.glob('*raw.fits'):\n",
+ " h = fits.getheader(f)\n",
+ " file.append(h['filename'])\n",
+ " date.append(h['date-obs'])\n",
+ " expstart.append(h['expstart'])\n",
+ " pctetab.append(h['pctetab'])\n",
+ " drkcfile.append(h['drkcfile'])\n",
+ " pctecorr.append(h['pctecorr'])\n",
+ "\n",
+ "image_table = Table([file, date, expstart, pctetab, drkcfile, pctecorr],\n",
+ " names=('file','date-obs', 'expstart', 'pctetab', 'drkcfile', 'pctecorr'))\n",
+ "image_table['expstart'].format = '5.6f'\n",
+ "\n",
+ "# Sort and display the table\n",
+ "image_table.sort('expstart')\n",
+ "image_table"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 5. Find the Correct `DRKCFILE` \n",
+ "Below, we open the .txt file containing a list of all the `DRKCFILE` reference files created with the v1.0 pixel-based CTE correction.
`DRKCFILE` reference files are CTE corrected files used by the pipeline to perform the dark current subtraction during the generation
of the `flc` file. The `DRKCFILE` files listed in `archived_drkcfiles.txt` have been archived on the CRDS database and while
they are still accessible for use and download, they are not being actively used by MAST.
\n",
+ "\n",
+ "In the first cell, we generate an `astropy.Table` ( `drkc_table` ) using the data from the file `archived_drkcfiles.txt`, mentioned
in [Section 2](#txtfile), and create empty lists for the final table. Then, in the second cell, we index the `drkc_table` table for the best `DRKCFILE`
that corresponds to the `DATE-OBS` of the `raw` file being calibrated. Lastly, in the third cell, we create and display the final `astropy.table`
that contains just the necessary `DRKCFILE`.
\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Generate astropy table from `archived_drkcfiles.txt`\n",
+ "drkc_table = Table.read('archived_drkcfiles.txt',format='ascii.commented_header')\n",
+ "\n",
+ "# Create empty lists for final astropy table\n",
+ "rawfiles, obsdates, dkcfiles, uafters, active_dates = [],[],[],[], []\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Using image header table from section 4.1 find closest drkcfile\n",
+ "for expstart in image_table['expstart']:\n",
+ " table_idx = np.where(abs(drkc_table['useafter-mjd']-expstart) == abs(drkc_table['useafter-mjd']-expstart).min())[0][0]\n",
+ "\n",
+ " rawfile = image_table[image_table['expstart']==expstart]['file'][0]\n",
+ " \n",
+ " # if drkcfile has useafter date > rawfile expstart use previous drkcfile\n",
+ " if drkc_table[table_idx]['useafter-mjd'] > image_table[image_table['file']==rawfile]['expstart'][0]:\n",
+ " table_idx -= 1\n",
+ " #append info\n",
+ " rawfiles.append(rawfile)\n",
+ " obsdates.append(image_table[image_table['file']==rawfile]['date-obs'][0])\n",
+ " dkcfiles.append(drkc_table[table_idx]['drkcfile'])\n",
+ " uafters.append(drkc_table[table_idx]['useafter'])\n",
+ " active_dates.append(drkc_table[table_idx]['activation-date'])\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Generate table of filename, date-obs, drkc-filename, corresponding useafter\n",
+ "raw_dkc_tab = Table([rawfiles, obsdates, dkcfiles, uafters, active_dates],\n",
+ " names=('filename','date-obs','dkc-filename','dkc-useafter','dkc-activation'))\n",
+ "# Display table\n",
+ "raw_dkc_tab\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 6. Modify Image Header\n",
+ "Now that we know which v1.0 CTE corrected dark current reference file corresponds to our `raw` science file, we're ready to edit the header
keywords the v1.0 CTE corrected reference files and tables. \n",
+ "\n",
+ "\n",
+ "## 6.1 `DRKCFILE`\n",
+ "First, we will edit `raw` file's header with the v1.0 CTE corrected dark current reference file, `DRKCFILE`, that we just found in Section 6. \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ " for file in glob.glob('i*raw.fits'):\n",
+ " # Using raw_dkc_tab from above, grab appropriate drkcfile\n",
+ " ctecorr_dark = 'iref$'+raw_dkc_tab[raw_dkc_tab['filename']==file]['dkc-filename'][0]\n",
+ " fits.setval(file, 'DRKCFILE', value = ctecorr_dark)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 6.2 `PCTETAB`\n",
+ "The next keyword we're going to modify is the `PCTETAB`. This is the pixel-based correction reference table and without it the algorithm will
not work. In order to use the v1.0 pixel based correction, `PCTETAB` will need to be set to the proper reference file. In the below cell, we set
the `raw` file's `PCTETAB` to the v1.0 reference table, [zcv2057mi_cte.fits](https://hst-crds.stsci.edu/browse/zcv2057mi_cte.fits).\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fits.setval('idv404axq_raw.fits', 'PCTETAB', value = 'iref$zcv2057mi_cte.fits') \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 7. Re-Inspect Image Header \n",
+ "Now with the headers modified, we inspect the keywords one last time to verify the file was updated properly before we process
it through `calwf3`. At this point you should see:
\n",
+ "- `PCTETAB` set to `iref$zcv2057mi_cte.fits\t`
\n",
+ "- `DRKCFILE` set to `iref$3961719li_dkc.fits`
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Recollect and display header keywords\n",
+ "file, date, expstart, pctetab, drkcfile, pctecorr = [],[],[],[],[],[]\n",
+ "for f in glob.glob('*raw.fits'):\n",
+ " h = fits.getheader(f)\n",
+ " file.append(h['filename'])\n",
+ " date.append(h['date-obs'])\n",
+ " expstart.append(h['expstart'])\n",
+ " pctetab.append(h['pctetab'])\n",
+ " drkcfile.append(h['drkcfile'])\n",
+ " pctecorr.append(h['pctecorr'])\n",
+ "\n",
+ "updated_table = Table([file, date, expstart, pctetab, drkcfile, pctecorr],\n",
+ " names=('file','date-obs', 'expstart', 'pctetab', 'drkcfile', 'pctecorr'))\n",
+ "updated_table['expstart'].format = '5.6f'\n",
+ "\n",
+ "# Sort and display the table\n",
+ "updated_table.sort('expstart')\n",
+ "updated_table"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 8. Set Environment Variables\n",
+ "
If you already have the absolute paths set for CRDS, please skip this step and proceed to Section 9.
\n",
+ " \n",
+ "Before we run `calwf3`, we need to [set environment variables](https://hst-crds.stsci.edu/docs/cmdline_bestrefs/) for several subsequent calibration tasks. We will point to a subdirectory called
`crds_cache/` using the `IREF` environment variable. The `IREF` variable is used for WFC3 reference files. Other instruments use other
variables, e.g., `JREF` for ACS. You have the option to permanently add these environment variables to your user profile by adding the path
in your shell's configuration file. If you're using bash, you would edit the `~/.bash_profile` file with lines such as:\n",
+ "\n",
+ "* `export CRDS_PATH=\"$HOME/crds_cache\"`\n",
+ "* `export CRDS_SERVER_URL=\"https://hst-crds.stsci.edu\"`\n",
+ "* `export iref=\"${CRDS_PATH}/references/hst/iref/\"`\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "os.environ['CRDS_SERVER_URL'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_SERVER'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_PATH'] = '~/crds_cache'\n",
+ "os.environ['iref'] = '~/crds_cache/references/hst/iref/'\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 9. Run `calwf3` \n",
+ "As a reminder, the `calwf3` version must be `3.5.2` to use the v1.0 pixel-base CTE correction with the most up-to-date calibration parameters.
If you are not using version `3.5.2` the below `calwf3` call will crash due to an out-of-date `IMPHTTAB` reference file.
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "calwf3('idv404axq_raw.fits')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# show list of cwd to verify calibrated files were made\n",
+ "!ls -ltr *.fits\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 10. Inspect FLC Image Header\n",
+ "To verify that the data was calibrated with the v1.0 pixel-based CTE-correction, header keyword `CAL_VER` should be `3.5.2`,
`CTE_VER` should be `1.0`, and `CTE_NAME` should be `pixelCTE 2012`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Recollect and display FLC header keywords\n",
+ "file, pctetab, drkcfile, pctecorr, calver, ctename, ctever = [],[],[],[],[],[],[]\n",
+ "for f in glob.glob('*flc.fits'):\n",
+ " h = fits.getheader(f)\n",
+ " file.append(h['filename'])\n",
+ " pctetab.append(h['pctetab'])\n",
+ " drkcfile.append(h['drkcfile'])\n",
+ " pctecorr.append(h['pctecorr'])\n",
+ " calver.append(h['cal_ver'])\n",
+ " ctename.append(h['cte_name'])\n",
+ " ctever.append(h['cte_ver'])\n",
+ "\n",
+ "final_table = Table([file, pctetab, drkcfile, pctecorr, calver, ctename, ctever],\n",
+ " names=('file','pctetab', 'drkcfile', 'pctecorr','cal_ver','cte_name','cte_ver'))\n",
+ "\n",
+ "final_table"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 11. Investigate v1.0 and v2.0 Differences \n",
+ "Now that we have created a v1.0 CTE corrected image, lets compare it to the same image calibrated with the v2.0 correction.
\n",
+ "\n",
+ "\n",
+ "## 11.1 Download the v2.0 FLC File\n",
+ "First, we need to download the same FLC file from MAST that is corrected with the v2.0 pixel-based CTE correction so that we can
compare it to the v1.0 FLC file we just created in the notebook."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Get the observation records\n",
+ "obs_table = Observations.query_criteria(obs_id='idv404axq*',proposal_id=15576)\n",
+ "\n",
+ "# Get the listing of data products\n",
+ "products = Observations.get_product_list(obs_table)\n",
+ "\n",
+ "# Filter the products for the RAW files\n",
+ "filtered_products = Observations.filter_products(products, productSubGroupDescription='FLC',project='CALWF3')\n",
+ "\n",
+ "# Download all the images above\n",
+ "download_table = Observations.download_products(filtered_products, mrp_only=False)\n",
+ "\n",
+ "# For convenience move raws to cwd and remove empty download dir\n",
+ "for file in download_table['Local Path']:\n",
+ " filename = file.split('/')[-1][:9]+'_v2.0_flc.fits'\n",
+ " os.rename(file, os.path.basename(filename))\n",
+ " os.rmdir('mastDownload/HST/'+filename[:9])\n",
+ " \n",
+ "os.rmdir('mastDownload/HST/')\n",
+ "os.rmdir('mastDownload/')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 11.2 Open Files \n",
+ "In the cell below, we open each of the different files (FLT, v1.0 and v2.0 FLC) and create full-frame ~4Kx4K arrays. Additionally,
we multiply the science arrays by the [pixel area maps](https://www.stsci.edu/hst/instrumentation/wfc3/data-analysis/pixel-area-maps). Due to the geometric distortion present in WFC3 images, these pixel
area maps are necessary to achieve uniformity in the measured counts of an object across the field. The pixel map simply
reflects the area of the pixels at the location of the source, and by multiplying the images by this field-dependent correction
factor, we will improve the accuracy of the photometry. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Open data and set variables\n",
+ "with fits.open('idv404axq_v2.0_flc.fits') as hdu:\n",
+ " v2_uvis1 = hdu[4].data\n",
+ " v2_uvis2 = hdu[1].data\n",
+ "with fits.open('idv404axq_flc.fits') as hdu:\n",
+ " v1_uvis1 = hdu[4].data\n",
+ " v1_uvis2 = hdu[1].data \n",
+ "with fits.open('idv404axq_flt.fits') as hdu:\n",
+ " flt_uvis1 = hdu[4].data\n",
+ " flt_uvis2 = hdu[1].data \n",
+ " \n",
+ "# Load pixel area maps \n",
+ "PAM_uvis1 = fits.getdata('example/UVIS1wfc3_map.fits')\n",
+ "PAM_uvis2 = fits.getdata('example/UVIS2wfc3_map.fits')\n",
+ "\n",
+ "# Stich UVIS1 and 2 together and multiply by pixel area map\n",
+ "v2sci = np.concatenate([v2_uvis2*PAM_uvis2 ,v2_uvis1*PAM_uvis1])\n",
+ "v1sci = np.concatenate([v1_uvis2*PAM_uvis2 ,v1_uvis1*PAM_uvis1])\n",
+ "fltsci = np.concatenate([flt_uvis2*PAM_uvis2,flt_uvis1*PAM_uvis1])\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 11.3 Display 50x50 Pixel Background Subsection\n",
+ "One of the differences between the v1.0 and v2.0 CTE correction is the background level. Here, we show a square 50x50 pixel
subsection that is mostly featureless, i.e. no known sources or cosmic ray hits. The v2.0 correction significantly reduces noise
amplification and improves the resulting background. To aid in the visual inspection of the background subsection, an animated
GIF is included in the notebook that blinks between the v1.0 and v2.0 FLC files. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Generate subplots\n",
+ "fig, [ax1,ax2,ax3] = plt.subplots(1,3,figsize=(15,10),dpi=150)\n",
+ "\n",
+ "# Generate background subsections\n",
+ "flt_bkg = fltsci[2070:2120,2180:2230]\n",
+ "v1_bkg = v1sci[2070:2120,2180:2230]\n",
+ "v2_bkg = v2sci[2070:2120,2180:2230]\n",
+ "\n",
+ "# Calculate min and max values for image scaling \n",
+ "v1z1,v1z2 = zscale.zscale(v1_bkg)\n",
+ "\n",
+ "# Display background subsection\n",
+ "im1 = ax1.imshow(flt_bkg,origin='lower',cmap='Greys_r',vmin=v1z1,vmax=v1z2)\n",
+ "im2 = ax2.imshow(v1_bkg,origin='lower',cmap='Greys_r',vmin=v1z1,vmax=v1z2)\n",
+ "im3 = ax3.imshow(v2_bkg,origin='lower',cmap='Greys_r',vmin=v1z1,vmax=v1z2)\n",
+ "\n",
+ "# Formatting\n",
+ "fig.colorbar(im1,ax=ax1,shrink=0.35,pad=0.02)\n",
+ "fig.colorbar(im2,ax=ax2,shrink=0.35,pad=0.02)\n",
+ "fig.colorbar(im3,ax=ax3,shrink=0.35,pad=0.02)\n",
+ "ax1.set_title('FLT File BKG Subsection',size=14)\n",
+ "ax2.set_title('v1.0 PCTE FLC BKG Subsection',size=14)\n",
+ "ax3.set_title('v2.0 PCTE FLC BKG Subsection',size=14)\n",
+ "ax1.axis('off'),ax2.axis('off'),ax3.axis('off')\n",
+ "fig.tight_layout()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " Animated GIF of the v1.0 and v2.0 FLC image subsections:
\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 11.3.1 Pixel Distribution of Background Subsections\n",
+ "To gain a more quantitative picture of how the background pixels are changing between the different file versions, we plot
the distribution of pixel values from the 50x50 pixel subsection above. The increased noise level in the v1.0 correction is
apparent in the blue histogram below. In addition, we have also computed the difference between the file types and have
plotted them as histograms. These two plots illustrates how the background in the v2.0 CTE corrected image is less noisy
and more in-line with the values seen in the FLT image. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Generate subplots\n",
+ "fig, [ax1,ax2] = plt.subplots(2,1,figsize=(7,10),dpi=120)\n",
+ "\n",
+ "# Plot background subsection histograms\n",
+ "ax1.hist(flt_bkg.ravel(),bins=100,range=(-30,100),histtype='step',color='C3',label='FLT')\n",
+ "ax1.hist(v1_bkg.ravel(),bins=100,range=(-30,100),histtype='step',color='C0',label='v1.0 FLC')\n",
+ "ax1.hist(v2_bkg.ravel(),bins=100,range=(-30,100),histtype='step',color='k',label='v2.0 FLC')\n",
+ "\n",
+ "# Plot background subsection differential histograms\n",
+ "ax2.hist((v1_bkg-flt_bkg).ravel(),bins=100,range=(-25,50),histtype='step',color='magenta',label='v1.0 FLC $-$ FLT')\n",
+ "ax2.hist((v2_bkg-flt_bkg).ravel(),bins=100,range=(-25,50),histtype='step',color='limegreen',label='v2.0 FLC $-$ FLT')\n",
+ "ax2.hist((v1_bkg-v2_bkg).ravel(),bins=100,range=(-25,50),histtype='step',color='C9',label='v1.0 $-$ v2.0 FLC')\n",
+ "\n",
+ "# Formatting\n",
+ "ax1.set_title('Background Subsection Histogram',size=14)\n",
+ "ax2.set_title('Background Subsection Differential Histogram',size=14)\n",
+ "ax1.set_xlabel('Pixel Value [e-]',size=12)\n",
+ "ax1.set_ylabel('Frequency',size=12)\n",
+ "ax2.set_xlabel('Pixel Value [e-]',size=12)\n",
+ "ax2.set_ylabel('Frequency',size=12)\n",
+ "ax1.grid(alpha=0.5),ax2.grid(alpha=0.5)\n",
+ "ax1.legend(), ax2.legend()\n",
+ "ax1.set_yscale('log')\n",
+ "ax2.set_yscale('log')\n",
+ "\n",
+ "fig.tight_layout()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 11.4 Display Image Subsection\n",
+ "Another difference between the v1.0 and v2.0 pixel-based CTE model is the amount of correction applied to fainter sources.
In order to reduce noise amplification, the fluxes of faint sources only receive a limited amount of correction in the v2.0 version.
We again provide an animated GIF of the two subsections to aid with the visual comparison. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# Generate subplots\n",
+ "fig, [ax1,ax2] = plt.subplots(2,1,figsize=(8,8),dpi=150)\n",
+ "\n",
+ "# Calculate min and max values for image scaling \n",
+ "v1z1,v1z2 = zscale.zscale(v1_uvis1)\n",
+ "\n",
+ "# Display subsection\n",
+ "im1 = ax1.imshow(v1_uvis1,origin='lower',cmap='Greys_r',vmin=v1z1,vmax=v1z2)\n",
+ "im2 = ax2.imshow(v2_uvis1,origin='lower',cmap='Greys_r',vmin=v1z1,vmax=v1z2)\n",
+ "\n",
+ "# Formatting\n",
+ "ax1.set_xlim(85,325),ax2.set_xlim(85,325)\n",
+ "ax1.set_ylim(0,149),ax2.set_ylim(0,149)\n",
+ "fig.colorbar(im1,ax=ax1,shrink=0.95,pad=0.01)\n",
+ "fig.colorbar(im2,ax=ax2,shrink=0.95,pad=0.01)\n",
+ "ax1.set_title('v1.0 PCTE FLC UVIS1 Subsection',size=14)\n",
+ "ax2.set_title('v2.0 PCTE FLC UVIS1 Subsection',size=14)\n",
+ "fig.tight_layout()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " Animated GIF of the v1.0 and v2.0 FLC image subsections:
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 11.5 Aperture Photometry \n",
+ "To show the quantitative difference in the observed flux of sources between the v1.0 and v2.0 pixel-based CTE correction,
we perform aperture photometry on six stars of varying brightness within the image subsection above. Here, we display the
image subsection again with the apertures, annuli, and star labels overplotted. This subsection includes the first ~150 rows
of UVIS 1, which means all of these stars suffer the most CTE flux loss as they transfer 1900+ rows to the readout amplifier. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First, we approximate the center x and y positions of the stars in the 4Kx4K science arrays, and create the apertures and
annuli using `photutils`.
\n",
+ "\n",
+ "Then, we use `photutils` to measure the signal in each area and subtract the background values in the annuli from the
aperture sum values. We define a function named `get_flux()` to do this for us."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_flux(data,aperture,annulus_aperture):\n",
+ " \"\"\"\n",
+ " Function to calculate background subtracted aperture sum \n",
+ " \n",
+ " Parameters:\n",
+ " -----------\n",
+ " data : float array\n",
+ " The 2d array of science pixels being measured\n",
+ " aperture : photutils obj\n",
+ " A photutils aperture object with defined position and radius\n",
+ " annulus_aperture : photutils obj\n",
+ " A photutils circular annulus aperture object with defined position and radii\n",
+ " \n",
+ " Return:\n",
+ " -------\n",
+ " flux : float\n",
+ " The measured background subtracted aperture sum \n",
+ " \"\"\"\n",
+ " \n",
+ " # Generate photutils.aperture_photometry table object\n",
+ " phot = aperture_photometry(data, aperture)\n",
+ " \n",
+ " # Measure background around sources. aperture_stats_tbl() comes from background_median.py\n",
+ " bkg_phot = aperture_stats_tbl(data, annulus_aperture, method = 'exact', sigma_clip = True)\n",
+ " \n",
+ " # Calculate background subtracted aperture sum\n",
+ " flux = phot['aperture_sum'] - bkg_phot['aperture_median'] * aperture.area\n",
+ " \n",
+ " return flux\n",
+ "\n",
+ "# Approximate x,y pixel locations of each star in the 4Kx4K array\n",
+ "positions = [(299.4,2135.6),\n",
+ " (114.7,2093.4),\n",
+ " (171.3,2074.9),\n",
+ " (262.6,2164.9),\n",
+ " (289.1,2085.6),\n",
+ " (204.8,2073.1)]\n",
+ "\n",
+ "# Photutils cirular aperture object with small radius\n",
+ "aperture = CircularAperture(positions, r=3)\n",
+ "\n",
+ "# Photutils circular annulus aperture object \n",
+ "annulus_aperture = CircularAnnulus(positions, r_in=13, r_out=19)\n",
+ "\n",
+ "# Call function to calculate flux of stars\n",
+ "# THE RUNTIME WARNING MAY BE IGNORED\n",
+ "fltflux = get_flux(fltsci,aperture,annulus_aperture)\n",
+ "v1flux = get_flux(v1sci,aperture,annulus_aperture)\n",
+ "v2flux = get_flux(v2sci,aperture,annulus_aperture)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " You can ignore the RuntimeWarning: invalid value encountered in true_divide
message.
\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally, we plot our results.
\n",
+ "\n",
+ "The first plot below shows the measured flux of the six stars in each of the different calibrated products. Stars 1-6 are organized
by increasing flux, with Star 1 being the faintest and Star 6 being the brightest. The x-axis values correspond to the median flux
value measured in each of the three different files (FLT, v1.0, and v2.0) per star. The y-axis values show the individual flux values
for each star where the different colors and symbols represent the three file types. For example, the individual flux values (y-axis)
of Star 1 for the FLT, v1.0, and v2.0 files are ~2467, 3056, and 2799 e- respectively. The median of the three values is ~2799 e-,
which is the value plotted on the x-axis. The second plot illustrates the percent differences between the three different
flux values per star, and uses the same x-axis values as the first plot.
\n",
+ "\n",
+ "The FLT files have no CTE correction applied and thus have the lowest measured flux for each star due to the CTE flux loss.
Stars 1-4 have noticably different flux values between the v1.0 and v2.0 CTE corrections. In v1.0, the CTE algorithm is actually
over-correcting these fainter sources resulting in higher aperture photometry measurements. The flux values for stars 1-4 range
from ~3000 - 10000 e- within a 3-pixel radius aperture. The flux values between the v1.0 and v2.0 CTE corrections for stars
1-4 have percent differences of ~9 - 4%. Sources with more than ~10000 e- within a 3-pixel aperture (stars 5 & 6) have more
compareable flux values between the v1.0 and v2.0 CTE corrections, and have percent differences less than 2%."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Generate subplots\n",
+ "fig, [ax1,ax2] = plt.subplots(2,1,figsize=(8,13),dpi=120)\n",
+ "ax1.grid(alpha=0.5,which='both'),ax2.grid(alpha=0.5)\n",
+ "\n",
+ "# Find median flux values between products\n",
+ "medflux = np.median([fltflux,v1flux,v2flux],axis=0)\n",
+ "\n",
+ "# Scatter plot of measured flux\n",
+ "ax1.scatter(medflux,fltflux,25,marker='o',c='C3',label='FLT')\n",
+ "ax1.scatter(medflux,v1flux,30,marker='^',c='C0',label='v1.0 FLC')\n",
+ "ax1.scatter(medflux,v2flux,45,marker='*',c='k',label='v2.0 FLC')\n",
+ "\n",
+ "# Scatter plot of percentage difference\n",
+ "ax2.scatter(medflux,abs((fltflux-v1flux))/((fltflux+v1flux)/2)*100,30,\n",
+ " marker='^',c='magenta',label=r'$\\frac{|FLT - v1.0|}{(FLT + v1.0) ÷ 2}$')\n",
+ "ax2.scatter(medflux,abs((fltflux-v2flux))/((fltflux+v2flux)/2)*100,45,\n",
+ " marker='*',c='limegreen',label=r'$\\frac{|FLT - v2.0|}{(FLT + v2.0) ÷ 2}$')\n",
+ "ax2.scatter(medflux,abs((v1flux-v2flux))/((v1flux+v2flux)/2)*100,25,\n",
+ " marker='s',c='C9',label=r'$\\frac{|v1.0 - v2.0|}{(v1.0 + v2.0) ÷ 2}$')\n",
+ "\n",
+ "# Formatting \n",
+ "ax1.set_title('Measured Flux Within 3-pix Radius Aperture',size=14)\n",
+ "ax1.set_xlabel('Median Flux [e-]',size=12)\n",
+ "ax1.set_ylabel('Flux [e-]',size=12)\n",
+ "ax2.set_xlabel('Median Flux [e-]',size=12)\n",
+ "ax2.set_ylabel('Percent Difference [%]',size=12)\n",
+ "ax1.legend(prop={'size':11}),ax2.legend(prop={'size':15})\n",
+ "ax1.set_yscale('log')\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 12. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. You now have everything you need to process your own files with the v1.0 CTE
correction within `calwf3`. Since completing this notebook you should be more familiar with:\n",
+ "\n",
+ "- Applying the v1.0 pixel-based CTE correction to 2009-2021 UVIS data.\n",
+ "- Which header keywords of the `raw` fits file to edit in order to use the v1.0 correction.\n",
+ "- How to find and download the appropriate `PCTETAB` and `DRKCFILE` reference files.\n",
+ "- Verifying your version of `calwf3` and calibrating a `raw` file with the v1.0 CTE correction.\n",
+ "- Investigating the differences between v1.0 and v2.0 CTE corrected files.\n",
+ "\n",
+ "### Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please feel free to contact the [WFC3 Helpdesk](https://stsci.service-now.com/hst) for any questions.\n",
+ "\n",
+ "- [WFC3 CTE Website](https://www.stsci.edu/hst/instrumentation/wfc3/performance/cte)\n",
+ "- [HSTCAL GitHub](https://github.com/spacetelescope/hstcal)\n",
+ "- [Calwf3 Documentation](https://wfc3tools.readthedocs.io/en/latest/wfc3tools/calwf3.html)\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ "- [STScI Jupyter-notebooks](https://github.com/spacetelescope/notebooks/tree/master/notebooks)\n",
+ "- [STScI Astroconda Channel](http://ssb.stsci.edu/astroconda)\n",
+ "\n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Author:** Benjamin Kuhn; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** January 19, 2023\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `astropy`, `astroquery`, `matplotlib`, or photutils for published research, please cite the authors.
\n",
+ "Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://github.com/astropy/astroquery/blob/main/astroquery/CITATION)\n",
+ "* [Citing `matplotlib`](https://matplotlib.org/stable/users/project/citing.html)\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `photutils`](https://photutils.readthedocs.io/en/stable/citation.html)\n",
+ "
\n",
+ "***\n",
+ "[Top of Page](#top)\n",
+ " "
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.16"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/example/UVIS1wfc3_map.fits b/notebooks/WFC3/calwf3_v1.0_cte/example/UVIS1wfc3_map.fits
new file mode 100644
index 000000000..63dfe62e6
Binary files /dev/null and b/notebooks/WFC3/calwf3_v1.0_cte/example/UVIS1wfc3_map.fits differ
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/example/UVIS2wfc3_map.fits b/notebooks/WFC3/calwf3_v1.0_cte/example/UVIS2wfc3_map.fits
new file mode 100644
index 000000000..726dfa6a6
Binary files /dev/null and b/notebooks/WFC3/calwf3_v1.0_cte/example/UVIS2wfc3_map.fits differ
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/example/apphot_image.png b/notebooks/WFC3/calwf3_v1.0_cte/example/apphot_image.png
new file mode 100644
index 000000000..382ed3796
Binary files /dev/null and b/notebooks/WFC3/calwf3_v1.0_cte/example/apphot_image.png differ
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/example/background_median.py b/notebooks/WFC3/calwf3_v1.0_cte/example/background_median.py
new file mode 100644
index 000000000..7e9c6a88d
--- /dev/null
+++ b/notebooks/WFC3/calwf3_v1.0_cte/example/background_median.py
@@ -0,0 +1,98 @@
+#! /usr/bin/env python
+"""Computes MMM statistics within photutils apertures.
+The functions in this script enable the computation of statistics
+within a PhotUtils aperture, which is currently not directly
+implemented in PhotUtils itself. This code is meant to be
+imported into other code, and then be usable as a single line to
+return all the statistics in a format similar to the
+aperture_photometry method in PhotUtils (i.e. an astropy table).
+Authors
+-------
+ - Varun Bajaj, December 2017
+Use
+---
+ from background_median import aperture_stats_tbl
+ stats_tbl = aperture_stats_tbl(data, apertures)
+ See the docstring of aperture_stats_tbl for more info.
+"""
+import numpy as np
+
+# WAY faster than astropy.stats.sigma_clipped_stats
+from scipy.stats import sigmaclip
+from astropy.table import Table
+
+def aperture_stats_tbl(data, apertures,
+ method='exact', sigma_clip=True):
+ """Computes mean/median/mode/std in Photutils apertures.
+ Compute statistics for custom local background methods.
+ This is primarily intended for estimating backgrounds
+ via annulus apertures. The intent is that this falls easily
+ into other code to provide background measurements.
+ Parameters
+ ----------
+ data : array
+ The data for the image to be measured.
+ apertures : photutils PixelAperture object (or subclass)
+ The phoutils aperture object to measure the stats in.
+ i.e. the object returned via CirularAperture,
+ CircularAnnulus, or RectangularAperture etc.
+ method: str
+ The method by which to handle the pixel overlap.
+ Defaults to computing the exact area.
+ NOTE: Currently, this will actually fully include a
+ pixel where the aperture has ANY overlap, as a median
+ is also being performed. If the method is set to 'center'
+ the pixels will only be included if the pixel's center
+ falls within the aperture.
+ sigma_clip: bool
+ Flag to activate sigma clipping of background pixels
+ Returns
+ -------
+ stats_tbl : astropy.table.Table
+ An astropy Table with the colums X, Y, aperture_mean,
+ aperture_median, aperture_mode, aperture_std, aperture_area
+ and a row for each of the positions of the apertures.
+ """
+
+ # Get the masks that will be used to identify our desired pixels.
+ masks = apertures.to_mask(method=method)
+
+ # Compute the stats of pixels within the masks
+ aperture_stats = [calc_aperture_mmm(data, mask, sigma_clip)
+ for mask in masks]
+
+ aperture_stats = np.array(aperture_stats)
+
+
+ # Place the array of the x y positions alongside the stats
+ stacked = np.hstack([apertures.positions, aperture_stats])
+ # Name the columns
+ names = ['X','Y','aperture_mean','aperture_median','aperture_mode',
+ 'aperture_std', 'aperture_area']
+ # Make the table
+ stats_tbl = Table(data=stacked, names=names)
+
+
+ return stats_tbl
+
+def calc_aperture_mmm(data, mask, sigma_clip):
+ """Helper function to actually calculate the stats for pixels
+ falling within some Photutils aperture mask on some array
+ of data.
+ """
+ cutout = mask.cutout(data, fill_value=np.nan)
+ if cutout is None:
+ return (np.nan, np.nan, np.nan, np.nan, np.nan)
+ else:
+ values = cutout * mask.data / mask.data
+ values = values[~np.isnan(values)]
+ if sigma_clip:
+ values, clow, chigh = sigmaclip(values, low=3, high=3)
+
+ mean = np.mean(values)
+ median = np.median(values)
+ std = np.std(values)
+
+ mode = 3 * median - 2 * mean
+ actual_area = (~np.isnan(values)).sum()
+ return (mean, median, mode, std, actual_area)
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/example/v1_v2_bkg.gif b/notebooks/WFC3/calwf3_v1.0_cte/example/v1_v2_bkg.gif
new file mode 100644
index 000000000..669573b44
Binary files /dev/null and b/notebooks/WFC3/calwf3_v1.0_cte/example/v1_v2_bkg.gif differ
diff --git a/notebooks/WFC3/calwf3_v1.0_cte/example/v1_v2_subsection.gif b/notebooks/WFC3/calwf3_v1.0_cte/example/v1_v2_subsection.gif
new file mode 100644
index 000000000..0f51c1551
Binary files /dev/null and b/notebooks/WFC3/calwf3_v1.0_cte/example/v1_v2_subsection.gif differ
diff --git a/notebooks/WFC3/dash/README.md b/notebooks/WFC3/dash/README.md
new file mode 100755
index 000000000..2b9ef992f
--- /dev/null
+++ b/notebooks/WFC3/dash/README.md
@@ -0,0 +1,23 @@
+This notebook is the first in a new Drift And SHift (DASH) pipeline workflow developed to ease the process of reducing DASH data. The pipeline is customizable, able to be changed according to scientific goals of the user, and this first tutorial walks the user from data download to a finished product ready for science analysis.
+
+Installation
+------------
+`wfc3_dash` requires `lacosmicx` to be installed in the environment from [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions. `lacosmicx` implements the Laplacian cosmic ray detection algorithm and is needed to reduce dash data. After activating the virtual environment, follow the steps below to install the package:
+
+1. Install `cython` to allow the installation of `lacosmicx`:
+```
+>>> conda install cython
+```
+2. Go to https://github.com/cmccully/lacosmicx and clone the repository in the current directory:
+```
+>>> git clone https://github.com/cmccully/lacosmicx.git
+```
+3. Change directory to the `lacosmicx` repository:
+```
+>>> cd lacosmicx
+```
+4. Install the `lacosmicx` package:
+```
+>>> python setup.py develop
+```
+5. **The package is installed; now you will be able to complete the WFC3 Dash notebook.**
diff --git a/notebooks/WFC3/dash/dash.ipynb b/notebooks/WFC3/dash/dash.ipynb
new file mode 100644
index 000000000..8e9d66482
--- /dev/null
+++ b/notebooks/WFC3/dash/dash.ipynb
@@ -0,0 +1,820 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "# How to use `wfc3_dash` on DASH data\n",
+ "\n",
+ "***\n",
+ "## Learning Goals:\n",
+ "By the end of this tutorial, you will:\n",
+ "- Create difference files, association tables, and segmentation maps using `wfc3_dash`.\n",
+ "- Subtract background and fix cosmic rays from newly generated FLTs.\n",
+ "- Align reads to each other for a final product.\n",
+ "\n",
+ "## Table of Contents:\n",
+ "[Introduction](#introduction)
\n",
+ "[1. Imports](#imports)
\n",
+ "[2. Download relevant data](#downloads)
\n",
+ "[3. Run DASH](#DASH)
\n",
+ "- [3.1 Create DashData object](#object)
\n",
+ "- [3.2 Create difference files from reads](#diff_files)
\n",
+ "- [3.3 Create an association table](#asn_table)
\n",
+ "- [3.4 Create a segmentation map](#seg_map)
\n",
+ "- [3.5 Subtract background from the difference files](#subtract_ext)
\n",
+ "- [3.6 Fix cosmic rays](#cosmic_rays)
\n",
+ "- [3.7 Align reads to each other](#align_each_other)
\n",
+ "\n",
+ "[4. Plot original IMA vs. DASH pipeline science result](#plot)
\n",
+ "[5. Conclusions](#conclusions)
\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " \n",
+ "## Introduction\n",
+ "\n",
+ "This notebook is the first in a new Drift And SHift (DASH) pipeline workflow developed to ease the process of reducing DASH data. The pipeline is customizable, able to be changed according to scientific goals of the user, and this first tutorial walks the user from data download to a finished product ready for science analysis. For more information, see [Momcheva et. al 2016](https://arxiv.org/pdf/1603.00465.pdf) and [WFC3 ISR 2021-01](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/2021-02.pdf)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "- *os* for setting environment variables\n",
+ "- *glob* for querying through directories\n",
+ "- *numpy* for handling array functions\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *astropy* for astronomy related functions\n",
+ "- *astroquery.Observations* for downloading data\n",
+ "- *drizzlepac.astrodrizzle* for combining images\n",
+ "- *reduce_dash* for reducing DASH data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib notebook\n",
+ "\n",
+ "import os\n",
+ "from glob import glob\n",
+ "\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt \n",
+ "\n",
+ "from astropy.io import fits \n",
+ "from astropy.table import Table\n",
+ "from astropy.io import ascii\n",
+ "from astroquery.mast import Observations\n",
+ "\n",
+ "from drizzlepac import astrodrizzle \n",
+ "\n",
+ "from reduce_dash import DashData"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 2. Download relevant data\n",
+ "\n",
+ "Retrieve the table of observations associated with 15238."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obsTable = Observations.query_criteria(proposal_id=['15238'], obs_id=['IDNM0J030'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Get the full list of products associated to the table and restrict the list to IMA files."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "product_list = Observations.get_product_list(obsTable)\n",
+ "BM = (product_list['productSubGroupDescription'] == 'IMA') \n",
+ "product_list = product_list[BM]\n",
+ "\n",
+ "product_list.show_in_notebook(display_length=5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Choose a single exposure file to work on. In this example, we choose the first exposure. To create usable data, you will have to follow this work flow on all individual IMA files in your dataset."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myID = product_list['obsID'][0:1]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Download the IMA and FLT files for that exposure. The standard pipeline-FLT will be used for comparison with the detrended final product."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "download = Observations.download_products(myID,mrp_only=False,productSubGroupDescription=['IMA','FLT'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Display the results of the download operation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "download"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Read the files that were just downloaded locally. In addition, have the path be just the rootname, i.e. without the file extension."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "localpathtofile = download['Local Path'][1][:-8]\n",
+ "localpathtofile\n",
+ "\n",
+ "original_ima = fits.open(localpathtofile+'ima.fits')\n",
+ "original_flt = fits.open(localpathtofile+'flt.fits')\n",
+ "original_ima.info()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Print the number of samples and plot the individual reads of the IMA file.\n",
+ "\n",
+ "**Note: the individual 'SCI' extensions are stored in reverse order, with 'SCI', 1 corresponding to the last read.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "nsamp = original_ima[0].header['NSAMP']\n",
+ "print('NSAMP',nsamp)\n",
+ "\n",
+ "fig,axarr = plt.subplots((nsamp+3)//4,4, figsize=(9,3*((nsamp+3)//4)))\n",
+ "\n",
+ "for i in range(1,4*((nsamp+3)//4)+1):\n",
+ "\n",
+ " row = (i-1)//4\n",
+ " col = (i-1)%4\n",
+ " if (i <= nsamp):\n",
+ " immed = np.nanmedian(original_ima['SCI',i].data)\n",
+ " stdev = np.nanstd(original_ima['SCI',i].data)\n",
+ " axarr[row,col].imshow(original_ima['SCI',i].data,clim=[immed-.3*stdev,immed+.5*stdev],cmap='Greys',origin='lower')\n",
+ " axarr[row,col].set_title('SCI '+str(i))\n",
+ " axarr[row,col].set_xticks([]) \n",
+ " axarr[row,col].set_yticks([]) \n",
+ " else:\n",
+ " fig.delaxes(axarr[row,col])\n",
+ "\n",
+ "fig.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Query CRDS for reference files \n",
+ "\n",
+ "Before running `reduce_dash`, we need to set some environment variables for several subsequent calibration tasks.\n",
+ "\n",
+ "We will point to a subdirectory called `crds_cache/` using the IREF environment variable. The IREF variable is used for WFC3 reference files. Other instruments use other variables, e.g., JREF for ACS."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "os.environ['CRDS_SERVER_URL'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_SERVER'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_PATH'] = './crds_cache'\n",
+ "os.environ['iref'] = 'iref/'\n",
+ "if not os.path.exists('iref'):\n",
+ " os.mkdir('iref')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The code block below will query CRDS for the best reference files currently available for these datasets and update the header keywords to point to these new files. We will use the Python package `os` to run terminal commands. In the terminal, the line would be:\n",
+ "\n",
+ "```crds bestrefs --files [filename] --sync-references=1 --update-bestrefs```\n",
+ "\n",
+ "...where 'filename' is the name of your fits file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ima_files = glob('*_ima.fits') \n",
+ "\n",
+ "for file in ima_files:\n",
+ " command_line_input = 'crds bestrefs --files {:} --sync-references=1 --update-bestrefs'.format(file)\n",
+ " os.system(command_line_input)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. Run DASH\n",
+ "Run the DASH pipeline for a single exposure. This procedure showcases the capabilities and customization options of the DASH pipeline.\n",
+ "\n",
+ "**Note: the following will only work if you are using the notebooks inside of the Notebook directory. `wfc3_dash` submodule will be properly packaged and installed within the `wfc3_tools` module sometime in the future.**\n",
+ "\n",
+ "If you move the notebooks and want to use them elsewhere, you can still provide a `temp_path` to the dash codes and remove the comments below. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#import sys\n",
+ "\n",
+ "#module_path = os.path.abspath(os.path.join('..'))\n",
+ "#if module_path not in sys.path:\n",
+ "# sys.path.append(module_path)\n",
+ "\n",
+ "#tmp_path = \".../wfc3_dash/wfc3_dash\"\n",
+ "#if tmp_path not in sys.path:\n",
+ "# sys.path.append(tmp_path)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.1 Create DashData object\n",
+ "\n",
+ "We use the both IMA and FLT extensions of our local image to create a DashData object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash = DashData(localpathtofile+'ima.fits', flt_file_name=localpathtofile+'flt.fits')\n",
+ "print(myDash.root)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.2 Create difference files from reads\n",
+ "\n",
+ "A difference (diff) file contains the counts accumulated between two reads of the IMA file. The diff files are written to disk in a directory named `./diff` under the current working directory (cwd). In creating diff files from the readouts of the IMA, the first difference, between the 1-st and 0-th read is ignored because of its very short exposure time of 2.9 seconds, resulting in a noisy image. \n",
+ "\n",
+ "In order to create the best possible results, the `split_ima()` method uses the `bestrefs` function from [CRDS](https://hst-crds.stsci.edu/) to ensure all reference files are up to date and available."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash.split_ima()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Print the number of diff files and plot the diff files."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ndiff = len(myDash.diff_files_list)\n",
+ "print('Number of diff files',ndiff)\n",
+ "\n",
+ "if ndiff > 4: \n",
+ " fig,axarr = plt.subplots((ndiff+3)//4,4, figsize=(9,3*((ndiff+3)//4)))\n",
+ "\n",
+ " for i in range(4*((ndiff+3)//4)):\n",
+ "\n",
+ " row = (i)//4\n",
+ " col = (i)%4\n",
+ " if (i < ndiff):\n",
+ " diff_i = fits.open(myDash.diff_files_list[i]+'_diff.fits')\n",
+ " immed = np.nanmedian(diff_i['SCI'].data)\n",
+ " stdev = np.nanstd(diff_i['SCI'].data)\n",
+ " axarr[row,col].imshow(diff_i['SCI'].data,clim=[immed-.3*stdev,immed+.5*stdev],cmap='Greys',origin='lower')\n",
+ " axarr[row,col].set_title('Diff:'+str(i+1))\n",
+ " axarr[row,col].set_xticks([]) \n",
+ " axarr[row,col].set_yticks([]) \n",
+ " else:\n",
+ " fig.delaxes(axarr[row,col])\n",
+ "else:\n",
+ " fig,axarr = plt.subplots(1,ndiff,figsize=(15,15))\n",
+ " for i in range(ndiff):\n",
+ " immed = np.nanmedian(diff_i['SCI'].data)\n",
+ " stdev = np.nanstd(diff_i['SCI'].data)\n",
+ " diff_i = fits.open(myDash.diff_files_list[i]+'_diff.fits')\n",
+ " axarr[i].imshow(diff_i['SCI'].data,clim=[immed-.3*stdev,immed+.5*stdev],cmap='Greys',origin='lower')\n",
+ " axarr[i].set_title('Diff:'+str(i+1))\n",
+ " axarr[i].set_xticks([]) \n",
+ " axarr[i].set_yticks([]) \n",
+ "\n",
+ "fig.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.3 Create an association table\n",
+ "\n",
+ "This file mimics a typical association file for dithered exposures, which is used by AstroDrizzle to align and stack multiple exposures taken at the same sky position with small dithers. \n",
+ "\n",
+ "We exploit the fact that a WFC3/IR exposure taken under gyro control can be effectively split into individual pseudo-exposures (the diff images we created in [Section 3.2](#diff_files)). From there, AstroDrizzle can treat such pseudo-expsoures as individual dithers, and combine them into a single exposure."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash.make_pointing_asn()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Show the content of the asn file, which was created in `./diff`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "asn_filename = 'diff/{}_asn.fits'.format(myDash.root)\n",
+ "asn_table = Table(fits.getdata(asn_filename, ext=1))\n",
+ "asn_table.show_in_notebook()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.4 Create a segmentation map\n",
+ "\n",
+ "Create segmentation map from original FLT image to assist with background subtraction and fixing of cosmic ray flags using `create_seg_map()`. This method makes a directory called `./segmentation_maps`, which holds the outputs."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash.create_seg_map()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot segmentation map."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "rootname = myDash.root\n",
+ "segmap_name = ('segmentation_maps/'+ rootname + '_seg.fits')\n",
+ "segmap = fits.getdata(segmap_name)\n",
+ "\n",
+ "fig = plt.figure(figsize=(6, 8))\n",
+ "plt.title(segmap_name)\n",
+ "plt.imshow(segmap, origin='lower', vmin=0, vmax=1, cmap='Greys_r')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Print and read source list."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sourcelist_name = ('segmentation_maps/' + rootname + '_source_list.dat')\n",
+ "sourcelist = ascii.read(sourcelist_name)\n",
+ "print(sourcelist)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's create a segmentation map and source list from the difference files. We need to make source lists from our difference files created from the IMA so that `TweakReg` can better align these difference files to catalogs, each other, etc.\n",
+ "\n",
+ "First, generate a list of difference files that contain the full path name."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "diffpath = os.path.dirname(os.path.abspath('diff/{}_*_diff.fits'.format(rootname)))\n",
+ "cat_images = sorted([os.path.basename(x) for x in glob('diff/{}_*_diff.fits'.format(rootname))])\n",
+ "sc_diff_files = [diffpath + '/' + s for s in cat_images]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Then, create a difference segmentation map using `diff_seg_map()` and the diff files."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash.diff_seg_map(cat_images=sc_diff_files)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plot the segmentation map from a diffrence files."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "segmap_name = ('segmentation_maps/' + rootname + '_01_diff_seg.fits')\n",
+ "segmap = fits.getdata(segmap_name)\n",
+ "fig = plt.figure(figsize=(6, 8))\n",
+ "plt.title(segmap_name)\n",
+ "plt.imshow(segmap, origin='lower', vmin=0, vmax=1, cmap='Greys_r')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.5 Subtract background from difference files\n",
+ "\n",
+ "Subtract background from the individual reads taken from the original IMA file using the DRZ and SEG images produced in the background subtraction of the original FLT. \n",
+ "\n",
+ "By default, `subtract_background_reads()` will subtract the background and write it to the header. By setting `subtract=False`, the background will not be subtracted and will only be written to the header. In addition, setting `reset_stars_dq=True` will reset cosmic rays within objects to 0 since the centers of the stars are flagged."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash.subtract_background_reads()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.6 Fix cosmic rays\n",
+ "\n",
+ "Now, we can use `fix_cosmic_rays()` to reset cosmic rays within the segmentation maps of objects and use [L.A.Cosmic](https://arxiv.org/pdf/astro-ph/0108003.pdf) to find them again."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash.fix_cosmic_rays()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.7 Align reads to each other\n",
+ "Align reads from the IMA to one another by aligning each difference file to the first diff file.\n",
+ "\n",
+ "Listed below are all the parameters available to `myDash.align()`. `align()` uses `TweakReg` to update the WCS information in the headers of the diff files, then drizzles the images together using `AstroDrizzle`. There are more parameters available to users when working with `TweakReg` and `AstroDrizzle` that could be an integral part of the workflow for users of DASH. The example below lists the default values set for every input:\n",
+ "\n",
+ "``myDash.align(self, subtract_background = True, \n",
+ " align_method = None, \n",
+ " ref_catalog = None, \n",
+ " create_diff_source_lists = True,\n",
+ " updatehdr = True, \n",
+ " updatewcs = True, \n",
+ " wcsname = 'DASH', \n",
+ " threshold = 50., \n",
+ " cw = 3.5, \n",
+ " searchrad = 20., \n",
+ " astrodriz = True, \n",
+ " cat_file = 'catalogs/diff_catfile.cat',\n",
+ " drz_output = None, \n",
+ " move_files = False)``\n",
+ " \n",
+ "Refer to documentation to customize parameters for [TweakReg](https://drizzlepac.readthedocs.io/en/latest/tweakreg.html) and [AstroDrizzle](https://drizzlepac.readthedocs.io/en/latest/astrodrizzle.html). \n",
+ "\n",
+ "Note: the error `UnboundLocalError: local variable 'sig' referenced before assignment` can be solved by lowering threshold parameter."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash.align(updatehdr=False, updatewcs=True, astrodriz=False)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Print the shifts file to analyze how well the alignment went. Do not update header until shifts, as seen in the `xrms` and `yrms` columns, are satisfactory. Further information about the outputs in the shift file and what is 'satisfactory' can be found in the [Drizzlepac Handbook](https://hst-docs.stsci.edu/drizzpac)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "shift_file = glob('shifts/shifts_*.txt')\n",
+ "shift_file_name = shift_file[0]\n",
+ "\n",
+ "\n",
+ "shift_tab = Table.read(shift_file_name,\n",
+ " format='ascii.no_header',\n",
+ " names=['file','dx','dy','rot','scale','xrms','yrms'])\n",
+ "\n",
+ "formats = ['.2f', '.2f', '.3f', '.5f', '.2f', '.2f']\n",
+ "for i, col in enumerate(shift_tab.colnames[1:]):\n",
+ " shift_tab[col].format = formats[i]\n",
+ "shift_tab"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's align our images with a threshold of 20, and update the headers and WCS information."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "myDash.align(threshold = 20.)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. Plot original IMA and DASH pipeline science result\n",
+ "\n",
+ "Plot the final DRZ image and compare to the original IMA."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "sci_name = myDash.root + '_drz_sci.fits'\n",
+ "og_flt_name = 'mastDownload/HST/' + myDash.root + '/' + myDash.root + '_ima.fits'\n",
+ "sci = fits.getdata(sci_name)\n",
+ "og_flt = fits.getdata(og_flt_name)\n",
+ "\n",
+ "fig = plt.figure(figsize=(9, 4))\n",
+ "ax1 = fig.add_subplot(1,2,2)\n",
+ "ax2 = fig.add_subplot(1,2,1)\n",
+ "\n",
+ "ax1.set_title('DASH Pipeline Reduced Science File')\n",
+ "ax2.set_title('Original IMA (not reduced using pipeline)')\n",
+ "\n",
+ "ax1.set_xlim(-10,1120)\n",
+ "ax2.set_xlim(-10,1120)\n",
+ "\n",
+ "ax1.set_ylim(-10,1050)\n",
+ "ax2.set_ylim(-10,1050)\n",
+ "\n",
+ "ax1.imshow(sci, vmin=0, vmax=40, cmap='Greys_r', origin='lower')\n",
+ "ax2.imshow(og_flt, vmin=0, vmax=40, cmap='Greys_r', origin='lower')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 5. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. Now using WFC3 data, you should be more familiar with:\n",
+ "\n",
+ "- Creating difference files, association tables, and segmentation maps using `wfc3_dash`.\n",
+ "- Subtracting background and fixing cosmic rays from newly generated FLTs.\n",
+ "- Aligning reads to each other for a final product.\n",
+ "\n",
+ "Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ " - see sections 9.5.4 for reference to this notebook\n",
+ " \n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Authors:** Catherine Martlin; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** 2023-01-25\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `matplotlib`, `astropy`, `astroquery`, `photutils`, or `drizzlepac` for published research, please cite the authors. Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `matplotlib`](https://matplotlib.org/stable/users/project/citing.html)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://astroquery.readthedocs.io/en/latest/license.html)\n",
+ "* [Citing `photutils`](https://photutils.readthedocs.io/en/stable/citation.html)\n",
+ "* [Citing `drizzlepac`](https://drizzlepac.readthedocs.io/en/latest/LICENSE.html)\n",
+ "\n",
+ "***\n",
+ "[Top of Page](#title)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.7"
+ },
+ "toc": {
+ "base_numbering": 1,
+ "nav_menu": {},
+ "number_sections": false,
+ "sideBar": true,
+ "skip_h1_title": false,
+ "title_cell": "Table of Contents",
+ "title_sidebar": "Contents",
+ "toc_cell": false,
+ "toc_position": {},
+ "toc_section_display": true,
+ "toc_window_display": true
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/WFC3/dash/reduce_dash.py b/notebooks/WFC3/dash/reduce_dash.py
new file mode 100644
index 000000000..de1e74f72
--- /dev/null
+++ b/notebooks/WFC3/dash/reduce_dash.py
@@ -0,0 +1,886 @@
+#! /usr/bin/env python
+
+""" Reduces DASH/IR data.
+
+This script serves as a pipeline to reduce DASH/IR data. The
+FLT/IMA files available from MAST are inappropiate to use to
+perform science upon (Momcheva et al. 2017). This script will
+create an aligned image that is the combination of the
+differences between adjacent reads. This file is appropriate
+to use for science work.
+
+
+The following output products are created by this script from
+each IMA file:
+
+1. Individual fits files of differences between IMA reads with
+ thier own headers.
+2. A master ASN file of those read fits files for a single IMA.
+3. An aligned version of the IMA read fits files.
+
+Authors
+-------
+ Rosalia O'Brien 2019
+ Iva Momcheva 2018
+ Catherine Martlin 2018, 2023
+ Mario Gennaro 2018
+
+Use
+---
+ This script is intended to be executed via the command line
+ as such:
+ ::
+
+ python reduce_dash.py [-f|--file]
+
+ ``-f --file`` - The IMA file name/path.
+
+Notes
+-----
+
+ Lacosmicx (used to identify cosmic rays): https://github.com/cmccully/lacosmicx
+
+References
+----------
+
+ - Ivelina G. Momcheva, Pieter G. van Dokkum, Arjen van der Wel,
+ Gabriel B. Brammer, John MacKenty, Erica J. Nelson, Joel Leja,
+ Adam Muzzin, and Marijn Franx. 2017 January.
+ doi:10.1088/1538-3873/129/971/015004
+
+"""
+from glob import glob
+import os
+
+from astropy.convolution import convolve
+from astropy.convolution import Gaussian2DKernel
+from astropy.io import ascii
+from astropy.io import fits
+from astropy.stats import gaussian_fwhm_to_sigma
+from astropy.table import Table, Column, MaskedColumn
+from drizzlepac import tweakreg
+from drizzlepac import astrodrizzle
+import lacosmicx #for fix_cosmic_rays
+import numpy as np
+from stsci.tools import teal
+import stwcs
+from photutils import detect_sources #Needed for create_seg_map
+from photutils import detect_threshold #Needed for create_seg_map
+from photutils.segmentation import SourceCatalog
+
+from utils import get_flat
+from utils import get_IDCtable
+
+class DashData(object):
+
+ def __init__(self,file_name=None, flt_file_name=None):
+ '''
+ The init method performs a series of tests to make sure that the file
+ fed to the DashData class is a valid IMA file with units in e/s. Will
+ also add root attribute to DashData class.
+
+ Paramaters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+ file_name : fits file
+ Name of IMA file that is fed to DashData class.
+ flt_file_name : fits file
+ Name of FLT file that is fed to DashData class.
+
+ Outputs
+ -------
+ N/A
+ '''
+
+ if '_ima.fits' not in file_name:
+ raise Exception('Input needs to be an IMA file.')
+ else:
+ self.file_name = file_name
+ #First test whether the file exists
+ try:
+ self.ima_file = fits.open(self.file_name)
+ ### If it does - test its content
+
+ ###### Test whether it is a wfc3/ir image
+ if ( (self.ima_file[0].header['INSTRUME'].strip() == 'WFC3') & (self.ima_file[0].header['DETECTOR'].strip() == 'IR') ) == False:
+ raise Exception('This observation was not performed with WFC3/IR, instrument is set to: {}, and detector is set to: {}'.format(
+ self.ima_file[0].header['INSTRUME'],self.ima_file[0].header['DETECTOR'] ) )
+
+ ###### Test whether it has more than one science extension (FLTs have only 1)
+ nsci = [ext.header['EXTNAME '] for ext in self.ima_file[1:]].count('SCI')
+ if nsci == 1:
+ raise Exception('This file has only one science extension, it cannot be a WFC3/IR ima')
+
+ ###### Test that this file is NOT a RAW
+ calib_keys = ['DQICORR','ZSIGCORR','ZOFFCORR','DARKCORR','BLEVCORR','NLINCORR','FLATCORR','CRCORR','UNITCORR','PHOTCORR','RPTCORR','DRIZCORR']
+ performed = 0
+ for ck in calib_keys:
+ if self.ima_file[0].header[ck] == 'COMPLETE':
+ performed = performed + 1
+ if performed == 0:
+ raise Exception('This file looks like a RAW file')
+
+ ###### Test that the units of the individual images are e/s
+
+ bu = self.ima_file[1].header['BUNIT']
+ if bu != 'ELECTRONS/S':
+ uc = self.ima_file[0].header['UNITCORR']
+ fc = self.ima_file[0].header['FLATCORR']
+ raise Exception('BUNIT in the "SCI" extensions of this file is set to "{}", but should be set to "ELECTRONS/S"\n'
+ 'This is a consequence of UNITCORR set to "{}" and FLATCORR set to "{}".\n'
+ 'Please rerun calwf3 on this file after setting both UNITCORR and FLATCORR to "PERFORM" in the 0-th extension header'.format(bu,uc,fc))
+
+
+
+ except IOError:
+ print('Cannot read file.')
+
+ self.flt_file_name = flt_file_name
+ self.root = self.file_name.split('/')[-1].split('_ima')[0]
+
+ def align(self, subtract_background = True,
+ align_method = None, ref_catalog = None,
+ create_diff_source_lists=True,
+ updatehdr=True, updatewcs=True, wcsname = 'DASH',
+ threshold = 50., cw = 3.5,
+ searchrad=20., astrodriz=True,
+ cat_file='catalogs/diff_catfile.cat',
+ drz_output=None, move_files=False):
+
+ '''
+ Aligns new FLT's to reference catalog.
+
+ Parameters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+ subtract_background : bool, optional
+ If True, runs subtract_background_reads functions.
+ align_method : string, optional
+ Defines alignment method to be used. Default is None (input files
+ will align to each other).
+ ref_catalog : cat file, optional
+ Defines reference image that will be referenced for CATALOG
+ alignment method.
+ create_diff_source_lists : bool, optional
+ Specifies whether or not to create a segmentation image and source
+ list from the difference files.
+ updatehdr : bool, optional
+ Specifies whether to update the headers after aligning during
+ TweakReg. Default is True.
+ updatewcs : bool, optional
+ Specifies whether to update the WCS after aligning during TweakReg.
+ Default is True.
+ wcsname : str, optional (as long as name you choose doesn't already exist)
+ Specifies name of WCS. Default is 'DASH'.
+ threshold : float, optional
+ The object detection threshold above the local background in units of
+ sigma used by TweakReg.
+ cw : float, optional
+ conv_width or the convolution kernel width in pixels used by TweakReg.
+ searchrad : float, optional
+ Radius (in pixels) that TweakReg will search around sources to find
+ matches. Default is 20 pixels.
+ astrodriz : bool, optional
+ Specifies whether to drizzle images together using Astrodrizzle.
+ Default is True.
+ cat_file : str, optional
+ Name of catfile to be used to align sources in TweakReg. Default is
+ the catfile created by setting create_diff_source_lists to True,
+ catalogs/diff_catfile.cat
+ drz_output : str, optional
+ Name of output file after drizzling using AstroDrizzle. Default is
+ the root name of the original IMA.
+ move_files : bool, optional
+ If True, move files from alignment steps to folders.
+
+
+ Outputs
+ -------
+ Shifts file : txt file
+ File containing shifts during TweakReg.
+ WCS Shifts file : fits file
+ File containing WCS shifts during TweakReg.
+ Residual plot : png
+ Plot showing residuals from TweakReg alignment.
+ Vector plot : png
+ Plot showing vector poitnings from TweakReg alignment.
+ Aligned FLT's : fits file
+ Same diff files created in split_ima that have been aligned using TweakReg.
+ Drizzled Image : fits file
+ Setting astrodriz to True will output a drizzled image form a single
+ exposure (produced only if astrodriz is set to True).
+ '''
+
+ #Set name for output drizzled image to the rootname of the original IMA if it is not specified
+ if drz_output is None:
+ drz_output=self.root
+
+ input_images = sorted(glob('diff/{}_*_diff.fits'.format(self.root)))
+
+ if not os.path.exists('shifts'):
+ os.mkdir('shifts')
+ outshifts = 'shifts/shifts_{}.txt'.format(self.root)
+ outwcs = 'shifts/shifts_{}_wcs.fits'.format(self.root)
+
+ if subtract_background:
+ self.subtract_background_reads()
+
+ #Align images to a catalog
+ if align_method == 'CATALOG':
+ if (ref_catalog is not None):
+
+ ##Create source list and segmentation maps based on difference files
+ if create_diff_source_lists is True:
+ diffpath = os.path.dirname(os.path.abspath('diff/{}_*_diff.fits'.format(self.root)))
+ cat_images=sorted([os.path.basename(x) for x in glob('diff/{}_*_diff.fits'.format(self.root))])
+
+ sc_diff_files = [diffpath + '/' + s for s in cat_images]
+
+ self.diff_seg_map(cat_images=sc_diff_files)
+
+ teal.unlearn('tweakreg')
+ teal.unlearn('imagefindpars')
+
+ tweakreg.TweakReg(input_images,
+ refcat=ref_catalog,
+ catfile=cat_file,
+ xcol=2,
+ ycol=3,
+ updatehdr=updatehdr,
+ updatewcs=updatewcs,
+ wcsname=wcsname,
+ verbose=True,
+ imagefindcfg={'threshold': threshold, 'conv_width': cw},
+ searchrad=searchrad,
+ searchunits = 'pixels',
+ shiftfile=True,
+ outshifts=outshifts,
+ outwcs=outwcs,
+ interactive=False,
+ fitgeometry='rscale',
+ minobj=5)
+
+ else:
+
+ raise Exception('Need to specify reference catalog and reference image.')
+
+
+ #Align images to the first image
+ else:
+
+ teal.unlearn('tweakreg')
+ teal.unlearn('imagefindpars')
+
+ tweakreg.TweakReg(input_images,
+ catfile=cat_file,
+ xcol=2,
+ ycol=3,
+ updatehdr=updatehdr,
+ updatewcs=updatewcs,
+ wcsname=wcsname,
+ verbose=True,
+ imagefindcfg={'threshold': threshold, 'conv_width': cw},
+ searchrad=searchrad,
+ searchunits = 'pixels',
+ shiftfile=True,
+ outshifts=outshifts,
+ outwcs=outwcs,
+ interactive=False,
+ fitgeometry='rscale',
+ minobj=5)
+
+ pass
+
+ #Drizzle the images together
+ if astrodriz is True:
+
+ #Do not have drizzle take 256 flags into account
+ no_tfs = 2,4,8,16,32,64,128,512,2048,4096,8192,16384
+
+ astrodrizzle.AstroDrizzle(input_images,
+ output=drz_output,
+ clean=False,
+ final_pixfrac=1.0,
+ context=False,
+ resetbits=0,
+ preserve=False,
+ driz_cr_snr='8.0 5.0',
+ driz_cr_scale = '2.5 0.7',
+ driz_sep_bits=no_tfs,
+ final_bits=no_tfs, num_cores=1) #added num cores = 1
+
+ if move_files is True:
+ self.move_files()
+
+ def create_seg_map(self):
+ '''
+ Creates segmentation map, from original FLT file, that is used in
+ background subtraction and to fix cosmic rays.
+
+ Parameters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+
+ Output
+ ------
+ Segmentation Image : fits file
+ Segmentation map.
+ Source List : .dat file
+ List of sources and their properties.
+ '''
+
+ flt = fits.open(self.flt_file_name)
+ data = flt[1].data
+
+ threshold = detect_threshold(data, nsigma=3.)
+
+ sigma = 3.0 * gaussian_fwhm_to_sigma # FWHM = 3.
+ kernel = Gaussian2DKernel(sigma, x_size=3, y_size=3)
+ kernel.normalize()
+ convolved_data = convolve(data, kernel)
+ segm = detect_sources(convolved_data, threshold, npixels=10)
+
+ hdu = fits.PrimaryHDU(segm.data)
+ if not os.path.exists('segmentation_maps'):
+ os.mkdir('segmentation_maps')
+ hdu.writeto(('segmentation_maps/{}_seg.fits').format(self.root), overwrite=True)
+
+ # Create source list
+ cat = SourceCatalog(data, segm)
+
+ tbl = cat.to_table()
+ tbl['xcentroid'].info.format = '.2f'
+ tbl['ycentroid'].info.format = '.2f'
+ #tbl['cxx'].info.format = '.2f'
+ #tbl['cxy'].info.format = '.2f'
+ #tbl['cyy'].info.format = '.2f'
+
+ ascii.write(tbl, 'segmentation_maps/{}_source_list.dat'.format(self.root), overwrite=True)
+
+ def diff_seg_map(self, cat_images=None, remove_column_names=True, nsigma=1.0, sig=5.0, npixels=5):
+ '''
+ Creates segmentation image and source list from difference files.
+
+ Parameters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+ cat_images : list, str
+ List of difference files with full path name.
+ remove_column_names : bool
+ Specifies whether to remove the header from the source lists so
+ TweakReg can read them.
+ nsigma : float
+ The number of standard deviations per pixel above the background
+ for which to consider a pixel as possibly being part of a source.
+ Used by photutils.detect_threshold.
+ sig : float
+ Factor used to adjust gaussian_fwhm_to_sigma.
+ npixels : float
+ The number of connected pixels, each greater than threshold, that
+ an object must have to be detected. npixels must be a positive .
+
+ Outputs
+ -------
+ Segmentation Image : fits file
+ Segmentation map.
+ Source List : .dat file
+ List of sources and their properties.
+ '''
+
+ input_images = sorted(glob('diff/{}_*_diff.fits'.format(self.root)))
+
+ for index, diff in enumerate(input_images, start=1):
+
+ diff=fits.open(diff)
+ data = diff[1].data
+
+ threshold = detect_threshold(data, nsigma=nsigma)
+
+ sigma = sig * gaussian_fwhm_to_sigma
+ kernel = Gaussian2DKernel(sigma, x_size=sig, y_size=sig)
+ kernel.normalize()
+ convolved_data = convolve(data, kernel)
+ segm = detect_sources(convolved_data, threshold, npixels=npixels)
+
+ hdu = fits.PrimaryHDU(segm.data)
+ if not os.path.exists('segmentation_maps'):
+ os.mkdir('segmentation_maps')
+ hdu.writeto(('segmentation_maps/{}_{:02d}_diff_seg.fits').format(self.root, index), overwrite=True)
+
+ # Create source list
+ cat = SourceCatalog(data, segm)
+
+ tbl = cat.to_table()
+ tbl['xcentroid'].info.format = '.2f'
+ tbl['ycentroid'].info.format = '.2f'
+ #tbl['cxx'].info.format = '.2f'
+ #tbl['cxy'].info.format = '.2f'
+ #tbl['cyy'].info.format = '.2f'
+
+ ascii.write(tbl, 'segmentation_maps/{}_{:02d}_diff_source_list.dat'.format(self.root, index), overwrite=True)
+
+ if remove_column_names is True:
+ #Remove headers to source lists so tweakreg can read them
+ n = 1
+ nfirstlines = []
+
+ with open('segmentation_maps/{}_{:02d}_diff_source_list.dat'.format(self.root, index)) as f, open("temp_sl.dat", "w") as out:
+ for x in range(n):
+ nfirstlines.append(next(f))
+ for line in f:
+ out.write(line)
+
+ os.remove('segmentation_maps/{}_{:02d}_diff_source_list.dat'.format(self.root, index))
+ os.rename("temp_sl.dat", 'segmentation_maps/{}_{:02d}_diff_source_list.dat'.format(self.root, index))
+
+ if cat_images is not None:
+ x=np.array(cat_images)
+ y=np.array(sorted(glob(('segmentation_maps/{}_*_diff_source_list.dat').format(self.root))))
+ catdata = Table([x, y], names=['Diff File', 'Source List'])
+ #Save catfile in catalogs folder
+ if not os.path.exists('catalogs'):
+ os.mkdir('catalogs')
+ ascii.write(catdata, 'catalogs/diff_catfile.cat', overwrite=True)
+ else:
+ raise Exception('Need to input list of difference files in order to make source list. List should include full path.')
+
+
+ def fix_cosmic_rays(self, rm_custom=False, flag=None, **lacosmic_param):
+ '''
+ Resets cosmic rays within the seg maps of objects and uses L.A.Cosmic
+ to find them again.
+
+ Parameters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+ rm_custom : bool
+ Specifies whether or not the user would like to remove custom flags
+ within the boundaries of sources, as defined by the segmentation map
+ created from the original FLT.
+ flag : int
+ Specifies flag the user would like the remove within the boundaries
+ of sources.
+ lacosmic_param : dic
+ Dictionary of the L.A.Cosmic parameters that users may want to specify.
+ If not set, then presets are used.
+
+ Output
+ ------
+ Fixed for cosmic rays diff files : fits
+ Same diff files created in split_ima that have now been corrected
+ for cosmic ray errors.
+ '''
+
+ asn_exposures = sorted(glob('diff/' + self.root + '_*_diff.fits'))
+
+ seg = fits.open('segmentation_maps/{}_seg.fits'.format(self.root))
+ seg_data = np.cast[np.float32](seg[0].data)
+
+ flt_full = fits.open(self.flt_file_name)
+ flt_full_wcs = stwcs.wcsutil.HSTWCS(flt_full, ext=1)
+
+ EXPTIME = flt_full[0].header['EXPTIME']
+
+ if lacosmic_param:
+ gain = lacosmic_param['gain']
+ readnoise = lacosmic_param['readnoise']
+ objlim = lacosmic_param['objlim']
+ pssl = lacosmic_param['pssl']
+ verbose = lacosmic_param['verbose']
+ else:
+ gain = 1.0
+ readnoise = 20.
+ objlim = 15.0
+ pssl = 0.
+ verbose = True
+ #Have lacosmicx locate cosmic rays
+ crmask, clean = lacosmicx.lacosmicx(flt_full[1].data, gain=gain, readnoise=readnoise,
+ objlim = objlim,
+ pssl = pssl,
+ verbose=verbose)
+
+ yi, xi = np.indices((1014,1014))
+
+ #Remove all 4096 flags within the boundaries of objects
+ for exp in asn_exposures:
+ flt = fits.open(exp, mode = 'update')
+ flagged_stars = ((flt['DQ'].data & 4096) > 0) & (seg_data > 0)
+ flt['DQ'].data[flagged_stars] -= 4096
+ new_cr = (crmask == 1) & ((flt['DQ'].data & 4096) == 0) & ((seg_data == 0) | ((seg_data > 0) & (flt['SCI'].data < 1.))) & (xi > 915) & (yi < 295)
+ flt['DQ'].data[new_cr] += 4096
+ flt.flush()
+
+ #Remove custom flags
+ if rm_custom is True:
+ if flag is not None:
+ for exp in asn_exposures:
+ flt = fits.open(exp, mode = 'update')
+ flagged_stars = ((flt['DQ'].data & flag) > 0) & (seg_data > 0)
+ flt['DQ'].data[flagged_stars] -= flag
+ new_cr = (crmask == 1) & ((flt['DQ'].data & flag) == 0) & ((seg_data == 0) | ((seg_data > 0) & (flt['SCI'].data < 1.))) & (xi > 915) & (yi < 295)
+ flt['DQ'].data[new_cr] += flag
+ flt.flush()
+ else:
+ raise Exception('Must specify which flags to remove.')
+
+ def make_pointing_asn(self):
+ """
+ Makes a new association table for the reads extracted from a given IMA.
+
+ Parameters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+
+ Outputs
+ ----------
+ ASN files : fits file
+ Fits file formatted as an association file that holds
+ the names of the difference files created by split_ima
+ and the root name of the individual IMA file.
+ """
+
+ asn_filename = 'diff/{}_asn.fits'.format(self.root)
+ asn_list = self.diff_files_list.copy()
+ asn_list.append(self.root)
+
+ # Create Primary HDU:
+ hdr = fits.Header()
+ hdr['FILENAME'] = asn_filename
+ hdr['FILETYPE'] = 'ASN_TABLE'
+ hdr['ASN_ID'] = self.root
+ hdr['ASN_TABLE'] = asn_filename
+ hdr['COMMENT'] = "This association table is for the read differences for the IMA."
+ primary_hdu = fits.PrimaryHDU(header=hdr)
+
+ # Create the information in the asn file
+ num_mem = len(asn_list)
+
+ asn_mem_names = np.array(asn_list)
+ asn_mem_types = np.full(num_mem,'EXP-DTH',dtype=np.chararray)
+ asn_mem_types[-1] = 'PROD-DTH'
+ asn_mem_prsnt = np.ones(num_mem, dtype=np.bool_)
+ asn_mem_prsnt[-1] = 0
+
+ hdu_data = fits.BinTableHDU().from_columns([fits.Column(name='MEMNAME', format='14A', array=asn_mem_names),
+ fits.Column(name='MEMTYPE', format='14A', array=asn_mem_types),
+ fits.Column(name='MEMPRSNT', format='L', array=asn_mem_prsnt)])
+
+ # Create the final asn file
+ hdu = fits.HDUList([primary_hdu, hdu_data])
+
+ if 'EXTEND' not in hdu[0].header.keys():
+ hdu[0].header.update('EXTEND', True, after='NAXIS')
+
+ hdu.writeto(asn_filename, overwrite=True)
+
+ # Create property of the object that is the asn filename.
+ self.asn_filename = asn_filename
+
+ def move_files(self):
+ '''
+ Moves files from alignment steps to folders.
+
+ Parameters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+
+ Outputs
+ -------
+ residuals : dir
+ Directory containing all residual and vector plots.
+ histograms : dir
+ Directory containing all histogram png's.
+ misC_tweakreg_files : dir
+ Directory containing all misc. files.
+ '''
+
+ #Move all residual plots into residuals folder
+ if not os.path.exists('residuals'):
+ os.mkdir('residuals')
+
+ residuals=sorted(glob('residuals_{}_*_diff.png'.format(self.root)))
+ for image in residuals:
+ os.rename(image, 'residuals/' + image)
+
+ vectors=sorted(glob('vector_{}_*_diff.png'.format(self.root)))
+ for image in vectors:
+ os.rename(image, 'residuals/' + image)
+
+ #Move all histograms plots into histograms folder
+ if not os.path.exists('histograms'):
+ os.mkdir('histograms')
+
+ graphs=sorted(glob('hist2d_{}_*_diff.png'.format(self.root)))
+ for image in graphs:
+ os.rename(image, 'histograms/' + image)
+
+ #Move misc TweakReg files to misc_tweakreg folder
+ if not os.path.exists('misc_tweakreg_files'):
+ os.mkdir('misc_tweakreg_files')
+
+ files=sorted(glob('{}_*_diff*'.format(self.root)))
+ for image in files:
+ os.rename(image, 'misc_tweakreg_files/' + image)
+ fits=sorted(glob('{}_*_mask*'.format(self.root)))
+ for image in fits:
+ os.rename(image, 'misc_tweakreg_files/' + image)
+
+ def split_ima(self):
+ '''
+ Will create individual files for the difference between
+ adjacent reads of a IMA file. Will also add more attributes
+ to the DashData object.
+
+ Parameters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+
+ Outputs
+ ----------
+ N files : fits files
+ Fits files of the difference between adjacent IMA reads.
+
+ '''
+ FLAT = fits.open(get_flat(self.file_name))
+ IDCtable = fits.open(get_IDCtable(self.file_name))
+
+ NSAMP = self.ima_file[0].header['NSAMP']
+ shape = self.ima_file['SCI',1].shape
+
+ cube = np.zeros((NSAMP, shape[0], shape[1]), dtype='float32')
+ dq = np.zeros((NSAMP, shape[0], shape[1]), dtype=np.int)
+ time = np.zeros(NSAMP)
+
+ for i in range(NSAMP):
+ cube[NSAMP-1-i, :, :] = self.ima_file['SCI',i+1].data*self.ima_file['TIME',i+1].header['PIXVALUE']
+ dq[NSAMP-1-i, :, :] = self.ima_file['DQ',i+1].data
+ time[NSAMP-1-i] = self.ima_file['TIME',i+1].header['PIXVALUE']
+
+ diff = np.diff(cube, axis=0)
+ self.diff = diff[1:]
+ dt = np.diff(time)
+ self.dt = dt[1:]
+
+ self.dq = dq[1:]
+
+ self.readnoise_2D = np.zeros((1024,1024), dtype='float32')
+ self.readnoise_2D[512: ,0:512] += self.ima_file[0].header['READNSEA']
+ self.readnoise_2D[0:512,0:512] += self.ima_file[0].header['READNSEB']
+ self.readnoise_2D[0:512, 512:] += self.ima_file[0].header['READNSEC']
+ self.readnoise_2D[512: , 512:] += self.ima_file[0].header['READNSED']
+ self.readnoise_2D = self.readnoise_2D**2
+
+ self.diff_files_list = []
+ for j in range(1, NSAMP-1):
+
+ hdu0 = fits.PrimaryHDU(header=self.ima_file[0].header)
+ hdu0.header['EXPTIME'] = dt[j]
+ hdu0.header['IMA2FLT'] = (1, 'FLT {} extracted from IMA file'.format(j))
+ hdu0.header['NEXTEND'] = 5
+ hdu0.header['OBSMODE'] = 'ACCUM'
+ hdu0.header['NSAMP'] = 1
+
+
+ science_data = diff[j,:,:]/dt[j]
+ hdu1 = fits.ImageHDU(data = science_data[5:-5,5:-5], header = self.ima_file['SCI',NSAMP-j-1].header, name='SCI')
+ hdu1.header['EXTVER'] = 1
+ hdu1.header['ROOTNAME'] = '{}_{:02d}'.format(self.root,j)
+
+ var = 2*self.readnoise_2D + science_data*FLAT['SCI'].data*dt[j]
+ err = np.sqrt(var)/dt[j]
+
+ hdu2 = fits.ImageHDU(data = err[5:-5,5:-5], header = self.ima_file['ERR',NSAMP-j-1].header, name='ERR')
+ hdu2.header['EXTVER'] = 1
+
+ hdu3 = fits.ImageHDU(data = dq[j+1][5:-5,5:-5], header = self.ima_file['DQ',NSAMP-j-1].header, name='DQ')
+ hdu3.header['EXTVER'] = 1
+
+ # Turn the 8192 cosmic ray flag to the standard 4096
+ hdu3.data[(hdu3.data & 8192) > 0] -= 4096
+ # remove the 32 flag, these are not consistently bad
+ hdu3.data[(hdu3.data & 32) > 0] -= 32
+
+ hdu4 = fits.ImageHDU(data = (np.zeros((1014,1014), dtype=np.int16) + 1), header = self.ima_file['SAMP',NSAMP-j-1].header, name = 'SAMP')
+ hdu5 = fits.ImageHDU(np.zeros((1014,1014)) + dt[j], header = self.ima_file['TIME',NSAMP-j-1].header, name = 'TIME')
+ hdu4.header['EXTVER'] = 1
+ hdu5.header['EXTVER'] = 1
+
+ hdu = fits.HDUList([hdu0,hdu1,hdu2,hdu3,hdu4,hdu5])
+ print('Writing {}_{:02d}_diff.fits'.format(self.root,j))
+
+ self.hdu = hdu
+
+ if not os.path.exists('diff'):
+ os.mkdir('diff')
+
+
+ hdu.writeto('diff/{}_{:02d}_diff.fits'.format(self.root,j), overwrite=True)
+
+ self.diff_files_list.append('diff/{}_{:02d}'.format(self.root,j))
+
+ def subtract_background_reads(self, subtract=True, reset_stars_dq=False):
+ '''
+ Performs median background subtraction for each individual difference file.
+ Uses the DRZ and SEG images produced in FLT background subtraction.
+
+ Parameters
+ ----------
+ self : object
+ DashData object created from an individual IMA file.
+ subtract : bool
+ Does not subtract the background by default, but still writes it to
+ the header.
+ Set to True to subtract background.
+ reset_stars_dq : bool
+ Set to True to reset cosmic rays within objects to 0 because the
+ centers of stars are flagged.
+
+ Outputs
+ -------
+ Background Subtracted N files : fits files
+ Fits files of the difference between adjacent IMA reads that have
+ been background subtracted.
+ '''
+
+ seg = fits.open('segmentation_maps/{}_seg.fits'.format(self.root))
+ seg_data = np.cast[np.float32](seg[0].data)
+
+ yi, xi = np.indices((1014,1014))
+
+
+ self.bg_models = []
+
+ for ii, exp in enumerate(self.diff_files_list):
+
+ diff = fits.open('{}_diff.fits'.format(exp), mode='update')
+ diff_wcs = stwcs.wcsutil.HSTWCS(diff, ext=1)
+
+ mask = (seg_data == 0) & (diff['DQ'].data == 0) & (diff[1].data > -1) & (xi > 10) & (yi > 10) & (xi < 1004) & (yi < 1004)
+ mask &= (diff[1].data < 5*np.median(diff[1].data[mask]))
+ data_range = np.percentile(diff[1].data[mask], [2.5, 97.5])
+ mask &= (diff[1].data >= data_range[0]) & (diff[1].data <= data_range[1])
+ data_range = np.percentile(diff[2].data[mask], [0.05, 99.5])
+ mask &= (diff[2].data >= data_range[0]) & (diff[2].data <= data_range[1])
+
+ sky_level = np.median(diff[1].data[mask])
+ model = diff[1].data*0. + sky_level
+
+ diff[1].header['MDRIZSKY'] = sky_level
+ if not subtract:
+ if 'BG_SUB' not in (key for key in diff[1].header.keys()):
+ flt[1].header['BG_SUB'] = 'No'
+ else:
+ if 'BG_SUB' not in (key for key in diff[1].header.keys()):
+ diff[1].data -= model
+ diff[1].header['BG_SUB'] = 'Yes'
+ else:
+ print('Keyword BG_SUB already set to {}. Skipping background subtraction.'.format(diff[1].header['BG_SUB']))
+
+
+ if reset_stars_dq:
+ flagged_stars = ((diff['DQ'].data & 4096) > 0) & (blotted_seg > 0)
+ diff['DQ'].data[flagged_stars] -= 4096
+
+ diff.flush()
+ print('Background subtraction, {}_diff.fits: {}'.format(exp, sky_level))
+
+
+def main(ima_file_name = None, flt_file_name = None,
+ align_method = None, ref_catalog = None,
+ drz_output=None, subtract_background = False,
+ wcsname = 'DASH', threshold = 50., cw = 3.5,
+ updatehdr=True, updatewcs=True,
+ searchrad=20.,
+ astrodriz=True, cat_file = 'catalogs/diff_catfile.cat'):
+
+ '''
+ Runs entire DashData pipeline under a single function.
+
+ Parameters
+ ----------
+ ima_file_name : str
+ File name of ima file.
+ flt_file_name : str
+ File name of FLT file.
+ align_method : str, optional
+ Method to align difference files using TweakReg. Default is None, which
+ aligns reads to the first read.
+ Setting align_method equal to 'CATALOG' will align the reads to a catalog.
+ ref_catalog : str, optional
+ Catalog to be aligned to if using CATALOG align method.
+ drz_output : str, optional
+ Name to call final drizzled output image ( + '_drz_sci.fits' ).
+ Default is root_name + '_drz_sci.fits'.
+ subtract_background : bool
+ Determines whether background is subtracted or not during align
+ function.
+ Default is False since during this main function,
+ the background is subtracted separately.
+ wcsname : str
+ Name for WCS during TweakReg.
+ threshold : float
+ The object detection threshold above the local background in units of
+ sigma used by TweakReg.
+ cw : float
+ conv_width or the convolution kernel width in pixels used by TweakReg.
+ updatehdr : bool
+ Determines whether to update headers during TweakReg. Default is True.
+ updatewcs : bool
+ Determines whether to update WCS information during TweakReg. Default
+ is True.
+ searchrad : float
+ The search radius for a match used by TweakReg.
+ astrodriz : bool
+ Determines whether or not to run astrodrizzle. Default is True.
+ cat_file : str, optional
+ Name of catfile to be used to align sources in TweakReg. Default is
+ the catfile created by setting create_diff_source_lists to True,
+ catalogs/diff_catfile.cat
+
+ Outputs
+ -------
+ N files : fits files
+ Fits files of the difference between adjacent IMA reads.
+ N files : fits files
+ Fits files of the difference between adjacent IMA reads.
+ Shifts file : txt file
+ File containing shifts during TweakReg.
+ WCS Shifts file : fits filr
+ File containing WCS shifts during TweakReg.
+ Drizzled science image : fits
+ Drizzled science image from one exposure reduced using the DASH
+ pipeline.
+ Weighted science image : fits
+ Weighted drizzled science image from one exposure reduced using the
+ DASH pipeline.
+ '''
+
+ myDash = DashData(ima_file_name, flt_file_name)
+
+ myDash.split_ima()
+
+ myDash.create_seg_map()
+
+ diffpath = os.path.dirname(os.path.abspath('diff/{}_*_diff.fits'.format(myDash.root)))
+ cat_images=sorted([os.path.basename(x) for x in glob('diff/{}_*_diff.fits'.format(myDash.root))])
+ sc_diff_files = [diffpath + '/' + s for s in cat_images]
+ myDash.diff_seg_map(cat_images=sc_diff_files)
+
+ myDash.subtract_background_reads()
+
+ myDash.fix_cosmic_rays()
+
+ myDash.align(align_method = align_method, ref_catalog = ref_catalog, drz_output=drz_output,
+ subtract_background = subtract_background,
+ wcsname = wcsname, threshold = threshold, cw = cw,
+ updatehdr=updatehdr, updatewcs=updatewcs, cat_file=cat_file,
+ searchrad=searchrad,
+ astrodriz=astrodriz)
diff --git a/notebooks/WFC3/dash/requirements.txt b/notebooks/WFC3/dash/requirements.txt
new file mode 100644
index 000000000..fd23c2859
--- /dev/null
+++ b/notebooks/WFC3/dash/requirements.txt
@@ -0,0 +1,5 @@
+astropy==5.2.1
+astroquery==0.4.6
+drizzlepac==3.5.1
+matplotlib==3.7.0
+numpy==1.23.4
diff --git a/notebooks/WFC3/dash/utils.py b/notebooks/WFC3/dash/utils.py
new file mode 100644
index 000000000..a4bfe1da2
--- /dev/null
+++ b/notebooks/WFC3/dash/utils.py
@@ -0,0 +1,79 @@
+#! /usr/bin/env python
+
+""" Tools to help with reducing DASH/IR data.
+
+Authors
+-------
+ Rosalia O'Brien 2019
+ Catherine Martlin 2018/2019
+ Iva Momcheva 2018
+ Mario Gennaro 2018
+
+"""
+import os
+
+from astropy.io import fits
+from urllib.request import urlretrieve
+
+
+def get_flat(file_name):
+ '''
+ Will check if user has proper reference file directories
+ and files. Will also return flat field file appropriate for
+ the input file.
+
+ Parameters
+ ----------
+ file_name : string
+ File name of input IMA.
+
+ Returns
+ ----------
+ reffile_name : string
+ File name of flat field for that file.
+
+ '''
+ os.environ['iref'] = 'iref/'
+ if not os.path.exists('iref'):
+ os.mkdir('iref')
+
+ base_url = 'https://hst-crds.stsci.edu/unchecked_get/references/hst/'
+
+ with fits.open(file_name) as fitsfile:
+ reffile_name = fitsfile[0].header['PFLTFILE'].replace('$', '/')
+ if not os.path.exists(reffile_name):
+ urlretrieve(base_url + os.path.basename(reffile_name), reffile_name)
+
+ return reffile_name
+
+def get_IDCtable(file_name):
+ '''
+ Will check if user has proper reference file directories
+ and files. Will also return Instrument Distortion Calibration
+ reference file appropriate for the input file.
+
+ Parameters
+ ----------
+ file_name : string
+ File name of input IMA.
+
+ Returns
+ ----------
+ reffile_name : string
+ File name of Instrument Distortion Calibration reference file
+ for that file.
+
+ '''
+
+ os.environ['iref'] = 'iref/'
+ if not os.path.exists('iref'):
+ os.mkdir('iref')
+
+ base_url = 'https://hst-crds.stsci.edu/unchecked_get/references/hst/'
+
+ with fits.open(file_name) as fitsfile:
+ reffile_name = fitsfile[0].header['IDCTAB'].replace('$', '/')
+ if not os.path.exists(reffile_name):
+ urlretrieve(base_url + os.path.basename(reffile_name), reffile_name)
+
+ return reffile_name
\ No newline at end of file
diff --git a/notebooks/WFC3/exception_report/README.md b/notebooks/WFC3/exception_report/README.md
new file mode 100644
index 000000000..def41952f
--- /dev/null
+++ b/notebooks/WFC3/exception_report/README.md
@@ -0,0 +1,21 @@
+In this Jupyter Notebook tutorial, we present the steps that should be taken
+when an observer receives a WFC3 Exception Report Email.
+
+This directory, once downloaded, should contain this README.md, the tutorial
+Jupyter Notebook `wfc3_exception_report.ipynb`, an `html` copy of the notebook,
+and a subdirectory titled `docs`. The subdirectory should contain two `.py`
+files, one `.png`, and one `.gif` file that are used in the notebook.
+
+In order to run this Jupyter Notebook, you must have created a virtual
+environment, such as the one in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions. If
+you are using the `wfc3_env` environment from the `wfc3_env_legacy.yml` file in the
+WFC3Library repository, then you should not need any other packages to run this
+notebook.
+
+Optional Note: The tools in this notebook (specifically display_image) look much
+better in Jupyter Lab rather than in the classic Jupyter Notebook. If your
+environment has Jupyter Lab installed it's recommended you use that to run the
+.ipynb file. If you're interested in adding Jupyter Lab to your environment see
+the install instructions on the [Jupyter website](https://jupyter.org/install).
+
+Please submit any questions or comments to the [WFC3 Help Desk](https://stsci.service-now.com/hst).
diff --git a/notebooks/WFC3/exception_report/docs/display_image.py b/notebooks/WFC3/exception_report/docs/display_image.py
new file mode 100644
index 000000000..c503a9ab2
--- /dev/null
+++ b/notebooks/WFC3/exception_report/docs/display_image.py
@@ -0,0 +1,606 @@
+#! /usr/bin/env python
+
+import numpy as np
+import sys
+
+from astropy.io import fits
+from ginga.util import zscale
+import matplotlib.pyplot as plt
+
+def display_image(filename,
+ colormaps=['Greys_r','Greys_r','inferno_r'],
+ scaling=[(None,None),(None,None),(None,None)],
+ printmeta=False,
+ ima_multiread=False,
+ figsize=(18,18),
+ dpi=200):
+
+ """ A function to display the 'SCI', 'ERR/WHT', and 'DQ/CTX' arrays
+ of any WFC3 fits image. This function returns nothing, but will display
+ the requested image on the screen when called.
+
+ Authors
+ -------
+ Benjamin Kuhn, Oct 2021
+
+ Parameters
+ ----------
+ filename: String
+ Input image name with optional image section specification. If no image
+ section is entered, the entire image is used. If full path is not given,
+ file must exsist in current working directory. This can be an IR or UVIS:
+ raw, rac, ima, blv, blc, crj, crc, flt, flc, drz, drc fits file.
+ Image section must be entered as:
+
+ file.fits[x1:x2,y1:y2] where
+
+ x1 = x-axis pixel number start
+ x2 = x-axis pixel number end
+ y1 = y-axis pixel number start
+ y2 = y-axis pixel number end
+
+ colormaps: List
+ List of colormaps strings for the SCI, ERR, and DQ arrays. The first
+ element in the list is for the SCI array the second is for the ERR array
+ and the third element in the list is for the DQ extension. If no
+ colormaps are given the default maps will be 'Greys_r','Greys_r', and
+ 'inferno_r'. All three colormaps must be provided even if only
+ changing 1-2 maps.
+
+ scaling: List
+ List of real numbers to act as scalings for the SCI, ERR, and DQ arrays.
+ The first element in the list is for the SCI array the second is for the
+ ERR array and the third element in the list is for the DQ extension. If
+ no scalings are given the default scaling will use
+ ginga.util.zscale.zscale(). All three scalings must be provided even if
+ only changing 1-2 scalings. E.g. to change SCI array scaling:
+ scaling = [(5E4,8E4),(None,None),(None,None)]
+
+ printmeta: Bool
+ A boolean switch to turn on or off the printing of file infomation.
+ If printmeta is True various header keywords are printed to the screen
+ such as the filter, target name, date observed, brightness units and more.
+
+ ima_multiread: Bool
+ If ima_multiread is set to True each indiviual read of the ima will be
+ plotted. If ima_multiread is set to False only the final read of the ima
+ (ext 1) will be plotted.
+
+ figsize: (Float,Float)
+ The width, height of the figure. Default is (18,18).
+
+ dpi: Float
+ The resolution of the figure in dots-per-inch. Default is 200.
+
+ Returns
+ -------
+ N/A
+
+ """
+
+ section_start = filename.find("[")
+ all_pixels = False
+ if (section_start < 0):
+ all_pixels = True # just give the data to np
+ imagename = filename
+ elif (section_start > 0):
+ imagename = filename[:section_start]
+ if (filename[section_start+1].isalpha()):
+ print(filename[section_start+1])
+ print("Please only specify a pixel range, not an extension \
+ in the filename")
+ return 0, 0
+
+ with fits.open(imagename) as hdu:
+ h = hdu[0].header
+ h1 = hdu[1].header
+ h2 = hdu[2].header
+ h3 = hdu[3].header
+
+ if not all_pixels:
+ # pull the section off
+ section = filename[section_start+1:-1]
+ comma = section.find(",")
+ xsec = section[:comma]
+ ysec = section[comma+1:]
+ xs = xsec.find(":")
+ if xs < 0:
+ print("Invalid image section specified")
+ return 0, 0
+ try:
+ xstart = int(xsec[: xs])
+ except ValueError:
+ print("Problem getting xstart")
+ return
+ try:
+ xend = int(xsec[xs+1:])
+ except ValueError:
+ print("Problem getting xend")
+ return
+ ys = ysec.find(":")
+ if (ys < 0):
+ print("Invalid image section specified")
+ return 0, 0
+ try:
+ ystart = int(ysec[:ys])
+ except ValueError:
+ print("Problems getting ystart")
+ return
+ try:
+ yend = int(ysec[ys+1:])
+ except ValueError:
+ print("Problem getting yend")
+ return
+
+ bunit = get_bunit(h1)
+ detector = h['detector']
+ issubarray = h['subarray']
+ si = h['primesi']
+ fname = h['filename']
+ naxis1 = h1["NAXIS1"]
+ naxis2 = h1["NAXIS2"]
+
+ if len(colormaps) < 3 or len(colormaps) > 3:
+ sys.exit(f"{len(colormaps)} colormaps proived. Must input all three")
+
+ if len(scaling) < 3 or len(scaling) > 3:
+ sys.exit(f"{len(scaling)} scalings provided. Must input all three")
+
+ if printmeta:
+ print(f"\t{si}/{detector} {fname} ")
+ print('-'*44)
+ print(f"Filter = {h['filter']}, Date-Obs = {h['date-obs']} T{h['time-obs']},\nTarget = {h['targname']}, Exptime = {h['exptime']}, Subarray = {issubarray}, Units = {h1['bunit']}\n")
+
+
+ if detector == 'UVIS':
+ if ima_multiread == True:
+ sys.exit("keyword argument 'ima_multiread' can only be set to True for 'ima.fits' files")
+ try:
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2*2 # full y size
+
+ with fits.open(imagename) as hdu:
+ uvis2_sci = hdu["SCI",1].data
+ uvis2_err = hdu[2].data
+ uvis2_dq = hdu[3].data
+ uvis1_sci = hdu["SCI",2].data
+ uvis1_err = hdu[5].data
+ uvis1_dq = hdu[6].data
+
+ try:
+ fullsci = np.concatenate([uvis2_sci,uvis1_sci])
+ fulldq = np.concatenate([uvis2_dq,uvis1_dq])
+ fullerr = np.concatenate([uvis2_err,uvis1_err])
+
+ fullsci = fullsci[ystart:yend,xstart:xend]
+ fulldq = fulldq[ystart:yend,xstart:xend]
+ fullerr = fullerr[ystart:yend,xstart:xend]
+
+ make1x3plot(scaling, colormaps, fullsci, fullerr, fulldq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi)
+
+ except ValueError:
+ fullsci = np.concatenate([uvis2_sci,uvis1_sci])
+ fullsci = fullsci[ystart:yend,xstart:xend]
+
+ z1_sci, z2_sci = get_scale_limits(scaling[0],fullsci,'SCI')
+
+ fig, ax1 = plt.subplots(1,1,figsize=figsize,dpi=dpi)
+ im1 = ax1.imshow(fullsci,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n{h1['extname']} ext")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext")
+ fig.colorbar(im1, ax=ax1,shrink=.75,pad=.03)
+
+ except (IndexError,KeyError):
+
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2 # full y size
+
+ with fits.open(imagename) as hdu:
+ uvis_ext1 = hdu[1].data
+ uvis_ext2 = hdu[2].data
+ uvis_ext3 = hdu[3].data
+
+ try:
+ uvis_ext1 = uvis_ext1[ystart:yend,xstart:xend]
+ uvis_ext2 = uvis_ext2[ystart:yend,xstart:xend]
+ uvis_ext3 = uvis_ext3[ystart:yend,xstart:xend]
+
+ make1x3plot(scaling, colormaps, uvis_ext1, uvis_ext2, uvis_ext3,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi)
+
+ except (TypeError,IndexError,AttributeError):
+
+ z1_sci, z2_sci = get_scale_limits(scaling[0],uvis_ext1,'SCI')
+ fig, ax1 = plt.subplots(1,1,figsize=figsize,dpi=dpi)
+ im1 = ax1.imshow(uvis_ext1,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n{h1['extname']} ext")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext")
+ fig.colorbar(im1, ax=ax1,shrink=.75,pad=.03)
+
+
+ if detector == 'IR' and '_ima.fits' not in fname:
+ if ima_multiread == True:
+ sys.exit("keyword argument 'ima_multiread' can only be set to True for 'ima.fits' files")
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2 # full y size
+
+ try:
+ with fits.open(imagename) as hdu:
+ data_sci = hdu[1].data
+ data_err = hdu[2].data
+ data_dq = hdu[3].data
+
+ data_sci = data_sci[ystart:yend,xstart:xend]
+ data_err = data_err[ystart:yend,xstart:xend]
+ data_dq = data_dq[ystart:yend,xstart:xend]
+
+ make1x3plot(scaling, colormaps, data_sci, data_err, data_dq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi)
+
+ except (AttributeError, TypeError, ValueError):
+ z1_sci, z2_sci = get_scale_limits(scaling[0],data_sci,'SCI')
+ fig, ax1 = plt.subplots(1,1,figsize=figsize,dpi=dpi)
+ im1 = ax1.imshow(data_sci,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n{h1['extname']} ext")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext")
+ fig.colorbar(im1, ax=ax1,shrink=.75,pad=.03)
+
+
+ if '_ima.fits' in fname:
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2 # full y size
+
+ if ima_multiread == True:
+ nsamps = h['NSAMP']
+ for ext in reversed(range(1,nsamps+1)):
+ with fits.open(imagename) as hdu:
+ data_sci = hdu['SCI',ext].data
+ data_err = hdu['ERR',ext].data
+ data_dq = hdu['DQ',ext].data
+
+ data_sci = data_sci[ystart:yend,xstart:xend]
+ data_err = data_err[ystart:yend,xstart:xend]
+ data_dq = data_dq[ystart:yend,xstart:xend]
+
+ makeIR1x3plot(scaling, colormaps, data_sci, data_err, data_dq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3, nsamps, ext,
+ figsize, dpi)
+
+ if ima_multiread == False:
+ with fits.open(imagename) as hdu:
+ data_sci = hdu['SCI',1].data
+ data_err = hdu['ERR',1].data
+ data_dq = hdu['DQ',1].data
+
+ data_sci = data_sci[ystart:yend,xstart:xend]
+ data_err = data_err[ystart:yend,xstart:xend]
+ data_dq = data_dq[ystart:yend,xstart:xend]
+
+ make1x3plot(scaling, colormaps, data_sci, data_err, data_dq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi)
+
+
+def get_bunit(ext1header):
+ """ Get the brightness unit for the plot axis label.
+
+ Parameters
+ ----------
+ ext1header: Header
+ The extension 1 header of the fits file being displayed. This is the
+ extension that contains the brightness unit keyword.
+
+ Returns
+ -------
+ The string of the brightness unit for the axis label
+ {'counts', 'counts/s','e$^-$', 'e$^-$/s'}
+
+ """
+ units = ext1header['bunit']
+
+ if units == 'COUNTS':
+ return 'counts'
+ elif units == 'COUNTS/S':
+ return 'counts/s'
+ elif units == 'ELECTRONS':
+ return 'e$^-$'
+ elif units == 'ELECTRONS/S':
+ return 'e$^-$/s'
+ else:
+ return units
+
+
+def get_scale_limits(scaling, array, extname):
+ """ Get the scale limits to use for the image extension being displayed.
+
+ Parameters
+ ----------
+ scaling: List
+ List of real numbers to act as scalings for the SCI, ERR, and DQ arrays.
+ The first element in the list is for the SCI array the second is for the
+ ERR array and the third element in the list is for the DQ extension. If
+ no scalings are given the default scaling will use
+ ginga.util.zscale.zscale(). All three scalings must be provided even if
+ only changing 1-2 scalings. E.g. to change SCI array scaling:
+ scaling = [(5E4,8E4),(None,None),(None,None)]
+
+ array : Array
+ The ImageHDU array that is being displayed.
+
+ extname: String {"SCI", "ERR", "DQ"}
+ The name of the extension of which the scale is being determined.
+
+ Returns
+ -------
+ z1: Float
+ The minimum value for the image scale.
+
+ z2: Float
+ The maximum value for the image scale.
+
+ """
+ if extname == 'DQ':
+ if scaling[0] == None and scaling[1] == None:
+ z1, z2 = array.min(), array.max()
+ elif scaling[0] == None and scaling[1] != None:
+ z1 = array.min()
+ z2 = scaling[1]
+ elif scaling[0] != None and scaling[1] == None:
+ z1 = scaling[0]
+ z2 = array.max()
+ elif scaling[0] != None and scaling[1] != None:
+ z1 = scaling[0]
+ z2 = scaling[1]
+
+ elif extname == 'SCI' or extname == 'ERR':
+ if scaling[0] == None and scaling[1] == None:
+ z1, z2 = zscale.zscale(array)
+ elif scaling[0] == None and scaling[1] != None:
+ z1 = zscale.zscale(array)[0]
+ z2 = scaling[1]
+ elif scaling[0] != None and scaling[1] == None:
+ z1 = scaling[0]
+ z2 = zscale.zscale(array)[1]
+ elif scaling[0] != None and scaling[1] != None:
+ z1 = scaling[0]
+ z2 = scaling[1]
+ else:
+ print("`extname` must be set to either `SCI`, `ERR`, or `DQ`")
+ return
+
+ return z1, z2
+
+
+def make1x3plot(scaling, colormaps, fullsci, fullerr, fulldq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize=(9,6), dpi=100):
+ """ Make a 3 column figure to display any WFC3 image or image section.
+
+ Parameters
+ ----------
+ scaling: List
+ List of real numbers to act as scalings for the SCI, ERR, and DQ arrays.
+ The first element in the list is for the SCI array the second is for the
+ ERR array and the third element in the list is for the DQ extension. If
+ no scalings are given the default scaling will use
+ ginga.util.zscale.zscale(). All three scalings must be provided even if
+ only changing 1-2 scalings. E.g. to change SCI array scaling:
+ scaling = [(5E4,8E4),(None,None),(None,None)]
+
+ colormaps: List
+ List of colormaps strings for the SCI, ERR, and DQ arrays. The first
+ element in the list is for the SCI array the second is for the ERR array
+ and the third element in the list is for the DQ extension. If no
+ colormaps are given the default maps will be 'Greys_r','Greys_r', and
+ 'inferno_r'. All three colormaps must be provided even if only
+ changing 1-2 maps.
+
+ fullsci: Array
+ The 2d array of science pixels ('SCI' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ fullerr: Array
+ The 2d array of error pixels ('ERR' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ fulldq: Array
+ The 2d array of data quality pixels ('DQ' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ xstart: Integer
+ The starting index value for the x-axis of the image.
+
+ xend: Integer
+ The ending index value for the x-axis of the image.
+
+ ystart: Integer
+ The starting index value for the y-axis of the image.
+
+ yend: Integer
+ The ending index value for the y-axis of the image.
+
+ detector: String {"UVIS", "IR"}
+ The detector used for the image.
+
+ fname: String
+ The name of the file being plotted.
+
+ h1: Header
+ The extension 1 header of the fits file being displayed.
+
+ h2: Header
+ The extension 2 header of the fits file being displayed.
+
+ h3: Header
+ The extension 3 header of the fits file being displayed.
+
+ figsize: (float,float)
+ The width, height of the figure. Default is (9,6).
+
+ dpi: float
+ The resolution of the figure in dots-per-inch. Default is 100.
+
+ Returns
+ -------
+ N/A
+
+ """
+
+ z1_sci, z2_sci = get_scale_limits(scaling[0],fullsci,'SCI')
+ z1_err, z2_err = get_scale_limits(scaling[1],fullerr,'ERR')
+ z1_dq, z2_dq = get_scale_limits(scaling[2],fulldq,'DQ')
+
+ fig, [ax1,ax2,ax3] = plt.subplots(1,3,figsize=figsize,dpi=dpi)
+
+ im1 = ax1.imshow(fullsci,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ im2 = ax2.imshow(fullerr,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[1],vmin=z1_err, vmax=z2_err)
+ im3 = ax3.imshow(fulldq, origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[2],vmin=z1_dq, vmax=z2_dq)
+
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n{h1['extname']} ext")
+ ax2.set_title(f"WFC3/{detector} {fname}\n{h2['extname']} ext")
+ ax3.set_title(f"WFC3/{detector} {fname}\n{h3['extname']} ext")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext")
+ ax2.set_title(f"WFC3/{detector} {fname} {h2['extname']} ext")
+ ax3.set_title(f"WFC3/{detector} {fname} {h3['extname']} ext")
+ fig.colorbar(im1, ax=ax1,shrink=.25,pad=.03)
+ fig.colorbar(im2, ax=ax2,shrink=.25,pad=.03)
+ fig.colorbar(im3, ax=ax3,shrink=.25,pad=.03)
+
+def makeIR1x3plot(scaling, colormaps, data_sci, data_err, data_dq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3, nsamps, ext,
+ figsize=(9,6), dpi=100):
+ """ Make a 3 column figure to display any WFC3 IMA image or image section.
+
+ Parameters
+ ----------
+ scaling: List
+ List of real numbers to act as scalings for the SCI, ERR, and DQ arrays.
+ The first element in the list is for the SCI array the second is for the
+ ERR array and the third element in the list is for the DQ extension. If
+ no scalings are given the default scaling will use
+ ginga.util.zscale.zscale(). All three scalings must be provided even if
+ only changing 1-2 scalings. E.g. to change SCI array scaling:
+ scaling = [(5E4,8E4),(None,None),(None,None)]
+
+ colormaps: List
+ List of colormaps strings for the SCI, ERR, and DQ arrays. The first
+ element in the list is for the SCI array the second is for the ERR array
+ and the third element in the list is for the DQ extension. If no
+ colormaps are given the default maps will be 'Greys_r','Greys_r', and
+ 'inferno_r'. All three colormaps must be provided even if only
+ changing 1-2 maps.
+
+ data_sci: Array
+ The 2d array of science pixels ('SCI' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ data_err: Array
+ The 2d array of error pixels ('ERR' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ data_dq: Array
+ The 2d array of data quality pixels ('DQ' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ xstart: Integer
+ The starting index value for the x-axis of the image.
+
+ xend: Integer
+ The ending index value for the x-axis of the image.
+
+ ystart: Integer
+ The starting index value for the y-axis of the image.
+
+ yend: Integer
+ The ending index value for the y-axis of the image.
+
+ detector: String {"UVIS", "IR"}
+ The detector used for the image.
+
+ fname: String
+ The name of the file being plotted.
+
+ h1: Header
+ The extension 1 header of the fits file being displayed.
+
+ h2: Header
+ The extension 2 header of the fits file being displayed.
+
+ h3: Header
+ The extension 3 header of the fits file being displayed.
+
+ nsamps: Integer
+ The number of samples (readouts) contained in the file.
+
+ ext: Integer
+ The extension to be displayed. Ranges from 1 to nsamp.
+
+ figsize: (float,float)
+ The width, height of the figure. Default is (9,6).
+
+ dpi: float
+ The resolution of the figure in dots-per-inch. Default is 100.
+
+ Returns
+ -------
+ N/A
+
+ """
+
+ z1_sci, z2_sci = get_scale_limits(scaling[0],data_sci,'SCI')
+ z1_err, z2_err = get_scale_limits(scaling[1],data_err,'ERR')
+ z1_dq, z2_dq = get_scale_limits(scaling[2],data_dq,'DQ')
+
+ fig, [ax1,ax2,ax3] = plt.subplots(1,3,figsize = figsize,dpi=dpi)
+ im1 = ax1.imshow(data_sci,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ im2 = ax2.imshow(data_err,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[1],vmin=z1_err, vmax=z2_err)
+ im3 = ax3.imshow(data_dq, origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[2],vmin=z1_dq, vmax=z2_dq)
+ fig.colorbar(im1, ax=ax1,shrink=.25,pad=.03)
+ fig.colorbar(im2, ax=ax2,shrink=.25,pad=.03)
+ fig.colorbar(im3, ax=ax3,shrink=.25,pad=.03)
+
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n {h1['extname']} read {(nsamps+1)-ext}")
+ ax2.set_title(f"WFC3/{detector} {fname}\n {h2['extname']} read {(nsamps+1)-ext}")
+ ax3.set_title(f"WFC3/{detector} {fname}\n {h3['extname']} read {(nsamps+1)-ext}")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} read {(nsamps+1)-ext}")
+ ax2.set_title(f"WFC3/{detector} {fname} {h2['extname']} read {(nsamps+1)-ext}")
+ ax3.set_title(f"WFC3/{detector} {fname} {h3['extname']} read {(nsamps+1)-ext}")
diff --git a/notebooks/WFC3/exception_report/docs/flt_vs_flc.gif b/notebooks/WFC3/exception_report/docs/flt_vs_flc.gif
new file mode 100755
index 000000000..73c0d1667
Binary files /dev/null and b/notebooks/WFC3/exception_report/docs/flt_vs_flc.gif differ
diff --git a/notebooks/WFC3/exception_report/docs/rad_prof.py b/notebooks/WFC3/exception_report/docs/rad_prof.py
new file mode 100644
index 000000000..24a5aaa05
--- /dev/null
+++ b/notebooks/WFC3/exception_report/docs/rad_prof.py
@@ -0,0 +1,297 @@
+"""Tools for creating radial profile diagnostic information.
+
+This class is used in the computation of radial profiles, that
+is the pixel values vs the distance from the centroid of the source.
+This class can make plots, fit a Moffat function to the profile,
+and recenter the source position as the profile is sensitive to the
+centroid position. Various attributes such as the full width at
+half maximum and centroid positions can easily be accessed via the
+usual . syntax.
+
+https://github.com/spacetelescope/wfc3_photometry/blob/master/photometry_tools/rad_prof.py
+
+Authors
+-------
+ - Varun Bajaj, May 2018
+Use
+---
+ from rad_prof import RadialProfile
+ my_prof = RadialProfile(x, y, data) # Simplest case
+ print(my_prof.fwhm) # Print FWHM of Moffat fit
+ my_prof.show_profile() # Show plot of profile
+
+ # Use larger area, recompute centroid
+ my_prof = RadialProfile(x, y, data, r=7, recenter=True)
+ print(my_prof.x, my_prof.y)
+
+ # Can get shifts:
+ print(my_prof.x - my_prof.old_x)
+
+ # Show the profile
+ my_prof = RadialProfile(x, y, data, show=True)
+ plt.show()
+
+ # OR:
+ my_prof = RadialProfile(x, y, data)
+ my_prof.show_profile()
+ plt.show()
+"""
+
+import numpy as np
+import matplotlib.pyplot as plt
+
+from photutils.centroids import centroid_com, centroid_1dg, centroid_2dg
+from photutils.aperture import CircularAperture
+from scipy.optimize import curve_fit
+
+class RadialProfile:
+ """Main function to calulate radial profiles.
+
+ Computes a radial profile of a source in an array. This function
+ leverages some of the tools in photutils to cutout the small region
+ around the source. This function can first recenter the source
+ via a 2d Gaussian fit (radial profiles are sensitive to centroids)
+ and then fit a 1D Moffat profile to the values. The profile
+ is calculated by computing the distance from the center of each
+ pixel within a box of size r to the centroid of the source in the
+ box. Additionally, the profile and the fit can be plotted.
+ If fit is set to True, then the profile is fit with a 1D Moffat.
+ If show is set to True, then profile (and/or fit) is plotted.
+ If an axes object is provided, the plot(s) will be on that object.
+ NOTE: THE POSITIONS ARE 0 INDEXED (bottom left corner pixel
+ center is set to (0,0)).
+
+ Parameters
+ ----------
+ x : float
+ The x position of the centroid of the source. ZERO INDEXED.
+ stored in the .x attribute.
+ y : float
+ The y position of the centroid of the source. ZERO INDEXED.
+ stored in the .y attribute.
+ data : array
+ A 2D array containing the full image data. A small box
+ is cut out of this array for the radial profile.
+ r : float, optional
+ The size of the box used to cut out the source pixels.
+ The box is typically square with side length ~ 2*r + 1.
+ Default is 5 pix.
+ fit: bool
+ Fit a 1D Moffat profile. Default True. Required for
+ computation of FWHM.
+ recenter : bool, optional
+ Compute new centroid via 2D Gaussian fit. Default False.
+ show : bool, optional
+ Plot the profile. Default False. See ax parameter for info.
+ ax : matplotlib.axes.Axes, optional
+ Axes object to make the plots on. Default None.
+ If None and show is True, an axes object will be created.
+
+ Attributes
+ ----------
+ x : float
+ The x position in pixels of the source centroid. Gets updated
+ if the profile is recentered.
+ y : float
+ The y position in pixels of the source centroid. Gets updated
+ if the profile is recentered.
+ fwhm : float
+ The FWHM of the fitted profile, only computed if fit=True.
+ old_x : float
+ The x position in pixels of the original input centroid. Only
+ set if recenter = True.
+ old_y : float
+ The y position in pixels of the original input centroid. Only
+ set if recenter = True.
+ fitted : bool
+ Whether the data has had a profile fit. Only True if fit=True
+ and fitting was successful.
+ is_empty : bool
+ Whether cutout is empty or not. True if position falls
+ entirely off of data.
+ cutout : array
+ 2D array containing small cutout of data around source.
+ distances : array
+ Array containing distance to each pixel in cutout from centroid.
+ value : array
+ Array containing all the values in the cutout.
+ """
+ def __init__(self, x, y, data, r=5, fit=True, recenter=False,
+ show=False, ax=None):
+ self.x = x # X position
+ self.y = y # Y Position
+ self.r = r # radius (acutally makes a box)
+ self.is_empty = False # if gets set True, cutout is empty
+ self._setup_cutout(data) # Make the cutout
+
+ if recenter:
+ self.recenter_source(data) # recalculates centroid
+
+ self.fit = fit
+ self.fitted = False # Initial state, set to true if fit success
+ if self.is_empty:
+ self.fwhm = np.nan
+
+ else:
+ self._create_profile() # creates distances and values arrays
+
+ if fit:
+ self.fit_profile() # performs fit, updates self.fitted
+ if show:
+ self.show_profile(ax)
+
+ def _create_profile(self):
+ """Compute distances to pixels in cutout"""
+ iY, iX = np.mgrid[self.sy, self.sx] # Pixel grid indices
+ # extent = [sx.start, sx.stop-1, sy.start, sy.stop-1]
+
+ self.distances = np.sqrt( (iX - self.x) ** 2.
+ + (iY - self.y) ** 2. ).flatten()
+ self.values = self.cutout.flatten()
+
+ def _setup_cutout(self, data):
+ """Cuts out the aperture and defines slice objects.
+ General setup procedure.
+ """
+ self.ap = CircularAperture((self.x, self.y), r=self.r)
+ mask = self.ap.to_mask()
+ self.sy = slice(mask.bbox.iymin,mask.bbox.iymax,None)
+ self.sx = slice(mask.bbox.ixmin,mask.bbox.ixmax,None)
+ self.cutout = mask.cutout(data, fill_value=np.nan)
+
+ if self.cutout is None:
+ self.is_empty = True
+
+ def fit_profile(self):
+ """Fits 1d Moffat function to measured radial profile.
+ Fits a moffat profile to the distance and values of the pixels.
+ Further development may allow user defined models.
+ """
+ try:
+ amp0 = np.amax(self.values)
+ bias0 = np.nanmedian(self.values)
+ best_vals, covar = curve_fit(RadialProfile.profile_model,
+ self.distances,
+ self.values,
+ p0 = [amp0, 1.5, 1.5, bias0],
+ bounds = ([0., .3, .5, 0],
+ [np.inf, 10., 10., np.inf]))
+ hwhm = best_vals[1] * np.sqrt(2. ** (1./best_vals[2]) - 1.)
+ self.fwhm = 2 * hwhm
+ self.amp, self.gamma, self.alpha, self.bias = best_vals
+ self.fitted = True
+ mod = RadialProfile.profile_model(self.distances, *best_vals)
+ self.chisquared = np.nansum((self.values-mod)**2/mod)
+ except Exception as e:
+ print(e)
+ self.amp, self.gamma, self.alpha, self.bias = [np.nan] * 4
+ self.fwhm = np.nan
+ self.fitted = False
+ self.chisquared = np.nan
+
+ @staticmethod
+ def profile_model(r, amp, gamma, alpha, bias):
+ """Returns 1D Moffat profile evaluated at r values.
+
+ This function takes radius values and parameters in a simple 1D
+ moffat profiles and returns the values of the profile at those
+ radius values. The model is defined as:
+ model = amp * (1. + (r / gamma) ** 2.) ** (-1. * alpha) + bias
+
+ Parameters
+ ----------
+ r : array
+ The distances at which to sample the model.
+ amp : float
+ The amplitude of the of the model.
+ gamma: float
+ The width of the profile.
+ alpha: float
+ The decay of the profile.
+ bias: float
+ The bias level (piston term) of the data. This is like a background
+ value.
+
+ Returns
+ -------
+ model : array
+ The values of the model sampled at the r values.
+ """
+ model = amp * (1. + (r / gamma) ** 2.) ** (-1. * alpha) + bias
+ return model
+
+ def recenter_source(self, data):
+ """Recenters source position in cutout and updates x,y attributes"""
+
+ # Archive old positions.
+ self.old_x = self.x
+ self.old_y = self.y
+
+ if self.is_empty:
+ self.x, self.y = np.nan, np.nan
+
+ else:
+ # Fit 2D gaussian
+ xg1, yg1 = centroid_2dg(self.cutout)
+ dx = xg1 + self.sx.start - self.x
+ dy = yg1 + self.sy.start - self.y
+ dr = (dx ** 2. + dy ** 2.) ** .5
+ if dr > 2.:
+ print('Large shift of {},{} computed.'.format(dx, dy))
+ print('Rejecting and keeping original x, y coordinates')
+
+ else:
+ self.x = xg1 + self.sx.start
+ self.y = yg1 + self.sy.start
+ self._setup_cutout(data)
+
+ def show_profile(self, ax=None, show_fit=True):
+ """Makes plot of radial profile.
+
+ Plots the radial profile, that is pixel distance vs
+ pixel value. Can plot on an existing axes object if
+ the an axes object is passed in via the ax parameter.
+ The function attempts to set sensible axes limits, specifically
+ half of the smallest positive value (axes are logarithmic).
+ The axes object is returned by this, so that parameters can
+ be set by the user later.
+
+ Parameters
+ ----------
+ ax : matplotlib.axes.Axes, optional
+ An axes object to plot the radial profile on (for integrating)
+ the plot into other figures. If not set, the script will create
+ an axes object.
+ show_fit : bool, optional
+ Plot the fitted model. Only done if fit was successful.
+
+ Returns
+ -------
+ ax : matplotlib.axes.Axes
+ The axes object containing the radial profile plot.
+ """
+ if ax is None:
+ fig = plt.figure(dpi=110)
+ ax = fig.add_subplot(111)
+
+ ax.scatter(self.distances, self.values, alpha=.5,s=3)
+ min_y = np.amin(self.values[self.values >0.])/2.
+ #ax.set_ylim(min_y, np.nanmax(self.values)*2.)
+ ax.set_ylim(0.1, np.nanmax(self.values)*2.)
+ ax.set_xlim(0.)
+
+ ax.set_yscale('log')
+ ax.set_ylabel('Pixel Value',size=13)
+ ax.set_xlabel('Distance from centroid [pix]',size=13)
+
+ if self.fitted and show_fit:
+ tmp_r = np.arange(0,np.ceil(np.amax(self.distances)),.1)
+ model_fit = RadialProfile.profile_model(tmp_r, self.amp,
+ self.gamma, self.alpha,
+ self.bias)
+ label = r'$\gamma$= {}, $\alpha$ = {}'.format(round(self.gamma,2),
+ round(self.alpha,2))
+ label += '\nFWHM = {}'.format(round(self.fwhm, 2))
+ ax.plot(tmp_r, model_fit, label=label,color='k')
+ ax.legend(loc=1,prop={'size':13})
+ return ax
diff --git a/notebooks/WFC3/exception_report/docs/typical_images.png b/notebooks/WFC3/exception_report/docs/typical_images.png
new file mode 100755
index 000000000..6da58784d
Binary files /dev/null and b/notebooks/WFC3/exception_report/docs/typical_images.png differ
diff --git a/notebooks/WFC3/exception_report/wfc3_exception_report.ipynb b/notebooks/WFC3/exception_report/wfc3_exception_report.ipynb
new file mode 100755
index 000000000..56efe0fd5
--- /dev/null
+++ b/notebooks/WFC3/exception_report/wfc3_exception_report.ipynb
@@ -0,0 +1,721 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "\n",
+ "# Exception Report Checklist - WFC3\n",
+ "***\n",
+ "## Learning Goals\n",
+ "In this notebook, you will walk through the procedure for addressing a HST/WFC3 exception report and
\n",
+ "determining if a HOPR and/or Help Desk Ticket should be filed. \n",
+ "\n",
+ "By the end of this notebook, you will:\n",
+ "\n",
+ "- Download your data.\n",
+ "- Display the data.\n",
+ "- Investigate data quality & check for anomalies.\n",
+ "- Inspect JIF (jitter/observing log) header keywords for problems.\n",
+ "- Determine if a HOPR is warranted.\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#import)
\n",
+ "[2. Download Data](#download)
\n",
+ "[3. View Data](#viewdata)
\n",
+ "[4. Header Keywords from `_jif.fits`](#keywords)
\n",
+ "[5. Plotting Data from `_jit.fits`](#jit)
\n",
+ " [5.1 Interpreting the Jitter Plots](#interpret)
\n",
+ "[6. Further Analysis](#morework)
\n",
+ " [6.1 Radial Profile Plots](#radprof)
\n",
+ "[7. Should I submit a HOPR or Help Desk Ticket?](#HOPR)
\n",
+ "[8. Conclusions](#conclusions)
\n",
+ "[Additional Resources](#add)
\n",
+ "[About this Notebook](#about)
\n",
+ "[Citations](#cite)
\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "## Introduction \n",
+ "\n",
+ "This is a dedicated, stand-alone, notebook to help you look into your HST/WFC3 [Exception Report](https://www.stsci.edu/hst/observing/post-observation/exception-reports).
\n",
+ "HST observations go through a series of automated data quality checks. If a problem is found, an
\n",
+ "Exception Report email will be sent to the Principal Investigator (PI). It is then the responsibility of the
\n",
+ "PI to assess the data quality and determine whether or not the observations need to be repeated to
\n",
+ "accomplish the science goals.
\n",
+ "\n",
+ "Before starting this notebook, you should have received an Exception Report email from the STScI
\n",
+ "Automatic AlertPI Exception Report Generator detailing which of your Exposure IDs were affected.
\n",
+ "In this notebook, we provide all the necessary steps for directly downloading your data (including
\n",
+ "observing logs i.e. [JIF and JIT files](https://www.stsci.edu/hst/instrumentation/focus-and-pointing/pointing/jitter-file-format-definition)), displaying and analyzing it, and determining if a [Hubble
Observation Problem Report (HOPR)](https://www.stsci.edu/hst/observing/post-observation/reporting-problems) is warranted.\n",
+ "**There is a 90-day time limit from the date that
the data were delivered to file a HOPR.** Please keep in mind that when filing a HOPR, you will be
\n",
+ "required to show justification as to why the scientific goal(s) will be unattainable. If you run into any
\n",
+ "problems trying to use this notebook please contact the [WFC3 Help Desk](https://stsci.service-now.com/hst).
\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Examples of Nominal UVIS and IR Staring Mode Images "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Comparison of Nominal UVIS `_flt.fits` and `_flc.fits` Files
\n",
+ "### `_flt.fits` are calibrated with no CTE correction
\n",
+ "### `_flc.fits` are calibrated with a CTE correction (UVIS only)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Note: The above animated GIF is generated from a 500x500 pixel subsection of the full-frame image. For**
\n",
+ "**more information about UVIS CTE please see** [Chapter 6](https://hst-docs.stsci.edu/wfc3dhb/chapter-6-wfc3-uvis-charge-transfer-efficiency-cte) **of the WFC3 Data Handbook and our** [WFC3 CTE
Performance Webpage](https://www.stsci.edu/hst/instrumentation/wfc3/performance/cte)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## 1. Imports \n",
+ "\n",
+ "Installation instructions for this notebook are in a `README.md` attached to the repository.
\n",
+ "Please make sure you have read the contents of the `README.md` before continuing the notebook\n",
+ " \n",
+ "We import: \n",
+ "\n",
+ "- *glob* to make lists of files\n",
+ "- *os* to name files and remove directories \n",
+ "- *astropy.io.fits* for accessing FITS files\n",
+ "- *astropy.table Table* for creating tidy tables of the data\n",
+ "- *astroquery.mast.Observations* for downloading data from MAST\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *display_image* for displaying any type of WFC3 image"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "import glob \n",
+ "import os\n",
+ "\n",
+ "from astropy.io import fits\n",
+ "from astropy.table import Table\n",
+ "from astroquery.mast import Observations\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "from docs.display_image import display_image\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2. Download Data \n",
+ "\n",
+ "Here, we download the example images via `astroquery`. For more information, please look at the
\n",
+ "documentation for \n",
+ "[Astroquery](https://astroquery.readthedocs.io/en/latest/),\n",
+ "[Astroquery.mast](https://astroquery.readthedocs.io/en/latest/mast/mast.html), and \n",
+ "[CAOM Field Descriptions](https://mast.stsci.edu/api/v0/_c_a_o_mfields.html), which is used for the
\n",
+ "`obs_table` variable. Additionally, you may download the data from MAST using either the [HST MAST
\n",
+ "Search Engine](https://mast.stsci.edu/search/hst/ui/#/) or the more general [MAST Portal](https://mast.stsci.edu/portal/Mashup/Clients/Mast/Portal.html).\n",
+ "\n",
+ "We download `_flt.fits` images of star cluster NGC-1898 located in the Large Magellanic Cloud,
\n",
+ "from GO program [16748](https://www.stsci.edu/cgi-bin/get-proposal-info?id=16748&submit=Go&observatory=HST) as well as the corresponding `_jif.fits` and `_jit.fits` files. After
\n",
+ "downloading the images, we move them to a sub-directory within the current working directory. The
\n",
+ "data used in this notebook are courteous of PI Dr. Florian Niederhofer.
\n",
+ "\n",
+ "If you would like to use this notebook to download your own data, edit line 1 in the cell below
\n",
+ "with your Exposure ID number from the exception report email. If your data are from WFC3/IR,
\n",
+ "you should also download the `_ima.fits` files by editing the variable `file_types` on line 4
\n",
+ "to include `'IMA'` along with the `'FLT', 'JIF','JIT'` files. If your data are proprietary,
\n",
+ "you may need to take additional steps to download the data with astroquery.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "exp_ids = ['IEPP01010'] # Edit with exposure ID(s)\n",
+ "\n",
+ "# Specify flle types to download\n",
+ "file_types = ['FLT', 'JIF','JIT']\n",
+ "\n",
+ "#loop through exposure id\n",
+ "for obsid in exp_ids: \n",
+ " # make new directory to hold fits files - named by exposure id\n",
+ " try:\n",
+ " newdir = os.getcwd()+'/'+ obsid.lower()+'/'\n",
+ " mkdir = os.mkdir(newdir)\n",
+ " print(f'Making new directory {newdir}')\n",
+ " except FileExistsError: \n",
+ " pass\n",
+ " \n",
+ " # loop through to get FLTs, JIFs, and JITs\n",
+ " for file_type in file_types:\n",
+ " print(f'Working on getting {file_type} files for Exposure ID {obsid}')\n",
+ " obs_table = Observations.query_criteria(obs_id=obsid.lower())\n",
+ " products = Observations.get_product_list(obs_table)\n",
+ " filtered_products = Observations.filter_products(products, productSubGroupDescription=file_type, project='CALWF3')\n",
+ " download_table = Observations.download_products(filtered_products, mrp_only=False)\n",
+ " \n",
+ " # For convenience move raws to cwd and remove empty download dir\n",
+ " for file in download_table['Local Path']:\n",
+ " filename = file.split('/')[-1]\n",
+ " print(f'Moving {file} to {newdir+filename}')\n",
+ " os.rename(file, newdir+filename)\n",
+ " try:\n",
+ " os.rmdir(f'mastDownload/HST/{filename[:9]}')\n",
+ " print(f'Removing mastDownload/HST/{filename[:9]}') \n",
+ " os.rmdir(f'mastDownload/HST/{obsid.lower()}')\n",
+ " print(f'Remvoing mastDownload/HST/{obsid.lower()}') \n",
+ " except (OSError, FileNotFoundError): \n",
+ " pass\n",
+ " \n",
+ " print(f'Remvoing mastDownload/HST/') \n",
+ " os.rmdir(f'mastDownload/HST/')\n",
+ " print(f'Remvoing mastDownload/')\n",
+ " os.rmdir('mastDownload/')\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 3. View Data \n",
+ "\n",
+ "Below we use the imported [`display_image`](https://github.com/spacetelescope/WFC3Library/blob/master/notebooks/image_displayer_analyzer/display_image.py) function to display the data downloaded above. This
\n",
+ "function will display the SCI, ERR, and DQ array for any full-frame or subarray WFC3 UVIS or IR image.
\n",
+ "See our [notebook on displaying and analyzing data](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/image_displayer_analyzer) for different use cases and functionality. Additionally,
\n",
+ "the docstring for the function is available by running the command `display_image?`. The speed at
\n",
+ "which the images are displayed will depend partly on the number of files and their sizes.
\n",
+ "\n",
+ "While viewing your data and assessing the quality, please keep in mind that the UVIS and IR detectors
\n",
+ "both have their own unique anomalies. For a full listing of all known WFC3 anomalies, as well as their
\n",
+ "description and example image, please see [WFC3 ISR 2017-22](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2017/WFC3-2017-22.pdf). Additionally, there is a [WFC3 Anomalies
webpage](https://www.stsci.edu/hst/instrumentation/wfc3/performance/anomalies), which also provides examples as well as linked documentation to various WFC3 Instrument
\n",
+ "Science Reports.\n",
+ "\n",
+ "Please keep in mind that while the data may look OK to the eye, further analysis into any available PSFs
\n",
+ "as well as the S/N and/or flux achieved in the images may be required. For example, this notebook only
\n",
+ "shows images from the UVIS detector; if your data are from WFC3/IR please also download the
\n",
+ "Intermediate MultiAccum files (`_ima.fits`). These files contain the full stack of calibrated readouts,
\n",
+ "while the final calibrated image (`_flt.fits`) file is the single image fully processed and trimmed.
\n",
+ "For more information about the `_ima.fits` files see [Chapter 3.3](https://hst-docs.stsci.edu/wfc3dhb/chapter-3-wfc3-data-calibration/3-3-ir-data-calibration-steps) of the WFC3 Data Handbook. To
\n",
+ "display each individual read of the `_ima.fits` file, turn the `ima_multiread` keyword to `True` in
\n",
+ "the `display_image` function. If you would like to remove one of the reads from the `_ima.fits`
\n",
+ "files and recalibrate with `calwf3` please see our [Jupyter Notebook](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/calwf3_recalibration) and [WFC3 ISR 2016-16](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2016/WFC3-2016-16.pdf) on manual
\n",
+ "recalibration. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# only run this cell if you would like to see the docscring for the function\n",
+ "display_image?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "# Edit fltfiles if you would like to use your own files\n",
+ "fltfiles = sorted(glob.glob(f'{exp_ids[0].lower()}/*flt.fits'))\n",
+ "\n",
+ "for f in fltfiles:\n",
+ " display_image(f,\n",
+ " colormaps=['Greys_r', 'Greys_r', 'inferno_r'],\n",
+ " scaling=[(-10, 130), (None, None), (None, None)],\n",
+ " printmeta=True,\n",
+ " ima_multiread=False,\n",
+ " figsize=(16, 16),\n",
+ " dpi=150)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " \n",
+ "## 4. Header Keywords from `_jif.fits`\n",
+ "In the example above, we can see that the telescope guiding failed in at least 4 of the 7 images
\n",
+ "from dataset IEPP01010. Since this is not a SNAP program (which does not get repeat observations
per STScI policy) there is already enough evidence to file a [HOPR](https://www.stsci.edu/hst/observing/post-observation/reporting-problems) and request that the exposures
\n",
+ "get repeated.\n",
+ "\n",
+ "But, if you are still unsure if the data were affected, the next step is to look at the header keywords
\n",
+ "The [jitter files](https://www.stsci.edu/hst/instrumentation/focus-and-pointing/pointing/jitter-file-format-definition) `_jif.fits`, also known as observing logs, record a lot of information including
\n",
+ "Jitter, Pointing Control System data, World Coordinate System parameters, and spacecraft data
\n",
+ "taken during the observations.
\n",
+ "\n",
+ "One of the sections in the header of the jitter file is called \"Problem Flags and Warnings\" where
\n",
+ "a majority of the keywords will help assess if there were problems with guide star lock and tracking.
\n",
+ "\n",
+ "If you would like to use your own `_jif.fits` file please edit line 1 in the cell below. The indexing
\n",
+ "on line 2 may also need to be modified.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "jif_file = f'{exp_ids[0].lower()}/{exp_ids[0].lower()}_jif.fits' # Edit with the path to your own _jif.fits file\n",
+ "fits.getheader(jif_file,0)[-21:-6]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
Specifically from the keywords above, `T_GSFAIL` indicates one or more exposures had a guide
\n",
+ "star acquisition failure. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fits.getheader(jif_file,0)['T_GSFAIL*']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
Next, we loop through each extension of the `_jif.fits` file, and display various keywords that help
\n",
+ "identify which exposures were affected. In the `_jif.fits` files, each extension number corresponds
\n",
+ "to a given science exposure through the header keyword `EXPNAME`. In this example, the most relevant
\n",
+ "keywords that show something went wrong are `GUIDEACT`, `GSACQ`, `GSFAIL`, as well as `V2_RMS`
\n",
+ "and `V3_RMS`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "numexts = fits.getheader(jif_file,0)['NEXTEND'] # number of extensions i.e. exposures\n",
+ "\n",
+ "keywords = ['EXPNAME*','GUIDEACT*','GSACQ*','ACTGSSEP*',\n",
+ " 'GSSEPRMS*','NLOSSES*','CRVAL1*','CRVAL2*',\n",
+ " 'V2_RMS*','V3_RMS*','GSFAIL*']\n",
+ "\n",
+ "for ext in range(1,numexts+1):\n",
+ " print(\"JIF Header Ext Number:\",ext)\n",
+ " print('-'*80)\n",
+ " for keyword in keywords:\n",
+ " # try to display keyword because it may not be present \n",
+ " try: \n",
+ " print(fits.getheader(jif_file,ext)[keyword])\n",
+ " except KeyError: \n",
+ " pass\n",
+ " print('\\n')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Above, we see that the `_jif.fits` file is reporting that exposures 4 through 7 failed to acquire a
\n",
+ "guide star. In extensions 4-7, the `GSACQ` keyword is blank, `GSFAIL` is set to `NOLOCK`, and the
\n",
+ "values for `GSSEPRMS`, `V2_RMS`, `V3_RMS` are nonphysical at -32767 mas.
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " \n",
+ "## 5. Plotting Data from `_jit.fits`\n",
+ "\n",
+ "Next, we will use the data inside of the `_jit.fits` file to make plots of the jitter for each individual
\n",
+ "exposure. Specifically, we plot the V2 and V3 average jitter (over 3 seconds) as well as the V2 and V3
\n",
+ "jitter RMS. The HST-based, or vehicle (V2, V3) system is an orthogonal reference frame tied to the
\n",
+ "telescope and is used operationally for alignment, pointing, and slewing purposes (V2 = -U2 and V3
\n",
+ "= –U3). For more information about the coordinate systems, and UVIS and IR field geometries see the
\n",
+ "WFC3 Instrument Handbook [Chapter 6.4](https://hst-docs.stsci.edu/wfc3ihb/chapter-6-uvis-imaging-with-wfc3/6-4-uvis-field-geometry) and [Chapter 7.4](https://hst-docs.stsci.edu/wfc3ihb/chapter-7-ir-imaging-with-wfc3/7-4-ir-field-geometry) respectively. A description of each column,
\n",
+ "as well as the corresponding unit, can be found in the headers of the JIT file.
\n",
+ "\n",
+ "If you would like to use your own `_jit.fits` file please edit line 1 in the cell below. Additionally,
\n",
+ "if you need to change the figure size and/or resolution please edit lines 4 and/or 5."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "jit_file = f'{exp_ids[0].lower()}/{exp_ids[0].lower()}_jit.fits' # Edit with the path to your own _jit.fits file\n",
+ "numexts = fits.getheader(jit_file,0)['NEXTEND'] # number of extensions i.e. exposures\n",
+ "\n",
+ "figure_size = (7,5) # Edit if you want to chage the figure size\n",
+ "dotsperinch = 115 # Edit if you want to change the figure resolution\n",
+ "\n",
+ "for ext in range(1,numexts+1):\n",
+ "\n",
+ " jit_tbl = Table(fits.getdata(jit_file,ext))\n",
+ " expname = fits.getheader(jit_file,ext)['EXPNAME']\n",
+ " flt_file = glob.glob(f\"{exp_ids[0].lower()}/{expname[:8]}*flt.fits\")\n",
+ " \n",
+ " plt.figure(figsize=figure_size, dpi=dotsperinch)\n",
+ " plt.grid(alpha=0.5)\n",
+ " plt.scatter(jit_tbl['Seconds'],jit_tbl['SI_V2_AVG'],15,alpha=.5,marker='o',label='V2_AVG')\n",
+ " plt.scatter(jit_tbl['Seconds'],jit_tbl['SI_V3_AVG'],15,alpha=.5,marker='o',label='V3_AVG')\n",
+ " plt.scatter(jit_tbl['Seconds'],jit_tbl['SI_V2_RMS'],10,alpha=.5,marker='s',label='V2_RMS')\n",
+ " plt.scatter(jit_tbl['Seconds'],jit_tbl['SI_V3_RMS'],10,alpha=.5,marker='s',label='V3_RMS')\n",
+ " \n",
+ " \n",
+ " plt.xlabel('Exposure Time [Seconds]',size=13)\n",
+ " plt.ylabel('Coordinate Axis [Arcsec]',size=13)\n",
+ " plt.title(f\"Jitter File Ext Number: {ext}\\n Corresponding FLT: {flt_file[0].split('/')[-1]}\",size=14)\n",
+ " plt.legend(prop={'size':12},ncol=2)\n",
+ " plt.minorticks_on()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 5.1 Interpreting the Jitter Plots \n",
+ "In the plots above, there is more confirmation that exposures 4-7 failed to acquire a guide star. Every
\n",
+ "value in the V2 & V3 average and RMS columns inside of the `_jit.fits` file for those exposures
\n",
+ "are reporting an erroneous value of 1.6 x 1038. However, rather than having every value set to 1.6 x 1038,
\n",
+ "exposures 1-3 above have real jitter data reported. In this example, the average V2 & V3 jitter values
\n",
+ "vary by about +/- 0.5 - 2 mas and the RMS values are at a 1.5 - 2 mas level. \n",
+ "\n",
+ "At the time this notebook was written, the [HST Primer](https://hst-docs.stsci.edu/hsp/the-hubble-space-telescope-primer-for-cycle-30) section on [Optical Performance, Guiding
Performance, and Observing Efficiency](https://hst-docs.stsci.edu/hsp/the-hubble-space-telescope-primer-for-cycle-30/hst-primer-optical-performance-guiding-performance-and-observing-efficiency) states the dual guide star \"pointing control method was
\n",
+ "designed to keep telescope jitter below 0.007 arcsec rms, but the current performance has jitter of
\n",
+ "0.008 arcsec rms.\" If the exposure had single guide star tracking, the Primer section explains that \"a
\n",
+ "gyro drift around the guide star will be present that can be as large as 17 milliarcsec (mas) of roll
angle per second.\" "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 6. Further Analysis \n",
+ "While we have determined that four of the exposures failed in this example, further analysis may be
\n",
+ "needed to access your data quality.
\n",
+ "\n",
+ "If you are still unsure whether or not your data quality was affected (such as in exposures 1-3 above),
\n",
+ "we kindly ask that you complete a couple more verification steps:\n",
+ "1. Determine whether the signal-to-noise and/or flux of your data reached the expected levels\n",
+ "2. Analyze any point spread functions or sources that appear in your exposures for signs of drifting\n",
+ "
\n",
+ "\n",
+ "For analyzing the S/N and/or flux in your image using Python, we recommend the Astropy package for
\n",
+ "photometry, [photutils](https://photutils.readthedocs.io/en/stable/), and [imexam](https://imexam.readthedocs.io/en/0.9.1/#). Some of the methods offered by photutils are [source detection](https://photutils.readthedocs.io/en/stable/detection.html),
\n",
+ "[aperture photometry](https://photutils.readthedocs.io/en/stable/aperture.html), and [PSF photometry](https://photutils.readthedocs.io/en/stable/psf.html). The imexam method offers many useful diagnostic plots
\n",
+ "such as [radial profile](https://imexam.readthedocs.io/en/0.9.1/imexam/imexam_command.html#radial-profile-plot), [curve of growth](https://imexam.readthedocs.io/en/0.9.1/imexam/imexam_command.html#curve-of-growth-plot), and [contours](https://imexam.readthedocs.io/en/0.9.1/imexam/imexam_command.html#contour-plots). For more information about WFC3 PSF analysis
\n",
+ "please see our [PSF data analysis webpage](https://www.stsci.edu/hst/instrumentation/wfc3/data-analysis/psf).\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 6.1 Radial Profile Plots\n",
+ "\n",
+ "Below, we show an example of searching for sources with `photutils.detection.DAOStarFinder`
\n",
+ "in a 100x100 pixel subsection and subsequently plotting their radial profiles using the `RadialProfile`
class within the file `rad_prof.py`. \n",
+ "\n",
+ "We also import:\n",
+ "- *numpy* for handling arrays\n",
+ "- *astropy.stats.sigma_clipped_stats* for sigma clipping statistics\n",
+ "- *ginga.util.zscale* for scaling images\n",
+ "- *matplotlib.colors.LogNorm* for logarithmic normalization\n",
+ "- *photutils.detection.CircularAperture* for aperture photometry"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "from astropy.stats import sigma_clipped_stats\n",
+ "from ginga.util import zscale\n",
+ "from matplotlib.colors import LogNorm\n",
+ "from photutils.aperture import CircularAperture\n",
+ "from photutils.detection import DAOStarFinder\n",
+ "\n",
+ "from docs.rad_prof import RadialProfile"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ "\n",
+ "First, we open the data and 3 sigma clip it to get the median and standard deviation values. We then use
\n",
+ "those values to help search for sources using `photutils.detection.DAOStarFinder`. We truncate
\n",
+ "the list of sources to those with `flux > 10` and well within the x & y border of the 100x100 pixel
\n",
+ "subsection. Lastly, we create `photutils.aperture` objects so we can easily display the subsection
\n",
+ "with each source marked. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Read in data\n",
+ "filename = 'iepp01010/iepp01uvq_flt.fits'\n",
+ "uvis2 = fits.getdata(filename,'SCI',1)\n",
+ "header = fits.getheader(filename)\n",
+ "\n",
+ "# Trim data to 100x100 subsection\n",
+ "data = uvis2[:100,65:165]\n",
+ "\n",
+ "# 3 sigma clip data to get median and std values\n",
+ "mean, median, std = sigma_clipped_stats(data, sigma=3.0) \n",
+ "\n",
+ "# Search for sources\n",
+ "daofind = DAOStarFinder(fwhm=2.5, threshold=3*std) \n",
+ "sources = daofind(data - median) \n",
+ "\n",
+ "# Truncate list to show just a few sources \n",
+ "sources = sources[(sources['flux'] > 10) &\\\n",
+ " (sources['xcentroid'] > 10) & (sources['xcentroid'] < 90) &\\\n",
+ " (sources['ycentroid'] > 18) & (sources['ycentroid'] < 90) ]\n",
+ "\n",
+ "# Create circular apertures to plot\n",
+ "positions = np.transpose((sources['xcentroid'],sources['ycentroid']))\n",
+ "apertures = CircularAperture(positions, r=5.)\n",
+ "\n",
+ "# Get zscale image min and max limits\n",
+ "z1,z2 = zscale.zscale(data)\n",
+ "\n",
+ "# Plot 100x100 subsection and apertures\n",
+ "plt.figure(figsize=(15,10))\n",
+ "im1 = plt.imshow(data-z1+.01, origin='lower', cmap='Greys', norm = LogNorm(vmin=.01, vmax=z2*100.-z1) )\n",
+ "apertures.plot(color='red', lw=1.5, alpha=0.5)\n",
+ "plt.title(filename,size=14)\n",
+ "plt.colorbar(im1,pad=0.01)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ "\n",
+ "Now that we have the x & y coordinates for several (12) sources in the image, we loop through each one and
\n",
+ "calculate and display the radial profile, which provides the measured FWHM value in the legend of the plot.
\n",
+ "**For more information about UVIS and IR optical performance, such as nominal PSF FWHM values, please
\n",
+ "see WFC3 Instrument Handbook Chapters [6.6](https://hst-docs.stsci.edu/wfc3ihb/chapter-6-uvis-imaging-with-wfc3/6-6-uvis-optical-performance) and [7.6](https://hst-docs.stsci.edu/wfc3ihb/chapter-7-ir-imaging-with-wfc3/7-6-ir-optical-performance) respectively.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Loop through sources and plot star stamp next to corresponding radial profile plot\n",
+ "for xy in zip(sources['xcentroid'],sources['ycentroid']):\n",
+ " \n",
+ " fig, [ax1,ax2] = plt.subplots(1,2,figsize=(11,5))\n",
+ " \n",
+ " # Calculate radial profile and plot on ax2\n",
+ " my_prof = RadialProfile(xy[0],xy[1],data,\n",
+ " r=5,\n",
+ " fit=True,\n",
+ " recenter=True,\n",
+ " show=True,\n",
+ " ax=ax2)\n",
+ " \n",
+ " # Create boundaries for stamp \n",
+ " x1 = int(round(my_prof.x-7))\n",
+ " x2 = int(round(my_prof.x+7))\n",
+ " y1 = int(round(my_prof.y-7))\n",
+ " y2 = int(round(my_prof.y+7))\n",
+ " \n",
+ " # Plot star stamp \n",
+ " im1 = ax1.imshow(data[y1:y2,x1:x2]-z1+.01, origin='lower', cmap='Greys', extent= [x1,x2,y1,y2],norm = LogNorm(vmin=.01, vmax=z2*100.-z1) )\n",
+ "\n",
+ " ax1.set_title(f\"x = {my_prof.x:.3f}, y = {my_prof.y:.3f}\",size=13)\n",
+ " ax2.set_title(header['filter'],size=13)\n",
+ " ax2.grid(alpha=0.5)\n",
+ " fig.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Radial Profile Plot Note:** The scatter points that trend above the fitted line between pixel distances ~2-4, and
\n",
+ "then below the fitted line between ~4-7 pixels are due to the Airy rings surrounding the PSF. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 7. Should I submit a [HOPR](https://www.stsci.edu/hst/observing/post-observation/reporting-problems) or [Help Desk Ticket](https://stsci.service-now.com/hst)? \n",
+ "\n",
+ "If your data from the exception report are affected by a problem, as in the example above, please file a [HOPR](https://www.stsci.edu/hst/observing/post-observation/reporting-problems)
\n",
+ "and begin the process of requesting a repeat observation. If you are still unsure whether or not your data are
\n",
+ "affected by an issue after displaying it, checking the header keywords in the observing logs, plotting the jitter
\n",
+ "data, a quick-look determination of the S/N, and checking any PSFs for signs of drift, please reach out to the
\n",
+ "[WFC3 Help Desk](https://stsci.service-now.com/hst). Lastly, please do not forget that **there is a 90-day time limit from the date that the data
\n",
+ "were delivered to file a HOPR.**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 8. Conclusions \n",
+ "\n",
+ "Thank you for going through this notebook. You should now have all the necessary tools for accessing the
\n",
+ "data from your exception report. After completing this notebook you should be more familiar with:
\n",
+ "\n",
+ "- Downloading your data.\n",
+ "- Displaying your data.\n",
+ "- Viewing the `_jif.fits` file header.\n",
+ "- Plotting data from the `_jit.fits` file.\n",
+ "- Determining if a HOPR should be filed.\n",
+ "\n",
+ "**Congratulations, you have completed the notebook.**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Additional Resources \n",
+ "\n",
+ "Below are some additional resources that may be helpful. Please feel free to contact the [WFC3 Helpdesk](https://stsci.service-now.com/hst)
\n",
+ "with any questions.\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ "- [WFC3 Anomalies](https://www.stsci.edu/hst/instrumentation/wfc3/performance/anomalies)\n",
+ "- [WFC3 PSF Data Analysis](https://www.stsci.edu/hst/instrumentation/wfc3/data-analysis/psf)\n",
+ "- [Jitter File and Format](https://www.stsci.edu/hst/instrumentation/focus-and-pointing/pointing/jitter-file-format-definition)\n",
+ "\n",
+ "## About this Notebook \n",
+ "\n",
+ "**Author:** Benjamin Kuhn, WFC3 Instrument\n",
+ "\n",
+ "**Updated On:** January 20, 2023\n",
+ "\n",
+ "## Citations \n",
+ "\n",
+ "If you use Python packages for published research, please cite the authors. Follow these links for more
\n",
+ "information about citing packages such as `astropy`, `astroquery`, `matplotlib`, or `photutils`:\n",
+ "\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://github.com/astropy/astroquery/blob/main/astroquery/CITATION)\n",
+ "* [Citing `matplotlib`](https://matplotlib.org/stable/users/project/citing.html)\n",
+ "* [Citing `photutils`](https://photutils.readthedocs.io/en/stable/citation.html)\n",
+ "
\n",
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "[Top of Page](#top)\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.7.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/notebooks/WFC3/filter_transformations/.ipynb_checkpoints/filter_transformations-checkpoint.ipynb b/notebooks/WFC3/filter_transformations/.ipynb_checkpoints/filter_transformations-checkpoint.ipynb
new file mode 100644
index 000000000..8cdc1c4a7
--- /dev/null
+++ b/notebooks/WFC3/filter_transformations/.ipynb_checkpoints/filter_transformations-checkpoint.ipynb
@@ -0,0 +1,582 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "4f8f088c",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# WFC3/UVIS Filter Transformations with stsynphot\n",
+ "***\n",
+ "## Learning Goals\n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "- Generate synthetic observations using `synphot` and `stsynphot`.\n",
+ "- Find color terms between WFC3/UVIS filters and non-HST filters.\n",
+ "- Plot bandpasses to investigate various throughputs.\n",
+ "\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#imports)
\n",
+ "[2. Select filters for the transformation](#select)
\n",
+ "[3. Define a spectrum](#spec)
\n",
+ "[4. Select UVIS chips](#chips)
\n",
+ "[5. Select magnitude systems](#system)
\n",
+ "[6. Generate outputs](#output)
\n",
+ "[7. Plot bandpasses](#band)
\n",
+ "[8. Conclusions](#conclusion)
\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b3ccc9f1",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Introduction\n",
+ "This notebook computes color terms between selected WFC3/UVIS filters and non-HST filters, such as Johnson-Cousins, for a user-defined reference spectrum. The terms as given are the difference between the magnitude of the spectrum in the selected non-HST filter and the corresponding UVIS filter. \n",
+ "\n",
+ "This tool reproduces the methods described in section 4 of [WFC3 ISR 2014-16](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2014/WFC3-2014-16.pdf), but will automatically use the latest available spectra and throughput tables.\n",
+ "\n",
+ "`stsynphot` requires access to data distributed by the [Calibration Data Reference System](https://hst-crds.stsci.edu/) (CRDS) in order to operate. Both packages look for an environment variable called `PYSYN_CDBS` to find the directory containing these data.\n",
+ "\n",
+ "Users can obtain these data files from the CDRS. Information on how to obtain the most up-to-date reference files (and what they contain) can be found [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/synphot-throughput-tables). An example of how to download the files with `curl` and set up this environment variable is presented below.\n",
+ "\n",
+ "For detailed instructions on how to install and set up these packages, see the [synphot](https://synphot.readthedocs.io/en/latest/#installation-and-setup) and [stsynphot](https://stsynphot.readthedocs.io/en/latest/#installation-and-setup) documentation."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6884c604",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "\n",
+ "- *os* for setting environment variables\n",
+ "- *numpy* for handling array functions\n",
+ "- *pandas* for managing data\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *astropy.units* and *synphot.units* for handling units\n",
+ "- *synphot* and *stsynphot* for evaluating synthetic photometry\n",
+ "\n",
+ "Additionally, we will need to set the `PYSYN_CDBS` environment variable *before* importing stsynphot. We will also create a Vega spectrum using synphot's inbuilt `from_vega()` method, as the latter package will supercede this method's functionality and require a downloaded copy of the latest Vega spectrum to be provided."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f014a9e2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib notebook\n",
+ "\n",
+ "import os\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "import synphot as syn\n",
+ "from synphot import Observation\n",
+ "\n",
+ "vegaspec = syn.SourceSpectrum.from_vega()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c7a66046",
+ "metadata": {},
+ "source": [
+ "This section obtains the WFC3 throughput component tables for use with `stsynphot`. If the reference files need to be downloaded, please uncomment and execute the code block below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ad199734",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# cmd_input = 'curl -O https://ssb.stsci.edu/trds/tarfiles/synphot1.tar.gz'\n",
+ "# os.system(cmd_input)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4fcb217a",
+ "metadata": {},
+ "source": [
+ "Once the download is complete, unzip the file and set the environment variable `PYSYN_CDBS` to the path of the reference files. To do so, uncomment and execute the relevant line from the code block below. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5eb68a42",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# os.environ['PYSYN_CDBS'] = '/path/to/my/reference/files/'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d8654a6b",
+ "metadata": {},
+ "source": [
+ "Now, after having set up `PYSYN_CDBS`, we import stsynphot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "59b75282",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import stsynphot as stsyn\n",
+ "from stsynphot import band"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7f2ee24",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 2. Select filters for the transformation\n",
+ "\n",
+ "Define the filters to use for computing the transformation. One filter should be a UVIS filter, and the other a non-HST filter such as a Johnson-Cousins filter.\n",
+ "\n",
+ "**Filter names should be input as a list of tupled strings. Each tuple represents a pair of filters to convert between, and should contain the non-HST filter as the first element, and the UVIS filter as the second.**\n",
+ "\n",
+ "For non-HST filters, the filter system be included in the string, separated from the filter name by a comma (e.g. `'johnson, v'` or `'sdss, g'`). The available non-HST filters are listed here:\n",
+ "\n",
+ "| System | Bands |\n",
+ "|:----------|:--------------------|\n",
+ "| cousins | r, i |\n",
+ "| galex | nuv, fuv |\n",
+ "| johnson | u, b, v, r, i, j, k |\n",
+ "| landolt | u, b, v, r, i |\n",
+ "| sdss | u, g, r, i, z, |\n",
+ "| stromgren | u, v, b, y |\n",
+ "\n",
+ "Furthermore, Johnson-Cousins filters with corresponding UVIS filters are listed here:\n",
+ "\n",
+ "| Johnson-Cousins Filter \t| UVIS Filter \t|\n",
+ "|:------------------------\t|:-------------\t|\n",
+ "| U \t| F336W \t|\n",
+ "| B \t| F475W \t|\n",
+ "| V \t| F555W/F606W \t|\n",
+ "| I \t| F814W \t|\n",
+ "\n",
+ "A summary of the UVIS filters, with descriptions, is available in [Section 6.5.1](https://hst-docs.stsci.edu/wfc3ihb/chapter-6-uvis-imaging-with-wfc3/6-5-uvis-spectral-elements#id-6.5UVISSpectralElements-6.5.1FilterandGrismSummary) of the WFC3 Instrument Handbook\n",
+ "\n",
+ "The notebook is currently set up to return the color terms between the V and I Johnson-Cousins filters, and corresponding UVIS filters."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9b40d583",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "filts = [('johnson, v', 'f555w'), ('cousins, i', 'f814w')]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7798772d",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. Define a spectrum\n",
+ "\n",
+ "Define a spectrum to get color terms for. Some common options are embedded below. A wide array of reference spectra are available for download from spectral atlases located [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/astronomical-catalogs).\n",
+ "\n",
+ "```python\n",
+ "# Blackbody (5000 K)\n",
+ "bb_temp = 5000 * u.K\n",
+ "\n",
+ "model = syn.models.BlackBody1D(bb_temp)\n",
+ "spec = syn.SourceSpectrum(model)\n",
+ "\n",
+ "# Power law \n",
+ "pl_index = 0\n",
+ "\n",
+ "model = syn.models.PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)\n",
+ "spec = syn.SourceSpectrum(model)\n",
+ " \n",
+ "# Load from a FITS table (e.g. a CALSPEC spectrum)\n",
+ "spec = syn.SourceSpectrum.from_file('/path/to/your/spectrum.fits')\n",
+ "```\n",
+ "Currently, the notebook is configured to use a 5000 K blackbody spectrum."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "64bf3cdc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bb_temp = 5000 * u.K\n",
+ "\n",
+ "model = syn.models.BlackBody1D(bb_temp)\n",
+ "spec = syn.SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "47fd42a9",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. Select UVIS chips\n",
+ "\n",
+ "Quantum efficiency differences between the two UVIS chips mean that you must specify which chips to use for computing color terms. Simply set the chip you would like to use to `True` and the other to `False`, or set both to `True` if you would like coefficients for both."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "55a83fe6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "uvis1 = True\n",
+ "\n",
+ "uvis2 = True\n",
+ "\n",
+ "chips = [uvis1, uvis2]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "486907f1",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 5. Select magnitude systems\n",
+ "\n",
+ "Select which magnitude systems you would like color terms to be provided for. Set those you would like to `True` and others to `False`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "57cc10d1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ABMAG = True\n",
+ "STMAG = True\n",
+ "VEGAMAG = False\n",
+ "\n",
+ "mags = [('ABMAG', u.ABmag, ABMAG), ('STMAG', u.STmag, STMAG), ('VEGAMAG', su.VEGAMAG, VEGAMAG)]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "00b22e5b",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 6. Generate outputs\n",
+ "\n",
+ "Generate a data frame containing the color terms for the inputs you have specified. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aa37e55a",
+ "metadata": {},
+ "source": [
+ "First, let's define the column names for the output table, and a list to fill with table rows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6d5b3050",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cols = ['Filters', 'Chip']\n",
+ "rows = []"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2a2a9dc1",
+ "metadata": {},
+ "source": [
+ "Then, append the names of magnitude systems being used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f1f99d2a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for name, _, toggle in mags:\n",
+ " \n",
+ " if toggle:\n",
+ " \n",
+ " cols.append('d_' + name)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "55c45d0f",
+ "metadata": {},
+ "source": [
+ "Next, iterate over filter pairs. For each filter pair, this loop will:\n",
+ "- generate observation mode strings, bandpasses, and observations\n",
+ "- calculate the color term and append it\n",
+ "- append filters, chip, and color term as a row to `rows`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4b9a7577",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for pair in filts:\n",
+ "\n",
+ " filt_non, filt_uvis = pair # Unpack filters\n",
+ " \n",
+ " filt_str = filt_non + ' - ' + filt_uvis\n",
+ " \n",
+ " for i, toggle in enumerate(chips):\n",
+ " \n",
+ " if not toggle:\n",
+ " continue\n",
+ " \n",
+ " chip_str = 'uvis' + str(i + 1)\n",
+ " \n",
+ " # Generate observation mode strings, bandpasses, observations\n",
+ " \n",
+ " obsmode_non = filt_non\n",
+ " obsmode_uvis = 'wfc3, ' + chip_str + ', ' + filt_uvis\n",
+ "\n",
+ " bp_non = band(obsmode_non)\n",
+ " bp_uvis = band(obsmode_uvis)\n",
+ "\n",
+ " obs_non = Observation(spec, bp_non)\n",
+ " obs_uvis = Observation(spec, bp_uvis)\n",
+ "\n",
+ " row = [filt_str, chip_str] # Append filters and chip to row\n",
+ "\n",
+ " for name, unit, toggle in mags:\n",
+ " \n",
+ " if not toggle:\n",
+ " continue\n",
+ "\n",
+ " effstim_non = obs_non.effstim(flux_unit=unit, vegaspec=vegaspec) \n",
+ " effstim_uvis = obs_uvis.effstim(flux_unit=unit, vegaspec=vegaspec)\n",
+ " \n",
+ " color = effstim_non - effstim_uvis # Find color term\n",
+ " \n",
+ " row.append('{:.3f}'.format((color.value))) # Append color term\n",
+ " \n",
+ " rows.append(row) # Append row to list of rows"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac4e9a7e",
+ "metadata": {},
+ "source": [
+ "Finally, generate and return the output table."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bafd58e3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.DataFrame(rows, columns=cols)\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7f437658",
+ "metadata": {},
+ "source": [
+ "If you wish to save the output table as a .txt file, please uncomment and execute the code block below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "46610393",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#df.to_csv('your/path/here.txt', sep='\\t')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e9decdc",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 7. Plot bandpasses\n",
+ "\n",
+ "It can be nice to see your selected bandpass pairs plotted with each other. The cell below will generate a figure with subplots for each filter pair specified above, as well as the relevant portion of the spectrum you've defined, all normalized to fit on the same axes.\n",
+ "\n",
+ "**Note:** For the purposes of these plots, the non-HST bandpass and spectrum have been scaled to the amplitude of the HST bandpass, which reflects the actual total system throughput as a function of wavelength."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "af690657",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, axs = plt.subplots(1, len(filts), sharey=True, figsize=(3*len(filts),4)) # Instantiate subplots\n",
+ "\n",
+ "axs[0].set_ylabel('Throughput')\n",
+ "\n",
+ "for i, pair in enumerate(filts):\n",
+ " \n",
+ " f1, f2 = pair\n",
+ " \n",
+ " bp1 = band(f1)\n",
+ " bp2 = band('wfc3, uvis1,' + f2)\n",
+ " \n",
+ " # Create wavelength array for subplot based on average bandpass wavelength and width\n",
+ " avgwave = (bp1.avgwave().to(u.nm) + bp2.avgwave().to(u.nm))/2\n",
+ " width = (bp1.rectwidth().to(u.nm) + bp2.rectwidth().to(u.nm))/2\n",
+ " \n",
+ " left = max((avgwave - 1.5 * width).value, 1)\n",
+ " right = (avgwave + 1.5 * width).value\n",
+ " \n",
+ " wl = np.arange(left, right) * u.nm\n",
+ "\n",
+ " # Normalize curves to fit on one set of axes\n",
+ " \n",
+ " bp1_norm = bp1(wl) / np.max(bp1(wl)) * np.max(bp2(wl))\n",
+ " spec_norm = spec(wl) / np.max(spec(wl)) * np.max(bp2(wl))\n",
+ " \n",
+ " # Plot bandpasses and spectrum on subplot \n",
+ " \n",
+ " axs[i].plot(wl, bp1_norm, ls='--', label=f1, c='tab:blue')\n",
+ " axs[i].plot(wl, bp2(wl), ls='-.', label=f2, c='tab:red')\n",
+ " axs[i].plot(wl, spec_norm, label='spectrum', c='tab:purple')\n",
+ "\n",
+ " axs[i].set_xlabel('Wavelength (nm)')\n",
+ " \n",
+ " axs[i].legend(fontsize='x-small', loc='upper right')\n",
+ "\n",
+ "plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "65cd486e",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 8. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. Now using WFC3 data, you should be more familiar with:\n",
+ "\n",
+ "- Generating synthetic observations using `synphot` and `stsynphot`.\n",
+ "- Finding color terms between WFC3/UVIS filters and non-HST filters.\n",
+ "- Ploting bandpasses to investigate various throughputs.\n",
+ "\n",
+ "#### Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0c1d83ac",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ " - see sections 9.5.2 for reference to this notebook\n",
+ " \n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Authors:** Aidan Pidgeon, Jennifer Mack; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** 2021-09-13\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `astropy`, `synphot`, or `stsynphot` for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://www.scipy.org/citing.html#numpy)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `synphot`](https://synphot.readthedocs.io/en/latest/)\n",
+ "* [Citing `stsynphot`](https://stsynphot.readthedocs.io/en/latest/index.html)\n",
+ "\n",
+ "***\n",
+ "[Top of Page](#title)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d78e54fe",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/WFC3/filter_transformations/README.md b/notebooks/WFC3/filter_transformations/README.md
new file mode 100644
index 000000000..77de7d4a3
--- /dev/null
+++ b/notebooks/WFC3/filter_transformations/README.md
@@ -0,0 +1,3 @@
+This notebook demonstrates how to calculate photometric transformation coefficients between WFC3/UVIS wide-band filters and any other non-HST filter system for a given object spectrum.
+
+The new tool uses the latest WFC3 synthetic throughput tables and replaces functionality provided in the [WFC3 Photometric Conversion Tool](https://colortool.stsci.edu/uvis-filter-transformations), which is no longer supported. For more detail on photometric transformations to other systems, see [WFC3 ISR 2014-16](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2014/WFC3-2014-16.pdf).
diff --git a/notebooks/WFC3/filter_transformations/filter_transformations.ipynb b/notebooks/WFC3/filter_transformations/filter_transformations.ipynb
new file mode 100644
index 000000000..7ddbfabb0
--- /dev/null
+++ b/notebooks/WFC3/filter_transformations/filter_transformations.ipynb
@@ -0,0 +1,583 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "4f8f088c",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# WFC3/UVIS Filter Transformations with stsynphot\n",
+ "***\n",
+ "## Learning Goals\n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "- Generate synthetic observations using `synphot` and `stsynphot`.\n",
+ "- Find color terms between WFC3/UVIS filters and non-HST filters.\n",
+ "- Plot bandpasses to investigate various throughputs.\n",
+ "\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#imports)
\n",
+ "[2. Select filters for the transformation](#select)
\n",
+ "[3. Define a spectrum](#spec)
\n",
+ "[4. Select UVIS chips](#chips)
\n",
+ "[5. Select magnitude systems](#system)
\n",
+ "[6. Generate outputs](#output)
\n",
+ "[7. Plot bandpasses](#band)
\n",
+ "[8. Conclusions](#conclusion)
\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b3ccc9f1",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Introduction\n",
+ "This notebook computes color terms between selected WFC3/UVIS filters and non-HST filters, such as Johnson-Cousins, for a user-defined reference spectrum. The terms as given are the difference between the magnitude of the spectrum in the selected non-HST filter and the corresponding UVIS filter. \n",
+ "\n",
+ "This tool reproduces the methods described in section 4 of [WFC3 ISR 2014-16](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2014/WFC3-2014-16.pdf), but will automatically use the latest available spectra and throughput tables.\n",
+ "\n",
+ "`stsynphot` requires access to data distributed by the [Calibration Data Reference System](https://hst-crds.stsci.edu/) (CRDS) in order to operate. Both packages look for an environment variable called `PYSYN_CDBS` to find the directory containing these data.\n",
+ "\n",
+ "Users can obtain these data files from the CDRS. Information on how to obtain the most up-to-date reference files (and what they contain) can be found [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/synphot-throughput-tables). An example of how to download the files with `curl` and set up this environment variable is presented below.\n",
+ "\n",
+ "For detailed instructions on how to install and set up these packages, see the [synphot](https://synphot.readthedocs.io/en/latest/#installation-and-setup) and [stsynphot](https://stsynphot.readthedocs.io/en/latest/#installation-and-setup) documentation."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6884c604",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "\n",
+ "- *os* for setting environment variables\n",
+ "- *numpy* for handling array functions\n",
+ "- *pandas* for managing data\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *astropy.units* and *synphot.units* for handling units\n",
+ "- *synphot* and *stsynphot* for evaluating synthetic photometry\n",
+ "\n",
+ "Additionally, we will need to set the `PYSYN_CDBS` environment variable *before* importing stsynphot. We will also create a Vega spectrum using synphot's inbuilt `from_vega()` method, as the latter package will supercede this method's functionality and require a downloaded copy of the latest Vega spectrum to be provided."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f014a9e2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib notebook\n",
+ "\n",
+ "import os\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import astropy.units as u\n",
+ "import synphot.units as su\n",
+ "import synphot as syn\n",
+ "from synphot import Observation\n",
+ "\n",
+ "vegaspec = syn.SourceSpectrum.from_vega()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c7a66046",
+ "metadata": {},
+ "source": [
+ "This section obtains the WFC3 throughput component tables for use with `stsynphot`. If the reference files need to be downloaded, please uncomment and execute the code block below. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ad199734",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# cmd_input = 'curl -O https://archive.stsci.edu/hlsps/reference-atlases/hlsp_reference-atlases_hst_multi_everything_multi_v11_sed.tar'\n",
+ "# os.system(cmd_input)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4fcb217a",
+ "metadata": {},
+ "source": [
+ "Once the download is complete, unzip the file and set the environment variable `PYSYN_CDBS` to the path of the reference files. To do so, uncomment and execute the relevant line from the code block below. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5eb68a42",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# os.environ['PYSYN_CDBS'] = '/path/to/my/reference/files/'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d8654a6b",
+ "metadata": {},
+ "source": [
+ "Now, after having set up `PYSYN_CDBS`, we import stsynphot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "59b75282",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import stsynphot as stsyn\n",
+ "from stsynphot import band"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7f2ee24",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 2. Select filters for the transformation\n",
+ "\n",
+ "Define the filters to use for computing the transformation. One filter should be a UVIS filter, and the other a non-HST filter such as a Johnson-Cousins filter.\n",
+ "\n",
+ "**Filter names should be input as a list of tupled strings. Each tuple represents a pair of filters to convert between, and should contain the non-HST filter as the first element, and the UVIS filter as the second.**\n",
+ "\n",
+ "For non-HST filters, the filter system be included in the string, separated from the filter name by a comma (e.g. `'johnson, v'` or `'sdss, g'`). The available non-HST filters are listed here:\n",
+ "\n",
+ "| System | Bands |\n",
+ "|:----------|:--------------------|\n",
+ "| cousins | r, i |\n",
+ "| galex | nuv, fuv |\n",
+ "| johnson | u, b, v, r, i, j, k |\n",
+ "| landolt | u, b, v, r, i |\n",
+ "| sdss | u, g, r, i, z, |\n",
+ "| stromgren | u, v, b, y |\n",
+ "\n",
+ "Furthermore, Johnson-Cousins filters with corresponding UVIS filters are listed here:\n",
+ "\n",
+ "| Johnson-Cousins Filter \t| UVIS Filter \t|\n",
+ "|:------------------------\t|:-------------\t|\n",
+ "| U \t| F336W \t|\n",
+ "| B \t| F475W \t|\n",
+ "| V \t| F555W/F606W \t|\n",
+ "| I \t| F814W \t|\n",
+ "\n",
+ "A summary of the UVIS filters, with descriptions, is available in [Section 6.5.1](https://hst-docs.stsci.edu/wfc3ihb/chapter-6-uvis-imaging-with-wfc3/6-5-uvis-spectral-elements#id-6.5UVISSpectralElements-6.5.1FilterandGrismSummary) of the WFC3 Instrument Handbook\n",
+ "\n",
+ "The notebook is currently set up to return the color terms between the V and I Johnson-Cousins filters, and corresponding UVIS filters."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9b40d583",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "filts = [('johnson, v', 'f555w'), ('cousins, i', 'f814w')]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7798772d",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. Define a spectrum\n",
+ "\n",
+ "Define a spectrum to get color terms for. Some common options are embedded below. A wide array of reference spectra are available for download from spectral atlases located [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/astronomical-catalogs).\n",
+ "\n",
+ "```python\n",
+ "# Blackbody (5000 K)\n",
+ "bb_temp = 5000 * u.K\n",
+ "\n",
+ "model = syn.models.BlackBody1D(bb_temp)\n",
+ "spec = syn.SourceSpectrum(model)\n",
+ "\n",
+ "# Power law \n",
+ "pl_index = 0\n",
+ "\n",
+ "model = syn.models.PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)\n",
+ "spec = syn.SourceSpectrum(model)\n",
+ " \n",
+ "# Load from a FITS table (e.g. a CALSPEC spectrum)\n",
+ "spec = syn.SourceSpectrum.from_file('/path/to/your/spectrum.fits')\n",
+ "```\n",
+ "Currently, the notebook is configured to use a 5000 K blackbody spectrum."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "64bf3cdc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bb_temp = 5000 * u.K\n",
+ "\n",
+ "model = syn.models.BlackBody1D(bb_temp)\n",
+ "spec = syn.SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "47fd42a9",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. Select UVIS chips\n",
+ "\n",
+ "Quantum efficiency differences between the two UVIS chips mean that you must specify which chips to use for computing color terms. Simply set the chip you would like to use to `True` and the other to `False`, or set both to `True` if you would like coefficients for both."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "55a83fe6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "uvis1 = True\n",
+ "\n",
+ "uvis2 = True\n",
+ "\n",
+ "chips = [uvis1, uvis2]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "486907f1",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 5. Select magnitude systems\n",
+ "\n",
+ "Select which magnitude systems you would like color terms to be provided for. Set those you would like to `True` and others to `False`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "57cc10d1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ABMAG = True\n",
+ "STMAG = True\n",
+ "VEGAMAG = False\n",
+ "\n",
+ "mags = [('ABMAG', u.ABmag, ABMAG), ('STMAG', u.STmag, STMAG), ('VEGAMAG', su.VEGAMAG, VEGAMAG)]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "00b22e5b",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 6. Generate outputs\n",
+ "\n",
+ "Generate a data frame containing the color terms for the inputs you have specified. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aa37e55a",
+ "metadata": {},
+ "source": [
+ "First, let's define the column names for the output table, and a list to fill with table rows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6d5b3050",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cols = ['Filters', 'Chip']\n",
+ "rows = []"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2a2a9dc1",
+ "metadata": {},
+ "source": [
+ "Then, append the names of magnitude systems being used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f1f99d2a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for name, _, toggle in mags:\n",
+ " \n",
+ " if toggle:\n",
+ " \n",
+ " cols.append('d_' + name)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "55c45d0f",
+ "metadata": {},
+ "source": [
+ "Next, iterate over filter pairs. For each filter pair, this loop will:\n",
+ "- generate observation mode strings, bandpasses, and observations\n",
+ "- calculate the color term and append it\n",
+ "- append filters, chip, and color term as a row to `rows`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4b9a7577",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for pair in filts:\n",
+ "\n",
+ " filt_non, filt_uvis = pair # Unpack filters\n",
+ " \n",
+ " filt_str = filt_non + ' - ' + filt_uvis\n",
+ " \n",
+ " for i, toggle in enumerate(chips):\n",
+ " \n",
+ " if not toggle:\n",
+ " continue\n",
+ " \n",
+ " chip_str = 'uvis' + str(i + 1)\n",
+ " \n",
+ " # Generate observation mode strings, bandpasses, observations\n",
+ " \n",
+ " obsmode_non = filt_non\n",
+ " obsmode_uvis = 'wfc3, ' + chip_str + ', ' + filt_uvis\n",
+ "\n",
+ " bp_non = band(obsmode_non)\n",
+ " bp_uvis = band(obsmode_uvis)\n",
+ "\n",
+ " obs_non = Observation(spec, bp_non)\n",
+ " obs_uvis = Observation(spec, bp_uvis)\n",
+ "\n",
+ " row = [filt_str, chip_str] # Append filters and chip to row\n",
+ "\n",
+ " for name, unit, toggle in mags:\n",
+ " \n",
+ " if not toggle:\n",
+ " continue\n",
+ "\n",
+ " effstim_non = obs_non.effstim(flux_unit=unit, vegaspec=vegaspec) \n",
+ " effstim_uvis = obs_uvis.effstim(flux_unit=unit, vegaspec=vegaspec)\n",
+ " \n",
+ " color = effstim_non - effstim_uvis # Find color term\n",
+ " \n",
+ " row.append('{:.3f}'.format((color.value))) # Append color term\n",
+ " \n",
+ " rows.append(row) # Append row to list of rows"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac4e9a7e",
+ "metadata": {},
+ "source": [
+ "Finally, generate and return the output table."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bafd58e3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.DataFrame(rows, columns=cols)\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7f437658",
+ "metadata": {},
+ "source": [
+ "If you wish to save the output table as a .txt file, please uncomment and execute the code block below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "46610393",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#df.to_csv('your/path/here.txt', sep='\\t')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e9decdc",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 7. Plot bandpasses\n",
+ "\n",
+ "It can be nice to see your selected bandpass pairs plotted with each other. The cell below will generate a figure with subplots for each filter pair specified above, as well as the relevant portion of the spectrum you've defined, all normalized to fit on the same axes.\n",
+ "\n",
+ "**Note:** For the purposes of these plots, the non-HST bandpass and spectrum have been scaled to the amplitude of the HST bandpass, which reflects the actual total system throughput as a function of wavelength."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "af690657",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, axs = plt.subplots(1, len(filts), sharey=True, figsize=(3*len(filts),4)) # Instantiate subplots\n",
+ "\n",
+ "axs[0].set_ylabel('Throughput')\n",
+ "\n",
+ "for i, pair in enumerate(filts):\n",
+ " \n",
+ " f1, f2 = pair\n",
+ " \n",
+ " bp1 = band(f1)\n",
+ " bp2 = band('wfc3, uvis1,' + f2)\n",
+ " \n",
+ " # Create wavelength array for subplot based on average bandpass wavelength and width\n",
+ " avgwave = (bp1.avgwave().to(u.nm) + bp2.avgwave().to(u.nm))/2\n",
+ " width = (bp1.rectwidth().to(u.nm) + bp2.rectwidth().to(u.nm))/2\n",
+ " \n",
+ " left = max((avgwave - 1.5 * width).value, 1)\n",
+ " right = (avgwave + 1.5 * width).value\n",
+ " \n",
+ " wl = np.arange(left, right) * u.nm\n",
+ "\n",
+ " # Normalize curves to fit on one set of axes\n",
+ " \n",
+ " bp1_norm = bp1(wl) / np.max(bp1(wl)) * np.max(bp2(wl))\n",
+ " spec_norm = spec(wl) / np.max(spec(wl)) * np.max(bp2(wl))\n",
+ " \n",
+ " # Plot bandpasses and spectrum on subplot \n",
+ " \n",
+ " axs[i].plot(wl, bp1_norm, ls='--', label=f1, c='tab:blue')\n",
+ " axs[i].plot(wl, bp2(wl), ls='-.', label=f2, c='tab:red')\n",
+ " axs[i].plot(wl, spec_norm, label='spectrum', c='tab:purple')\n",
+ "\n",
+ " axs[i].set_xlabel('Wavelength (nm)')\n",
+ " \n",
+ " axs[i].legend(fontsize='x-small', loc='upper right')\n",
+ "\n",
+ "plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "65cd486e",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 8. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. Now using WFC3 data, you should be more familiar with:\n",
+ "\n",
+ "- Generating synthetic observations using `synphot` and `stsynphot`.\n",
+ "- Finding color terms between WFC3/UVIS filters and non-HST filters.\n",
+ "- Ploting bandpasses to investigate various throughputs.\n",
+ "\n",
+ "#### Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0c1d83ac",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ " - see sections 9.5.2 for reference to this notebook\n",
+ " \n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Authors:** Aidan Pidgeon, Jennifer Mack; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** 2021-09-13\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `astropy`, `synphot`, or `stsynphot` for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `synphot`](https://synphot.readthedocs.io/en/latest/)\n",
+ "* [Citing `stsynphot`](https://stsynphot.readthedocs.io/en/latest/index.html)\n",
+ "\n",
+ "***\n",
+ "[Top of Page](#title)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d78e54fe",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/WFC3/filter_transformations/requirements.txt b/notebooks/WFC3/filter_transformations/requirements.txt
new file mode 100644
index 000000000..5c08850bd
--- /dev/null
+++ b/notebooks/WFC3/filter_transformations/requirements.txt
@@ -0,0 +1,6 @@
+astropy==5.2.1
+matplotlib==3.7.0
+numpy==1.23.4
+pandas==1.5.3
+stsynphot==1.2.0
+synphot==1.1.1
diff --git a/notebooks/WFC3/flux_conversion_tool/.ipynb_checkpoints/flux_conversion_tool-checkpoint.ipynb b/notebooks/WFC3/flux_conversion_tool/.ipynb_checkpoints/flux_conversion_tool-checkpoint.ipynb
new file mode 100644
index 000000000..11c7fe51d
--- /dev/null
+++ b/notebooks/WFC3/flux_conversion_tool/.ipynb_checkpoints/flux_conversion_tool-checkpoint.ipynb
@@ -0,0 +1,877 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "6077aec5",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Flux Unit Conversions with synphot and stsynphot\n",
+ "***\n",
+ "## Learning Goals\n",
+ "By the end of this tutorial, you will:\n",
+ "\n",
+ "- Perform conversions between various systems of flux and magnitude using the `synphot` and `stsynphot` packages.\n",
+ "- Extrapolate an output flux at a different wavelength than the input flux, by using a spectrum defined using the same packages.\n",
+ "- Provide a framework to adapt a more personalized and streamlined conversion process, if desired.\n",
+ "\n",
+ "## Table of Contents\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#imports)
\n",
+ "[2. Input and output setup](#input)
\n",
+ "- [2.1 Units](#unit)
\n",
+ "- [2.2 Bandpasses](#band)
\n",
+ "- [2.3 Choosing a spectrum](#spec)
\n",
+ "- [2.4 User settings](#user)
\n",
+ "\n",
+ "[3. Set up the conversion](#setting)
\n",
+ "[4. Perform the conversion and create a plot](#perform)
\n",
+ "[5. Examples](#ex)
\n",
+ "- [5.1 Flux in Jy to AB mag with a flat spectrum in $F_\\nu$](#ex1)
\n",
+ "- [5.2 Flux in flam to Flux in flam along a blackbody](#ex2)
\n",
+ "- [5.3 Flux in fnu to flux in photnu, any spectrum (same wavelength)](#ex3)
\n",
+ "- [5.4 mag to mag from an HST bandpass to a Johnson bandpass, flat spectrum in $F_\\lambda$](#ex4)
\n",
+ "\n",
+ "[6. Conclusions](#conclusion)
\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "53a3fa89",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Introduction\n",
+ "This notebook is based on the prior \"HST Photometric Conversion Tool\" that returns unit conversions between various flux units and magnitude systems. It is not intended to replace more detailed functionality such as that provided by the [Exposure Time Calculator](https://etc.stsci.edu/) (ETC). Rather, it is intended to provide a simple, quick result for flux unit conversions.\n",
+ "\n",
+ "`stsynphot` requires access to data distributed by the [Calibration Data Reference System](https://hst-crds.stsci.edu/) (CRDS) in order to operate. Both packages look for an environment variable called `PYSYN_CDBS` to find the directory containing these data.\n",
+ "\n",
+ "Users can obtain these data files from the CDRS. Information on how to obtain the most up-to-date reference files (and what they contain) can be found [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/synphot-throughput-tables). An example of how to download these files using `curl` and set up this environment variable is presented in the imports section below.\n",
+ "\n",
+ "For detailed instructions on how to install and set up these packages, see the [synphot](https://synphot.readthedocs.io/en/latest/#installation-and-setup) and [stsynphot](https://stsynphot.readthedocs.io/en/latest/#installation-and-setup) documentation."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "746e504f",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "- *os* for setting environment variables\n",
+ "\n",
+ "- *numpy* for handling array functions\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "\n",
+ "- *synphot* and *stsynphot* for evaluating synthetic photometry\n",
+ "- *astropy.units* and *synphot.units* for handling units\n",
+ "\n",
+ "Additionally, we will need to set the `PYSYN_CDBS` environment variable *before* importing stsynphot. We will also create a Vega spectrum using synphot's inbuilt `from_vega()` method, as the latter package will supercede this method's functionality and require a downloaded copy of the latest Vega spectrum to be provided."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7f440831",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib notebook\n",
+ "\n",
+ "import os\n",
+ "\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "import synphot as syn\n",
+ "from synphot import SourceSpectrum, Observation\n",
+ "from synphot.models import BlackBody1D, PowerLawFlux1D\n",
+ "from synphot.units import convert_flux\n",
+ "\n",
+ "from astropy import units as u\n",
+ "from synphot import units as su\n",
+ "\n",
+ "vegaspec = SourceSpectrum.from_vega() "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "03e60162",
+ "metadata": {},
+ "source": [
+ "This section obtains the WFC3 throughput component tables for use with `synphot`. If reference files need to be downloaded, please uncomment and execute the code block below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "528e42d3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# cmd_input = 'curl -O https://ssb.stsci.edu/trds/tarfiles/synphot1.tar.gz'\n",
+ "# os.system(cmd_input)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a60c88ec",
+ "metadata": {},
+ "source": [
+ "Once the downloaded is complete, unzip the file and set the environment variable `PYSYN_CDBS` to the path of the reference files. To do so, uncomment and execute the relevant line from the code block below. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f80d0021",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# os.environ['PYSYN_CDBS'] = '/path/to/my/reference/files/'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c4bbc869",
+ "metadata": {},
+ "source": [
+ "Now, after having set up `PYSYN_CDBS`, we import stsynphot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5e4bba39",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import stsynphot as stsyn\n",
+ "from stsynphot import band"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9ddf5c75",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 2. Input and output setup\n",
+ "\n",
+ "\n",
+ "### 2.1 Units\n",
+ "\n",
+ "The conversion framework below will accept any `astropy` or `synphot` unit with dimensions of spectral flux density ($F_\\lambda$ or $F_\\nu$) or photon flux density. Flux units with any of the following dimensions will be supported by the tool:\n",
+ "- [power] [area] [wavelength]$^{-1}$\n",
+ "- [power] [area] [frequency]$^{-1}$\n",
+ "- photons [area] [wavelength]$^{-1}$\n",
+ "- photons [area] [frequency]$^{-1}$\n",
+ "\n",
+ "Alternatively, a magnitude system may be specified as the unit for the input or the output in the same way that a flux density would be. The tables below lists flux units which are defined by name in `astropy` and `synphot`, and the magnitude systems supported by the tool.\n",
+ "\n",
+ "| Unit | Definition | astropy/synphot attribute |\n",
+ "|:---|:---:|:---\n",
+ "| Jansky | $$10^{-26} \\text{ W} \\text{ m}^{-2} \\text{ Hz}^{-1}$$ | `astropy.units.Jy` |\n",
+ "| fnu | $$\\text{erg} \\text{ s}^{-1} \\text{ cm}^{-2} \\text{ Hz}^{-1}$$ | `synphot.units.FNU` |\n",
+ "| flam | $$\\text{erg} \\text{ s}^{-1} \\text{ cm}^{-2} \\text{ Ã…}^{-1}$$ |`synphot.units.FLAM` |\n",
+ "| photnu | $$\\text{photons} \\text{ s}^{-1} \\text{ cm}^{-2} \\text{ Hz}^{-1}$$ | `synphot.units.PHOTNU` |\n",
+ "| photlam | $$\\text{photons} \\text{ s}^{-1} \\text{ cm}^{-2} \\text{ Ã…}^{-1}$$ | `synphot.units.PHOTLAM` |\n",
+ "\n",
+ "| Mag System | astropy/synphot attribute |\n",
+ "|:---|:---|\n",
+ "| ABmag | `astropy.units.ABmag` |\n",
+ "| STmag | `astropy.units.STmag` |\n",
+ "| vegamag | `synphot.units.VEGAMAG` |\n",
+ "\n",
+ "For more information on accepted units in `synphot`, refer to the documentation [here](https://synphot.readthedocs.io/en/latest/synphot/units.html). \n",
+ "\n",
+ "\n",
+ "### 2.2 Bandpasses\n",
+ "\n",
+ "When selecting a magnitude as an input or output, the tool will need a bandpass to be defined, which is done with a string of [observation mode](https://stsynphot.readthedocs.io/en/latest/stsynphot/obsmode.html#), or obsmode, keywords. The pivot wavelength for that bandpass will then serve as the characteristic wavelength to be used for the conversion.\n",
+ "\n",
+ "For HST bandpasses, `stsynphot` accounts for the telescope's optics by combining throughput information along the entire optical path. As an example, `'wfc3, uvis2, f475w, mjd#59367'` tells `stsynphot` to retrieve the latest throughput tables for the UVIS2 detector on WFC3, through the F475W filter for the Modified Julian Date 59367 (June 1, 2021). The option to specify a Julian date is provided for instruments which show changes in sensitivity over time. If no date is specified, `stsynphot` will use the reference epoch for each instrument as default.\n",
+ "\n",
+ "As the required and optional obsmode keywords vary from instrument to instrument, it would be impractical to list the available options here in their entirety. Please refer to the [full list](https://stsynphot.readthedocs.io/en/latest/stsynphot/appendixb.html#stsynphot-appendixb) of available obsmode keywords for details on how to specify HST bandpasses.\n",
+ "\n",
+ "For non-HST filter systems, the only required keywords are the filter system's name and that of the desired filter within that system (e.g. `'johnson, v'`). A list of the non-HST filter systems accepted by `stsynphot` is given here:\n",
+ "\n",
+ "| System | Bands |\n",
+ "|:----------|:--------------------|\n",
+ "| cousins | r, i |\n",
+ "| galex | nuv, fuv |\n",
+ "| johnson | u, b, v, r, i, j, k |\n",
+ "| landolt | u, b, v, r, i |\n",
+ "| sdss | u, g, r, i, z, |\n",
+ "| stromgren | u, v, b, y |\n",
+ "\n",
+ "\n",
+ "### 2.3 Choosing a spectrum\n",
+ "\n",
+ "You'll also need to define a spectrum, which the tool will use to extrapolate your input flux to an output at a different wavelength.\n",
+ "\n",
+ "The embedded code below shows how to generate or load various useful spectra. You can simply copy one of them into the cell below and modify as appropriate, or create your own. For more information, see the [Source Spectrum documentation](https://synphot.readthedocs.io/en/latest/synphot/spectrum.html#).\n",
+ "\n",
+ "Some notes:\n",
+ "- For evaluation and plotting, these models default to outputting flux in photlam, however, the output unit may be specified with the `flux_unit` keyword argument.\n",
+ "\n",
+ "- `synphot.models.BlackBody1D` outputs a function according to Planck's law, which means that the output unit carries an implicit \"per unit solid angle,\" in steradians. For a normalized blackbody, you can use `BlackBodyNorm1D`, whose output is normalized to a 1 solar radius star at a distance of 1 kpc, or multiply your source spectrum by some solid angle of your choosing.\n",
+ "\n",
+ "- `synphot.models.PowerLawFlux1D` uses the definition $f(x) = A (\\frac{x}{x_0})^{-\\alpha}$, where $A$ is input flux (`flux_in`), and $x_0$ is the input wavelength (`wl_in`). Note the negative sign in front of the power law index $\\alpha$. The model can generate curves with $x$ as either frequency or wavelength, but the example here assumes that wavelength will be used. The y-axis unit will be taken from $A$. \n",
+ "\n",
+ "- A wide array of reference spectra are available for download from spectral atlases located [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/astronomical-catalogs).\n",
+ "\n",
+ "\n",
+ "\n",
+ "Example spectrum definitions:\n",
+ "\n",
+ "```python\n",
+ "# Blackbody\n",
+ "bb_temp = 5800 * u.K\n",
+ "\n",
+ "model = BlackBody1D(bb_temp)\n",
+ "spec = SourceSpectrum(model)\n",
+ "\n",
+ "# Power law \n",
+ "pl_index = 0\n",
+ "\n",
+ "model = PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)\n",
+ "spec = SourceSpectrum(model)\n",
+ " \n",
+ "# Load from a FITS table\n",
+ "spec = SourceSpectrum.from_file('/path/to/your/spectrum.fits')\n",
+ "```\n",
+ "\n",
+ "The notebook has been set up to perform an extrapolation from $V = 0.0$ in the Vega system to the R-band in the same system, using the Vega spectrum defined in the imports cell. Further examples of input and output settings are available at the bottom of this notebook.\n",
+ "\n",
+ "\n",
+ "### 2.4 User settings\n",
+ "\n",
+ "First, we define our conversion input settings:\n",
+ "- `val_in`: numerical value of input flux/mag (float)\n",
+ "- `unit_in`: unit or mag system for input value\n",
+ "- `wl_bp_in`: input's wavelength (float) for flux, or bandpass obsmode (string) for magnitudes\n",
+ "- `wl_unit`: wavelength unit (used for plots, so needs to be specified even when using a bandpass)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "de540dfe",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "val_in = 0.0\n",
+ "unit_in = su.VEGAMAG\n",
+ "wl_bp_in = 'johnson, v'\n",
+ "\n",
+ "wl_unit = u.nm "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "42d7a951",
+ "metadata": {},
+ "source": [
+ "Next, we define our conversion output settings:\n",
+ "- `unit_out`: unit or mag system for the output\n",
+ "- `wl_bp_out`: wavelength (float) or bandpass obsmode (string) to find output for; if a wavelength, the unit specified in the cell above by `wl_unit` will be used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3d477832",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "unit_out = su.VEGAMAG\n",
+ "wl_bp_out = 'cousins, r'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ee4dd82c",
+ "metadata": {},
+ "source": [
+ "Finally, we define our spectrum to use (copy/paste from above, or define your own)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b542e3c2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "spec = vegaspec"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d8d4e50f",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. Set up the conversion\n",
+ "\n",
+ "Now, we need to run a few cells that will set up the conversion. First, we check whether the input and output are a flux or a magnitude, and set some variables appropriately. Then, we scale the chosen spectrum such that it passes through the defined input so the extrapolation to the output wavelength will give an accurate result.\n",
+ "\n",
+ "Note that the default plotting unit is set to the input unit for conversions made from flux units, and photlam for conversions from magnitudes. This may be altered, if desired, by changing the `plot_unit` variable definitions in the cell below."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0a54da3b",
+ "metadata": {},
+ "source": [
+ "**Note: No inputs required for the cells below. All the inputs were assigned in [Section 2.4](#user).**\n",
+ "\n",
+ "First, let's combine input value and unit as a quantity, then list the systems that will work for the tool."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1caf81ab",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "quant_in = val_in * unit_in\n",
+ "\n",
+ "mag_systems = [u.STmag, u.ABmag, su.VEGAMAG]\n",
+ "flux_systems = ['spectral flux density', 'spectral flux density wav', \n",
+ " 'photon flux density', 'photon flux density wav']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bfe5d48f",
+ "metadata": {},
+ "source": [
+ "Next, let's get inputs set up for following steps. Here are the three possible outcomes:\n",
+ "- **If the input is a magnitude,**\n",
+ " - define bandpass with input obsmode string\n",
+ " - pivot wavelength of input bandpass\n",
+ " - set `flux_in` to equivalent flux in photlam at pivot wavelength (Vega spectrum needed if using VEGAMAG)\n",
+ " - set plotting unit and flux for later\n",
+ " \n",
+ " \n",
+ "- **If the input is a flux,**\n",
+ " - combine wavelength for flux and unit as the input wavelength\n",
+ " - set plotting unit and flux for later\n",
+ "\n",
+ "\n",
+ "- **If anything else, print**\n",
+ " - `unit_in not a flux density unit or magnitude system`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5338d317",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if unit_in in mag_systems:\n",
+ " \n",
+ " mag_in = quant_in\n",
+ " \n",
+ " band_in = band(wl_bp_in)\n",
+ " wl_in = band_in.pivot().to(wl_unit)\n",
+ " \n",
+ " flux_in = convert_flux(wl_in, quant_in, su.PHOTLAM,\n",
+ " vegaspec=vegaspec)\n",
+ " \n",
+ " plot_unit = su.PHOTLAM\n",
+ " \n",
+ " plot_flux_in = convert_flux(wl_in, flux_in, plot_unit)\n",
+ " \n",
+ "elif unit_in.physical_type in flux_systems:\n",
+ " \n",
+ " flux_in = quant_in\n",
+ " wl_in = wl_bp_in * wl_unit \n",
+ " \n",
+ " plot_unit = unit_in\n",
+ " plot_flux_in = convert_flux(wl_in, flux_in, plot_unit)\n",
+ "\n",
+ "else:\n",
+ " print('unit_in not a flux density unit or magnitude system')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9f3b3f26",
+ "metadata": {},
+ "source": [
+ "We perform a similar setup for outputs:\n",
+ "- **If the output is a magnitude,**\n",
+ " - use output wavelength to calculate output bandpass\n",
+ " - output bandpass's pivot wavelength\n",
+ " \n",
+ " \n",
+ "- **If the output is a flux,**\n",
+ " - combine wavelength for flux and unit as output wavelength\n",
+ " \n",
+ "\n",
+ "- **If anything else, print**\n",
+ " - `unit_out not a flux density unit or magnitude system`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5928f11f",
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "if unit_out in mag_systems:\n",
+ " \n",
+ " band_out = band(wl_bp_out)\n",
+ " wl_out = band_out.pivot().to(wl_unit)\n",
+ "\n",
+ "elif unit_out.physical_type in flux_systems:\n",
+ " \n",
+ " wl_out = wl_bp_out * wl_unit\n",
+ "\n",
+ "else:\n",
+ " print('unit_out not a flux density unit or magnitude system') "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "339e2f19",
+ "metadata": {},
+ "source": [
+ "Finally, we convert the flux, scale, and multiply by our spectrum. The default evaluation unit is set to photlam."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c747a9e6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "scale = convert_flux(wl_in, flux_in, su.PHOTLAM) / spec(wl_in)\n",
+ "\n",
+ "scale_spec = spec * scale"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e54c6137",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. Perform the conversion and create a plot\n",
+ "\n",
+ "We can now find our output by using the `convert_flux` function from `synphot`. We will first scale the spectrum defined above such that its value at the input wavelength is that of the input flux. Then, we convert the scaled spectrum's value at the *output* wavelength to the selected output units, as well as the unit that will be used for plotting. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "317c99b2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if unit_out in mag_systems:\n",
+ " \n",
+ " flux_out = convert_flux(wl_out, scale_spec(wl_out), unit_out,\n",
+ " vegaspec=vegaspec)\n",
+ " \n",
+ " plot_flux_out = convert_flux(wl_out, scale_spec(wl_out), plot_unit)\n",
+ " \n",
+ "else:\n",
+ " flux_out = convert_flux(wl_out, scale_spec(wl_out), unit_out)\n",
+ " \n",
+ " plot_flux_out = convert_flux(wl_out, scale_spec(wl_out), plot_unit)\n",
+ " \n",
+ "val_out = flux_out.value"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a086b2d",
+ "metadata": {},
+ "source": [
+ "Print the input and output values."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "82c08695",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print('Input: {:.4} {} at {:.1f} {}\\n'.format(float(val_in), str(unit_in), wl_in.value, str(wl_in.unit)))\n",
+ "print('Output: {:.4} {} at {:.1f} {}'.format(float(val_out), str(unit_out), wl_out.value, str(wl_out.unit)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "de0ffd76",
+ "metadata": {},
+ "source": [
+ "While not strictly necessary for performing the conversion, plotting the selected spectrum with the input and output points can be a useful check to see if the spectrum looks like what you're expecting.\n",
+ "\n",
+ "Let's define a set of wavelengths and minimum/maximum bounds for the plot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0b5f1e79",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "wl_settings = [wl.value for wl in [wl_in, wl_out]]\n",
+ "\n",
+ "short = min(wl_settings)\n",
+ "long = max(wl_settings)\n",
+ "\n",
+ "if short == long: # In case wl_in == wl_out\n",
+ " diff = 10.\n",
+ " \n",
+ "else:\n",
+ " diff = long - short\n",
+ "\n",
+ "right = long + diff\n",
+ "\n",
+ "left = max([short - diff, 0.1])\n",
+ "\n",
+ "waves = np.linspace(left, right, 10000) * wl_unit"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7805b257",
+ "metadata": {},
+ "source": [
+ "We will also set the colors for the in/out markers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "358172e8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if wl_in.value > wl_out.value:\n",
+ " \n",
+ " c_in = 'r'\n",
+ " c_out = 'b'\n",
+ " \n",
+ "else: \n",
+ " c_in = 'b'\n",
+ " c_out = 'r'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8495e6ac",
+ "metadata": {},
+ "source": [
+ "Plot the spectrum, input, and output. If the input was a magnitude, then `plot_unit` ([see Section 3](#setting)) will be used. In addition, if the input and output wavelength are the same, then print the input and output."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8bea8f73",
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "plt.figure()\n",
+ "\n",
+ "# Plot spectrum\n",
+ "\n",
+ "plt.plot(waves, scale_spec(waves, flux_unit=plot_unit), c='k')\n",
+ "\n",
+ "# Plot input\n",
+ "\n",
+ "plt.plot(wl_in.value, plot_flux_in.value,\n",
+ " marker='o', color=c_in, ls='none', \n",
+ " label='Input: {:.4} {} at {:.1f} {}'.format(\n",
+ " float(val_in), str(unit_in), wl_in.value, str(wl_in.unit)))\n",
+ "\n",
+ "# Plot output\n",
+ "\n",
+ "plt.plot(wl_out.value, plot_flux_out.value,\n",
+ " marker='s', color=c_out, ls='none', \n",
+ " label='Output: {:.4} {} at {:.1f} {}'.format(\n",
+ " float(val_out), str(unit_out), wl_out.value, str(wl_out.unit)))\n",
+ "\n",
+ "# Set heights for dotted lines to markers as % of plot range\n",
+ "\n",
+ "bottom, top = plt.ylim()\n",
+ "yrange = top - bottom\n",
+ "inheight = (plot_flux_in.value - bottom) / yrange\n",
+ "outheight = (plot_flux_out.value - bottom) / yrange\n",
+ "\n",
+ "# Plot dotted lines to markers\n",
+ "\n",
+ "plt.axvline(wl_in.to(wl_unit).value, ymax=inheight, ls=':', c=c_in)\n",
+ "plt.axvline(wl_out.to(wl_unit).value, ymax=outheight, ls=':', c=c_out)\n",
+ "\n",
+ "# Miscellaneous\n",
+ "\n",
+ "plt.ylabel('Flux ({})'.format(str(plot_unit)))\n",
+ "plt.xlabel('Wavelength ({})'.format(str(wl_unit)))\n",
+ "plt.legend(fontsize='small') \n",
+ "plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c818eec6",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 5. Examples\n",
+ "\n",
+ "Here, we provide some examples to illustrate a few of the many conversions which are possible. If desired, you may run an example cell to set the inputs for the tool, then run through the notebook (without running the cells in [Section 2.4](#user)) to see the results. Each cell will define an input, output, and spectrum.\n",
+ "\n",
+ "\n",
+ "### 5.1. Flux in Jy to AB mag with a flat spectrum in $F_\\nu$\n",
+ "Run cell then go to [Section 3](#setting) to convert flux and plot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fd8fe178",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Input: 3631 Jy at 550. nm\n",
+ "\n",
+ "val_in = 3631. \n",
+ "unit_in = u.Jy\n",
+ "wl_bp_in = 550.\n",
+ "\n",
+ "wl_unit = u.nm\n",
+ "\n",
+ "# Output: Johnson V mag (AB)\n",
+ "\n",
+ "unit_out = u.ABmag\n",
+ "wl_bp_out = 'Johnson, V'\n",
+ " \n",
+ "# Spectrum: Flat power law in F_nu\n",
+ "\n",
+ "pl_index = 0\n",
+ "model = PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)\n",
+ "spec = SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0964f2f4",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 5.2. Flux in flam to Flux in flam along a blackbody\n",
+ "Run cell then go to [Section 3](#setting) to convert flux and plot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "714bbeb1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Input: 1.234e-8 flam at 500. nm\n",
+ "\n",
+ "val_in = 1.234e-8 \n",
+ "unit_in = su.FLAM\n",
+ "wl_bp_in = 500.\n",
+ "\n",
+ "wl_unit = u.nm\n",
+ "\n",
+ "# Output: flam at 800. nm\n",
+ "\n",
+ "unit_out = su.FLAM\n",
+ "wl_bp_out = 800.\n",
+ " \n",
+ "# Spectrum: 5800 K blackbody\n",
+ "\n",
+ "bb_temp = 5800 * u.K\n",
+ "model = BlackBody1D(bb_temp)\n",
+ "spec = SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2735fc75",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 5.3. Flux in fnu to flux in photnu, any spectrum (same wavelength)\n",
+ "Run cell then go to [Section 3](#setting) to convert flux and plot. Note the spectrum is irrelevant since conversion is at the same wavelength."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "771c6282",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Input: 1.234e-21 fnu at 686. nm\n",
+ "\n",
+ "val_in = 1.234e-21 \n",
+ "unit_in = su.FNU\n",
+ "wl_bp_in = 686.\n",
+ "\n",
+ "wl_unit = u.nm\n",
+ "\n",
+ "# Output: photnu at 686. nm\n",
+ "\n",
+ "unit_out = su.PHOTNU\n",
+ "wl_bp_out = 686.\n",
+ " \n",
+ "# Spectrum: 5800 K blackbody\n",
+ "bb_temp = 5800 * u.K\n",
+ "model = BlackBody1D(bb_temp)\n",
+ "spec = SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "94e3245b",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 5.4. mag to mag from an HST bandpass to a Johnson bandpass, flat spectrum in $F_\\lambda$\n",
+ "Run cell then go to [Section 3](#setting) to convert flux and plot. Note we run `convert_flux` for the power law amplitude to ensure the spectrum is flat in $F_\\lambda$ rather than in photlam."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7da9e44e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Input: STmag = 12.240, F606W filter on WFC3 UVIS 2\n",
+ "\n",
+ "val_in = 12.240 \n",
+ "unit_in = u.STmag\n",
+ "wl_bp_in = 'wfc3, uvis2, f606w, mjd#59367'\n",
+ "\n",
+ "wl_unit = u.nm\n",
+ "\n",
+ "# Output: Johnson V mag (AB)\n",
+ "\n",
+ "unit_out = u.STmag\n",
+ "wl_bp_out = 'Johnson, V'\n",
+ " \n",
+ "# Spectrum: Flat power law in F_lambda\n",
+ "\n",
+ "pl_index = 0\n",
+ "\n",
+ "model = PowerLawFlux1D(amplitude=convert_flux(606 * u.nm, 1., su.FLAM), x_0=606 * u.nm, alpha=pl_index)\n",
+ "spec = SourceSpectrum(model)\n",
+ "model = PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4a38c7a9",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 6. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. Now using WFC3 data, you should be more familiar with:\n",
+ "\n",
+ "- Performing conversions between various systems of flux and magnitude using the `synphot` and `stsynphot` packages.\n",
+ "- Extrapolating an output flux at a different wavelength than the input flux.\n",
+ "- Adapting a more personalized and streamlined conversion process.\n",
+ "\n",
+ "#### Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aad2523c",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ " - see sections 9.5.2 for reference to this notebook\n",
+ " \n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Authors:** Aidan Pidgeon, Joel Green; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** 2021-09-13\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `astropy`, `synphot`, or `stsynphot` for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://www.scipy.org/citing.html#numpy)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `synphot`](https://synphot.readthedocs.io/en/latest/)\n",
+ "* [Citing `stsynphot`](https://stsynphot.readthedocs.io/en/latest/index.html)\n",
+ "\n",
+ "***\n",
+ "[Top of Page](#title)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f708c513",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/WFC3/flux_conversion_tool/README.md b/notebooks/WFC3/flux_conversion_tool/README.md
new file mode 100644
index 000000000..4b3abe36b
--- /dev/null
+++ b/notebooks/WFC3/flux_conversion_tool/README.md
@@ -0,0 +1 @@
+This notebook provides a framework for users to convert between multiple magnitude and flux unit systems, and plot the results on the selected spectrum. This tool is based on the NICMOS unit conversion form and replaces the [HST Unit conversion tool](https://colortool.stsci.edu/unit-conversion/), which was developed in 2014. The updated tool incorporates the latest WFC3/UVIS ([WFC3 ISR 2021-04](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/WFC3_ISR_2021-04.pdf)) and WFC3/IR ([WFC3 ISR 2020-10](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2020/WFC3-ISR-2020-10.pdf)) photometric calibration as well as recent changes in the Vega spectrum of up to ~1.5% ([Bohlin et al. 2020](https://iopscience.iop.org/article/10.3847/1538-3881/ab94b4)). See Section 9.5.2 of the [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb) for more information.
diff --git a/notebooks/WFC3/flux_conversion_tool/flux_conversion_tool.ipynb b/notebooks/WFC3/flux_conversion_tool/flux_conversion_tool.ipynb
new file mode 100644
index 000000000..02db84c58
--- /dev/null
+++ b/notebooks/WFC3/flux_conversion_tool/flux_conversion_tool.ipynb
@@ -0,0 +1,877 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "6077aec5",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Flux Unit Conversions with synphot and stsynphot\n",
+ "***\n",
+ "## Learning Goals\n",
+ "By the end of this tutorial, you will:\n",
+ "\n",
+ "- Perform conversions between various systems of flux and magnitude using the `synphot` and `stsynphot` packages.\n",
+ "- Extrapolate an output flux at a different wavelength than the input flux, by using a spectrum defined using the same packages.\n",
+ "- Provide a framework to adapt a more personalized and streamlined conversion process, if desired.\n",
+ "\n",
+ "## Table of Contents\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#imports)
\n",
+ "[2. Input and output setup](#input)
\n",
+ "- [2.1 Units](#unit)
\n",
+ "- [2.2 Bandpasses](#band)
\n",
+ "- [2.3 Choosing a spectrum](#spec)
\n",
+ "- [2.4 User settings](#user)
\n",
+ "\n",
+ "[3. Set up the conversion](#setting)
\n",
+ "[4. Perform the conversion and create a plot](#perform)
\n",
+ "[5. Examples](#ex)
\n",
+ "- [5.1 Flux in Jy to AB mag with a flat spectrum in $F_\\nu$](#ex1)
\n",
+ "- [5.2 Flux in flam to Flux in flam along a blackbody](#ex2)
\n",
+ "- [5.3 Flux in fnu to flux in photnu, any spectrum (same wavelength)](#ex3)
\n",
+ "- [5.4 mag to mag from an HST bandpass to a Johnson bandpass, flat spectrum in $F_\\lambda$](#ex4)
\n",
+ "\n",
+ "[6. Conclusions](#conclusion)
\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "53a3fa89",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Introduction\n",
+ "This notebook is based on the prior \"HST Photometric Conversion Tool\" that returns unit conversions between various flux units and magnitude systems. It is not intended to replace more detailed functionality such as that provided by the [Exposure Time Calculator](https://etc.stsci.edu/) (ETC). Rather, it is intended to provide a simple, quick result for flux unit conversions.\n",
+ "\n",
+ "`stsynphot` requires access to data distributed by the [Calibration Data Reference System](https://hst-crds.stsci.edu/) (CRDS) in order to operate. Both packages look for an environment variable called `PYSYN_CDBS` to find the directory containing these data.\n",
+ "\n",
+ "Users can obtain these data files from the CDRS. Information on how to obtain the most up-to-date reference files (and what they contain) can be found [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/synphot-throughput-tables). An example of how to download these files using `curl` and set up this environment variable is presented in the imports section below.\n",
+ "\n",
+ "For detailed instructions on how to install and set up these packages, see the [synphot](https://synphot.readthedocs.io/en/latest/#installation-and-setup) and [stsynphot](https://stsynphot.readthedocs.io/en/latest/#installation-and-setup) documentation."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "746e504f",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "- *os* for setting environment variables\n",
+ "\n",
+ "- *numpy* for handling array functions\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "\n",
+ "- *synphot* and *stsynphot* for evaluating synthetic photometry\n",
+ "- *astropy.units* and *synphot.units* for handling units\n",
+ "\n",
+ "Additionally, we will need to set the `PYSYN_CDBS` environment variable *before* importing stsynphot. We will also create a Vega spectrum using synphot's inbuilt `from_vega()` method, as the latter package will supercede this method's functionality and require a downloaded copy of the latest Vega spectrum to be provided."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7f440831",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib notebook\n",
+ "\n",
+ "import os\n",
+ "\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "import synphot as syn\n",
+ "from synphot import SourceSpectrum, Observation\n",
+ "from synphot.models import BlackBody1D, PowerLawFlux1D\n",
+ "from synphot.units import convert_flux\n",
+ "\n",
+ "from astropy import units as u\n",
+ "from synphot import units as su\n",
+ "\n",
+ "vegaspec = SourceSpectrum.from_vega() "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "03e60162",
+ "metadata": {},
+ "source": [
+ "This section obtains the WFC3 throughput component tables for use with `synphot`. If reference files need to be downloaded, please uncomment and execute the code block below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "528e42d3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# cmd_input = 'curl -O https://archive.stsci.edu/hlsps/reference-atlases/hlsp_reference-atlases_hst_multi_everything_multi_v11_sed.tar'\n",
+ "# os.system(cmd_input)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a60c88ec",
+ "metadata": {},
+ "source": [
+ "Once the downloaded is complete, unzip the file and set the environment variable `PYSYN_CDBS` to the path of the reference files. To do so, uncomment and execute the relevant line from the code block below. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f80d0021",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# os.environ['PYSYN_CDBS'] = '/path/to/my/reference/files/'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c4bbc869",
+ "metadata": {},
+ "source": [
+ "Now, after having set up `PYSYN_CDBS`, we import stsynphot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5e4bba39",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import stsynphot as stsyn\n",
+ "from stsynphot import band"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9ddf5c75",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 2. Input and output setup\n",
+ "\n",
+ "\n",
+ "### 2.1 Units\n",
+ "\n",
+ "The conversion framework below will accept any `astropy` or `synphot` unit with dimensions of spectral flux density ($F_\\lambda$ or $F_\\nu$) or photon flux density. Flux units with any of the following dimensions will be supported by the tool:\n",
+ "- [power] [area] [wavelength]$^{-1}$\n",
+ "- [power] [area] [frequency]$^{-1}$\n",
+ "- photons [area] [wavelength]$^{-1}$\n",
+ "- photons [area] [frequency]$^{-1}$\n",
+ "\n",
+ "Alternatively, a magnitude system may be specified as the unit for the input or the output in the same way that a flux density would be. The tables below lists flux units which are defined by name in `astropy` and `synphot`, and the magnitude systems supported by the tool.\n",
+ "\n",
+ "| Unit | Definition | astropy/synphot attribute |\n",
+ "|:---|:---:|:---\n",
+ "| Jansky | $$10^{-26} \\text{ W} \\text{ m}^{-2} \\text{ Hz}^{-1}$$ | `astropy.units.Jy` |\n",
+ "| fnu | $$\\text{erg} \\text{ s}^{-1} \\text{ cm}^{-2} \\text{ Hz}^{-1}$$ | `synphot.units.FNU` |\n",
+ "| flam | $$\\text{erg} \\text{ s}^{-1} \\text{ cm}^{-2} \\text{ Ã…}^{-1}$$ |`synphot.units.FLAM` |\n",
+ "| photnu | $$\\text{photons} \\text{ s}^{-1} \\text{ cm}^{-2} \\text{ Hz}^{-1}$$ | `synphot.units.PHOTNU` |\n",
+ "| photlam | $$\\text{photons} \\text{ s}^{-1} \\text{ cm}^{-2} \\text{ Ã…}^{-1}$$ | `synphot.units.PHOTLAM` |\n",
+ "\n",
+ "| Mag System | astropy/synphot attribute |\n",
+ "|:---|:---|\n",
+ "| ABmag | `astropy.units.ABmag` |\n",
+ "| STmag | `astropy.units.STmag` |\n",
+ "| vegamag | `synphot.units.VEGAMAG` |\n",
+ "\n",
+ "For more information on accepted units in `synphot`, refer to the documentation [here](https://synphot.readthedocs.io/en/latest/synphot/units.html). \n",
+ "\n",
+ "\n",
+ "### 2.2 Bandpasses\n",
+ "\n",
+ "When selecting a magnitude as an input or output, the tool will need a bandpass to be defined, which is done with a string of [observation mode](https://stsynphot.readthedocs.io/en/latest/stsynphot/obsmode.html#), or obsmode, keywords. The pivot wavelength for that bandpass will then serve as the characteristic wavelength to be used for the conversion.\n",
+ "\n",
+ "For HST bandpasses, `stsynphot` accounts for the telescope's optics by combining throughput information along the entire optical path. As an example, `'wfc3, uvis2, f475w, mjd#59367'` tells `stsynphot` to retrieve the latest throughput tables for the UVIS2 detector on WFC3, through the F475W filter for the Modified Julian Date 59367 (June 1, 2021). The option to specify a Julian date is provided for instruments which show changes in sensitivity over time. If no date is specified, `stsynphot` will use the reference epoch for each instrument as default.\n",
+ "\n",
+ "As the required and optional obsmode keywords vary from instrument to instrument, it would be impractical to list the available options here in their entirety. Please refer to the [full list](https://stsynphot.readthedocs.io/en/latest/stsynphot/appendixb.html#stsynphot-appendixb) of available obsmode keywords for details on how to specify HST bandpasses.\n",
+ "\n",
+ "For non-HST filter systems, the only required keywords are the filter system's name and that of the desired filter within that system (e.g. `'johnson, v'`). A list of the non-HST filter systems accepted by `stsynphot` is given here:\n",
+ "\n",
+ "| System | Bands |\n",
+ "|:----------|:--------------------|\n",
+ "| cousins | r, i |\n",
+ "| galex | nuv, fuv |\n",
+ "| johnson | u, b, v, r, i, j, k |\n",
+ "| landolt | u, b, v, r, i |\n",
+ "| sdss | u, g, r, i, z, |\n",
+ "| stromgren | u, v, b, y |\n",
+ "\n",
+ "\n",
+ "### 2.3 Choosing a spectrum\n",
+ "\n",
+ "You'll also need to define a spectrum, which the tool will use to extrapolate your input flux to an output at a different wavelength.\n",
+ "\n",
+ "The embedded code below shows how to generate or load various useful spectra. You can simply copy one of them into the cell below and modify as appropriate, or create your own. For more information, see the [Source Spectrum documentation](https://synphot.readthedocs.io/en/latest/synphot/spectrum.html#).\n",
+ "\n",
+ "Some notes:\n",
+ "- For evaluation and plotting, these models default to outputting flux in photlam, however, the output unit may be specified with the `flux_unit` keyword argument.\n",
+ "\n",
+ "- `synphot.models.BlackBody1D` outputs a function according to Planck's law, which means that the output unit carries an implicit \"per unit solid angle,\" in steradians. For a normalized blackbody, you can use `BlackBodyNorm1D`, whose output is normalized to a 1 solar radius star at a distance of 1 kpc, or multiply your source spectrum by some solid angle of your choosing.\n",
+ "\n",
+ "- `synphot.models.PowerLawFlux1D` uses the definition $f(x) = A (\\frac{x}{x_0})^{-\\alpha}$, where $A$ is input flux (`flux_in`), and $x_0$ is the input wavelength (`wl_in`). Note the negative sign in front of the power law index $\\alpha$. The model can generate curves with $x$ as either frequency or wavelength, but the example here assumes that wavelength will be used. The y-axis unit will be taken from $A$. \n",
+ "\n",
+ "- A wide array of reference spectra are available for download from spectral atlases located [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/astronomical-catalogs).\n",
+ "\n",
+ "\n",
+ "\n",
+ "Example spectrum definitions:\n",
+ "\n",
+ "```python\n",
+ "# Blackbody\n",
+ "bb_temp = 5800 * u.K\n",
+ "\n",
+ "model = BlackBody1D(bb_temp)\n",
+ "spec = SourceSpectrum(model)\n",
+ "\n",
+ "# Power law \n",
+ "pl_index = 0\n",
+ "\n",
+ "model = PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)\n",
+ "spec = SourceSpectrum(model)\n",
+ " \n",
+ "# Load from a FITS table\n",
+ "spec = SourceSpectrum.from_file('/path/to/your/spectrum.fits')\n",
+ "```\n",
+ "\n",
+ "The notebook has been set up to perform an extrapolation from $V = 0.0$ in the Vega system to the R-band in the same system, using the Vega spectrum defined in the imports cell. Further examples of input and output settings are available at the bottom of this notebook.\n",
+ "\n",
+ "\n",
+ "### 2.4 User settings\n",
+ "\n",
+ "First, we define our conversion input settings:\n",
+ "- `val_in`: numerical value of input flux/mag (float)\n",
+ "- `unit_in`: unit or mag system for input value\n",
+ "- `wl_bp_in`: input's wavelength (float) for flux, or bandpass obsmode (string) for magnitudes\n",
+ "- `wl_unit`: wavelength unit (used for plots, so needs to be specified even when using a bandpass)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "de540dfe",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "val_in = 0.0\n",
+ "unit_in = su.VEGAMAG\n",
+ "wl_bp_in = 'johnson, v'\n",
+ "\n",
+ "wl_unit = u.nm "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "42d7a951",
+ "metadata": {},
+ "source": [
+ "Next, we define our conversion output settings:\n",
+ "- `unit_out`: unit or mag system for the output\n",
+ "- `wl_bp_out`: wavelength (float) or bandpass obsmode (string) to find output for; if a wavelength, the unit specified in the cell above by `wl_unit` will be used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3d477832",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "unit_out = su.VEGAMAG\n",
+ "wl_bp_out = 'cousins, r'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ee4dd82c",
+ "metadata": {},
+ "source": [
+ "Finally, we define our spectrum to use (copy/paste from above, or define your own)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b542e3c2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "spec = vegaspec"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d8d4e50f",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. Set up the conversion\n",
+ "\n",
+ "Now, we need to run a few cells that will set up the conversion. First, we check whether the input and output are a flux or a magnitude, and set some variables appropriately. Then, we scale the chosen spectrum such that it passes through the defined input so the extrapolation to the output wavelength will give an accurate result.\n",
+ "\n",
+ "Note that the default plotting unit is set to the input unit for conversions made from flux units, and photlam for conversions from magnitudes. This may be altered, if desired, by changing the `plot_unit` variable definitions in the cell below."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0a54da3b",
+ "metadata": {},
+ "source": [
+ "**Note: No inputs required for the cells below. All the inputs were assigned in [Section 2.4](#user).**\n",
+ "\n",
+ "First, let's combine input value and unit as a quantity, then list the systems that will work for the tool."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1caf81ab",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "quant_in = val_in * unit_in\n",
+ "\n",
+ "mag_systems = [u.STmag, u.ABmag, su.VEGAMAG]\n",
+ "flux_systems = ['spectral flux density', 'spectral flux density wav', \n",
+ " 'photon flux density', 'photon flux density wav']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bfe5d48f",
+ "metadata": {},
+ "source": [
+ "Next, let's get inputs set up for following steps. Here are the three possible outcomes:\n",
+ "- **If the input is a magnitude,**\n",
+ " - define bandpass with input obsmode string\n",
+ " - pivot wavelength of input bandpass\n",
+ " - set `flux_in` to equivalent flux in photlam at pivot wavelength (Vega spectrum needed if using VEGAMAG)\n",
+ " - set plotting unit and flux for later\n",
+ " \n",
+ " \n",
+ "- **If the input is a flux,**\n",
+ " - combine wavelength for flux and unit as the input wavelength\n",
+ " - set plotting unit and flux for later\n",
+ "\n",
+ "\n",
+ "- **If anything else, print**\n",
+ " - `unit_in not a flux density unit or magnitude system`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5338d317",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if unit_in in mag_systems:\n",
+ " \n",
+ " mag_in = quant_in\n",
+ " \n",
+ " band_in = band(wl_bp_in)\n",
+ " wl_in = band_in.pivot().to(wl_unit)\n",
+ " \n",
+ " flux_in = convert_flux(wl_in, quant_in, su.PHOTLAM,\n",
+ " vegaspec=vegaspec)\n",
+ " \n",
+ " plot_unit = su.PHOTLAM\n",
+ " \n",
+ " plot_flux_in = convert_flux(wl_in, flux_in, plot_unit)\n",
+ " \n",
+ "elif unit_in.physical_type in flux_systems:\n",
+ " \n",
+ " flux_in = quant_in\n",
+ " wl_in = wl_bp_in * wl_unit \n",
+ " \n",
+ " plot_unit = unit_in\n",
+ " plot_flux_in = convert_flux(wl_in, flux_in, plot_unit)\n",
+ "\n",
+ "else:\n",
+ " print('unit_in not a flux density unit or magnitude system')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9f3b3f26",
+ "metadata": {},
+ "source": [
+ "We perform a similar setup for outputs:\n",
+ "- **If the output is a magnitude,**\n",
+ " - use output wavelength to calculate output bandpass\n",
+ " - output bandpass's pivot wavelength\n",
+ " \n",
+ " \n",
+ "- **If the output is a flux,**\n",
+ " - combine wavelength for flux and unit as output wavelength\n",
+ " \n",
+ "\n",
+ "- **If anything else, print**\n",
+ " - `unit_out not a flux density unit or magnitude system`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5928f11f",
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "if unit_out in mag_systems:\n",
+ " \n",
+ " band_out = band(wl_bp_out)\n",
+ " wl_out = band_out.pivot().to(wl_unit)\n",
+ "\n",
+ "elif unit_out.physical_type in flux_systems:\n",
+ " \n",
+ " wl_out = wl_bp_out * wl_unit\n",
+ "\n",
+ "else:\n",
+ " print('unit_out not a flux density unit or magnitude system') "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "339e2f19",
+ "metadata": {},
+ "source": [
+ "Finally, we convert the flux, scale, and multiply by our spectrum. The default evaluation unit is set to photlam."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c747a9e6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "scale = convert_flux(wl_in, flux_in, su.PHOTLAM) / spec(wl_in)\n",
+ "\n",
+ "scale_spec = spec * scale"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e54c6137",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. Perform the conversion and create a plot\n",
+ "\n",
+ "We can now find our output by using the `convert_flux` function from `synphot`. We will first scale the spectrum defined above such that its value at the input wavelength is that of the input flux. Then, we convert the scaled spectrum's value at the *output* wavelength to the selected output units, as well as the unit that will be used for plotting. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "317c99b2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if unit_out in mag_systems:\n",
+ " \n",
+ " flux_out = convert_flux(wl_out, scale_spec(wl_out), unit_out,\n",
+ " vegaspec=vegaspec)\n",
+ " \n",
+ " plot_flux_out = convert_flux(wl_out, scale_spec(wl_out), plot_unit)\n",
+ " \n",
+ "else:\n",
+ " flux_out = convert_flux(wl_out, scale_spec(wl_out), unit_out)\n",
+ " \n",
+ " plot_flux_out = convert_flux(wl_out, scale_spec(wl_out), plot_unit)\n",
+ " \n",
+ "val_out = flux_out.value"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a086b2d",
+ "metadata": {},
+ "source": [
+ "Print the input and output values."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "82c08695",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print('Input: {:.4} {} at {:.1f} {}\\n'.format(float(val_in), str(unit_in), wl_in.value, str(wl_in.unit)))\n",
+ "print('Output: {:.4} {} at {:.1f} {}'.format(float(val_out), str(unit_out), wl_out.value, str(wl_out.unit)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "de0ffd76",
+ "metadata": {},
+ "source": [
+ "While not strictly necessary for performing the conversion, plotting the selected spectrum with the input and output points can be a useful check to see if the spectrum looks like what you're expecting.\n",
+ "\n",
+ "Let's define a set of wavelengths and minimum/maximum bounds for the plot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0b5f1e79",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "wl_settings = [wl.value for wl in [wl_in, wl_out]]\n",
+ "\n",
+ "short = min(wl_settings)\n",
+ "long = max(wl_settings)\n",
+ "\n",
+ "if short == long: # In case wl_in == wl_out\n",
+ " diff = 10.\n",
+ " \n",
+ "else:\n",
+ " diff = long - short\n",
+ "\n",
+ "right = long + diff\n",
+ "\n",
+ "left = max([short - diff, 0.1])\n",
+ "\n",
+ "waves = np.linspace(left, right, 10000) * wl_unit"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7805b257",
+ "metadata": {},
+ "source": [
+ "We will also set the colors for the in/out markers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "358172e8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if wl_in.value > wl_out.value:\n",
+ " \n",
+ " c_in = 'r'\n",
+ " c_out = 'b'\n",
+ " \n",
+ "else: \n",
+ " c_in = 'b'\n",
+ " c_out = 'r'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8495e6ac",
+ "metadata": {},
+ "source": [
+ "Plot the spectrum, input, and output. If the input was a magnitude, then `plot_unit` ([see Section 3](#setting)) will be used. In addition, if the input and output wavelength are the same, then print the input and output."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8bea8f73",
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "plt.figure()\n",
+ "\n",
+ "# Plot spectrum\n",
+ "\n",
+ "plt.plot(waves, scale_spec(waves, flux_unit=plot_unit), c='k')\n",
+ "\n",
+ "# Plot input\n",
+ "\n",
+ "plt.plot(wl_in.value, plot_flux_in.value,\n",
+ " marker='o', color=c_in, ls='none', \n",
+ " label='Input: {:.4} {} at {:.1f} {}'.format(\n",
+ " float(val_in), str(unit_in), wl_in.value, str(wl_in.unit)))\n",
+ "\n",
+ "# Plot output\n",
+ "\n",
+ "plt.plot(wl_out.value, plot_flux_out.value,\n",
+ " marker='s', color=c_out, ls='none', \n",
+ " label='Output: {:.4} {} at {:.1f} {}'.format(\n",
+ " float(val_out), str(unit_out), wl_out.value, str(wl_out.unit)))\n",
+ "\n",
+ "# Set heights for dotted lines to markers as % of plot range\n",
+ "\n",
+ "bottom, top = plt.ylim()\n",
+ "yrange = top - bottom\n",
+ "inheight = (plot_flux_in.value - bottom) / yrange\n",
+ "outheight = (plot_flux_out.value - bottom) / yrange\n",
+ "\n",
+ "# Plot dotted lines to markers\n",
+ "\n",
+ "plt.axvline(wl_in.to(wl_unit).value, ymax=inheight, ls=':', c=c_in)\n",
+ "plt.axvline(wl_out.to(wl_unit).value, ymax=outheight, ls=':', c=c_out)\n",
+ "\n",
+ "# Miscellaneous\n",
+ "\n",
+ "plt.ylabel('Flux ({})'.format(str(plot_unit)))\n",
+ "plt.xlabel('Wavelength ({})'.format(str(wl_unit)))\n",
+ "plt.legend(fontsize='small') \n",
+ "plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c818eec6",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 5. Examples\n",
+ "\n",
+ "Here, we provide some examples to illustrate a few of the many conversions which are possible. If desired, you may run an example cell to set the inputs for the tool, then run through the notebook (without running the cells in [Section 2.4](#user)) to see the results. Each cell will define an input, output, and spectrum.\n",
+ "\n",
+ "\n",
+ "### 5.1. Flux in Jy to AB mag with a flat spectrum in $F_\\nu$\n",
+ "Run cell then go to [Section 3](#setting) to convert flux and plot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fd8fe178",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Input: 3631 Jy at 550. nm\n",
+ "\n",
+ "val_in = 3631. \n",
+ "unit_in = u.Jy\n",
+ "wl_bp_in = 550.\n",
+ "\n",
+ "wl_unit = u.nm\n",
+ "\n",
+ "# Output: Johnson V mag (AB)\n",
+ "\n",
+ "unit_out = u.ABmag\n",
+ "wl_bp_out = 'Johnson, V'\n",
+ " \n",
+ "# Spectrum: Flat power law in F_nu\n",
+ "\n",
+ "pl_index = 0\n",
+ "model = PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)\n",
+ "spec = SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0964f2f4",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 5.2. Flux in flam to Flux in flam along a blackbody\n",
+ "Run cell then go to [Section 3](#setting) to convert flux and plot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "714bbeb1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Input: 1.234e-8 flam at 500. nm\n",
+ "\n",
+ "val_in = 1.234e-8 \n",
+ "unit_in = su.FLAM\n",
+ "wl_bp_in = 500.\n",
+ "\n",
+ "wl_unit = u.nm\n",
+ "\n",
+ "# Output: flam at 800. nm\n",
+ "\n",
+ "unit_out = su.FLAM\n",
+ "wl_bp_out = 800.\n",
+ " \n",
+ "# Spectrum: 5800 K blackbody\n",
+ "\n",
+ "bb_temp = 5800 * u.K\n",
+ "model = BlackBody1D(bb_temp)\n",
+ "spec = SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2735fc75",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 5.3. Flux in fnu to flux in photnu, any spectrum (same wavelength)\n",
+ "Run cell then go to [Section 3](#setting) to convert flux and plot. Note the spectrum is irrelevant since conversion is at the same wavelength."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "771c6282",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Input: 1.234e-21 fnu at 686. nm\n",
+ "\n",
+ "val_in = 1.234e-21 \n",
+ "unit_in = su.FNU\n",
+ "wl_bp_in = 686.\n",
+ "\n",
+ "wl_unit = u.nm\n",
+ "\n",
+ "# Output: photnu at 686. nm\n",
+ "\n",
+ "unit_out = su.PHOTNU\n",
+ "wl_bp_out = 686.\n",
+ " \n",
+ "# Spectrum: 5800 K blackbody\n",
+ "bb_temp = 5800 * u.K\n",
+ "model = BlackBody1D(bb_temp)\n",
+ "spec = SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "94e3245b",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 5.4. mag to mag from an HST bandpass to a Johnson bandpass, flat spectrum in $F_\\lambda$\n",
+ "Run cell then go to [Section 3](#setting) to convert flux and plot. Note we run `convert_flux` for the power law amplitude to ensure the spectrum is flat in $F_\\lambda$ rather than in photlam."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7da9e44e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Input: STmag = 12.240, F606W filter on WFC3 UVIS 2\n",
+ "\n",
+ "val_in = 12.240 \n",
+ "unit_in = u.STmag\n",
+ "wl_bp_in = 'wfc3, uvis2, f606w, mjd#59367'\n",
+ "\n",
+ "wl_unit = u.nm\n",
+ "\n",
+ "# Output: Johnson V mag (AB)\n",
+ "\n",
+ "unit_out = u.STmag\n",
+ "wl_bp_out = 'Johnson, V'\n",
+ " \n",
+ "# Spectrum: Flat power law in F_lambda\n",
+ "\n",
+ "pl_index = 0\n",
+ "\n",
+ "model = PowerLawFlux1D(amplitude=convert_flux(606 * u.nm, 1., su.FLAM), x_0=606 * u.nm, alpha=pl_index)\n",
+ "spec = SourceSpectrum(model)\n",
+ "model = PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4a38c7a9",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 6. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. Now using WFC3 data, you should be more familiar with:\n",
+ "\n",
+ "- Performing conversions between various systems of flux and magnitude using the `synphot` and `stsynphot` packages.\n",
+ "- Extrapolating an output flux at a different wavelength than the input flux.\n",
+ "- Adapting a more personalized and streamlined conversion process.\n",
+ "\n",
+ "#### Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aad2523c",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ " - see sections 9.5.2 for reference to this notebook\n",
+ " \n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Authors:** Aidan Pidgeon, Joel Green; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** 2021-09-13\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `astropy`, `synphot`, or `stsynphot` for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `synphot`](https://synphot.readthedocs.io/en/latest/)\n",
+ "* [Citing `stsynphot`](https://stsynphot.readthedocs.io/en/latest/index.html)\n",
+ "\n",
+ "***\n",
+ "[Top of Page](#title)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f708c513",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/WFC3/flux_conversion_tool/requirements.txt b/notebooks/WFC3/flux_conversion_tool/requirements.txt
new file mode 100644
index 000000000..2a8a2f707
--- /dev/null
+++ b/notebooks/WFC3/flux_conversion_tool/requirements.txt
@@ -0,0 +1,5 @@
+astropy==5.2.1
+matplotlib==3.7.0
+numpy==1.23.4
+stsynphot==1.2.0
+synphot==1.1.1
diff --git a/notebooks/WFC3/image_displayer_analyzer/README.md b/notebooks/WFC3/image_displayer_analyzer/README.md
new file mode 100755
index 000000000..4525ced2c
--- /dev/null
+++ b/notebooks/WFC3/image_displayer_analyzer/README.md
@@ -0,0 +1,21 @@
+In this tutorial, we present `display_image`, a tool for displaying full images with metadata, individual WFC3/UVIS chip images, a section of an image with various colormaps/scaling, and individual WFC3/IR `ima` reads. In addition, we present `row_column_stats`, a tool for computing row and column statistics for the types of WFC3 images previously mentioned.
+
+This directory, once unzipped, should contain this `README.md`,
+the image displayer tool `display_image.py`, the row and column statistic
+tool `row_column_stats.py`, and the Jupyter Notebook tutorial
+`wfc3_imageanalysis.ipynb`. Both of these tools are meant to be used inside of
+a Jupyter Notebook.
+
+In order to run the Jupyter Notebook you must create the virtual
+environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library)
+installation instructions. No additional packages are required to run this
+Jupyter Notebook.
+
+These tools (specifically `display_image`) look much better in Jupyter Lab
+rather than the classic Jupyter Notebook. If your environment has Jupyter Lab
+installed it's recommended you use that to run the `.ipynb` file. If you're
+interested in adding Jupyter Lab to your environment see the install
+instructions on the [Jupyter website](https://jupyter.org/install).
+
+Questions or concerns should be sent to the [HST Help Desk](https://stsci.service-now.com/hst).
+---------------------------------------------------------------------
diff --git a/notebooks/WFC3/image_displayer_analyzer/display_image.py b/notebooks/WFC3/image_displayer_analyzer/display_image.py
new file mode 100755
index 000000000..922479239
--- /dev/null
+++ b/notebooks/WFC3/image_displayer_analyzer/display_image.py
@@ -0,0 +1,606 @@
+#! /usr/bin/env python
+
+import numpy as np
+import sys
+
+from astropy.io import fits
+from ginga.util import zscale
+import matplotlib.pyplot as plt
+
+def display_image(filename,
+ colormaps=['Greys_r','Greys_r','inferno_r'],
+ scaling=[(None,None),(None,None),(None,None)],
+ printmeta=False,
+ ima_multiread=False,
+ figsize=(18,18),
+ dpi=200):
+
+ """ A function to display the 'SCI', 'ERR/WHT', and 'DQ/CTX' arrays
+ of any WFC3 fits image. This function returns nothing, but will display
+ the requested image on the screen when called.
+
+ Authors
+ -------
+ Benjamin Kuhn, Oct 2021
+
+ Parameters
+ ----------
+ filename: String
+ Input image name with optional image section specification. If no image
+ section is entered, the entire image is used. If full path is not given,
+ file must exsist in current working directory. This can be an IR or UVIS:
+ raw, rac, ima, blv, blc, crj, crc, flt, flc, drz, drc fits file.
+ Image section must be entered as:
+
+ file.fits[x1:x2,y1:y2] where
+
+ x1 = x-axis pixel number start
+ x2 = x-axis pixel number end
+ y1 = y-axis pixel number start
+ y2 = y-axis pixel number end
+
+ colormaps: List
+ List of colormaps strings for the SCI, ERR, and DQ arrays. The first
+ element in the list is for the SCI array the second is for the ERR array
+ and the third element in the list is for the DQ extension. If no
+ colormaps are given the default maps will be 'Greys_r','Greys_r', and
+ 'inferno_r'. All three colormaps must be provided even if only
+ changing 1-2 maps.
+
+ scaling: List
+ List of real numbers to act as scalings for the SCI, ERR, and DQ arrays.
+ The first element in the list is for the SCI array the second is for the
+ ERR array and the third element in the list is for the DQ extension. If
+ no scalings are given the default scaling will use
+ ginga.util.zscale.zscale(). All three scalings must be provided even if
+ only changing 1-2 scalings. E.g. to change SCI array scaling:
+ scaling = [(5E4,8E4),(None,None),(None,None)]
+
+ printmeta: Bool
+ A boolean switch to turn on or off the printing of file infomation.
+ If printmeta is True various header keywords are printed to the screen
+ such as the filter, target name, date observed, brightness units and more.
+
+ ima_multiread: Bool
+ If ima_multiread is set to True each indiviual read of the ima will be
+ plotted. If ima_multiread is set to False only the final read of the ima
+ (ext 1) will be plotted.
+
+ figsize: (float,float)
+ The width, height of the figure. Default is (18,18)
+
+ dpi: float
+ The resolution of the figure in dots-per-inch. Default is 200
+
+ Returns
+ -------
+ N/A
+
+ """
+
+ section_start = filename.find("[")
+ all_pixels = False
+ if (section_start < 0):
+ all_pixels = True # just give the data to np
+ imagename = filename
+ elif (section_start > 0):
+ imagename = filename[:section_start]
+ if (filename[section_start+1].isalpha()):
+ print(filename[section_start+1])
+ print("Please only specify a pixel range, not an extension \
+ in the filename")
+ return 0, 0
+
+ with fits.open(imagename) as hdu:
+ h = hdu[0].header
+ h1 = hdu[1].header
+ h2 = hdu[2].header
+ h3 = hdu[3].header
+
+ if not all_pixels:
+ # pull the section off
+ section = filename[section_start+1:-1]
+ comma = section.find(",")
+ xsec = section[:comma]
+ ysec = section[comma+1:]
+ xs = xsec.find(":")
+ if xs < 0:
+ print("Invalid image section specified")
+ return 0, 0
+ try:
+ xstart = int(xsec[: xs])
+ except ValueError:
+ print("Problem getting xstart")
+ return
+ try:
+ xend = int(xsec[xs+1:])
+ except ValueError:
+ print("Problem getting xend")
+ return
+ ys = ysec.find(":")
+ if (ys < 0):
+ print("Invalid image section specified")
+ return 0, 0
+ try:
+ ystart = int(ysec[:ys])
+ except ValueError:
+ print("Problems getting ystart")
+ return
+ try:
+ yend = int(ysec[ys+1:])
+ except ValueError:
+ print("Problem getting yend")
+ return
+
+ bunit = get_bunit(h1)
+ detector = h['detector']
+ issubarray = h['subarray']
+ si = h['primesi']
+ fname = h['filename']
+ naxis1 = h1["NAXIS1"]
+ naxis2 = h1["NAXIS2"]
+
+ if len(colormaps) < 3 or len(colormaps) > 3:
+ sys.exit(f"{len(colormaps)} colormaps proived. Must input all three")
+
+ if len(scaling) < 3 or len(scaling) > 3:
+ sys.exit(f"{len(scaling)} scalings provided. Must input all three")
+
+ if printmeta:
+ print(f"\t{si}/{detector} {fname} ")
+ print('-'*44)
+ print(f"Filter = {h['filter']}, Date-Obs = {h['date-obs']} T{h['time-obs']},\nTarget = {h['targname']}, Exptime = {h['exptime']}, Subarray = {issubarray}, Units = {h1['bunit']}\n")
+
+
+ if detector == 'UVIS':
+ if ima_multiread == True:
+ sys.exit("keyword argument 'ima_multiread' can only be set to True for 'ima.fits' files")
+ try:
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2*2 # full y size
+
+ with fits.open(imagename) as hdu:
+ uvis2_sci = hdu["SCI",1].data
+ uvis2_err = hdu[2].data
+ uvis2_dq = hdu[3].data
+ uvis1_sci = hdu["SCI",2].data
+ uvis1_err = hdu[5].data
+ uvis1_dq = hdu[6].data
+
+ try:
+ fullsci = np.concatenate([uvis2_sci,uvis1_sci])
+ fulldq = np.concatenate([uvis2_dq,uvis1_dq])
+ fullerr = np.concatenate([uvis2_err,uvis1_err])
+
+ fullsci = fullsci[ystart:yend,xstart:xend]
+ fulldq = fulldq[ystart:yend,xstart:xend]
+ fullerr = fullerr[ystart:yend,xstart:xend]
+
+ make1x3plot(scaling, colormaps, fullsci, fullerr, fulldq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi)
+
+ except ValueError:
+ fullsci = np.concatenate([uvis2_sci,uvis1_sci])
+ fullsci = fullsci[ystart:yend,xstart:xend]
+
+ z1_sci, z2_sci = get_scale_limits(scaling[0],fullsci,'SCI')
+
+ fig, ax1 = plt.subplots(1,1,figsize=figsize,dpi=dpi)
+ im1 = ax1.imshow(fullsci,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n{h1['extname']} ext")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext")
+ fig.colorbar(im1, ax=ax1,shrink=.75,pad=.03)
+
+ except (IndexError,KeyError):
+
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2 # full y size
+
+ with fits.open(imagename) as hdu:
+ uvis_ext1 = hdu[1].data
+ uvis_ext2 = hdu[2].data
+ uvis_ext3 = hdu[3].data
+
+ try:
+ uvis_ext1 = uvis_ext1[ystart:yend,xstart:xend]
+ uvis_ext2 = uvis_ext2[ystart:yend,xstart:xend]
+ uvis_ext3 = uvis_ext3[ystart:yend,xstart:xend]
+
+ make1x3plot(scaling, colormaps, uvis_ext1, uvis_ext2, uvis_ext3,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi)
+
+ except (TypeError,IndexError,AttributeError):
+
+ z1_sci, z2_sci = get_scale_limits(scaling[0],uvis_ext1,'SCI')
+ fig, ax1 = plt.subplots(1,1,figsize=figsize,dpi=dpi)
+ im1 = ax1.imshow(uvis_ext1,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n{h1['extname']} ext")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext")
+ fig.colorbar(im1, ax=ax1,shrink=.75,pad=.03)
+
+
+ if detector == 'IR' and '_ima.fits' not in fname:
+ if ima_multiread == True:
+ sys.exit("keyword argument 'ima_multiread' can only be set to True for 'ima.fits' files")
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2 # full y size
+
+ try:
+ with fits.open(imagename) as hdu:
+ data_sci = hdu[1].data
+ data_err = hdu[2].data
+ data_dq = hdu[3].data
+
+ data_sci = data_sci[ystart:yend,xstart:xend]
+ data_err = data_err[ystart:yend,xstart:xend]
+ data_dq = data_dq[ystart:yend,xstart:xend]
+
+ make1x3plot(scaling, colormaps, data_sci, data_err, data_dq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi)
+
+ except (AttributeError, TypeError, ValueError):
+ z1_sci, z2_sci = get_scale_limits(scaling[0],data_sci,'SCI')
+ fig, ax1 = plt.subplots(1,1,figsize=figsize,dpi=dpi)
+ im1 = ax1.imshow(data_sci,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n{h1['extname']} ext")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext")
+ fig.colorbar(im1, ax=ax1,shrink=.75,pad=.03)
+
+
+ if '_ima.fits' in fname:
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2 # full y size
+
+ if ima_multiread == True:
+ nsamps = h['NSAMP']
+ for ext in reversed(range(1,nsamps+1)):
+ with fits.open(imagename) as hdu:
+ data_sci = hdu['SCI',ext].data
+ data_err = hdu['ERR',ext].data
+ data_dq = hdu['DQ',ext].data
+
+ data_sci = data_sci[ystart:yend,xstart:xend]
+ data_err = data_err[ystart:yend,xstart:xend]
+ data_dq = data_dq[ystart:yend,xstart:xend]
+
+ makeIR1x3plot(scaling, colormaps, data_sci, data_err, data_dq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3, nsamps, ext,
+ figsize, dpi)
+
+ if ima_multiread == False:
+ with fits.open(imagename) as hdu:
+ data_sci = hdu['SCI',1].data
+ data_err = hdu['ERR',1].data
+ data_dq = hdu['DQ',1].data
+
+ data_sci = data_sci[ystart:yend,xstart:xend]
+ data_err = data_err[ystart:yend,xstart:xend]
+ data_dq = data_dq[ystart:yend,xstart:xend]
+
+ make1x3plot(scaling, colormaps, data_sci, data_err, data_dq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi)
+
+
+def get_bunit(ext1header):
+ """ Get the brightness unit for the plot axis label
+
+ Parameters
+ ----------
+ ext1header: Header
+ The extension 1 header of the fits file being displayed. This is the
+ extension that contains the brightness unit keyword
+
+ Returns
+ -------
+ The string of the brightness unit for the axis label
+ {'counts', 'counts/s','e$^-$', 'e$^-$/s'}
+
+ """
+ units = ext1header['bunit']
+
+ if units == 'COUNTS':
+ return 'counts'
+ elif units == 'COUNTS/S':
+ return 'counts/s'
+ elif units == 'ELECTRONS':
+ return 'e$^-$'
+ elif units == 'ELECTRONS/S':
+ return 'e$^-$/s'
+ else:
+ return units
+
+
+def get_scale_limits(scaling, array, extname):
+ """ Get the scale limits to use for the image extension being displayed
+
+ Parameters
+ ----------
+ scaling: List
+ List of real numbers to act as scalings for the SCI, ERR, and DQ arrays.
+ The first element in the list is for the SCI array the second is for the
+ ERR array and the third element in the list is for the DQ extension. If
+ no scalings are given the default scaling will use
+ ginga.util.zscale.zscale(). All three scalings must be provided even if
+ only changing 1-2 scalings. E.g. to change SCI array scaling:
+ scaling = [(5E4,8E4),(None,None),(None,None)]
+
+ array : Array
+ The ImageHDU array that is being displayed.
+
+ extname: String {"SCI", "ERR", "DQ"}
+ The name of the extension of which the scale is being determined
+
+ Returns
+ -------
+ z1: Float
+ The minimum value for the image scale
+
+ z2: Float
+ The maximum value for the image scale
+
+ """
+ if extname == 'DQ':
+ if scaling[0] == None and scaling[1] == None:
+ z1, z2 = array.min(), array.max()
+ elif scaling[0] == None and scaling[1] != None:
+ z1 = array.min()
+ z2 = scaling[1]
+ elif scaling[0] != None and scaling[1] == None:
+ z1 = scaling[0]
+ z2 = array.max()
+ elif scaling[0] != None and scaling[1] != None:
+ z1 = scaling[0]
+ z2 = scaling[1]
+
+ elif extname == 'SCI' or extname == 'ERR':
+ if scaling[0] == None and scaling[1] == None:
+ z1, z2 = zscale.zscale(array)
+ elif scaling[0] == None and scaling[1] != None:
+ z1 = zscale.zscale(array)[0]
+ z2 = scaling[1]
+ elif scaling[0] != None and scaling[1] == None:
+ z1 = scaling[0]
+ z2 = zscale.zscale(array)[1]
+ elif scaling[0] != None and scaling[1] != None:
+ z1 = scaling[0]
+ z2 = scaling[1]
+ else:
+ print("`extname` must be set to either `SCI`, `ERR`, or `DQ`")
+ return
+
+ return z1, z2
+
+
+def make1x3plot(scaling, colormaps, fullsci, fullerr, fulldq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3,
+ figsize, dpi):
+ """ Make a 3 column figure to display any WFC3 image or image section
+
+ Parameters
+ ----------
+ scaling: List
+ List of real numbers to act as scalings for the SCI, ERR, and DQ arrays.
+ The first element in the list is for the SCI array the second is for the
+ ERR array and the third element in the list is for the DQ extension. If
+ no scalings are given the default scaling will use
+ ginga.util.zscale.zscale(). All three scalings must be provided even if
+ only changing 1-2 scalings. E.g. to change SCI array scaling:
+ scaling = [(5E4,8E4),(None,None),(None,None)]
+
+ colormaps: List
+ List of colormaps strings for the SCI, ERR, and DQ arrays. The first
+ element in the list is for the SCI array the second is for the ERR array
+ and the third element in the list is for the DQ extension. If no
+ colormaps are given the default maps will be 'Greys_r','Greys_r', and
+ 'inferno_r'. All three colormaps must be provided even if only
+ changing 1-2 maps.
+
+ fullsci: Array
+ The 2d array of science pixels ('SCI' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ fullerr: Array
+ The 2d array of error pixels ('ERR' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ fulldq: Array
+ The 2d array of data quality pixels ('DQ' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ xstart: Integer
+ The starting index value for the x-axis of the image.
+
+ xend: Integer
+ The ending index value for the x-axis of the image.
+
+ ystart: Integer
+ The starting index value for the y-axis of the image.
+
+ yend: Integer
+ The ending index value for the y-axis of the image.
+
+ detector: String {"UVIS", "IR"}
+ The detector used for the image
+
+ fname: String
+ The name of the file being plotted
+
+ h1: Header
+ The extension 1 header of the fits file being displayed.
+
+ h2: Header
+ The extension 2 header of the fits file being displayed.
+
+ h3: Header
+ The extension 3 header of the fits file being displayed.
+
+ figsize: (float,float)
+ The width, height of the figure. Default is (9,6)
+
+ dpi: float
+ The resolution of the figure in dots-per-inch. Default is 100
+
+ Returns
+ -------
+ N/A
+
+ """
+
+ z1_sci, z2_sci = get_scale_limits(scaling[0],fullsci,'SCI')
+ z1_err, z2_err = get_scale_limits(scaling[1],fullerr,'ERR')
+ z1_dq, z2_dq = get_scale_limits(scaling[2],fulldq,'DQ')
+
+ fig, [ax1,ax2,ax3] = plt.subplots(1,3,figsize=figsize,dpi=dpi)
+
+ im1 = ax1.imshow(fullsci,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ im2 = ax2.imshow(fullerr,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[1],vmin=z1_err, vmax=z2_err)
+ im3 = ax3.imshow(fulldq, origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[2],vmin=z1_dq, vmax=z2_dq)
+
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n{h1['extname']} ext")
+ ax2.set_title(f"WFC3/{detector} {fname}\n{h2['extname']} ext")
+ ax3.set_title(f"WFC3/{detector} {fname}\n{h3['extname']} ext")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext")
+ ax2.set_title(f"WFC3/{detector} {fname} {h2['extname']} ext")
+ ax3.set_title(f"WFC3/{detector} {fname} {h3['extname']} ext")
+ fig.colorbar(im1, ax=ax1,shrink=.25,pad=.03)
+ fig.colorbar(im2, ax=ax2,shrink=.25,pad=.03)
+ fig.colorbar(im3, ax=ax3,shrink=.25,pad=.03)
+
+def makeIR1x3plot(scaling, colormaps, data_sci, data_err, data_dq,
+ xstart, xend, ystart, yend,
+ detector, fname, h1, h2, h3, nsamps, ext,
+ figsize, dpi):
+ """ Make a 3 column figure to display any WFC3 IMA image or image section
+
+ Parameters
+ ----------
+ scaling: List
+ List of real numbers to act as scalings for the SCI, ERR, and DQ arrays.
+ The first element in the list is for the SCI array the second is for the
+ ERR array and the third element in the list is for the DQ extension. If
+ no scalings are given the default scaling will use
+ ginga.util.zscale.zscale(). All three scalings must be provided even if
+ only changing 1-2 scalings. E.g. to change SCI array scaling:
+ scaling = [(5E4,8E4),(None,None),(None,None)]
+
+ colormaps: List
+ List of colormaps strings for the SCI, ERR, and DQ arrays. The first
+ element in the list is for the SCI array the second is for the ERR array
+ and the third element in the list is for the DQ extension. If no
+ colormaps are given the default maps will be 'Greys_r','Greys_r', and
+ 'inferno_r'. All three colormaps must be provided even if only
+ changing 1-2 maps.
+
+ data_sci: Array
+ The 2d array of science pixels ('SCI' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ data_err: Array
+ The 2d array of error pixels ('ERR' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ data_dq: Array
+ The 2d array of data quality pixels ('DQ' array). If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ xstart: Integer
+ The starting index value for the x-axis of the image.
+
+ xend: Integer
+ The ending index value for the x-axis of the image.
+
+ ystart: Integer
+ The starting index value for the y-axis of the image.
+
+ yend: Integer
+ The ending index value for the y-axis of the image.
+
+ detector: String {"UVIS", "IR"}
+ The detector used for the image
+
+ fname: String
+ The name of the file being plotted
+
+ h1: Header
+ The extension 1 header of the fits file being displayed.
+
+ h2: Header
+ The extension 2 header of the fits file being displayed.
+
+ h3: Header
+ The extension 3 header of the fits file being displayed.
+
+ nsamps: Integer
+ The number of samples (readouts) contained in the file
+
+ ext: Integer
+ The extension to be displayed. Ranges from 1 to nsamp
+
+ figsize: (float,float)
+ The width, height of the figure. Default is (9,6)
+
+ dpi: float
+ The resolution of the figure in dots-per-inch. Default is 100
+
+ Returns
+ -------
+ N/A
+
+ """
+
+ z1_sci, z2_sci = get_scale_limits(scaling[0],data_sci,'SCI')
+ z1_err, z2_err = get_scale_limits(scaling[1],data_err,'ERR')
+ z1_dq, z2_dq = get_scale_limits(scaling[2],data_dq,'DQ')
+
+ fig, [ax1,ax2,ax3] = plt.subplots(1,3,figsize = figsize,dpi=dpi)
+ im1 = ax1.imshow(data_sci,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[0],vmin=z1_sci, vmax=z2_sci)
+ im2 = ax2.imshow(data_err,origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[1],vmin=z1_err, vmax=z2_err)
+ im3 = ax3.imshow(data_dq, origin='lower',extent=(xstart,xend,ystart,yend),cmap=colormaps[2],vmin=z1_dq, vmax=z2_dq)
+ fig.colorbar(im1, ax=ax1,shrink=.25,pad=.03)
+ fig.colorbar(im2, ax=ax2,shrink=.25,pad=.03)
+ fig.colorbar(im3, ax=ax3,shrink=.25,pad=.03)
+
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n {h1['extname']} read {(nsamps+1)-ext}")
+ ax2.set_title(f"WFC3/{detector} {fname}\n {h2['extname']} read {(nsamps+1)-ext}")
+ ax3.set_title(f"WFC3/{detector} {fname}\n {h3['extname']} read {(nsamps+1)-ext}")
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} read {(nsamps+1)-ext}")
+ ax2.set_title(f"WFC3/{detector} {fname} {h2['extname']} read {(nsamps+1)-ext}")
+ ax3.set_title(f"WFC3/{detector} {fname} {h3['extname']} read {(nsamps+1)-ext}")
diff --git a/notebooks/WFC3/image_displayer_analyzer/requirements.txt b/notebooks/WFC3/image_displayer_analyzer/requirements.txt
new file mode 100644
index 000000000..a624b7053
--- /dev/null
+++ b/notebooks/WFC3/image_displayer_analyzer/requirements.txt
@@ -0,0 +1,2 @@
+astroquery==0.4.6
+matplotlib==3.7.0
diff --git a/notebooks/WFC3/image_displayer_analyzer/row_column_stats.py b/notebooks/WFC3/image_displayer_analyzer/row_column_stats.py
new file mode 100755
index 000000000..da71d38e3
--- /dev/null
+++ b/notebooks/WFC3/image_displayer_analyzer/row_column_stats.py
@@ -0,0 +1,422 @@
+#! /usr/bin/env python
+
+import sys
+import numpy as np
+
+from astropy.io import fits
+import matplotlib.pyplot as plt
+from scipy.stats import mode as mode
+
+def get_bunit(ext1header):
+ """ Get the brightness unit for the plot axis label
+
+ Parameters
+ ----------
+ ext1header: Header
+ The extension 1 header of the fits file being displayed. This is the
+ extension that contains the brightness unit keyword
+
+ Returns
+ -------
+ The string of the brightness unit for the axis label
+ {'counts', 'counts/s','e$^-$', 'e$^-$/s'}
+
+ """
+ units = ext1header['bunit']
+
+ if units == 'COUNTS':
+ return 'counts'
+ elif units == 'COUNTS/S':
+ return 'counts/s'
+ elif units == 'ELECTRONS':
+ return 'e$^-$'
+ elif units == 'ELECTRONS/S':
+ return 'e$^-$/s'
+ else:
+ return units
+
+def get_yaxis_and_label(stat, scidata, axes):
+ """ Get the y-axis values and the y axis label for the plot
+
+ Parameters
+ ----------
+ stat: String {median', 'mean', 'mode', 'stddev'}
+ The statistic that is being computed.
+
+ scidata: Array
+ The image array which is being measured. If an image section is
+ being displayed the array has already been indexed prior to calling this
+ function.
+
+ axes: Integer {0, 1}
+ The axis over which to compute the statistc. For column stats axes = 0
+ for row stats axes = 1
+
+ Returns
+ -------
+ yaxis: Array
+ The array of statistical values requested
+
+ ylabel: String
+ The string of the statistic being computed to be used as the axis label
+
+ """
+ if stat == 'median':
+ yaxis = np.nanmedian(scidata, axis=axes)
+ ylabel = 'Median'
+ elif stat == 'mean':
+ yaxis = np.nanmedian(scidata, axis=axes)
+ ylabel = 'Mean'
+ elif stat == 'mode':
+ yaxis = mode(scidata, axis=axes)[0]
+ ylabel = 'Mode'
+ elif stat == 'stddev':
+ yaxis = np.nanstd(scidata, axis=axes)
+ ylabel = "Standard Dev."
+ else:
+ sys.exit("keyword argument 'stat' must be 'median', 'mean', 'mode', or 'stddev'")
+
+ return yaxis, ylabel
+
+def makeplot(xaxis, yaxis, axlabel, ylabel,
+ bunit,detector, fname, h1, ylim,
+ figsize, dpi):
+ """ Make and display the plot for WFC3 UVIS or IR images
+
+ Parameters
+ ----------
+ xaxis: Range
+ Range from 1 to the total number of rows or columns. If image section
+ range will go from x1 to x2
+
+ yaxis: Array
+ The statistical values being plotted
+
+ axlabel: String {"Row", "Column"}
+ The axis which the statistc was computed over
+
+ bunit: String
+ The string of the brightness unit for the axis label
+
+ detector: String {"UVIS", "IR"}
+ The detector used for the image
+
+ fname: String
+ The name of the file being plotted
+
+ h1: Header
+ The extension 1 header of the fits file being displayed.
+
+ ylim: (float,float)
+ The minimum and maximum values for y axis scale.
+
+ figsize: (float,float)
+ The width, height of the figure. Default is (9,6)
+
+ dpi: float
+ The resolution of the figure in dots-per-inch. Default is 120
+
+ Returns
+ -------
+ N/A
+
+ """
+ fig, ax1 = plt.subplots(1, 1, figsize = figsize, dpi=dpi)
+ # ax1.scatter(xaxis,yaxis,10,alpha=0.75)
+ ax1.plot(xaxis,yaxis,marker='o',markersize=5,ls='-',alpha=0.75)
+
+ ax1.set_xlabel(f"{axlabel} Number",size=13)
+ ax1.set_ylabel(f"{axlabel} {ylabel} [{bunit}]",size=13)
+ ax1.grid(alpha=.75)
+ ax1.minorticks_on()
+ ax1.yaxis.set_ticks_position('both'),ax1.xaxis.set_ticks_position('both')
+ ax1.tick_params(axis='both',which='minor',direction='in',labelsize = 12,length=4)
+ ax1.tick_params(axis='both',which='major',direction='in',labelsize = 12,length=7)
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n {h1['extname']} ext",size=14)
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} ext",size=14)
+ if ylim != None:
+ ax1.set_ylim(ylim[0],ylim[1])
+
+def make_ima_plot(xaxis, yaxis, axlabel, ylabel,
+ bunit, detector, fname,h1, ylim, nsamps, ext,
+ figsize, dpi):
+ """ Make and display the plot for WFC3 IR IMA images
+
+ Parameters
+ ----------
+ xaxis: Range
+ Range from 1 to the total number of rows or columns. If image section
+ range will go from x1 to x2
+
+ yaxis: Array
+ The statistical values being plotted
+
+ axlabel: String {"Row", "Column"}
+ The axis which the statistc was computed over
+
+ bunit: String
+ The string of the brightness unit for the axis label
+
+ detector: String {"UVIS", "IR"}
+ The detector used for the image
+
+ fname: String
+ The name of the file being plotted
+
+ h1: Header
+ The extension 1 header of the fits file being displayed.
+
+ ylim: (float,float)
+ The minimum and maximum values for y axis scale.
+
+ nsamps: Integer
+ The number of samples (readouts) contained in the file
+
+ ext: Integer
+ The extension to be displayed. Ranges from 1 to nsamp
+
+ figsize: (float,float)
+ The width, height of the figure. Default is (9,6)
+
+ dpi: float
+ The resolution of the figure in dots-per-inch. Default is 120
+
+ Returns
+ -------
+ N/A
+
+ """
+ fig, ax1 = plt.subplots(1,1,figsize=figsize,dpi=dpi)
+ # ax1.scatter(xaxis,yaxis,10,alpha=0.75)
+ ax1.plot(xaxis,yaxis,marker='o',markersize=5,ls='-',alpha=0.75)
+
+ ax1.set_xlabel(f"{axlabel} Number",size=13)
+ ax1.set_ylabel(f"{axlabel} {ylabel} [{bunit}]",size=13)
+ ax1.grid(alpha=.75)
+ ax1.minorticks_on()
+ ax1.yaxis.set_ticks_position('both'),ax1.xaxis.set_ticks_position('both')
+ ax1.tick_params(axis='both',which='minor',direction='in',labelsize = 12,length=4)
+ ax1.tick_params(axis='both',which='major',direction='in',labelsize = 12,length=7)
+ if len(fname) > 18:
+ ax1.set_title(f"WFC3/{detector} {fname}\n {h1['extname']} read {(nsamps+1)-ext}",size=14)
+ else:
+ ax1.set_title(f"WFC3/{detector} {fname} {h1['extname']} read {(nsamps+1)-ext}",size=14)
+ if ylim != None:
+ ax1.set_ylim(ylim[0],ylim[1])
+
+def row_column_stats(filename, stat='median', axis='column', ylim=(None,None),
+ printmeta=False, ima_multiread=False, plot=True,
+ figsize=(9,6), dpi=120):
+ """ A function to plot the column median vs column number for
+ the 'SCI' data of any WFC3 fits image.
+
+ Authors:
+ --------
+ Benjamin Kuhn, Oct 2021
+
+ Parameters
+ ----------
+ filename: String
+ Input image name with optional image section specification. If no image
+ section is entered, the entire image is used. If full path is not given,
+ file must exsist in current working directory. This can be an IR or UVIS:
+ raw, rac, ima, blv, blc, crj, crc, flt, flc, drz, drc fits file.
+ Image section must be entered as:
+
+ file.fits[x1:x2,y1:y2] where
+
+ x1 = x-axis pixel number start
+ x2 = x-axis pixel number end
+ y1 = y-axis pixel number start
+ y2 = y-axis pixel number end
+
+ stat: String { "mean", "median", "mode", "stddev"}
+ The type of statistic to compute
+
+ axis: String { "row", "column"}
+ The axis to compute the statistic over
+
+ ylim: Tuple
+ A Tuple of two real numbers that will serve as the min a max values
+ for the y-axis of the plot.
+
+ printmeta: Bool
+ A boolean switch to turn on or off the printing of file infomation.
+ If printmeta is True various header keywords are printed to the
+ screen such as the filter, target name, date observed, brightness
+ units and more.
+
+ ima_multiread: Bool
+ Set ima_multiread to True if you would like each indiviual read of
+ the ima to be plotted. Set ima_multiread to False if you would like
+ just the final read of the ima to be plotted.
+
+ plot: Bool
+ Set plot to False if you do not want the function to plot.
+
+ figsize: (float,float)
+ The width, height of the figure. Default is (9,6)
+
+ dpi: float
+ The resolution of the figure in dots-per-inch. Default is 120
+
+ Returns
+ -------
+ xaxis: Range
+ Range from 1 to the total number of rows or columns
+
+ yaxis: Array
+ Array of y-axis row or column statistic values
+
+ """
+
+ section_start = filename.find("[")
+ all_pixels = False
+ if (section_start < 0):
+ all_pixels = True # just give the data to np
+ imagename = filename
+ elif (section_start > 0):
+ imagename = filename[:section_start]
+ if (filename[section_start+1].isalpha()):
+ print(filename[section_start+1])
+ print("Please only specify a pixel range, not an extension \
+ in the filename")
+ return 0, 0
+
+ if not all_pixels:
+ # pull the section off
+ section = filename[section_start+1:-1]
+ comma = section.find(",")
+ xsec = section[:comma]
+ ysec = section[comma+1:]
+ xs = xsec.find(":")
+ if xs < 0:
+ print("Invalid image section specified")
+ return 0, 0
+ try:
+ xstart = int(xsec[: xs])
+ except ValueError:
+ print("Problem getting xstart")
+ return
+ try:
+ xend = int(xsec[xs+1:])
+ except ValueError:
+ print("Problem getting xend")
+ return
+
+ ys = ysec.find(":")
+ if (ys < 0):
+ print("Invalid image section specified")
+ return 0, 0
+ try:
+ ystart = int(ysec[:ys])
+ except ValueError:
+ print("Problems getting ystart")
+ return
+ try:
+ yend = int(ysec[ys+1:])
+ except ValueError:
+ print("Problem getting yend")
+ return
+
+ with fits.open(imagename) as hdu:
+ h = hdu[0].header
+ h1 = hdu[1].header
+
+ bunit = get_bunit(h1)
+ detector = h['detector']
+ issubarray = h['subarray']
+ si = h['primesi']
+ fname = h['filename']
+ naxis1 = h1["NAXIS1"]
+ naxis2 = h1["NAXIS2"]
+
+ if all_pixels:
+ xstart = 0
+ ystart = 0
+ xend = naxis1 # full x size
+ yend = naxis2 # full y size
+
+ if axis == 'column':
+ axes = 0
+ xaxis = range(xstart, xend)
+ axlabel = 'Column'
+ elif axis == 'row':
+ axes = 1
+ xaxis = range(ystart, yend)
+ axlabel = 'Row'
+ else:
+ sys.exit("keyword argument 'axis' must be set to 'column' or 'row' ")
+
+ if printmeta:
+ print(f"\t{si}/{detector} {fname} ")
+ print('-'*44)
+ print(f"Filter = {h['filter']}, Date-Obs = {h['date-obs']} T{h['time-obs']},\nTarget = {h['targname']}, Exptime = {h['exptime']}, Subarray = {issubarray}, Units = {h1['bunit']}\n")
+
+
+
+ if detector == 'UVIS':
+ if ima_multiread == True:
+ sys.exit("keyword argument 'ima_multiread' can only be set to True for 'ima.fits' files")
+ try:
+ with fits.open(imagename) as hdu:
+ uvis1_sci = hdu['SCI',2].data
+ uvis2_sci = hdu['SCI',1].data
+
+ uvis_sci = np.concatenate([uvis2_sci,uvis1_sci])
+
+ if all_pixels:
+ uvis_sci = uvis_sci[ystart:yend*2,xstart:xend]
+ if axis == 'row':
+ xaxis = range(ystart, yend*2)
+ else:
+ uvis_sci = uvis_sci[ystart:yend,xstart:xend]
+
+ except KeyError:
+ with fits.open(imagename) as hdu:
+ uvis_sci = hdu['SCI',1].data
+
+ if all_pixels:
+ uvis_sci = uvis_sci[ystart:yend,xstart:xend]
+ if axis == 'row':
+ xaxis = range(ystart, yend)
+ else:
+ uvis_sci = uvis_sci[ystart:yend,xstart:xend]
+
+ yaxis, ylabel = get_yaxis_and_label(stat,uvis_sci,axes)
+ if plot:
+ makeplot(xaxis, yaxis, axlabel, ylabel,
+ bunit, detector, fname, h1,
+ ylim, figsize, dpi)
+
+
+ if detector == 'IR':
+ if ima_multiread == True:
+ nsamps = fits.getheader(imagename)['NSAMP']
+ for ext in reversed(range(1,nsamps+1)):
+ with fits.open(imagename) as hdu:
+ scidata = hdu['SCI',ext].data
+
+ scidata = scidata[ystart:yend,xstart:xend]
+
+ yaxis, ylabel = get_yaxis_and_label(stat,scidata,axes)
+ if plot:
+ make_ima_plot(xaxis, yaxis, axlabel, ylabel,
+ bunit, detector, fname,h1, ylim,
+ nsamps, ext, figsize, dpi)
+
+ if ima_multiread == False:
+ with fits.open(imagename) as hdu:
+ scidata = hdu['SCI',1].data
+
+ scidata = scidata[ystart:yend,xstart:xend]
+
+ yaxis, ylabel = get_yaxis_and_label(stat,scidata,axes)
+ if plot:
+ makeplot(xaxis, yaxis, axlabel, ylabel,
+ bunit, detector, fname, h1,
+ ylim, figsize, dpi)
+
+ return xaxis, yaxis
diff --git a/notebooks/WFC3/image_displayer_analyzer/wfc3_image_displayer_analyzer.ipynb b/notebooks/WFC3/image_displayer_analyzer/wfc3_image_displayer_analyzer.ipynb
new file mode 100755
index 000000000..aa95e3e0b
--- /dev/null
+++ b/notebooks/WFC3/image_displayer_analyzer/wfc3_image_displayer_analyzer.ipynb
@@ -0,0 +1,543 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# WFC3 Image Displayer & Analyzer \n",
+ "***\n",
+ "## Learning Goals\n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "\n",
+ "- Download two WFC3 images from MAST.\n",
+ "- Learn how to use the `display_image` tool to display any WFC3 fits file.\n",
+ "- Learn how to use the `row_column_stats` tool to plot row or column statistics for any WFC3 fits file.\n",
+ "\n",
+ "This notebook provides a method to quickly display images from the Hubble Space Telescope’s Wide Field Camera 3 (WFC3) instrument. This tool also allows the user to derive statistics by row or column in the image.
\n",
+ "Please make sure you have read the `README.md` file before continuing. \n",
+ "\n",
+ "## Table of Contents\n",
+ " [Introduction](#intro)
\n",
+ " [1. Imports](#imports)
\n",
+ " [2. Query MAST and download a WFC3 `flt.fits` and `ima.fits` image](#download)
\n",
+ " [3. display_image](#display)
\n",
+ " [3.1 Display the full images with metadata](#displayfull)
\n",
+ " [3.2 Display UVIS1 & UVIS2 separately](#perchip)
\n",
+ " [3.3 Display an image section and change the `SCI` array colormap](#colormap)
\n",
+ " [3.4 Change the scaling of the `SCI` and `ERR` arrays](#scaling)
\n",
+ " [3.5 Display each read of `ima` image section](#allreads)
\n",
+ " [4. row_column_stats](#row_col)
\n",
+ " [4.1 Compute column median and column standard deviation for a full image](#columnmedian)
\n",
+ " [4.2 Measure UVIS1 & UVIS2 column medians separately and overplot on one figure](#overplotccds)
\n",
+ " [4.3 Display image section and compute column & row mean](#imgsectionmean)
\n",
+ " [4.4 Compute column mean for each read of `ima` image section](#columnavgima)
\n",
+ "[5. Conclusions](#conclusions)
\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite) \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "## Introduction \n",
+ "\n",
+ "One of the crucial steps in any analysis of WFC3 data is to visually inspect the
\n",
+ "images. Whether you are viewing every image in the dataset or just a few
\n",
+ "suspected outliers, displaying fits images takes time. To speed up the process
\n",
+ "of displaying WFC3 images, we have created a tool in Python, `display_image()`,
\n",
+ "that is meant to be used in a Jupyter Notebook. Once the function is imported
\n",
+ "into your Jupyter Notebook session, you enter the WFC3 fits image you
\n",
+ "want to display and it shows the full science, error, and data quality arrays
\n",
+ "with a good scaling and colorbar. If the observation is a full frame UVIS
\n",
+ "exposure, then the two CCDs are displayed together as one image (i.e. a 4kx4k
\n",
+ "image). The `display_image()` tool allows for some customization, such as
\n",
+ "displaying only a section of the image as well as changing the colormap or scaling.
\n",
+ "\n",
+ "In addition to visually inspecting WFC3 exposures, it can be helpful to compute
\n",
+ "and plot statistics of the image as well. One common technique to quantify WFC3
\n",
+ "images during analysis is to measure statistics of each individual column or row.
\n",
+ "In this notebook we present a tool in Python, `row_column_stats()`, that is
\n",
+ "meant to be used in a Jupyter Notebook. After importing the function into your
\n",
+ "notebook session, you enter a WFC3 fits image along with the axis and
\n",
+ "statistic you are interested in measuring. The function returns a plot of the
\n",
+ "row (or column) statistic as a function of row (or column) number. In addition
\n",
+ "to the plot, the function returns the row/column values and statistics being plotted.
\n",
+ "This is useful if you want to plot multiple images on one figure. The
\n",
+ "`row_column_stats()` tool allows for some customization, such as measuring
\n",
+ "only a section of the image as well as choosing the axis (row or column) and the
\n",
+ "statistic (mean, median, mode, or, standard deviation).
\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:
\n",
+ "
\n",
+ "**•** *os* for setting environment variables
\n",
+ " \n",
+ "**•** *astroquery.mast Observations* for downloading data from MAST
\n",
+ "**•** *matplotlib.pyplot* for plotting data\n",
+ " \n",
+ "**•** *display_image* for displaying a WFC3 image
\n",
+ "**•** *row_column_stats* for computing statistics on a WFC3 image"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "\n",
+ "from astroquery.mast import Observations\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "from display_image import display_image\n",
+ "from row_column_stats import row_column_stats\n",
+ "\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 2. Query MAST and download a WFC3 `flt.fits` and `ima.fits` image \n",
+ "You may download the data from MAST using either the [Archive Search Engine](https://archive.stsci.edu/hst/search.php) or the [MAST Portal](https://mast.stsci.edu/portal/Mashup/Clients/Mast/Portal.html).\n",
+ "\n",
+ "Here, we download our images via `astroquery`. For more information, please look at the documentation for [Astroquery](https://astroquery.readthedocs.io/en/latest/),\n",
+ "[Astroquery.mast](https://astroquery.readthedocs.io/en/latest/mast/mast.html), and \n",
+ "[CAOM Field Descriptions](https://mast.stsci.edu/api/v0/_c_a_o_mfields.html), which is used for the `obs_table` variable.\n",
+ "\n",
+ "We download images of N2525 from proposal 15145, one being a `flt.fits` in WFC3/UVIS and the other being a `ima.fits` in WFC3/IR. After downloading the images, we move them to our current working directory (cwd)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "query = [('idgga5*','UVIS','FLT',(2,3)),\n",
+ " ('i*','IR','IMA',(10,11))]\n",
+ "\n",
+ "for criteria in query:\n",
+ " # Get the observation records\n",
+ " obs_table = Observations.query_criteria(obs_id=criteria[0], proposal_id=15145, target_name='N2525', instrument_name=f\"WFC3/{criteria[1]}\")\n",
+ "\n",
+ " # Get the listing of data products\n",
+ " products = Observations.get_product_list(obs_table)\n",
+ "\n",
+ " # Filter the products for the file type\n",
+ " filtered_products = Observations.filter_products(products, productSubGroupDescription=criteria[2], dataproduct_type='image')\n",
+ "\n",
+ " # Display the table\n",
+ " filtered_products[criteria[3][0]:criteria[3][1]]\n",
+ "\n",
+ " # Download the images above\n",
+ " download_table = Observations.download_products(filtered_products[criteria[3][0]:criteria[3][1]], mrp_only=False)\n",
+ "\n",
+ " # For convenience move file to cwd and remove empty download dir\n",
+ " for file in download_table['Local Path']:\n",
+ " filename = file.split('/')[-1]\n",
+ " os.rename(file, os.path.basename(file))\n",
+ " os.rmdir('mastDownload/HST/'+filename[:9])\n",
+ " \n",
+ " os.rmdir('mastDownload/HST/')\n",
+ " os.rmdir('mastDownload/')\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "List the fits files to verify they were moved properly"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!ls -ltr *.fits"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. `display_image`\n",
+ "In this section, we demonstrate the functionality of `display_image`, a useful tool for quickly analyzing WFC3 images. The subsections explain how to display full images with metadata, individual WFC3/UVIS chip images, a section of an image with various colormaps/scaling, and individual WFC3/IR `ima` reads."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.1 Display the full images with metadata\n",
+ "First, we display the `SCI`, `ERR`, and `DQ` arrays for each image and print header info. The default value for `printmeta` is `False`. In the cell below, we set the keyword `printmeta` to `True` to print useful information from the header of the file to the screen. The WFC3/UVIS image is in electrons and the WFC3/IR image is in electrons/second. See Section 2.2.3 of the [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb) for full descriptions of `SCI`, `ERR`, and `DQ` arrays."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display_image('idgga5m1q_flt.fits',printmeta=True)\n",
+ "display_image('idggabk1q_ima.fits',printmeta=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.2 Display UVIS1 & UVIS2 separately\n",
+ "Next, we display the WFC3/UVIS chips separately. To select a section of an image, append [xstart:xend,ystart:yend] to the image name as shown below.
\n",
+ "Notice how we need to specify the full axis range `[0:4096,0:2051]` and not simply just `[:,:2051]` as in standard `numpy` notation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print ('Display UVIS1')\n",
+ "display_image('idgga5m1q_flt.fits[0:4096,2051:4102]') "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print ('Display UVIS2')\n",
+ "display_image('idgga5m1q_flt.fits[0:4096,0:2051]') "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.3 Display an image section and change the `SCI` array colormap\n",
+ "Then, we display `SCI` arrays with a different colormap. Regardless of how many colormaps are being changed, all three colormaps must be provided. The elements of `colormaps` sequentially correspond with the `SCI`, `ERR`, and `DQ` arrays."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display_image('idgga5m1q_flt.fits[3420:3575,2590:2770]',\n",
+ " colormaps = [\"viridis\",\"Greys_r\",\"inferno_r\"])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.4 Change the scaling of the `SCI` and `ERR` arrays\n",
+ "Now, we change the scaling of the `SCI` and `ERR` arrays. Regardless of how many scalings are being changed, all three scalings must be provided. The elements of `scaling` sequentially correspond with the `SCI`, `ERR`, and `DQ` arrays. The default scaling value of `None` uses `ginga.util.zscale.zscale()` for scaling (see [documentation](https://ginga.readthedocs.io/en/stable/) for more information). "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display_image('idgga5m1q_flt.fits[3420:3575,2590:2770]',\n",
+ " colormaps = [\"viridis\",\"viridis\",\"inferno_r\"],\n",
+ " scaling = [(50000,80000),(None,400),(None,None)])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 3.5 Display each read of `ima` image section \n",
+ "In addition to changing each `SCI` array's colormap and scaling, we display each read of the `ima` by setting `ima_multiread=True`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display_image('idggabk1q_ima.fits[43:55,299:311]',\n",
+ " colormaps = [\"viridis\",\"Greys_r\",\"inferno_r\"],\n",
+ " scaling=[(2,18),(None,None),(None,None)],\n",
+ " ima_multiread=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. `row_column_stats`\n",
+ "In this section, we demonstrate the functionality of `row_column_stats`, a useful tool for quickly computing WFC3 statistics. The subsections explain how to compute row and column statistics for a full image, individual WFC3/UVIS chips, a section of an image, and individual `ima` reads. The row/column numbers are on the x-axis and the statistics are on the y-axis."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 4.1 Compute column median and column standard deviation for a full image\n",
+ "First, we plot the column median and standard deviations for our WFC3/UVIS image."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# plot column median for the full image\n",
+ "x,y = row_column_stats('idgga5m1q_flt.fits',\n",
+ " stat='median',\n",
+ " axis='column')\n",
+ "\n",
+ "# plot column standard deviation for the full image\n",
+ "x,y = row_column_stats('idgga5m1q_flt.fits',\n",
+ " stat='stddev',\n",
+ " axis='column')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 4.2 Measure UVIS1 & UVIS2 column medians separately and overplot on one figure \n",
+ "\n",
+ "Next, we plot the column medians for each individual WFC3/UVIS chip."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# get column median values for UVIS2 but don't plot \n",
+ "x2,y2 = row_column_stats('idgga5m1q_flt.fits[0:4096,0:2051]',\n",
+ " stat='median',\n",
+ " axis='column',\n",
+ " plot=False)\n",
+ "\n",
+ "# get column median values for UVIS1 but don't plot \n",
+ "x1,y1 = row_column_stats('idgga5m1q_flt.fits[0:4096,2051:4102]',\n",
+ " stat='median',\n",
+ " axis='column',\n",
+ " plot=False)\n",
+ "\n",
+ "# overplot UVIS1 and UVIS2 data on one figure \n",
+ "plt.figure(figsize=(8,6),dpi=130)\n",
+ "plt.grid(alpha=.5)\n",
+ "plt.plot(x1,y1,marker='.',label='UVIS 1',color='k')\n",
+ "plt.plot(x2,y2,marker='.',label='UVIS 2',color='C3')\n",
+ "plt.title('WFC3/UVIS idgga5m1q_flt.fits')\n",
+ "plt.xlabel('Column Number')\n",
+ "plt.ylabel('Column Median [e-]')\n",
+ "plt.legend()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 4.3 Display image section and compute row & column mean\n",
+ "\n",
+ "Now, we compute the row and column means for a section of our WFC3/UVIS image."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Display a section of the image\n",
+ "display_image('idgga5m1q_flt.fits[3420:3575,2590:2770]')\n",
+ "\n",
+ "# plot row mean for a section of the image\n",
+ "x,y= row_column_stats('idgga5m1q_flt.fits[3420:3575,2590:2770]',\n",
+ " stat='mean',\n",
+ " axis='row')\n",
+ "\n",
+ "# plot column mean for a section of the image\n",
+ "x,y= row_column_stats('idgga5m1q_flt.fits[3420:3575,2590:2770]',\n",
+ " stat='mean',\n",
+ " axis='column')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Note: Without specifying `ylim`, the y-axis limits (above) are set to `matplotlib` defaults.
\n",
+ "Set `ylim` to `(y1,y2)` (below) to create custom y-axis limits from the previous example.**
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "y1 = 50\n",
+ "y2 = 220\n",
+ "\n",
+ "# Display a section of the image\n",
+ "display_image('idgga5m1q_flt.fits[3420:3575,2590:2770]')\n",
+ "\n",
+ "# plot row mean for single source with custom yaxis limits\n",
+ "x,y= row_column_stats('idgga5m1q_flt.fits[3420:3575,2590:2770]',\n",
+ " stat='mean',\n",
+ " axis='row',\n",
+ " ylim=(y1,y2))\n",
+ "\n",
+ "# plot column mean for single source with custom yaxis limits\n",
+ "x,y= row_column_stats('idgga5m1q_flt.fits[3420:3575,2590:2770]',\n",
+ " stat='mean',\n",
+ " axis='column',\n",
+ " ylim=(y1,y2))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### 4.4 Compute column mean for each read of `ima` image section \n",
+ "\n",
+ "Finally, we compute the column means for the same section of each `ima` read."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Display a section of the image\n",
+ "display_image('idggabk1q_ima.fits[43:55,299:311]')\n",
+ "\n",
+ "# plot column mean for section of ima\n",
+ "x,y = row_column_stats('idggabk1q_ima.fits[43:55,299:311]',\n",
+ " stat='mean',\n",
+ " axis='column',\n",
+ " ima_multiread=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 5. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. Now while analyzing WFC3 data, you should be more familiar with:\n",
+ "\n",
+ "- Using `display_image` to quickly inspect the `SCI`, `ERR`, and `DQ` arrays of an image or image section. \n",
+ "- Using `row_column_stats` to compute statistics on each individual column (or row) of an image or image section. \n",
+ "\n",
+ "\n",
+ "#### Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ "- [Matplotlib.pyplot Colormaps](https://matplotlib.org/stable/tutorials/colors/colormaps.html)\n",
+ "\n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Author:** Benjamin Kuhn; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** 2021-10-04\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `matplotlib`, `astropy`, or `astroquery` for published research, please cite the authors.
\n",
+ "Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `matplotlib`](https://matplotlib.org/stable/users/project/citing.html)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://astroquery.readthedocs.io/en/latest/license.html)\n",
+ "
\n",
+ "***\n",
+ "[Top of Page](#top)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.7.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/notebooks/WFC3/ir_ima_visualization/IR_IMA_Visualization_with_an_Example_of_Time_Variable_Background.ipynb b/notebooks/WFC3/ir_ima_visualization/IR_IMA_Visualization_with_an_Example_of_Time_Variable_Background.ipynb
new file mode 100644
index 000000000..98f7af2d1
--- /dev/null
+++ b/notebooks/WFC3/ir_ima_visualization/IR_IMA_Visualization_with_an_Example_of_Time_Variable_Background.ipynb
@@ -0,0 +1,778 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "\n",
+ "# WFC3/IR IMA Visualization Tools with An Example of Time Variable Background\n",
+ "\n",
+ "\n",
+ "## Learning Goals\n",
+ "\n",
+ "The main purpose of this notebook is to familiarize users with the structure of the WFC3/IR IMA files, to visualize individual reads and the difference between reads, and to plot the cumulative signal and count rate throughout the MULTIACCUM exposure. These visualization tools may be used to identify issues with the data, for example, a [guidestar (GS) failure](https://archive.stsci.edu/cgi-bin/mastpreview?mission=hst&dataid=ID7002010), a [satellite trail](https://archive.stsci.edu/cgi-bin/mastpreview?mission=hst&dataid=IB5X02030) in a specific read, or time variable background, which may take the form of scattered light or He I 10830 Ã… airglow line emission. \n",
+ "\n",
+ "This notebook walks through:\n",
+ "\n",
+ "- Exploring WFC3/IR IMA Data Structure;\n",
+ "- How to find and select individual reads in an IMA file;\n",
+ "- How to show individual reads as images;\n",
+ "- Plotting the signal ramp through subsequent reads;\n",
+ "- Plotting the difference in signal between reads using two different methods.\n",
+ "\n",
+ "\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#import)
\n",
+ "[2. Downloading Data](#main)
\n",
+ "- [2.1 Download Example MULTIACCUM Observation](#load)
\n",
+ "- [2.2 WFC3/IR File Information](#file)
\n",
+ "\n",
+ "\n",
+ "[3. Visualizing Individual Reads of IMA Images](#vis)
\n",
+ "[4. Taking the Difference Between Reads: The Cumulative Rate](#cumulative)
\n",
+ "[5. A More Accurate Difference Between Reads: The Instantaneous Rate](#instantaneous)
\n",
+ "\n",
+ "\n",
+ "[6. Conclusions](#conclusions)
\n",
+ "[Additional Resources](#add)
\n",
+ "[About this Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Introduction \n",
+ "\n",
+ "\n",
+ "**Observing with the WFC3/IR MULTIACCUM Mode**\n",
+ "\n",
+ "\n",
+ "As discussed in section [7.7 of the WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb/chapter-7-ir-imaging-with-wfc3/7-7-ir-exposure-and-readout), the only observing mode available for the WFC3/IR channel is the MULTIACCUM mode, which samples the signal multiple times as an exposure accumulates. Exposures are taken in \"a sequence of non-destructive reads specified by the user from a variety of pre-defined configurations with both constant (SPARS) and increasing (STEP) time intervals between subsequent reads. At the time of each read,\n",
+ "the accumulated charge on each pixel is recorded and this charge accumulation history for\n",
+ "a given exposure — the 'ramp' — is recorded in the RAW data files.\" The maximum number of reads (following the zero read) during an exposure is 15, which are collected as the signal ramps up.\n",
+ "\n",
+ "\n",
+ "Multiple readouts in the MULTIACCUM mode are advantageous for three key reasons. First, they increase the dynamic range of the image. The signal in a pixel that is saturated by the end of the exposure is recorded multiple times, including before saturation. Second, cosmic-ray events that occur throughout the exposure can be anaylzed and identified in individual reads and subsequently removed. Finally, by fitting to multiple reads, one can reduce the effective read noise in an observation. \n",
+ "\n",
+ "See section [7.7 of the WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb/chapter-7-ir-imaging-with-wfc3/7-7-ir-exposure-and-readout) for more details.\n",
+ "\n",
+ "\n",
+ "**Time-Variable Background in the WFC3/IR Channel**\n",
+ "\n",
+ "In WFC3/IR images, the sky background may be comprised of one or more of the following components: zodiacal light, [scattered light from the bright Earth limb](https://hst-docs.stsci.edu/wfc3dhb/chapter-7-wfc3-ir-sources-of-error/7-10-time-variable-background), and [He I 10830 Ã… airglow line emission](https://hst-docs.stsci.edu/wfc3dhb/chapter-7-wfc3-ir-sources-of-error/7-10-time-variable-background) from helium atoms excited by sunlight in the Earth's upper atmosphere. The zodiacal light, which depends on the orientation of the target with respect to the sun, varies throughout the year but is effectively constant within a given exposure/orbit/visit. However, the scattered light and line emission components can vary within an orbit and even within a single exposure, leading to a background that varies with time. In this notebook, we will show an example of time-variable background due to Earth limb scattered light (made when HST is pointing near the bright Earth limb), which results in a spatially variable signal with the leftmost (x<400) columns of the detector being subject to background levels up to twice as bright as that on the rest of the chip.\n",
+ "\n",
+ "In the following sections, we show how to identify the impacted reads. In future [WFC3 Library](https://github.com/spacetelescope/WFC3Library) notebooks, Correcting for Scattered Light in WFC3/IR Exposures: Using `calwf3` to Exclude Bad Reads (O'Connor, in prep.) and Correcting for Scattered Light in IR Exposures: Manually Excluding Bad Reads (O'Connor, in prep.), we show how to reprocess the exposure while excluding those reads. Here, we show how to compute and plot the median background rate (e.g. the difference between IMA reads) and we compare the background in different regions of the detector. \n",
+ "\n",
+ "See section [7.10 of the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb/chapter-7-wfc3-ir-sources-of-error/7-10-time-variable-background) for more details."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## 1. Imports \n",
+ " \n",
+ "We use the following libraries: \n",
+ " \n",
+ "- *os* for splitting file paths \n",
+ "- *numpy* for handling array functions\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *astropy.io fits* for accessing FITS files\n",
+ "- *astroquery* for downlaoding data from MAST\n",
+ "- *ginga* for scaling using zscale\n",
+ "\n",
+ "We import the following module:\n",
+ "- *ima_visualization_and_differencing* to take the difference between reads, plot the ramp, and to visualize the difference in images\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "\n",
+ "import numpy as np\n",
+ "from matplotlib import pyplot as plt\n",
+ "import matplotlib.patheffects as path_effects\n",
+ "\n",
+ "from astropy.io import fits\n",
+ "from astroquery.mast import Observations\n",
+ "from ginga.util.zscale import zscale\n",
+ "\n",
+ "import ima_visualization_and_differencing as diff\n",
+ "\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2. Downloading Data \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "### 2.1 Download Example MULTIACCUM Observation \n",
+ "\n",
+ "Here, we download two consecutive exposures from image association 'ICQTBB020' acquired in visit BB of program [14037](https://www.stsci.edu/hst/observing/program-information). This visit consists of two orbits of two exposures each, and we focus on the second orbit which contains two identical images of the target (filter=F140W, SAMP-SEQ=SPARS100, NSAMP=16). The first exposure 'icqtbbbxq' was acquired in the first half of the orbit and is strongly contaminated by scattered light. The second exposure 'icqtbbc0q' was acquired during the second half of the orbit and allows us to compare what one would see in a nominal image. \n",
+ "\n",
+ "When running this notebook, these dataset names may be replaced with your own observations. If running this notebook with just one observation, note that simple changes to each cell will allow you to run the notebook with just one image (these changes are suggested within each cell). We recommend that you step through this notebook first using the example observations given below. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "Let's query for the IR images using MAST, selecting both the IMA and FLT data products from the two exposures: 'icqtbbbxq' and 'icqtbbc0q'. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "EX_OBS = Observations.query_criteria(obs_id = 'ICQTBB020')\n",
+ "EXOBS_Prods = Observations.get_product_list(EX_OBS)\n",
+ "yourProd = Observations.filter_products(EXOBS_Prods, obs_id = ['icqtbbbxq', 'icqtbbc0q'], extension = [\"_ima.fits\",\"_flt.fits\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "yourProd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Observations.download_products(yourProd, mrp_only = False, cache = False)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 2.2 WFC3/IR File Information \n",
+ "\n",
+ "\n",
+ "The figure below shows the WFC3/IR file structure corresponding to [Figure 2.4 of the Data Handbook](https://hst-docs.stsci.edu/wfc3dhb/chapter-2-wfc3-data-structure/2-2-wfc3-file-structure). Note that for WFC3/IR data, each read or image set (IMSET) consists of five data arrays: SCI, ERR, DQ, SAMP, TIME. Consecutive MULTIACCUM readouts are stored in reverse chronological order, with [SCI,1] corresponding to the final, cumulative exposure. \n",
+ "\n",
+ "\n",
+ "\n",
+ "The table below lists the IMSET, SAMPNUM, and SAMPTIME for a WFC3/IR SPARS100 exposure, modified from [Section 7.7 of the Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb/chapter-7-ir-imaging-with-wfc3/7-7-ir-exposure-and-readout). Note that the image header keyword NSAMP reports a value of 16, but there are actually 15 science reads in the IMA file, following the 0th read (which has an exposure time of 0). While NSAMP keyword is reported in the primary header (extension 0), the SAMPNUM and SAMPTIME keywords may be found in the science header of each read, and these report the read (IMSET) number and the cumulative exposure time of each respective read. \n",
+ "\n",
+ "This table is similar to [Table 7.7](https://hst-docs.stsci.edu/wfc3ihb/chapter-7-ir-imaging-with-wfc3/7-7-ir-exposure-and-readout#id-7.7IRExposureandReadout-table7.8), except that the column labelled NSAMP in the handbook is really the SAMPNUM. Note that we have added a row at the top of the table to highlight that IMSET [SCI,16] corresponds to the 0th read.\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 3. Visualizing Individual Reads of IMA Images\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, let's check out the file structure of our WFC3/IR IMA FITS files. We define the paths to our images here."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "ima_scattered = 'mastDownload/HST/icqtbbbxq/icqtbbbxq_ima.fits'\n",
+ "flt_scattered = 'mastDownload/HST/icqtbbbxq/icqtbbbxq_flt.fits'\n",
+ "ima_nominal = 'mastDownload/HST/icqtbbc0q/icqtbbc0q_ima.fits'\n",
+ "flt_nominal = 'mastDownload/HST/icqtbbc0q/icqtbbc0q_flt.fits'\n",
+ "\n",
+ "image = fits.open(ima_scattered)\n",
+ "image.info()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As we can see, the IMA contains 16 science (SCI) extensions or IMSETS, recorded in *reverse chronological* order in the file. For this observation, the \"0th\" read corresponds to the extension 76 or the 16th science extenstion, e.g. [SCI,16]. In the cells below, we show how to query the NSAMP and SAMPNUM keywords in the image headers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "prihdr = image[0].header\n",
+ "NSAMP = prihdr['NSAMP']\n",
+ "print(f'The total number of reads (including the 0th) is {NSAMP}.')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sci16hdr = image['SCI',16].header\n",
+ "SAMPNUM_sci16 = sci16hdr['SAMPNUM']\n",
+ "SAMPTIME_sci16 = sci16hdr['SAMPTIME']\n",
+ "print(f'For sample number {SAMPNUM_sci16}, the exposure time is {SAMPTIME_sci16}s.')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sci1hdr = image['SCI',1].header\n",
+ "SAMPNUM_sci1 = sci1hdr['SAMPNUM']\n",
+ "SAMPTIME_sci1 = sci1hdr['SAMPTIME']\n",
+ "print(f'For sample number {SAMPNUM_sci1}, the exposure time is {SAMPTIME_sci1:.3f}s.')\n",
+ "\n",
+ "image.close()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The 0th read [SCI,16] is taken at 0 seconds, while the 1st read [SCI,15] is taken just a few seconds after exposure start. Since it takes a finite time (2.93 sec) to read the full array, this short read represents the time delay between reading the first and last pixel. The rest of the reads are then taken at the time interval specified by the STEP or SPARS sequence. Here, we have chosen a dataset with SPARS100, which has a time interval of 100 seconds between reads. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's compare the final read of the IMA and the corresponding FLT product for each dataset."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize = (30, 30))\n",
+ "fig\n",
+ "rows = 2\n",
+ "columns = 2\n",
+ "\n",
+ "files = [ima_scattered, flt_scattered, ima_nominal, flt_nominal] \n",
+ "# If only analyzing one image, please remove the second ima,flt pair from the list \n",
+ "\n",
+ "for i,file in enumerate(files):\n",
+ " path, filename = os.path.split(file)\n",
+ " \n",
+ " image = fits.open(file)\n",
+ "\n",
+ " ax = fig.add_subplot(rows, columns, i+1)\n",
+ " ax.set_title(filename, fontsize = 20)\n",
+ " \n",
+ " subplot_titles = ['scattered', 'nominal']\n",
+ " #Please change the vmin and vmax values to fit your own data\n",
+ " if i == 0 or i == 1:\n",
+ " ax.set_title(f'{filename}, {subplot_titles[i//2]}', fontsize = 20)\n",
+ " im = ax.imshow(image[\"SCI\", 1].data, origin = 'lower',cmap = 'Greys_r', vmin = 0.25, vmax = 1.7)\n",
+ " else:\n",
+ " ax.set_title(f'{filename}, {subplot_titles[i//2]}', fontsize = 20)\n",
+ " im = ax.imshow(image[\"SCI\", 1].data, origin = 'lower',cmap = 'Greys_r', vmin = 0.5, vmax = 1.2)\n",
+ " plt.colorbar(im, ax = ax)\n",
+ "\n",
+ "plt.subplots_adjust(bottom = 0.2, right = 0.5, top = 0.5)\n",
+ "plt.rc('xtick', labelsize = 10) \n",
+ "plt.rc('ytick', labelsize = 10) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here, we see our target field. In the top row, we can see the scattered light in dataset 'icqtbbbxq' affecting the left side of both the IMA and FLT product. In the bottom row, we see the nominal IMA and FLT images for dataset 'icqtbbc0q'.\n",
+ "\n",
+ "Note that FLT images differ from IMA images in that they have had cosmic rays removed by the [`calwf3` pipeline](https://hst-docs.stsci.edu/wfc3dhb/chapter-3-wfc3-data-calibration/3-3-ir-data-calibration-steps#id-3.3IRDataCalibrationSteps-3.3.10) via the CRCORR step which performs 'up-the-ramp' fitting."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To visually inspect each read of the IMA image, we can use the following snippet of code to create a multi-panel display. Each panel is shown with the same scale in electrons/second (e-/s) to highlight the increasing signal-to-noise in each successive read of the MULTIACCUM exposure. Here, we use the *read_wfc* funtion found in *ima_visualization_and_differencing.py* to grab the IMA science data from all reads as a data cube and the integration time as an array.\n",
+ "\n",
+ "For a second tutorial on visualizing reads of the MULTIACCUM exposure, see the [\"IMA Viewer\"](https://github.com/spacetelescope/WFC3Library) notebook (Marinelli, in prep.) on the WFC3 Library GitHub. This notebook allows the user to create gifs looping through reads as the signal accumulates, which can be useful for quickly diagnosing any issues with the data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " diff.plot_ima_subplots(ima_filename = ima_scattered, vmin = 0, vmax = 2.2)\n",
+ " \n",
+ "except FileNotFoundError:\n",
+ " print(\"No file by this name found\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Above, we see scattered light in every read in the cumulative exposure. In reality (as we will see later in this notebook), the scattered light is present only during the first few reads of the exposure. Because we are plotting reads with an accumulating signal, we see the scattered light affecting all reads of the IMA, even when the scattered light is no longer present. We will see this more clearly when visualizing the difference between reads.\n",
+ "\n",
+ "Conversely, when we show individual reads from the nominal IMA file, we see no scattered light (as seen below)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " diff.plot_ima_subplots(ima_filename = ima_nominal, vmin = 0, vmax = 2)\n",
+ "\n",
+ "except FileNotFoundError:\n",
+ " print(\"No file by this name found\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To get a better sense of how the MULTIACCUM method works, we can plot the median signal accumulation in electrons up the ramp for both images. The median value works well for sparse fields where the majority of the pixels are sky.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize = (10, 8))\n",
+ "\n",
+ "ima_files=[ima_scattered, ima_nominal] \n",
+ "#If only using one image, please remove the extraneous image from this list \n",
+ "\n",
+ "marker_select = ['o','s']\n",
+ "color_select = ['black','C0']\n",
+ "for i, ima in enumerate(ima_files):\n",
+ " path, filename = os.path.split(ima)\n",
+ " \n",
+ " cube, integ_time = diff.read_wfc3(ima)\n",
+ " median_fullframe = np.nanmedian(cube, axis = (0,1))\n",
+ "\n",
+ " plt.rcParams.update({'font.size':15})\n",
+ " plt.plot(integ_time[1:], median_fullframe[1:]*integ_time[1:],\n",
+ " marker = marker_select[i], markersize = 8, color = color_select[i], label = filename)\n",
+ " plt.legend()\n",
+ "plt.grid()\n",
+ "plt.xlabel('Integ. Time (s)', fontsize = 15)\n",
+ "plt.ylabel('electrons', fontsize = 15)\n",
+ "plt.rc('xtick', labelsize = 15) \n",
+ "plt.rc('ytick', labelsize = 15) \n",
+ "plt.grid(visible = True)\n",
+ "_=plt.title(\"Comparison of Signal Accumulation Ramp in Nominal vs. Scattered Light Images\", fontsize=15)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "For dataset 'icqtbbc0q' (blue), we see the background signal accumulating linearly with time, whereas for dataset 'icqtbbbxq' (black), we see a non-linear background in the first portion of the exposure. 'icqtbbbxq' becomes linear in the second portion of the exposure and has the same slope as the nominal exposure. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next we compare sky values in different regions of the detector (left side, right side, and full frame). If you would like to specify your own regions for the left and right sides of your image, you can change the \"lhs_region\" and \"rhs_region\" parameters. Each region must be specified as a dictionary including the four \"corners\" (x0, x1, y0, and y1) of the region you would like to select. You may want to avoid the edges of the detector which have a large number of bad pixels and higher flat field errors. \n",
+ "\n",
+ "Here we compare the full frame ramp for each image with the ramp from the left and right sides of the detector. We compute the median signal from the left side, right side, and full frame image using the *get_median_fullframe_lhs_rhs* function from the *ima_visualization_and_differencing.py* module."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize = (50, 20))\n",
+ "fig\n",
+ "rows = 1\n",
+ "columns = 2\n",
+ "ima_files = [ima_scattered, ima_nominal] \n",
+ "#If only using one image, please remove the extraneous image from this list \n",
+ "\n",
+ "subplot_titles = ['scattered', 'nominal']\n",
+ "\n",
+ "\n",
+ "lhs_region={\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ "rhs_region={\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ "for i,ima in enumerate(ima_files):\n",
+ " \n",
+ " path, filename = os.path.split(ima)\n",
+ " \n",
+ " cube, integ_time = diff.read_wfc3(ima)\n",
+ " \n",
+ " median_fullframe, median_lhs, median_rhs = diff.get_median_fullframe_lhs_rhs(cube, lhs_region = lhs_region, rhs_region = rhs_region)\n",
+ " plt.rcParams.update({'font.size':40})\n",
+ " ax = fig.add_subplot(rows, columns, i+1)\n",
+ " ax.plot(integ_time[1:], median_fullframe[1:]*integ_time[1:], 's', markersize = 25, label = 'Full Frame', color = 'black')\n",
+ " ax.plot(integ_time[1:], median_lhs[1:]*integ_time[1:], '<', markersize = 20, label = 'LHS', color = 'C1')\n",
+ " ax.plot(integ_time[1:], median_rhs[1:]*integ_time[1:], '>', markersize = 20, label = 'RHS', color= 'C2')\n",
+ " ax.set_ylim(0,1800)\n",
+ " ax.grid()\n",
+ " ax.set_xlabel('Integ. Time (s)')\n",
+ " ax.set_ylabel('electrons')\n",
+ " ax.legend(loc = 0)\n",
+ " _=ax.set_title(f'{filename}, {subplot_titles[i]}', fontsize = 40)\n",
+ " ax.tick_params(axis = \"x\", labelsize = 30) \n",
+ " ax.tick_params(axis = \"y\", labelsize = 30) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "The left panel shows the observation affected by scattered light. By comparing the signal from the left side (orange triangles) and right side (green triangles) of our image, we see that the left side is brighter than the right and that the difference in total counts between the two sides is changing over the exposure. In this case, the difference between the two sides of the image is due to scattered light which varies spatially across the detector. We know the time-variable component is only due to Earth limb scattered light because this filter (F140W) is not affected by the He I 10830 Ã… airglow line emission (see section [7.10.2 of the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb/chapter-7-wfc3-ir-sources-of-error/7-10-time-variable-background)). In the following sections, we will identify the impacted reads by looking at the difference in count rates between each read.\n",
+ "\n",
+ "The right panel shows the ramp plot for the nominal exposure, and we see that the signal from the left side, right side, and full frame are nearly identical. \n",
+ "\n",
+ "**Note that, in an image with an extended object, there may be a spatial dependence in the ramp plots (e.g. the right side may be higher than the left), but the slope of the ramp would be linear with time.**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 4. Taking the Difference Between IMA Reads: The Cumulative Rate "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Our first method of taking the difference between reads is as simple as subtracting each read from the one before, e.g. $\\mu$ = [SCI,15]-[SCI,14], [SCI,14]-[SCI,13],... where $\\mu$ represents the median difference. In the panels below, we now plot the the ramps in units of count rate (e-/s) in order to see how the background changes through the exposure. We use the *compute_diff_imas* function from the *ima_visualization_and_differencing.py* module, taking the cumulative difference between reads as described above, and the *plot_ramp* function from the module, which plots the median difference in count rate from the left side, right side, and full frame image.\n",
+ "\n",
+ "(Note that we exclude the 0th read [SCI,16] in our difference calculations.)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "##If only using one image, please remove the extraneous image from this list \n",
+ "lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ "rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ "diff.plot_ramp_subplots(ima_files = [ima_scattered, ima_nominal], difference_method = 'cumulative', exclude_sources = False, ylims = [-0.3,0.3], lhs_region = lhs_region, rhs_region = rhs_region)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The left panel shows a large contribution from scattered light on the left side of the image (orange triangles) during the first portion of the exposure. This difference approaches zero toward the end of the exposure. The right side of the image also has a slighlty elevated count rate early in the exposure, but not as extreme as the left side.\n",
+ "\n",
+ "The right panel shows that the difference in count rate is effectively zero for the nominal image, as expected. \n",
+ "\n",
+ "Note that the first data point in both plots has a very large error because we are subtracting from the 1st read (~2.9 seconds), which has very little signal and large errors. \n",
+ "\n",
+ "To visualize the excess signal in two dimensions, lets make a panel plot of the differences plotted above. First, we will show the image affected by time-variable background which shows the expected spatial and time variation due to scattered light. Note that each panel is plotted with a unique zscale to highlight large changes in the signal rate with time. We use the *panel_plot* function from the *ima_visualization_and_differencing.py* module. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ " rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ " diff.plot_ima_difference_subplots(ima_filename = ima_scattered, difference_method = 'cumulative', lhs_region = lhs_region, rhs_region = rhs_region)\n",
+ " \n",
+ "except FileNotFoundError:\n",
+ " print(\"No file by this name found\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Above each panel, we print the median difference $\\mu$ in the count rate over the entire image . Below each panel, we list the IMSET difference, along with the time interval between the two IMSETs.\n",
+ "\n",
+ "The statistics in orange (on the left and right side of each panel) give the median rate and standard deviation of each side of the image, respectively. The value in green 'delta' is the difference between the left and right side of the image. The value in white \"Ratio\" gives the ratio of the median difference in orange for the left versus the right side. \n",
+ "\n",
+ "Note that, because we took the simple difference in reads, the sources are not visible. This leaves us with only the sky component, making it easy to identify the time-variable background and whether it is due to scattered light or Helium emission. However, since we've subtracted off the first read, we lose any information about the background level at the beginning of the exposure where the scattered light was the highest in this example. \n",
+ "\n",
+ "We see a large difference in count rate between the two sides of the image in the earlier reads. This difference decreases with time during the exposure because the scattered light is no longer present in later reads. \n",
+ "\n",
+ "Next, lets look at the difference images for the nominal exposure."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ " rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ " diff.plot_ima_difference_subplots(ima_filename = ima_nominal, difference_method = 'cumulative', lhs_region = lhs_region, rhs_region = rhs_region)\n",
+ "\n",
+ "except FileNotFoundError:\n",
+ " print(\"No file by this name found\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As we expect, the differences images are blank (with the exception of a speckled pattern showing cosmic rays and differences in noise between reads). Both 'delta'($\\Delta$) and $\\mu$ are effectively zero in this nominal image. The ratio, in this case, is less useful becuase the signal differences between left and right are close to zero. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 5. A More Accurate Difference Between Reads: The Instantaneous Rate "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here we implement a different technique to examine the count rate difference between consecutive reads. In this case, we first convert from count rate (e-/s) back to counts (e-) before taking the difference, as shown in equation 3 from [WFC3 ISR 2018-05](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2018/WFC3-2018-05.pdf).\n",
+ "\n",
+ "![Instantaneous Difference Equation](instantaneous_diff.png)\n",
+ "\n",
+ "One advantage of this method is that it does not remove information about the signal levels at the beginning of the exposure, as in the prior method. Thus the ramp plot below shows a median rate of ~1.5 e-/s for the first two differences instead of ~zero. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#If only using one image, please remove the extraneous image from this list \n",
+ "lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ "rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ "diff.plot_ramp_subplots(ima_files = [ima_scattered, ima_nominal], difference_method = 'instantaneous', exclude_sources = True, ylims = [0.5,2.5], lhs_region = lhs_region, rhs_region = rhs_region)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In our nominal exposure (right), we see a constant background due to zodiacal light at a level of ~0.9e-/s throughout. For our scattered light exposure (left), we see the same zodiacal light at a level of ~0.9e-/s in later reads, with the scattered light component affecting the first several reads where the median count rate for the left side (orange triangles) is larger than the right side (green triangles). "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the panel plot (below), we see that sources (small galaxies) are visible in the difference images using this new method, whereas in the cumulative difference method they are not. Note that this may complicate the analysis of the spatial background (e.g. left versus right) for images with extended targets, such as large galaxies. In this case, users may wish to adjust the regions of the detector used for the ramp plots. We therefore recommend inspecting both the panel plots as well as the ramp fits for diagnosing any issues with the data. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ " rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ " diff.plot_ima_difference_subplots(ima_filename = ima_scattered, difference_method = 'instantaneous', lhs_region = lhs_region, rhs_region = rhs_region)\n",
+ "\n",
+ "except FileNotFoundError:\n",
+ " print(\"No file by this name found\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this figure, we see that the ratio of instantaneous rate for the left versus right side of the image is ~1.0 for all but the first few reads. \n",
+ "\n",
+ "In a subsequent notebook, Correcting for Scattered Light in IR Exposures by Reprocessing with Calwf3 (O'Connor, in prep.), we show how to exclude these specific reads from the exposure and reprocess the image with `calwf3`. For this dataset, we exlude the first 6 reads, where the ratio is greater than 1.1 e-/s. While this reduces the total exposure from 1403 to 903 seconds, it removes the spatial component from the sky background and allows for a more accurate 'up-the-ramp' fit with `calwf3`.\n",
+ "\n",
+ "In a separate notebook, Correcting for Scattered Light in IR Exposures by Manually Removing Bad Data(O'Connor, in prep.), we correct the final image product by manually removing bad reads from the IMA file, again exluding reads where the ratio is greater than 1.1 e-/s. \n",
+ "\n",
+ "For comparison, we show the difference images for the nominal exposure (below) which do not show any scattered light artifacts."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " diff.plot_ima_difference_subplots(ima_filename = ima_nominal, difference_method = 'instantaneous', lhs_region = lhs_region, rhs_region = rhs_region)\n",
+ " \n",
+ "except FileNotFoundError:\n",
+ " print(\"No file by this name found\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 6. Conclusions \n",
+ "\n",
+ "\n",
+ "**Congratulations, you have completed the notebook.**\n",
+ "\n",
+ "You should now be familiar with: \n",
+ "- How to find and select individual reads in an IMA file\n",
+ "- How to display individual reads\n",
+ "- How to plot the signal accumulation ramp of a WFC3/IR IMA file\n",
+ "- How to plot the difference in signal between reads using two different methods\n",
+ "\n",
+ "\n",
+ "This notebook can be used to help identify issues with WFC3/IR images, for example time variable backgrounds. To correct for scattered light background in IR exposures, please see the subsequent notebooks Correcting for Scattered Light in WFC3/IR Exposures: Using `calwf3` to Exclude Bad Reads (O'Connor, in prep.) and Correcting for Scattered Light in IR Exposures: Manually Excluding Bad Reads (O'Connor, in prep.), which makes use of the same dataset highlighted in this tutorial. \n",
+ "\n",
+ "For a tutorial on how to correct time-variable background due to the He I 10830 Å airglow line background, which has no spatial signature, please see the notebook [Correcting for Helium Line Emission Background in IR Exposures using the “Flatten-Ramp†Technique](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/tvb_flattenramp). "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Additional Resources \n",
+ "\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Help Desk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ "\n",
+ "\n",
+ "## About this Notebook \n",
+ "\n",
+ "**Authors:** \n",
+ "- Anne O'Connor, WFC3 Instrument\n",
+ "- Harish Khandrika, WFC3 Instrument\n",
+ "- Jennifer Mack, WFC3 Instrument\n",
+ "- Annalisa Calamida, WFC3 Instrument\n",
+ "\n",
+ "**Updated On:** 2023-05-05\n",
+ "\n",
+ "## Citations \n",
+ "\n",
+ "If you use `numpy` or `astropy` for published research, please cite the\n",
+ "authors. Follow these links for more information about citing `numpy` and\n",
+ "`astropy`:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://astroquery.readthedocs.io/en/latest/)\n",
+ "* [Citing `wfc3tools`](https://wfc3tools.readthedocs.io/en/latest/)\n",
+ "* [Citing `drizzlepac`](https://drizzlepac.readthedocs.io/en/latest/LICENSE.html)\n",
+ "\n",
+ "\n",
+ "If you use this notebook, or information from the WFC3 Data Handbook, Instrument Handbook,\n",
+ "or WFC3 ISRs for published research, please cite them:\n",
+ "* Citing this notebook:\n",
+ " Please cite the primary author and year, and hyperlink the notebook or WFC3 Library\n",
+ " \n",
+ "* [Citing the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb#:~:text=Citation,%2C%20(Baltimore%3A%20STScI).)\n",
+ "\n",
+ "* [Citing the WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb#:~:text=Citation,14.0%E2%80%9D%20(Baltimore%3A%20STScI))\n",
+ "\n",
+ "* [Instrument Science Report WFC3 2021-01](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/2021-01.pdf)\n",
+ "\n",
+ "* [Instrument Science Report WFC3 2018-05](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2018/WFC3-2018-05.pdf)\n",
+ "\n",
+ "\n",
+ "\n",
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "[Top of Page](#top)\n",
+ " "
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.0"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/WFC3/ir_ima_visualization/README.md b/notebooks/WFC3/ir_ima_visualization/README.md
new file mode 100644
index 000000000..1e5f47f32
--- /dev/null
+++ b/notebooks/WFC3/ir_ima_visualization/README.md
@@ -0,0 +1,13 @@
+The main purpose of this notebook is to familiarize users with the structure of the WFC3/IR IMA files, to visualize individual reads and the difference between reads, and to plot the cumulative signal and count rate throughout the MULTIACCUM exposure. These visualization tools may be used to identify issues with the data, for example, a guidestar (GS) failure, a satellite trail in a specific read, or time variable background, which may take the form of scattered light or He I 10830 Ã… airglow line emission.
+
+This notebook walks through:
+
+- Exploring WFC3/IR IMA Data Structure;
+- How to find and select individual reads in an IMA file;
+- How to show individual read as images;
+- Plotting the signal ramp through subsequent reads;
+- Plotting the difference in signal between reads using two different methods.
+
+Installation Instruction:
+
+- Please refer to the instructions found on the main [WFC3 Library github page](https://github.com/spacetelescope/WFC3Library). No other installations are required.
\ No newline at end of file
diff --git a/notebooks/WFC3/ir_ima_visualization/SAMPNUM_Table.png b/notebooks/WFC3/ir_ima_visualization/SAMPNUM_Table.png
new file mode 100644
index 000000000..ba0b61ac4
Binary files /dev/null and b/notebooks/WFC3/ir_ima_visualization/SAMPNUM_Table.png differ
diff --git a/notebooks/WFC3/ir_ima_visualization/ima_visualization_and_differencing.py b/notebooks/WFC3/ir_ima_visualization/ima_visualization_and_differencing.py
new file mode 100644
index 000000000..d174df612
--- /dev/null
+++ b/notebooks/WFC3/ir_ima_visualization/ima_visualization_and_differencing.py
@@ -0,0 +1,446 @@
+import os
+import numpy as np
+from astropy.io import fits
+import matplotlib.pyplot as plt
+from ginga.util.zscale import zscale
+import matplotlib.patheffects as path_effects
+
+def read_wfc3(filename):
+ '''
+ Read a full-frame IR image and return the datacube plus integration times for each read.
+ Requires the path to a RAW full-frame IR image fits file (filename).
+
+ Parameters
+ ----------
+ filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ Returns
+ -------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+ '''
+
+ with fits.open(filename) as f:
+ hdr = f[0].header
+ NSAMP = hdr['NSAMP']
+ hdr1 = f[1].header
+ cube = np.zeros((hdr1['NAXIS1'],hdr1['NAXIS2'],NSAMP), dtype = float)
+ integ_time = np.zeros(shape = (NSAMP))
+
+ for i in range(1, NSAMP+1):
+ cube[:,:,i-1] = f[('SCI', i)].data
+ integ_time[i-1] = f[('TIME', i)].header['PIXVALUE']
+
+ cube = cube[:,:,::-1]
+ integ_time = integ_time[::-1]
+ return cube, integ_time
+
+
+
+def compute_diff_imas(cube, integ_time, diff_method):
+
+ '''
+ Compute the difference in signal between reads of a WFC3 IR IMA file.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ diff_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ Returns
+ --------
+ diff : array-like
+ 1024x1024x(NSAMP-1) datacube of the differebce between IR IMA reads in ascending time order,
+ where NSAMP is the number of samples taken.
+ '''
+
+ if diff_method == 'instantaneous':
+ ima_j = cube[:, :, 1:]
+ ima_j_1 = cube[:,:,0:-1]
+ t_0 = integ_time[0]
+ t_j = integ_time[1:]
+ t_j_1 = integ_time[0:-1]
+
+ diff = ((ima_j*(t_j-t_0))-(ima_j_1*(t_j_1-t_0)))/(t_j-t_j_1)
+
+ elif diff_method == 'cumulative':
+ diff = cube[:,:,0:-1] - cube[:,:,1:]
+
+ else: # if an incorrect method is chosen raise an error
+ raise ValueError(f"{diff_method} is an invalid method. The allowed methods are 'instantaneous' and 'cumulative'.")
+
+ return diff
+
+
+def get_median_fullframe_lhs_rhs(cube, lhs_region, rhs_region):
+
+ '''
+ Compute the median in the full-frame image, the user-defined left side region, and the user-defined right side region.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+ Returns
+ -------
+ median_full_frame : array of floats
+ The median signal of the full frame of each read, clipped by 5 pixels around the border to exclude any bad pixel regions.
+
+ median_lhs : array of floats
+ The median signal of the left side of each read.
+
+ median_rhs : array of floats
+ The median signal of the right side of each read.
+ '''
+
+
+ median_full_frame = np.nanmedian(cube[5:-5,5:-5,:], axis = (0,1))
+ median_lhs = np.nanmedian(cube[lhs_region['y0']:lhs_region['y1'],
+ lhs_region['x0']:lhs_region['x1'],:], axis = (0,1))
+ median_rhs = np.nanmedian(cube[rhs_region['y0']:rhs_region['y1'],
+ rhs_region['x0']:rhs_region['x1'],:], axis = (0,1))
+
+
+ return median_full_frame, median_lhs, median_rhs
+
+def get_std_fullframe_lhs_rhs(cube, lhs_region, rhs_region):
+
+ '''
+ Compute the standard deviation of the signal in the full-frame image, the user-defined left side region,
+ and the user-defined right side region.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+
+ Returns
+ -------
+ standard_dev_fullframe : array of floats
+ The standard deviation of the signal of the full frame of each read, clipped by 5 pixels around the border to exclude any bad pixel regions.
+
+ standard_dev_lhs : array of floats
+ The standard deviation of the signal of the left side of each read.
+
+ standard_dev_rhs : array of floats
+ The standard deviation of the signal of the right side of each read.
+ '''
+
+
+ standard_dev_fullframe = np.nanstd(cube[5:-5,5:-5,:], axis = (0,1))
+ standard_dev_lhs = np.nanstd(cube[lhs_region['y0']:lhs_region['y1'],
+ lhs_region['x0']:lhs_region['x1'],:], axis = (0,1))
+ standard_dev_rhs = np.nanstd(cube[rhs_region['y0']:rhs_region['y1'],
+ rhs_region['x0']:rhs_region['x1'],:], axis = (0,1))
+
+
+ return standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs
+
+
+def plot_ramp(ima, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs):
+
+ '''
+ Plots the signal accumulation ramp of an IMA image. Each point is the median signal (in e-/s) of
+ the difference between subsequent reads. The median signal difference is plotted for the full
+ frame image, and the left and right sides.
+
+ Parameters
+ -----------
+ ima: str
+ Name of the IMA file.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ median_diff_full_frame: array-like
+ The median difference in signal between each full-frame read.
+
+ median_diff_lhs: array-like
+ The median difference in signal between the left side of each read.
+
+ median_diff_rhs: array-like
+ The median difference in signal between the right side of each read.
+ '''
+
+ plt.plot(integ_time[2:], median_diff_fullframe[1:], 's', markersize = 25, label = 'Full Frame', color = 'black')
+ plt.plot(integ_time[2:], median_diff_lhs[1:], '<', markersize = 20, label = 'LHS', color = 'orange')
+ plt.plot(integ_time[2:], median_diff_rhs[1:], '>', markersize = 20, label = 'RHS', color = 'green')
+ ax = plt.gca()
+ for spine in ['top', 'bottom', 'left', 'right']: ax.spines[spine].set_visible(False)
+ plt.grid()
+ plt.xlabel('SAMPTIME [s]')
+ plt.ylabel('$\mu$ [e-/s]')
+ plt.legend(loc = 0)
+ plt.title(ima)
+
+
+def panel_plot(cube, integ_time, median_diff_full_frame, median_diff_lhs, median_diff_rhs,
+ standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs, diff_method):
+ '''
+ Plot the difference between individual reads of an IMA image file in a
+ panel plot up to 4x4 in size (i.e. SCI[16]-SCI[15], SCI[15]-SCI[14], SCI[14]-SCI[15], etc.).
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ median_diff_full_frame: array-like
+ The median difference in signal between each full-frame read.
+
+ median_diff_lhs: array-like
+ The median difference in signal between the left side of each read.
+
+ median_diff_rhs: array-like
+ The median difference in signal between the right side of each read.
+
+ standard_dev_fullframe : array of floats
+ The standard deviation of the signal of the full frame of each read.
+
+ standard_dev_lhs : array of floats
+ The standard deviation of the signal of the left side of each read.
+
+ standard_dev_rhs : array of floats
+ The standard deviation of the signal of the right side of each read.
+
+ diff_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ Returns:
+ --------
+
+ fig: figure object
+ Panel plot with subplots showing the difference between subsequent IMA reads.
+ Above each panel, we print the median difference $\mu$ in the count rate over the entire image.
+ Below each panel, we list the IMSET difference, along with the time interval between the two IMSETs.
+ The statistics in orange (on the left and right side of each panel) give the median rate and
+ standard deviation of each side of the image, respectively. The value in green 'delta' is the
+ difference between the left and right side of the image.
+ The value in white "Ratio" gives the ratio of the median difference in orange
+ for the left versus the right side.
+ '''
+
+
+ xlabel_list = ["SCI[16-15]","SCI[15-14]","SCI[14-13]","SCI[13-12]","SCI[12-11]",
+ "SCI[11-10]","SCI[10-9]","SCI[9-8]","SCI[8-7]","SCI[[7-6]]","SCI[6-5]",
+ "SCI[5-4]","SCI[4-3]","SCI[3-2]","SCI[2-1]"]
+
+ fig, axarr = plt.subplots(4, 4)
+ fig.set_size_inches(40, 40)
+ fig.set_dpi(40)
+ itime = integ_time[0:-1] - integ_time[1:]
+
+ diff = compute_diff_imas(cube, integ_time, diff_method = diff_method)
+
+
+ for i, ax in enumerate(axarr.reshape(-1)):
+ if (i < cube.shape[-1]-2):
+ i=i+1
+
+ diff_i = diff[:,:,i]
+ vmin,vmax = zscale(diff_i)
+ im = ax.imshow(np.abs(diff_i), cmap='Greys_r', origin='lower',
+ vmin = vmin, vmax = vmax)
+ ax.set_title(f'$\mu = ${median_diff_full_frame[i]:.2f}±{standard_dev_fullframe[i]:.2f} e-/s', fontsize = 30)
+
+ text = ax.text(50, 500, f'{median_diff_lhs[i]:.3f}\n±\n{standard_dev_lhs[i]:.3f}', color='Orange', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(700, 500, f'{median_diff_rhs[i]:.3f}\n±\n{standard_dev_rhs[i]:.3f}', color='Orange', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(200, 900, f'Ratio = {median_diff_lhs[i]/median_diff_rhs[i]:.2f}', color='White', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(300, 300, f'$\Delta = ${median_diff_lhs[i]-median_diff_rhs[i]:.2f}', color='#32CD32', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+
+ cbar = plt.colorbar(im, ax = ax)
+ cbar.ax.tick_params(labelsize = 20)
+
+
+ ax.set_yticklabels([])
+ ax.set_xticklabels([])
+ ax.set_xlabel(f'{xlabel_list[i]}, $\Delta t = ${np.abs(itime[i]):.2f} sec', fontsize = 30)
+
+
+ else:
+
+ ax.set_axis_off()
+
+ return fig
+
+
+def plot_ima_subplots(ima_filename, vmin, vmax):
+ '''
+ Build a simple panel plot of individual IMA reads.
+
+ Parameters
+ ----------
+ ima_filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ vmin: float
+ Minimum magnitude for scaling the data range that the colormap covers.
+
+ vmax: float
+ Maximum magnitude for scaling the data range that the colormap covers.
+ '''
+
+ path, filename = os.path.split(ima_filename)
+
+ cube, integ_time = read_wfc3(ima_filename)
+
+ fig_panel1, axarr = plt.subplots(4, 4)
+ fig_panel1.set_size_inches(40, 40)
+ fig_panel1.set_dpi(40)
+ plt.rcParams.update({'font.size':40})
+ itime = integ_time[0:-1] - integ_time[1:]
+ read_title=np.arange(16,0,-1)
+ for i, ax in enumerate(axarr.reshape(-1)):
+
+ im = ax.imshow(cube[:,:,i], cmap = 'Greys_r', origin = 'lower', vmin = vmin , vmax = vmax)
+
+ cbar=plt.colorbar(im, ax = ax)
+ cbar.ax.tick_params(labelsize = 20)
+ ax.set_title(f'SCI, {read_title[i]}', fontsize = 40)
+ ax.set_yticklabels([])
+ ax.set_xticklabels([])
+
+ _=fig_panel1.suptitle(filename, fontsize = 40)
+ plt.subplots_adjust(bottom = 0.3, right = 0.9, top = 0.95)
+
+
+def plot_ramp_subplots(ima_files, difference_method, ylims, exclude_sources, lhs_region, rhs_region):
+ '''
+ Build a simple figure with subplots of IMA accumulation ramps.
+
+ Parameters
+ ----------
+ ima_files : list of str
+ Paths to RAW full-frame IR image fits files.
+
+ difference_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ ylims: list of floats
+ Two floats, the first detailing the lower y-axis limit, and the second giving the
+ upper y-axis limit.
+
+ exclude_sources: bool
+ Set to True to exclude any sources (such as stars) and isolate the background counts.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+ '''
+
+ fig = plt.figure(figsize = (50, 20))
+ fig
+ rows = 1
+ columns = 2
+
+ subplot_titles = ['scattered', 'nominal']
+
+ for i,ima in enumerate(ima_files):
+
+
+ path, filename = os.path.split(ima)
+ cube, integ_time = read_wfc3(ima)
+
+ if exclude_sources == True:
+ cube[np.abs(cube) > 3] = np.nan
+
+ diff_cube = compute_diff_imas(cube, integ_time, diff_method = difference_method)
+ median_diff_fullframe, median_diff_lhs, median_diff_rhs = get_median_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ ax = fig.add_subplot(rows, columns, i+1)
+ plot_ramp(ima, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs)
+ ax.set_ylim(ylims[0],ylims[1])
+
+ ax.tick_params(axis = "x", labelsize = 30)
+ ax.tick_params(axis = "y", labelsize = 30)
+
+ _=ax.set_title(f'{filename}, {subplot_titles[i]}', fontsize=50)
+
+
+def plot_ima_difference_subplots(ima_filename, difference_method, lhs_region, rhs_region):
+ '''
+ Build a complex panel plot of the difference between individual IMA reads.
+ The median difference $\mu$ in the count rate over the entire image is printed above each panel. Below each panel,
+ The IMSET difference, along with the time interval between the two IMSETs, is printed below.
+ The statistics in orange (on the left and right side of each panel) give the median rate and
+ standard deviation of each side of the image, respectively. The value in green 'delta' is the
+ difference between the left and right side of the image. The value in white "Ratio" gives the
+ ratio of the median difference in orange for the left versus the right side.
+
+ Parameters
+ ----------
+ ima_filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ difference_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+ '''
+
+ path,filename = os.path.split(ima_filename)
+
+ cube, integ_time = read_wfc3(ima_filename)
+
+ median_fullframe, median_lhs, median_rhs = get_median_fullframe_lhs_rhs(cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ diff_cube = compute_diff_imas(cube, integ_time, diff_method = difference_method)
+
+ median_diff_fullframe, median_diff_lhs, median_diff_rhs = get_median_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+ standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs = get_std_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ fig_0 = panel_plot(cube, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs, standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs, diff_method = difference_method)
+ _=fig_0.suptitle(filename, fontsize = 40)
+ plt.subplots_adjust(bottom = 0.25, right = 0.9, top = 0.95)
+
diff --git a/notebooks/WFC3/ir_ima_visualization/instantaneous_diff.png b/notebooks/WFC3/ir_ima_visualization/instantaneous_diff.png
new file mode 100644
index 000000000..0c2285a6e
Binary files /dev/null and b/notebooks/WFC3/ir_ima_visualization/instantaneous_diff.png differ
diff --git a/notebooks/WFC3/ir_ima_visualization/ir_data_format.png b/notebooks/WFC3/ir_ima_visualization/ir_data_format.png
new file mode 100644
index 000000000..aece92512
Binary files /dev/null and b/notebooks/WFC3/ir_ima_visualization/ir_data_format.png differ
diff --git a/notebooks/WFC3/ir_ima_visualization/requirements.txt b/notebooks/WFC3/ir_ima_visualization/requirements.txt
new file mode 100644
index 000000000..6de0ed093
--- /dev/null
+++ b/notebooks/WFC3/ir_ima_visualization/requirements.txt
@@ -0,0 +1,5 @@
+astropy==5.2.1
+astroquery==0.4.6
+ginga==4.1.1
+matplotlib==3.7.0
+numpy==1.23.4
diff --git a/notebooks/WFC3/ir_scattered_light_calwf3_corrections/Correcting_for_Scattered_Light_in_IR_Exposures_Using_calwf3_to_Mask_Bad_Reads.ipynb b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/Correcting_for_Scattered_Light_in_IR_Exposures_Using_calwf3_to_Mask_Bad_Reads.ipynb
new file mode 100644
index 000000000..666dff9a5
--- /dev/null
+++ b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/Correcting_for_Scattered_Light_in_IR_Exposures_Using_calwf3_to_Mask_Bad_Reads.ipynb
@@ -0,0 +1,724 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Correcting for Scattered Light in WFC3/IR Exposures: Using `calwf3` to Mask Bad Reads\n",
+ "\n",
+ "\n",
+ "## Learning Goals\n",
+ "\n",
+ "This notebook shows one of two available methods to correct for time-variable background \n",
+ "(TVB) due to scattered light from observing close to the Earth's limb. This method illustrates how to mask bad reads in the RAW image and then reprocess with `calwf3`, and it may be used for rejecting anomalous reads occurring either at the beginning or at the end of an exposure.\n",
+ "\n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "\n",
+ "- Compute and plot the difference between IMA reads to identify the reads affected by TVB. \n",
+ "- Reprocess a single exposure with `calwf3` by excluding the first few reads which are affected by scattered light.\n",
+ "- Compare the original FLT to the reprocessed FLT image.\n",
+ "- Compare the original DRZ to the reprocessed DRZ image.\n",
+ "\n",
+ "A second method (manually subtracting bad reads from the final IMA read) can \n",
+ "be found in the notebook [Correcting for Scattered Light in WFC3/IR Exposures: Manually Subtracting Bad Reads (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_scattered_light_manual_corrections). This provides a method for removing anomalies such as satellite trails which appear in the middle of an IMA exposure. One caveat of the second method is that it does not perform the 'ramp fitting' step and therefore the calibrated FLT products will still contain cosmic rays. \n",
+ "\n",
+ "\n",
+ "\n",
+ "**Please note that this method may leave large sky residuals in regions \n",
+ "corresponding to WFC3/IR 'blobs', flagged in the FLT data quality (DQ) array as a value of 512. This method is therefore recommended for observations acquired using an WFC3-IR-DITHER-BLOB dither (or POSTARG equivalent) to step over blob regions. Software such\n",
+ "as AstroDrizzle may then be used to combine the FLT exposures, while excluding pixels \n",
+ "with 512 flags (or any bit-wise combination of 512 and another flag e.g. 576 = 512 + 64).**\n",
+ "\n",
+ "
\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#import)
\n",
+ "[2. Downloading Data](#load)
\n",
+ "[3. Identifying Reads with Time Variable Background](#identify)
\n",
+ "[4. Querying CRDS for the Reference File](#ref)
\n",
+ "[5. Reprocessing the Observation](#main)
\n",
+ "- [5.1 Re-running `calwf3`](#reprocess)
\n",
+ "- [5.2 Comparing FLT Products](#compare)
\n",
+ "\n",
+ "[6. Drizzling Nominal and Reprocessed FLT Products](#drizzle)
\n",
+ "[7. Conclusions](#conclusions)
\n",
+ "[Additional Resources](#add)
\n",
+ "[About this Notebook](#about)
\n",
+ "[Citations](#cite)
\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Introduction \n",
+ "\n",
+ "Observations with strong time variability in the sky background during a MULTIACCUM ramp can corrupt the WFC3 `calwf3` 'linear ramp fit' and cosmic-ray identification algorithm (CRCORR, [Section 3.3.10 of the Data Handbook](https://hst-docs.stsci.edu/wfc3dhb/chapter-3-wfc3-data-calibration/3-3-ir-data-calibration-steps#id-3.3IRDataCalibrationSteps-3.3.10)). The CRCORR \n",
+ "algorithm assumes that a given pixel sees a constant count rate throughout the read from a \n",
+ "combination of sources and diffuse background (i.e., the integrated signal \"ramps\" are linear). A background \n",
+ "varying strongly with time (i.e. where the \"ramps\" are non-linear) can trigger the cosmic-ray \n",
+ "(CR) flagging thresholds in `calwf3`, causing the algorithm to identify most or all of the pixels as a CR at any given read.\n",
+ "\n",
+ "In this notebook we will examine an observation affected by strong TVB, \n",
+ "specifically due to Earth limb scattered light ([Section 7.10 of the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb/chapter-7-wfc3-ir-sources-of-error/7-10-time-variable-background)) affecting the first few reads and producing a spatially variable background. We will run `calwf3` while rejecting the affected reads to create an improved FLT product with a flat background and an improved ramp fit. One caveat is that the new FLT will \n",
+ "have a reduced total exposure time, given the rejection of some number of reads, and \n",
+ "therefore a lower signal-to-noise ratio.\n",
+ "\n",
+ "Please see the notebook [WFC3/IR IMA Visualization with An Example of Time Variable Background (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_ima_visualization) for a walkthrough of how to identify a TVB in due to scattered light. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 1. Imports \n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "\n",
+ "- *os* for setting environment variables\n",
+ "- *glob* for finding lists of files\n",
+ "- *shutil* for managing directories\n",
+ "- *numpy* for handling array functions\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *astropy.io fits* for accessing FITS files\n",
+ "- *astroquery.mast Observations* for downloading data\n",
+ "- *wfc3tools* `calwf3` for calibrating WFC3 data\n",
+ "- *ginga* for finding min/max outlier pixels\n",
+ "- *stwcs* for updating World Coordinate System images\n",
+ "- *drizzlepac* for combining images with AstroDrizzle \n",
+ "\n",
+ "We import the following modules:\n",
+ "- *ima_visualization_and_differencing* to take the difference between reads, plot the ramp, and visualize the difference in images\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os \n",
+ "import glob\n",
+ "import shutil \n",
+ "import numpy as np\n",
+ "from matplotlib import pyplot as plt\n",
+ "from astropy.io import fits\n",
+ "from astroquery.mast import Observations\n",
+ "from wfc3tools import calwf3\n",
+ "from ginga.util.zscale import zscale\n",
+ "from stwcs import updatewcs\n",
+ "from drizzlepac import astrodrizzle\n",
+ "\n",
+ "import ima_visualization_and_differencing as diff\n",
+ "\n",
+ "%matplotlib inline\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2. Downloading Data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The following commands query MAST for the necessary data products and download them to the current directory. Here we obtain WFC3/IR observations from HST Frontier Fields program [14037](https://archive.stsci.edu/proposal_search.php?id=14037&mission=hst), Visit BB. We specifically want the observation `icqtbbbxq`, as it is strongly affected by Earth limb scattered light. The data products requested are the RAW, IMA, and FLT files. For an example of TVB at the end of an exposure, we include an alternate dataset (OBS_ID = `ICXT27020`, file_id = `icxt27hkq`) in which the Earth limb affects the reads at the end of the MULTIACCUM sequence (SCI,1 through SCI,5). \n",
+ "\n",
+ "**Warning: this cell may take a few minutes to complete.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "OBS_ID = 'ICQTBB020' #Earth-limb at the start \n",
+ "#OBS_ID = 'ICXT27020' #Earth-limb at the end \n",
+ "data_list = Observations.query_criteria(obs_id=OBS_ID)\n",
+ "\n",
+ "file_id = \"icqtbbbxq\"\n",
+ "#file_id = 'icxt27hkq'\n",
+ "Observations.download_products(data_list['obsid'], project='CALWF3', obs_id=file_id, \n",
+ " mrp_only=False, productSubGroupDescription=['RAW', 'IMA', 'FLT'])\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, we will move our IMA and FLT files to a separate directory called \"orig/\" so they are not overwritten when we run `calwf3`. We leave our RAW file in the working directory for later use."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if not os.path.exists('orig/'):\n",
+ " os.mkdir('orig/')\n",
+ "\n",
+ "shutil.copy(f'mastDownload/HST/{file_id}/{file_id}_ima.fits', f'orig/{file_id}_ima.fits')\n",
+ "shutil.copy(f'mastDownload/HST/{file_id}/{file_id}_flt.fits', f'orig/{file_id}_flt.fits') \n",
+ "\n",
+ "raw_file = f'mastDownload/HST/{file_id}/{file_id}_raw.fits'\n",
+ "\n",
+ "remove_files_list=glob.glob(f'./{file_id}_*.fits')\n",
+ "for rm_file in remove_files_list:\n",
+ " os.remove(rm_file)\n",
+ "\n",
+ "shutil.copy(raw_file, f'{file_id}_raw.fits')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 3. Identifying Reads with Time Variable Background"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this section, we show how to identify the reads impacted by TVB by examining the difference in count rate between reads. This section was taken from the [WFC3/IR IMA Visualization with An Example of Time Variable Background (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_ima_visualization) notebook, which includes a more comprehensive walkthrough of identifying time variable background in WFC3/IR images. \n",
+ "\n",
+ "Here we implement a technique to examine the count rate difference between consecutive reads. In this case, we first convert from count rate (electrons/second) back to counts (electrons) before taking the difference, as shown in equation 3 from [WFC3 ISR 2018-05](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2018/WFC3-2018-05.pdf). \n",
+ "\n",
+ "![Instantaneous Difference Equation](instantaneous_diff.png)\n",
+ "\n",
+ "We compare sky values in different regions of the detector (left side, right side, and full frame). If you would like to specify your own regions for the left and right sides of your image, you can change the `lhs_region` and `rhs_region` parameters. Each region must be specified as a dictionary including the four \"corners\" (x0, x1, y0, and y1) of the region you would like to select. You may want to avoid the edges of the detector which have a large number of bad pixels and higher flat field errors."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize = (20, 10))\n",
+ "\n",
+ "ima_filepath = f'orig/{file_id}_ima.fits'\n",
+ "\n",
+ "path, filename = os.path.split(ima_filepath)\n",
+ "cube, integ_time = diff.read_wfc3(ima_filepath)\n",
+ "\n",
+ "\n",
+ "lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ "rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ "\n",
+ "#Please use a limit that makes sense for your own data, when running your images through this notebook.\n",
+ "cube[np.abs(cube) > 3] = np.nan\n",
+ "\n",
+ "diff_cube = diff.compute_diff_imas(cube, integ_time, diff_method = \"instantaneous\")\n",
+ "median_diff_fullframe, median_diff_lhs, median_diff_rhs = diff.get_median_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)\n",
+ "\n",
+ "plt.rc('xtick', labelsize = 20) \n",
+ "plt.rc('ytick', labelsize = 20) \n",
+ "plt.rcParams.update({'font.size': 30})\n",
+ "plt.rcParams.update({'lines.markersize': 15})\n",
+ "\n",
+ "diff.plot_ramp(ima_filepath, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs)\n",
+ "\n",
+ "plt.ylim(0.5,2.5)\n",
+ "_ = plt.title(filename)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here, we utilize a few functions from our module `ima_visualization_and_differencing`. We use `read_wfc3` to grab the IMA data from all reads and corresponding integration times. We also implement upper and lower limits on our pixel values to exclude sources when plotting our ramp. We take the instantaneous difference using `compute_diff_imas`, which computes the difference as described in the equation above. Finally, we use `plot_ramp` to plot the median count rate from the left side, right side, and full frame image."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "For our scattered light exposure, we see zodiacal light at a level of ~0.9e-/s in later reads, with the scattered light component affecting the first several reads where the median count rate for the left side (orange triangles) is larger than the right side (green triangles). We can visualize this in 2 dimensions in the panel plot below, using the `plot_ima_difference_subplots`. \n",
+ "\n",
+ "In the panel plot, we see that sources (small galaxies) are visible in the difference images using this new method. Note that this may complicate the analysis of the spatial background (e.g. left versus right) for images with extended targets, such as large galaxies. In this case, users may wish to adjust the regions of the detector used for the ramp plots. We therefore recommend inspecting both the panel plots as well as the ramp fits for diagnosing any issues with the data. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize = (20, 10))\n",
+ "\n",
+ "ima_filepath = f'orig/{file_id}_ima.fits'\n",
+ "\n",
+ "lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ "rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ "\n",
+ "diff.plot_ima_difference_subplots(ima_filepath, difference_method='instantaneous', lhs_region=lhs_region, rhs_region=rhs_region)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this figure, we see that the ratio of instantaneous rate for the left versus right side of the image is ~1.0 for all but the first few reads (which are affected by scattered light). We choose to exclude reads with a ratio greater than 1.1 from the exposure and reprocess the image with `calwf3`. While this reduces the total exposure from 1403 to 1000 seconds, it removes the spatial component from the sky background and allows for a more accurate 'up-the-ramp' fit with `calwf3`."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 4. Querying CRDS for the Reference File"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Before running `calwf3`, we need to set some environment variables.\n",
+ "\n",
+ "We will point to a subdirectory called `crds_cache` using the IREF environment variable, which is used for WFC3 reference files. Other instruments use other variables, e.g., JREF for ACS."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "os.environ['CRDS_SERVER_URL'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_SERVER'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_PATH'] = './crds_cache'\n",
+ "os.environ['iref'] = './crds_cache/references/hst/wfc3/'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The code block below will query CRDS for the best reference files currently available for our dataset and update the header keywords to point to these new files. We will use the Python package `os` to run terminal commands. In the terminal, the line would be:"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "crds bestrefs --files [filename] --sync-references=1 --update-bestrefs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "...where 'filename' is the name of your fits file.\n",
+ "\n",
+ "\n",
+ "**Warning: this cell may take a few minutes to complete.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "raw_file = f'{file_id}_raw.fits'\n",
+ "\n",
+ "\n",
+ "print( f\"Querying CRDS for the reference file associated with {raw_file}.\")\n",
+ "command_line_input = 'crds bestrefs --files {:} --sync-references=1 --update-bestrefs'.format(raw_file)\n",
+ "os.system(command_line_input)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 5. Reprocessing the Observation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As discussed in the [introduction](#intro) to this notebook, the accuracy of the ramp fit performed during the CRCORR cosmic-ray rejection step of the pipeline determines the quality of the calibrated WFC3/IR FLT data products. Given that a time variable background can compromise the quality of the ramp fit, observations affected by TVB will likely result in poor-quality calibrated FLT images (see the Appendix of [WFC3 ISR 2021-01](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/2021-01.pdf)).\n",
+ "\n",
+ "To address poorly calibrated FLT images where some reads are affected by scattered light TVB (as in our example observation), we can remove these reads and re-run `calwf3` to produce cleaner FLT images. We choose to exclude reads where the ratio of background signal is greater than 1.1 e-/s (see the notebook [WFC3/IR IMA Visualization with An Example of Time Variable Background (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_ima_visualization) for a more complete demonstration of how we find this ratio).\n",
+ "\n",
+ "The following reprocessing example is replacing section [7.10.1 of the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb/chapter-7-wfc3-ir-sources-of-error/7-10-time-variable-background). "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 5.1 Re-running `calwf3` "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Below, we select our excluded reads (in this case reads 11-15), which are at the beginning of the exposure. We set the DQ value to 1024 for these reads, prompting `calwf3` to flag all pixels in these reads as bad, effectively rejecting the reads."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "raw_filepath = f'{file_id}_raw.fits'\n",
+ "\n",
+ "# Remove existing products or calwf3 will die\n",
+ "flt_filepath = raw_filepath.replace('raw', 'flt')\n",
+ "ima_filepath = raw_filepath.replace('raw', 'ima')\n",
+ "for filepath in [flt_filepath, ima_filepath]:\n",
+ " if os.path.exists(filepath):\n",
+ " os.remove(filepath)\n",
+ "\n",
+ "reads = np.arange(11,16) #numpy arange creates an array including the start value (11) but excluding the stop value (16), so the array is actually 11-15. \n",
+ "for read in reads:\n",
+ " fits.setval(raw_filepath, extver=read, extname='DQ', keyword='pixvalue', value=1024)\n",
+ "\n",
+ "calwf3(raw_filepath)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 5.2 Comparing FLT Products "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Please move your reprocessed images to a new directory with a different name each time you run this notebook."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "reprocessed_flt = f'{file_id}_flt.fits'\n",
+ "reprocessed_ima = f'{file_id}_ima.fits'\n",
+ "original_flt = f'orig/{file_id}_flt.fits'\n",
+ "original_ima = f'orig/{file_id}_ima.fits'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, we can compare our original and reprocessed FLT products."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "image_new = fits.getdata(reprocessed_flt)\n",
+ "image_old = fits.getdata(original_flt)\n",
+ "\n",
+ "fig = plt.figure(figsize=(20, 7))\n",
+ "fig\n",
+ "rows = 1\n",
+ "columns = 2\n",
+ "\n",
+ "#add the total exptime in the title \n",
+ "ax1 = fig.add_subplot(rows, columns, 1)\n",
+ "ax1.set_title(\"Reprocessed FLT image\", fontsize=20)\n",
+ "im1 = plt.imshow(image_new, vmin=0.8, vmax=1.3, origin='lower', cmap='Greys_r')\n",
+ "ax1.tick_params(axis='both', labelsize = 10)\n",
+ "cbar1 = plt.colorbar(im1, ax=ax1)\n",
+ "cbar1.ax.tick_params(labelsize=10)\n",
+ "\n",
+ "\n",
+ "ax2 = fig.add_subplot(rows,columns,2)\n",
+ "ax2.set_title(\"Original FLT image\", fontsize=20)\n",
+ "im2 = plt.imshow(image_old, vmin=0.8, vmax=1.3, origin='lower', cmap='Greys_r')\n",
+ "ax2.tick_params(axis='both', labelsize=10)\n",
+ "cbar2 = plt.colorbar(im2, ax=ax2)\n",
+ "cbar2.ax.tick_params(labelsize=10)\n",
+ "\n",
+ "plt.rc('xtick', labelsize=10) \n",
+ "plt.rc('ytick', labelsize=10) \n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This new image was produced by `calwf3` after masking the first 5 reads (not including the zero read) in the RAW file, reducing the effective exposure time from 1403 to 1000 seconds. While the total exposure is reduced from 1403 seconds to 1000 seconds (thus decreasing the overall S/N of the image), the background in the reprocessed image is now uniform over the entire field of view. We can see that the new FLT image is free of the Earth limb scattered light visible in the old FLT image. \n",
+ "\n",
+ "Finally, note that the reprocessed FLT product now includes a larger sky background in science pixels corresponding to IR \"blobs\", regions of reduced sensitivity due particulate matter on the channel selection mechanism (CSM) mirror ([section 7.5 of the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb/chapter-7-wfc3-ir-sources-of-error/7-5-blobs)). \n",
+ "\n",
+ "The method for correcting WFC3/IR images described in the notebook [Correcting for Scattered Light in WFC3/IR Exposures: Manually Subtracting Bad Reads (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_scattered_light_manual_corrections) provides FLT products without blobs, but that do include cosmic rays.\n",
+ "\n",
+ "We update the FLT header keywords \"EXPTIME\" (in the primary header) and \"SAMPTIME\" (in the science header) to reflect the new total exposure time."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "image_new = fits.open(reprocessed_flt, mode ='update')\n",
+ "\n",
+ "ima_orig = fits.open(original_ima)\n",
+ " \n",
+ "hdr = ima_orig[0].header\n",
+ "NSAMP = hdr['NSAMP']\n",
+ "hdr1 = ima_orig[1].header\n",
+ "integ_time = np.zeros(shape=(NSAMP))\n",
+ "for i in range(1, NSAMP+1):\n",
+ " integ_time[i-1] = ima_orig[('TIME', i)].header['PIXVALUE']\n",
+ "integ_time = integ_time[::-1]\n",
+ "\n",
+ "dt = np.diff(integ_time)\n",
+ "\n",
+ "final_time = integ_time[-1]\n",
+ "\n",
+ "if (len(reads) > 0):\n",
+ " for read in reads:\n",
+ " index = len(integ_time)-read-1 #because the reads are stored in reverse order\n",
+ " final_time -= dt[index]\n",
+ " \n",
+ " \n",
+ "print(f'The final exposure time after reprocessing is {final_time}.')\n",
+ "image_new[0].header['EXPTIME'] = final_time\n",
+ "image_new.flush()\n",
+ "image_new.close()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 6. Drizzling Nominal and Reprocessed FLT Products "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In our example we use an exposure (`icqtbbbxq`) from image association `ICQTBB020` acquired in visit BB of program [14037](https://www.stsci.edu/hst/observing/program-information). This visit consists of two orbits of two exposures each, and we now download the three other FLTs in the visit (`icqtbbc0q_flt.fits`, `icqtbbbrq_flt.fits`, `icqtbbbtq_flt.fits`) and the pipeline drizzled DRZ product. \n",
+ "\n",
+ "To produce a clean DRZ image (without blob residuals), we can drizzle the four FLTs together (from the nominal exposures and the reprocessed exposure), replacing pixels flagged as blobs with those from the dithered (nominal) image.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data_list = Observations.query_criteria(obs_id=OBS_ID)\n",
+ "\n",
+ "Observations.download_products(data_list['obsid'], project='CALWF3', \n",
+ " mrp_only=False, productSubGroupDescription=['FLT','DRZ'])\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "nominal_file_ids = [\"icqtbbc0q\", \"icqtbbbrq\", \"icqtbbbtq\"]\n",
+ "#nominal_file_ids = [\"icxt27hoq\"]\n",
+ "nominal_list = []\n",
+ "for nominal_file_id in nominal_file_ids:\n",
+ " shutil.copy(f'mastDownload/HST/{nominal_file_id}/{nominal_file_id}_flt.fits', f'{nominal_file_id}_flt.fits')\n",
+ " nominal_list.append(f'{nominal_file_id}_flt.fits')\n",
+ "print(nominal_list)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we update the image World Coordinate System of the reprocessed image in preparation for drizzling."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "updatewcs.updatewcs(reprocessed_flt, use_db=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally, we combine the four FLT images with AstroDrizzle while exluding pixels flagged as blobs and replacing those pixels with those from dithered frames."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "astrodrizzle.AstroDrizzle('icqtbb*flt.fits', output='f140w', preserve=False, build=False, context=False, skymethod='match', driz_separate=False, median=False, blot=False, driz_cr=False, final_bits='16')\n",
+ "#astrodrizzle.AstroDrizzle('icxt27*flt.fits', output='f105w', preserve=False, build=False, context=False, skymethod='match', driz_separate=False, median=False, blot=False, driz_cr=False, final_bits='16')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Comparing the new DRZ image made with the reprocessed FLT product against the original pipeline DRZ image, we see that the new DRZ image no longer includes scattered light but has a slightly lower S/N due the reduced total exposure time from 1403 to 1000 seconds. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "DRZ_image = fits.open(\"f140w_drz_sci.fits\")\n",
+ "Orig_DRZ = fits.open('mastDownload/HST/icqtbb020/icqtbb020_drz.fits')\n",
+ "\n",
+ "#DRZ_image = fits.getdata(\"f105w_drz_sci.fits\")\n",
+ "#Orig_DRZ = fits.getdata('mastDownload/HST/icxt27020/icxt27020_drz.fits')\n",
+ "\n",
+ "fig = plt.figure(figsize=(20,10))\n",
+ "rows = 1\n",
+ "columns = 2\n",
+ "\n",
+ "\n",
+ "ax1 = fig.add_subplot(rows, columns, 1)\n",
+ "ax1.set_title(\"Reprocessed DRZ Image\", fontsize=20)\n",
+ "vmin,vmax = zscale(Orig_DRZ[1].data)\n",
+ "im1 = plt.imshow(DRZ_image[0].data, vmin=vmin, vmax=vmax, origin='lower', cmap='Greys_r')\n",
+ "_= plt.colorbar()\n",
+ "\n",
+ "ax2 = fig.add_subplot(rows, columns, 2)\n",
+ "ax2.set_title(\"Original Pipeline DRZ Image\", fontsize=20)\n",
+ "im2 = plt.imshow(Orig_DRZ[1].data, vmin=vmin, vmax=vmax, origin='lower', cmap='Greys_r')\n",
+ "_= plt.colorbar()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 7. Conclusions \n",
+ "\n",
+ "**Congratulations, you have completed the notebook.**\n",
+ "\n",
+ "You should now be familiar with how to reprocess an observation affected by Earth limb scattered light by removing the first few reads and rerunning `calwf3`.\n",
+ "\n",
+ "Thank you for following along! "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Additional Resources \n",
+ "\n",
+ "\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Help Desk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ " - [WFC3/UVIS CTE Website](https://www.stsci.edu/hst/instrumentation/wfc3/performance/cte)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ "- [Instrument Science Report WFC3 2021-01](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/2021-01.pdf)\n",
+ "\n",
+ "## About this Notebook \n",
+ "\n",
+ "\n",
+ "**Author:** Anne O'Connor, Jennifer Mack, Annalisa Calamida, Harish Khandrika -- WFC3 Instrument\n",
+ "\n",
+ "**Updated On:** 2023-05-25\n",
+ "\n",
+ "## Citations \n",
+ "\n",
+ "If you use the following tools for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the tools:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://astroquery.readthedocs.io/en/latest/)\n",
+ "* [Citing `wfc3tools`](https://wfc3tools.readthedocs.io/en/latest/)\n",
+ "* [Citing `drizzlepac`](https://drizzlepac.readthedocs.io/en/latest/LICENSE.html)\n",
+ "\n",
+ "\n",
+ "If you use this notebook, or information from the WFC3 Data Handbook, Instrument Handbook,\n",
+ "or WFC3 ISRs for published research, please cite them:\n",
+ "\n",
+ "* [Citing the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb#:~:text=Citation,%2C%20(Baltimore%3A%20STScI).)\n",
+ "* [Citing the WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb#:~:text=Citation,14.0%E2%80%9D%20(Baltimore%3A%20STScI))\n",
+ "* [Instrument Science Report WFC3 2021-01](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/2021-01.pdf)\n",
+ "* Citing this notebook:\n",
+ " Please cite the primary author and year, and hyperlink the notebook or WFC3 Library\n",
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "[Top of Page](#top)\n",
+ " "
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/WFC3/ir_scattered_light_calwf3_corrections/README.md b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/README.md
new file mode 100644
index 000000000..616a58ac6
--- /dev/null
+++ b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/README.md
@@ -0,0 +1,10 @@
+This notebook shows one of two available methods to correct for time-variable background (TVB) due to scattered light from observing close to the Earth's limb. This method illustrates how to mask bad reads in the RAW image and then reprocess with calwf3, and it may be used for rejecting anomalous reads occurring either at the beginning or at the end of an exposure.
+
+This tutorial is a walkthrough of the following:
+
+- Computing and plot the difference between IMA reads to identify the reads affected by TVB.
+- Reprocessing a single exposure with calwf3 by excluding the first few reads which are affected by scattered light.
+- Comparing the original FLT to the reprocessed FLT image.
+
+Installation Instructions:
+- Please refer to the instructions found on the main [WFC3 Library GitHub page](https://github.com/spacetelescope/WFC3Library). No other installations are required.
\ No newline at end of file
diff --git a/notebooks/WFC3/ir_scattered_light_calwf3_corrections/ima_visualization_and_differencing.py b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/ima_visualization_and_differencing.py
new file mode 100644
index 000000000..62f6ee235
--- /dev/null
+++ b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/ima_visualization_and_differencing.py
@@ -0,0 +1,446 @@
+import os
+import numpy as np
+from astropy.io import fits
+import matplotlib.pyplot as plt
+from ginga.util.zscale import zscale
+import matplotlib.patheffects as path_effects
+
+def read_wfc3(filename):
+ '''
+ Read a full-frame IR image and return the datacube plus integration times for each read.
+ Requires the path to a RAW full-frame IR image fits file (filename).
+
+ Parameters
+ ----------
+ filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ Returns
+ -------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+ '''
+
+ with fits.open(filename) as f:
+ hdr = f[0].header
+ NSAMP = hdr['NSAMP']
+ hdr1 = f[1].header
+ cube = np.zeros((hdr1['NAXIS1'],hdr1['NAXIS2'],NSAMP), dtype = float)
+ integ_time = np.zeros(shape = (NSAMP))
+
+ for i in range(1, NSAMP+1):
+ cube[:,:,i-1] = f[('SCI', i)].data
+ integ_time[i-1] = f[('TIME', i)].header['PIXVALUE']
+
+ cube = cube[:,:,::-1]
+ integ_time = integ_time[::-1]
+ return cube, integ_time
+
+
+
+def compute_diff_imas(cube, integ_time, diff_method):
+
+ '''
+ Compute the difference in signal between reads of a WFC3 IR IMA file.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ diff_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ Returns
+ --------
+ diff : array-like
+ 1024x1024x(NSAMP-1) datacube of the differebce between IR IMA reads in ascending time order,
+ where NSAMP is the number of samples taken.
+ '''
+
+ if diff_method == 'instantaneous':
+ ima_j = cube[:, :, 1:]
+ ima_j_1 = cube[:,:,0:-1]
+ t_0 = integ_time[0]
+ t_j = integ_time[1:]
+ t_j_1 = integ_time[0:-1]
+
+ diff = ((ima_j*(t_j-t_0))-(ima_j_1*(t_j_1-t_0)))/(t_j-t_j_1)
+
+ elif diff_method == 'cumulative':
+ diff = cube[:,:,0:-1] - cube[:,:,1:]
+
+ else: # if an incorrect method is chosen raise an error
+ raise ValueError(f"{diff_method} is an invalid method. The allowed methods are 'instantaneous' and 'cumulative'.")
+
+ return diff
+
+
+def get_median_fullframe_lhs_rhs(cube, lhs_region, rhs_region):
+
+ '''
+ Compute the median in the full-frame image, the user-defined left side region, and the user-defined right side region.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+ Returns
+ -------
+ median_full_frame : array of floats
+ The median signal of the full frame of each read, clipped by 5 pixels around the border to exclude any bad pixel regions.
+
+ median_lhs : array of floats
+ The median signal of the left side of each read.
+
+ median_rhs : array of floats
+ The median signal of the right side of each read.
+ '''
+
+
+ median_full_frame = np.nanmedian(cube[5:-5,5:-5,:], axis = (0,1))
+ median_lhs = np.nanmedian(cube[lhs_region['y0']:lhs_region['y1'],
+ lhs_region['x0']:lhs_region['x1'],:], axis = (0,1))
+ median_rhs = np.nanmedian(cube[rhs_region['y0']:rhs_region['y1'],
+ rhs_region['x0']:rhs_region['x1'],:], axis = (0,1))
+
+
+ return median_full_frame, median_lhs, median_rhs
+
+def get_std_fullframe_lhs_rhs(cube, lhs_region, rhs_region):
+
+ '''
+ Compute the standard deviation of the signal in the full-frame image, the user-defined left side region,
+ and the user-defined right side region.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+
+ Returns
+ -------
+ standard_dev_fullframe : array of floats
+ The standard deviation of the signal of the full frame of each read, clipped by 5 pixels around the border to exclude any bad pixel regions.
+
+ standard_dev_lhs : array of floats
+ The standard deviation of the signal of the left side of each read.
+
+ standard_dev_rhs : array of floats
+ The standard deviation of the signal of the right side of each read.
+ '''
+
+
+ standard_dev_fullframe = np.nanstd(cube[5:-5,5:-5,:], axis = (0,1))
+ standard_dev_lhs = np.nanstd(cube[lhs_region['y0']:lhs_region['y1'],
+ lhs_region['x0']:lhs_region['x1'],:], axis = (0,1))
+ standard_dev_rhs = np.nanstd(cube[rhs_region['y0']:rhs_region['y1'],
+ rhs_region['x0']:rhs_region['x1'],:], axis = (0,1))
+
+
+ return standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs
+
+
+def plot_ramp(ima, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs):
+
+ '''
+ Plots the signal accumulation ramp of an IMA image. Each point is the median signal (in e-/s) of
+ the difference between subsequent reads. The median signal difference is plotted for the full
+ frame image, and the left and right sides.
+
+ Parameters
+ -----------
+ ima: str
+ Name of the IMA file.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ median_diff_full_frame: array-like
+ The median difference in signal between each full-frame read.
+
+ median_diff_lhs: array-like
+ The median difference in signal between the left side of each read.
+
+ median_diff_rhs: array-like
+ The median difference in signal between the right side of each read.
+ '''
+
+ plt.plot(integ_time[2:], median_diff_fullframe[1:], 's', markersize = 25, label = 'Full Frame', color = 'black')
+ plt.plot(integ_time[2:], median_diff_lhs[1:], '<', markersize = 20, label = 'LHS', color = 'orange')
+ plt.plot(integ_time[2:], median_diff_rhs[1:], '>', markersize = 20, label = 'RHS', color = 'green')
+ ax = plt.gca()
+ for spine in ['top', 'bottom', 'left', 'right']: ax.spines[spine].set_visible(False)
+ plt.grid()
+ plt.xlabel('SAMPTIME [s]')
+ plt.ylabel('$\mu$ [e-/s]')
+ plt.legend(loc = 0)
+ plt.title(ima)
+
+
+def panel_plot(cube, integ_time, median_diff_full_frame, median_diff_lhs, median_diff_rhs,
+ standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs, diff_method):
+ '''
+ Plot the difference between individual reads of an IMA image file in a
+ panel plot up to 4x4 in size (i.e. SCI[16]-SCI[15], SCI[15]-SCI[14], SCI[14]-SCI[15], etc.).
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ median_diff_full_frame: array-like
+ The median difference in signal between each full-frame read.
+
+ median_diff_lhs: array-like
+ The median difference in signal between the left side of each read.
+
+ median_diff_rhs: array-like
+ The median difference in signal between the right side of each read.
+
+ standard_dev_fullframe : array of floats
+ The standard deviation of the signal of the full frame of each read.
+
+ standard_dev_lhs : array of floats
+ The standard deviation of the signal of the left side of each read.
+
+ standard_dev_rhs : array of floats
+ The standard deviation of the signal of the right side of each read.
+
+ diff_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ Returns:
+ --------
+
+ fig: figure object
+ Panel plot with subplots showing the difference between subsequent IMA reads.
+ Above each panel, we print the median difference $\mu$ in the count rate over the entire image.
+ Below each panel, we list the IMSET difference, along with the time interval between the two IMSETs.
+ The statistics in orange (on the left and right side of each panel) give the median rate and
+ standard deviation of each side of the image, respectively. The value in green 'delta' is the
+ difference between the left and right side of the image.
+ The value in white "Ratio" gives the ratio of the median difference in orange
+ for the left versus the right side.
+ '''
+
+
+ xlabel_list = ["SCI[16-15]","SCI[15-14]","SCI[14-13]","SCI[13-12]","SCI[12-11]",
+ "SCI[11-10]","SCI[10-9]","SCI[9-8]","SCI[8-7]","SCI[[7-6]]","SCI[6-5]",
+ "SCI[5-4]","SCI[4-3]","SCI[3-2]","SCI[2-1]"]
+
+ fig, axarr = plt.subplots(4, 4)
+ fig.set_size_inches(40, 40)
+ fig.set_dpi(40)
+ itime = integ_time[0:-1] - integ_time[1:]
+
+ diff = compute_diff_imas(cube, integ_time, diff_method = diff_method)
+
+
+ for i, ax in enumerate(axarr.reshape(-1)):
+ if (i < cube.shape[-1]-2):
+ i=i+1
+
+ diff_i = diff[:,:,i]
+ vmin = 0
+ vmax = 2
+ im = ax.imshow(np.abs(diff_i), cmap='Greys_r', origin='lower',
+ vmin = vmin, vmax = vmax)
+ ax.set_title(f'$\mu = ${median_diff_full_frame[i]:.2f}±{standard_dev_fullframe[i]:.2f} e-/s', fontsize = 30)
+
+ text = ax.text(50, 500, f'{median_diff_lhs[i]:.3f}\n±\n{standard_dev_lhs[i]:.3f}', color='Orange', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(700, 500, f'{median_diff_rhs[i]:.3f}\n±\n{standard_dev_rhs[i]:.3f}', color='Orange', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(200, 900, f'Ratio = {median_diff_lhs[i]/median_diff_rhs[i]:.2f}', color='White', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(300, 300, f'$\Delta = ${median_diff_lhs[i]-median_diff_rhs[i]:.2f}', color='#32CD32', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+
+ cbar = plt.colorbar(im, ax = ax)
+ cbar.ax.tick_params(labelsize = 20)
+
+
+ ax.set_yticklabels([])
+ ax.set_xticklabels([])
+ ax.set_xlabel(f'{xlabel_list[i]}, $\Delta t = ${np.abs(itime[i]):.2f} sec', fontsize = 30)
+
+
+ else:
+
+ ax.set_axis_off()
+
+ return fig
+
+
+def plot_ima_subplots(ima_filename, vmin, vmax):
+ '''
+ Build a simple panel plot of individual IMA reads.
+
+ Parameters
+ ----------
+ ima_filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ vmin: float
+ Minimum magnitude for scaling the data range that the colormap covers.
+
+ vmax: float
+ Maximum magnitude for scaling the data range that the colormap covers.
+ '''
+
+ path, filename = os.path.split(ima_filename)
+
+ cube, integ_time = read_wfc3(ima_filename)
+
+ fig_panel1, axarr = plt.subplots(4, 4)
+ fig_panel1.set_size_inches(40, 40)
+ fig_panel1.set_dpi(40)
+ plt.rcParams.update({'font.size':40})
+ itime = integ_time[0:-1] - integ_time[1:]
+ read_title=np.arange(16,0,-1)
+ for i, ax in enumerate(axarr.reshape(-1)):
+
+ im = ax.imshow(cube[:,:,i], cmap = 'Greys_r', origin = 'lower', vmin = vmin , vmax = vmax)
+
+ cbar=plt.colorbar(im, ax = ax)
+ cbar.ax.tick_params(labelsize = 20)
+ ax.set_title(f'SCI, {read_title[i]}', fontsize = 40)
+ ax.set_yticklabels([])
+ ax.set_xticklabels([])
+
+ _=fig_panel1.suptitle(filename, fontsize = 40)
+ plt.subplots_adjust(bottom = 0.3, right = 0.9, top = 0.95)
+
+
+def plot_ramp_subplots(ima_files, difference_method, ylims, exclude_sources, lhs_region, rhs_region):
+ '''
+ Build a simple figure with subplots of IMA accumulation ramps.
+
+ Parameters
+ ----------
+ ima_files : list of str
+ Paths to RAW full-frame IR image fits files.
+
+ difference_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ ylims: list of floats
+ Two floats, the first detailing the lower y-axis limit, and the second giving the
+ upper y-axis limit.
+
+ exclude_sources: bool
+ Set to True to exclude any sources (such as stars) and isolate the background counts.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+ '''
+
+ fig = plt.figure(figsize = (50, 20))
+ fig
+ rows = 1
+ columns = 2
+
+ subplot_titles = ['scattered', 'nominal']
+
+ for i,ima in enumerate(ima_files):
+
+
+ path, filename = os.path.split(ima)
+ cube, integ_time = read_wfc3(ima)
+
+ if exclude_sources == True:
+ cube[np.abs(cube) > 3] = np.nan
+
+ diff_cube = compute_diff_imas(cube, integ_time, diff_method = difference_method)
+ median_diff_fullframe, median_diff_lhs, median_diff_rhs = get_median_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ ax = fig.add_subplot(rows, columns, i+1)
+ plot_ramp(ima, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs)
+ ax.set_ylim(ylims[0],ylims[1])
+
+ ax.tick_params(axis = "x", labelsize = 30)
+ ax.tick_params(axis = "y", labelsize = 30)
+
+ _=ax.set_title(f'{filename}, {subplot_titles[i]}', fontsize=50)
+
+
+def plot_ima_difference_subplots(ima_filename, difference_method, lhs_region, rhs_region):
+ '''
+ Build a complex panel plot of the difference between individual IMA reads.
+ The median difference $\mu$ in the count rate over the entire image is printed above each panel. Below each panel,
+ The IMSET difference, along with the time interval between the two IMSETs, is printed below.
+ The statistics in orange (on the left and right side of each panel) give the median rate and
+ standard deviation of each side of the image, respectively. The value in green 'delta' is the
+ difference between the left and right side of the image. The value in white "Ratio" gives the
+ ratio of the median difference in orange for the left versus the right side.
+
+ Parameters
+ ----------
+ ima_filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ difference_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+ '''
+
+ path,filename = os.path.split(ima_filename)
+
+ cube, integ_time = read_wfc3(ima_filename)
+
+ median_fullframe, median_lhs, median_rhs = get_median_fullframe_lhs_rhs(cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ diff_cube = compute_diff_imas(cube, integ_time, diff_method = difference_method)
+
+ median_diff_fullframe, median_diff_lhs, median_diff_rhs = get_median_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+ standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs = get_std_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ fig_0 = panel_plot(cube, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs, standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs, diff_method = difference_method)
+ _=fig_0.suptitle(filename, fontsize = 40)
+ plt.subplots_adjust(bottom = 0.25, right = 0.9, top = 0.95)
diff --git a/notebooks/WFC3/ir_scattered_light_calwf3_corrections/instantaneous_diff.png b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/instantaneous_diff.png
new file mode 100644
index 000000000..0c2285a6e
Binary files /dev/null and b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/instantaneous_diff.png differ
diff --git a/notebooks/WFC3/ir_scattered_light_calwf3_corrections/requirements.txt b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/requirements.txt
new file mode 100644
index 000000000..2814a9434
--- /dev/null
+++ b/notebooks/WFC3/ir_scattered_light_calwf3_corrections/requirements.txt
@@ -0,0 +1,8 @@
+astropy==5.2.1
+astroquery==0.4.6
+drizzlepac==3.5.1
+ginga==4.1.1
+matplotlib==3.7.0
+numpy==1.23.4
+stwcs==1.7.2
+wfc3tools==1.4.0
diff --git a/notebooks/WFC3/ir_scattered_light_manual_corrections/Correcting_for_Scattered_Light_in_IR_Exposures_by_Manually_Subtracting_Bad_Reads.ipynb b/notebooks/WFC3/ir_scattered_light_manual_corrections/Correcting_for_Scattered_Light_in_IR_Exposures_by_Manually_Subtracting_Bad_Reads.ipynb
new file mode 100644
index 000000000..7b05eae8a
--- /dev/null
+++ b/notebooks/WFC3/ir_scattered_light_manual_corrections/Correcting_for_Scattered_Light_in_IR_Exposures_by_Manually_Subtracting_Bad_Reads.ipynb
@@ -0,0 +1,1089 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Correcting for Scattered Light in WFC3/IR Exposures: Manually Subtracting Bad Reads\n",
+ "\n",
+ "\n",
+ "## Learning Goals\n",
+ "\n",
+ "This notebook presents one of two available methods to correct for a time variable background (TVB) due to scattered light from observing close to the Earth's limb. This method illustrates how to manually subtract any bad reads from the final exposure read of the WFC3/IR IMA data. \n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "\n",
+ "- Compute and plot the difference between IMA reads to identify those affected by TVB. \n",
+ "- Correct a single exposure in which the first few reads are affected by scattered light by subtracting those \"bad\" reads from the final IMA read.\n",
+ "- Compare the original FLT to the reprocessed FLT image.\n",
+ "- Compare the original DRZ to the reprocessed DRZ image.\n",
+ "\n",
+ "A second method for correcting TVB (masking bad reads in the RAW image and re-running `calwf3`) can be found in the notebook [Correcting for Scattered Light in WFC3/IR Exposures: Using `calwf3` to Mask Bad Reads (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_scattered_light_calwf3_corrections). This method performs the 'ramp \n",
+ "fitting' step in calwf3 and therefore removes cosmic rays from the final image. It only works, \n",
+ "however, when TVB occurs at the beginning or end of the IR exposure and may leave sky \n",
+ "residuals in regions flagged as IR 'blobs'.\n",
+ "\n",
+ "\n",
+ "\n",
+ "**Please note that the FLT products in this notebook are really 'corrected IMA' \n",
+ "files and therefore do not include the 'ramp fitting' step in `calwf3`. The final images will \n",
+ "therefore still contain cosmic rays, and these artifacts may be removed using software such \n",
+ "as AstroDrizzle when combining multiple exposures.**\n",
+ " \n",
+ "
\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#import)
\n",
+ "[2. Downloading Data](#load)
\n",
+ "[3. Identifying Reads with Earth-limb Scattered Light](#identify)
\n",
+ "[4. Querying CRDS for the Reference File](#ref)
\n",
+ "\n",
+ "[5. Correcting the Data](#main)
\n",
+ "- [5.1 Excising \"Bad\" Reads](#reprocess)
\n",
+ "- [5.2 Comparing FLT Products](#compare)
\n",
+ "\n",
+ "[6. Drizzling Nominal and Reprocessed FLT Products](#drizzle)
\n",
+ "[7. Conclusions](#conclusions)
\n",
+ "[Additional Resources](#add)
\n",
+ "[About this Notebook](#about)
\n",
+ "[Citations](#cite)
\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Introduction \n",
+ "\n",
+ "WFC3 images can be affected by many different kinds of unwanted, non-science features, such as satellite trails, peculiar cosmic rays, Earth-limb scattered light, reflections off the filter wheel, and more. We call these features \"anomalies\". The majority of these anomalies are well studied, correctable, and easily identifiable, as discussed in [WFC3 ISR 2017-22](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2017/WFC3-2017-22.pdf).\n",
+ "\n",
+ "\n",
+ "In this notebook, we will walk through the process of correcting WFC3/IR images for anomalies that appear in only some of the reads (see [section 7.7 of the WFC3 Instrument Handboook](https://hst-docs.stsci.edu/wfc3ihb/chapter-7-ir-imaging-with-wfc3/7-7-ir-exposure-and-readout) for a discussion of the WFC3/IR MULTIACCUM observing mode). We examine \n",
+ "an observation affected by a strong TVB due to Earth limb scattered light affecting the first few reads ([section 7.10 of the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb/chapter-7-wfc3-ir-sources-of-error/7-10-time-variable-background)). We will manually subtract the affected reads from the final read of the IMA and copy the updated science and error arrays into the FLT science and error arrays. This method is based on section 5 of [WFC3 ISR 2016-16: 'Excising Individual Reads'](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2016/WFC3-2016-16.pdf). This same method can be used to remove individual reads that contain other anomalies, such as satellite trails.\n",
+ "\n",
+ "This new FLT will have a reduced total exposure time (and signal-to-noise) given the rejection \n",
+ "of some number of reads but will now have a flat background and an improved ramp fit. \n",
+ "\n",
+ "Please see the notebook [WFC3/IR IMA Visualization with An Example of Time Variable Background (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_ima_visualization) for a walkthrough of how to identify a TVB due to scattered light. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 1. Imports \n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "\n",
+ "- *os* for setting environment variables\n",
+ "- *glob* for finding lists of files\n",
+ "- *shutil* for managing directories\n",
+ "- *numpy* for handling array functions\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *astropy.io fits* for accessing FITS files\n",
+ "- *astroquery.mast Observations* for downloading data \n",
+ "- *wfc3tools* `calwf3` for calibrating WFC3 data\n",
+ "- *ginga* for finding min/max outlier pixels\n",
+ "- *stwcs* for updating World Coordinate System images\n",
+ "- *drizzlepac* for combining images with AstroDrizzle\n",
+ "\n",
+ "We import the following modules:\n",
+ "- *ima_visualization_and_differencing* to take the difference between reads, plot the ramp, and visualize the difference in images\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os \n",
+ "import glob\n",
+ "import shutil \n",
+ "import numpy as np\n",
+ "from matplotlib import pyplot as plt\n",
+ "from astropy.io import fits\n",
+ "from astroquery.mast import Observations\n",
+ "from wfc3tools import calwf3\n",
+ "from ginga.util.zscale import zscale\n",
+ "from stwcs import updatewcs\n",
+ "from drizzlepac import astrodrizzle\n",
+ "\n",
+ "import ima_visualization_and_differencing as diff\n",
+ "\n",
+ "%matplotlib inline\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2. Downloading Data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The following commands query MAST for the necessary data products and download them to the current directory. Here we obtain WFC3/IR observations from HST Frontier Fields program [14037](https://archive.stsci.edu/proposal_search.php?id=14037&mission=hst), Visit BB. We specifically want the observation \"icqtbbbxq\", as it is strongly affected by Earth limb scattered light. The data products requested are the RAW, IMA, and FLT files.\n",
+ "\n",
+ "**Warning: this cell may take a few minutes to complete.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "OBS_ID = 'ICQTBB020'\n",
+ "data_list = Observations.query_criteria(obs_id=OBS_ID)\n",
+ "\n",
+ "file_id = \"icqtbbbxq\"\n",
+ "Observations.download_products(data_list['obsid'], project = 'CALWF3', obs_id = file_id, \n",
+ " mrp_only = False, productSubGroupDescription = ['RAW','IMA','FLT'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, we will copy our RAW file into our working directory to use in this tutorial. We copy the IMA and FLT files to a new directory called \"orig/\" for later use. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if not os.path.exists('orig/'):\n",
+ " os.mkdir('orig/')\n",
+ "\n",
+ "shutil.copy(f'mastDownload/HST/{file_id}/{file_id}_ima.fits',f'orig/{file_id}_ima.fits')\n",
+ "shutil.copy(f'mastDownload/HST/{file_id}/{file_id}_flt.fits',f'orig/{file_id}_flt.fits') \n",
+ "\n",
+ "raw_file = f'mastDownload/HST/{file_id}/{file_id}_raw.fits'\n",
+ "\n",
+ "shutil.copy(raw_file, f'{file_id}_raw.fits')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 3. Identifying Reads with Earth-limb Scattered Light"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this section, we show how to identify the reads impacted by the scattered light by examining the difference in count rate between reads. This section was taken from the [WFC3/IR IMA Visualization with An Example of Time Variable Background (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_ima_visualization) notebook, which includes a more comprehensive walkthrough of identifying time variable background. \n",
+ "\n",
+ "Here we implement a technique to examine the count rate difference between consecutive reads. In this case, we first convert from count rate (electrons/second) back to counts (electrons) before taking the difference, as shown in equation 3 from [WFC3 ISR 2018-05](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2018/WFC3-2018-05.pdf).\n",
+ "\n",
+ "![Instantaneous Difference Equation](instantaneous_diff.png)\n",
+ "\n",
+ "We compare sky values in different regions of the detector (left side, right side, and full frame). If you would like to specify your own regions for the left and right sides of your image, you can change the `lhs_region` and `rhs_region` parameters. Each region must be specified as a dictionary including the four \"corners\" (x0, x1, y0, and y1) of the region you would like to select. You may want to avoid the edges of the detector which have a large number of bad pixels and higher flat field errors."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize = (20, 10))\n",
+ "\n",
+ "ima_filepath = f'orig/{file_id}_ima.fits'\n",
+ "\n",
+ "path, filename = os.path.split(ima_filepath)\n",
+ "cube, integ_time = diff.read_wfc3(ima_filepath)\n",
+ "\n",
+ "\n",
+ "lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ "rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ "\n",
+ "#Please use a limit that makes sense for your own data, when running your images through this notebook.\n",
+ "cube[np.abs(cube) > 3] = np.nan\n",
+ "\n",
+ "diff_cube = diff.compute_diff_imas(cube, integ_time, diff_method = \"instantaneous\")\n",
+ "median_diff_fullframe, median_diff_lhs, median_diff_rhs = diff.get_median_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)\n",
+ "\n",
+ "plt.rc('xtick', labelsize = 20) \n",
+ "plt.rc('ytick', labelsize = 20) \n",
+ "plt.rcParams.update({'font.size': 30})\n",
+ "plt.rcParams.update({'lines.markersize': 15})\n",
+ "\n",
+ "diff.plot_ramp(ima_filepath, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs)\n",
+ "\n",
+ "plt.ylim(0.5,2.5)\n",
+ "_ = plt.title(filename)\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here, we utilize a few functions from our module `ima_visualization_and_differencing`. We use `read_wfc3` to grab the IMA data from all reads and corresponding integration times. We also implement upper and lower limits on our pixel values to exclude sources when plotting our ramp. We take the instantaneous difference using `compute_diff_imas`, which computes the difference as described in the equation above. Finally, we use `plot_ramp` to plot the median count rate from the left side, right side, and full frame image."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "For our scattered light exposure, we see zodiacal light at a level of ~0.9e/s in later reads, with the scattered light component affecting the first several reads where the median count rate for the left side (orange triangles) is larger than the right side (green triangles). We can visualize this in 2 dimensions in the panel plot below, using `plot_ima_difference_subplots`.\n",
+ "\n",
+ "In the panel plot, we see that sources (small galaxies) are visible in the difference images using this new method. Note that this may complicate the analysis of the spatial background (e.g. left versus right) for images with extended targets, such as large galaxies. In this case, users may wish to adjust the regions of the detector used for the ramp plots. We therefore recommend inspecting both the panel plots as well as the ramp fits for diagnosing any issues with the data. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig = plt.figure(figsize = (20, 10))\n",
+ "\n",
+ "ima_filepath = f'orig/{file_id}_ima.fits'\n",
+ "\n",
+ "\n",
+ "lhs_region = {\"x0\":50,\"x1\":250,\"y0\":100,\"y1\":900}\n",
+ "rhs_region = {\"x0\":700,\"x1\":900,\"y0\":100,\"y1\":900}\n",
+ "\n",
+ "diff.plot_ima_difference_subplots(ima_filepath, difference_method='instantaneous', lhs_region=lhs_region, rhs_region=rhs_region)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this figure, we see that the ratio of instantaneous rate for the left versus right side of the image is ~1.0 for all but the first few reads (which are affected by scattered light). We choose to exclude reads with a ratio greater than 1.1 from the final science data, as they are the reads most strongly affected by scattered light. While this reduces the total exposure from 1403 to 1000 seconds, it removes the spatial component from the sky background."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 4. Querying CRDS for the Reference File"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this notebook, we will run `calwf3` to produce an IMA file, which we will use to remove bad reads. Before running `calwf3`, we need to set some environment variables.\n",
+ "\n",
+ "We will point to a subdirectory called `crds_cache` using the IREF environment variable, which is used for WFC3 reference files. Other instruments use other variables, e.g., JREF for ACS."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "os.environ['CRDS_SERVER_URL'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_SERVER'] = 'https://hst-crds.stsci.edu'\n",
+ "os.environ['CRDS_PATH'] = './crds_cache'\n",
+ "os.environ['iref'] = './crds_cache/references/hst/wfc3/'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The code block below will query CRDS for the best reference files currently available for our dataset and update the header keywords to point to these new files. We will use `os` to run terminal commands. In the terminal, the line would be:"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "crds bestrefs --files [filename] --sync-references=1 --update-bestrefs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "...where 'filename' is the name of your fits file.\n",
+ "\n",
+ "\n",
+ "**Warning: this cell may take a few minutes to complete.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "raw_filepath = f'{file_id}_raw.fits'\n",
+ "\n",
+ "\n",
+ "print( f\"Querying CRDS for the reference file associated with {raw_filepath}.\")\n",
+ "command_line_input = 'crds bestrefs --files {:} --sync-references=1 --update-bestrefs'.format(raw_file)\n",
+ "os.system(command_line_input);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 5. Correcting the Data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To address anomalies such as scattered light, satellite trails, and more in WFC3/IR images we can remove the individual affected reads and correct the science and error arrays accordingly. For our example image, we choose to exclude reads where the ratio of background signal is greater than 1.1 e-/s (see the notebook [WFC3/IR IMA Visualization with An Example of Time Variable Background (O'Connor 2023)](https://github.com/spacetelescope/WFC3Library/tree/master/notebooks/ir_ima_visualization) for a more complete demonstration of how we find this ratio).\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 5.1 Excising \"Bad\" Reads "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this section, we walk through the key steps to removing bad reads. \n",
+ "\n",
+ "We select our excluded reads (in this case reads reads SCI,15 through SCI, 11) and use the \"remove_reads\" function to effectively subtract out the reads affected by TVB. \n",
+ "\n",
+ "The key steps to this process are:\n",
+ "\n",
+ "1. Run `calwf3` on the RAW image file to produce an IMA and an FLT.\n",
+ "2. Take the IMA file and subtract the science array from the \"bad\" reads from the cumulative exposure.\n",
+ " - Correct the final integration time accordingly. \n",
+ "3. Correct the error image extension to reflect the changes to the science array. \n",
+ "4. Update the final FLT headers, science array, and error array.\n",
+ "\n",
+ "\n",
+ "We walk through this process below."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### STEP 1: Run `calwf3`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "bad_reads = [11,12,13,14,15] #note, we leave the \"zero read\" (read number 16)\n",
+ "\n",
+ "#### Remove any existing ima or flt products from working directory or calwf3 will not run \n",
+ "for ext in ['flt','ima']:\n",
+ " if os.path.exists(raw_filepath.replace('raw', ext)):\n",
+ " os.remove(raw_filepath.replace('raw', ext))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ " ##run CALWF3\n",
+ "calwf3(raw_filepath)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### STEP 2: Correct the IMA product"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here we walk through the process of subtracting the reads affected by Earth-limb scattered light from the cumulative science extension of the IMA. While an FLT product is also created in step 1, we do not use this file due to the poor-quality ramp fit in the presence of TVB.\n",
+ "\n",
+ "Overall, the steps are as follows:\n",
+ "\n",
+ "1. Load the science data as a 3D array and the integration time as a 1D array from the science and time extensions of the IMA file. In addition, load the associated dark reference file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ima_filepath_new = f'{file_id}_ima.fits'\n",
+ "ima = fits.open(ima_filepath_new)\n",
+ "\n",
+ "cube, integ_time = diff.read_wfc3(ima_filepath_new)\n",
+ "\n",
+ "dark_file = ima[0].header['DARKFILE'].replace('iref$', os.getenv('iref'))\n",
+ "dark_counts, dark_time = diff.read_wfc3(dark_file)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "2. Convert science data from electrons/second to electrons."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cube_counts = np.zeros(np.shape(cube))\n",
+ "for img in range(cube.shape[2]):\n",
+ " cube_counts[:,:,img] = cube[:,:,img]*integ_time[img]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "3. Compute the difference between reads (the cumulative difference, in this case) to isolate counts and integration time from bad reads."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cube_diff = np.diff(cube_counts, axis = 2)\n",
+ "dark_diff = np.diff(dark_counts, axis = 2)\n",
+ "dt = np.diff(integ_time)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "4. For each bad read, subtract the counts (and time) from ONLY that read from the total data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "final_dark = dark_counts[:,:,-1] \n",
+ "\n",
+ "final_sci = cube_counts[:,:,-1]\n",
+ "final_time = np.ones((1024, 1024))*integ_time[-1]\n",
+ "\n",
+ "\n",
+ "if (len(bad_reads) > 0):\n",
+ " for read in bad_reads:\n",
+ " index = cube_counts.shape[2]-read-1\n",
+ " final_sci -= cube_diff[:,:,index]\n",
+ " final_dark -= dark_diff[:,:,index]\n",
+ " final_time -= dt[index]\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### STEP 3: Correct the Error Image"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The errors associated with the raw data are estimated according to the noise model for the detector which currently includes a simple combination of detector readnoise and poisson noise from the pixel and which is intended to replicate the `calwf3` error array calculation. Currently, the inital detector noise model (in electrons) is as follows, where RN is the readnoise.\n",
+ "\n",
+ "$$ SCI_{1} = signal= (flux*flat + dark)$$ \n",
+ "\n",
+ "$$ \\sigma_{1} = \\sqrt{(RN^{2}) + (flux*flat + dark)} $$\n",
+ "\n",
+ "\n",
+ "Note that our signal equation includes flat and dark corrections to revert the final science array (flux) produced by `calwf3` to the original signal (in electrons) recorded in the detector.\n",
+ "\n",
+ "The ERR array continues to be updated as the SCI array is processed. The dark error term is added in quadrature as the dark current is subtracted from the science array:\n",
+ "\n",
+ "$$ SCI_{2} = signal - dark $$\n",
+ "\n",
+ "$$ \\sigma_{2} = \\sqrt{\\sigma_{1}^{2}+\\sigma_{dark}^{2}} $$\n",
+ "\n",
+ "Next, the flat images are divided out of the science image. There are two flat-fields (p-flat and delta-flat), which are each divided out of the science image. The flat errors are combined using the correct error propagation method.\n",
+ "\n",
+ " $$ flat = pflat * dflat $$\n",
+ "\n",
+ "P-Flat (pflat) file:\n",
+ "\n",
+ "$$ SCI_{3} = SCI_{2}/pflat $$\n",
+ "\n",
+ "$$ \\frac{\\sigma_{3}}{SCI_{3}} = \\sqrt{ (\\frac{\\sigma_{2}}{SCI_{2}})^{2} +(\\frac{\\sigma_{pflat}}{pflat})^{2}} $$\n",
+ "\n",
+ "Delta-Flat (dflat) file:\n",
+ "\n",
+ "$$ SCI_{4} = SCI_{3}/dflat $$\n",
+ "\n",
+ "$$ \\frac{\\sigma_{4}}{SCI_{4}} = \\sqrt{ (\\frac{\\sigma_{3}}{SCI_{3}})^{2} +(\\frac{\\sigma_{dflat}}{dflat})^{2}} = \\sqrt{ (\\frac{\\sigma_{2}}{SCI_{2}})^{2} +(\\frac{\\sigma_{pflat}}{pflat})^{2} +(\\frac{\\sigma_{dflat}}{dflat})^{2}}$$\n",
+ "\n",
+ "\n",
+ "and finally it is converted to an error in electrons/second as:\n",
+ "\n",
+ " $$ \\sigma_{e^{-}/s}= \\frac{\\sigma_{4}}{exptime}$$\n",
+ " \n",
+ "Evaluating this equation, we come up with an equation for error array calculation (in electrons/second) which we use in our Python calculations as follows:\n",
+ "\n",
+ "$$ \\sigma_{e^{-}/s}= \\frac{\\sqrt{ RN^{2} + (flux*(pflat*dflat) + dark) + \\sigma_{dark}^{2} + (\\sigma_{pflat}*flux*dflat)^{2} + (\\sigma_{dflat}*flux*pflat)^{2} }}{pflat*dflat*exptime}$$\n",
+ "\n",
+ "\n",
+ "We do not address the error propagation through the nonlinearity correction step of `calwf3` (NLINCORR), as it is complicated and sufficiently small to be outside of the scope of this notebook. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "##getting variance terms\n",
+ "#### Readnoise in 4 amps\n",
+ "RN = np.zeros((1024,1024))\n",
+ "RN[512: ,0:512] += ima[0].header['READNSEA']\n",
+ "RN[0:512,0:512] += ima[0].header['READNSEB']\n",
+ "RN[0:512, 512:] += ima[0].header['READNSEC']\n",
+ "RN[512: , 512:] += ima[0].header['READNSED']\n",
+ "\n",
+ "\n",
+ "#### Gain in 4 amps\n",
+ "gain_2D = np.zeros((1024,1024))\n",
+ "gain_2D[512: ,0:512] += ima[0].header['ATODGNA']\n",
+ "gain_2D[0:512,0:512] += ima[0].header['ATODGNB']\n",
+ "gain_2D[0:512, 512:] += ima[0].header['ATODGNC']\n",
+ "gain_2D[512: , 512:] += ima[0].header['ATODGND']\n",
+ "\n",
+ "#dark image\n",
+ "dark_im = fits.open(dark_file)\n",
+ "\n",
+ "##And grabbing the flats\n",
+ "pflat_file = ima[0].header['PFLTFILE'].replace('iref$', os.getenv('iref'))\n",
+ "pflat_im = fits.open(pflat_file)\n",
+ "pflat = pflat_im[1].data\n",
+ "\n",
+ "dflat_file = ima[0].header['DFLTFILE'].replace('iref$', os.getenv('iref'))\n",
+ "dflat_im = fits.open(dflat_file)\n",
+ "dflat = dflat_im[1].data\n",
+ "\n",
+ "\n",
+ "#Computing the final error\n",
+ "\n",
+ "#### Variance terms\n",
+ "\n",
+ "## poisson error: sqrt(signal), flux = final_sci, dark is converted to electrons\n",
+ "signal = (final_sci*(pflat*dflat)+final_dark*gain_2D)\n",
+ "## flat errors\n",
+ "dflat_err=dflat_im['ERR'].data\n",
+ "pflat_err=pflat_im['ERR'].data\n",
+ "#dark error\n",
+ "dark_err = (dark_im['ERR'].data)*gain_2D \n",
+ "##final\n",
+ "final_err = np.sqrt(RN**2 + signal + (dark_err**2) + (pflat_err*final_sci*dflat)**2\\\n",
+ " + (dflat_err*final_sci*pflat)**2)\n",
+ " \n",
+ "final_err /= (pflat*dflat*final_time)\n",
+ "final_err[np.isnan(final_err)] = 0\n",
+ "\n",
+ "#and finally the final science image (converted back to count rate)\n",
+ "final_sci /= final_time "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### STEP 4: Update the FLT Product"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally, we update the FLT product created in step 1 with the new science array, error array, and header keywords (such as the new total exposure time)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "flt_filepath_new = f'{file_id}_flt.fits'\n",
+ "flt = fits.open(flt_filepath_new, mode='update')\n",
+ " \n",
+ "#Updating the flt data\n",
+ "\n",
+ "flt['SCI'].data = final_sci[5:-5,5:-5]\n",
+ "flt['ERR'].data = final_err[5:-5,5:-5]\n",
+ "\n",
+ "\n",
+ "# Updating the FLT header\n",
+ "flt[0].header['IMA2FLT'] = (1, 'FLT extracted from IMA file')\n",
+ "flt[0].header['EXPTIME'] = np.max(final_time)\n",
+ "flt[0].header['NPOP'] = (len(bad_reads), 'Number of reads popped from the sequence')\n",
+ "\n",
+ "flt.flush()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Putting It All Together"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Below, we have included the entire correction process (steps 1-4 above) in a function, for convenience. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "def remove_reads(raw_filepath, bad_reads = []):\n",
+ " '''\n",
+ " From the final IMA read, subtract data of reads affected by anomalies.\n",
+ " Compute a corrected science image and error image, and place them in the FLT product. \n",
+ " \n",
+ " Parameters\n",
+ " ----------\n",
+ " raw_filepath: str\n",
+ " Path to a RAW full-frame IR image fits file.\n",
+ " \n",
+ " bad_reads: list of int\n",
+ " List of the IMSET numbers (science extension numbers) of reads affected by anomalies.\n",
+ " '''\n",
+ " \n",
+ " flt_filepath = raw_filepath.replace('raw', 'flt')\n",
+ " ima_filepath = raw_filepath.replace('raw', 'ima')\n",
+ " \n",
+ " #### Remove existing products or calwf3 will die\n",
+ " for filepath in [flt_filepath, ima_filepath]:\n",
+ " if os.path.exists(filepath):\n",
+ " os.remove(filepath)\n",
+ " \n",
+ " #### Run calwf3\n",
+ " calwf3(raw_filepath)\n",
+ " \n",
+ " #take calwf3 produced IMA, get rid of bad reads \n",
+ " ima = fits.open(ima_filepath)\n",
+ "\n",
+ " cube, integ_time = diff.read_wfc3(ima_filepath)\n",
+ "\n",
+ " dark_file = ima[0].header['DARKFILE'].replace('iref$', os.getenv('iref'))\n",
+ " dark_counts, dark_time = diff.read_wfc3(dark_file)\n",
+ "\n",
+ "\n",
+ " cube_counts = np.zeros(np.shape(cube))\n",
+ " for img in range(cube.shape[2]):\n",
+ " cube_counts[:,:,img] = cube[:,:,img]*integ_time[img]\n",
+ "\n",
+ " cube_diff = np.diff(cube_counts, axis = 2)\n",
+ " dark_diff = np.diff(dark_counts, axis = 2)\n",
+ " dt = np.diff(integ_time)\n",
+ "\n",
+ " final_dark = dark_counts[:,:,-1] \n",
+ "\n",
+ " final_sci = cube_counts[:,:,-1]\n",
+ " final_time = np.ones((1024, 1024))*integ_time[-1]\n",
+ "\n",
+ "\n",
+ " if (len(bad_reads) > 0):\n",
+ " for read in bad_reads:\n",
+ " index = cube_counts.shape[2]-read-1\n",
+ " final_sci -= cube_diff[:,:,index]\n",
+ " final_dark -= dark_diff[:,:,index]\n",
+ " final_time -= dt[index]\n",
+ "\n",
+ "\n",
+ "\n",
+ " ##getting variance terms\n",
+ " #### Readnoise in 4 amps\n",
+ " RN = np.zeros((1024,1024))\n",
+ " RN[512: ,0:512] += ima[0].header['READNSEA']\n",
+ " RN[0:512,0:512] += ima[0].header['READNSEB']\n",
+ " RN[0:512, 512:] += ima[0].header['READNSEC']\n",
+ " RN[512: , 512:] += ima[0].header['READNSED']\n",
+ "\n",
+ "\n",
+ " #### Gain in 4 amps\n",
+ " gain_2D = np.zeros((1024,1024))\n",
+ " gain_2D[512: ,0:512] += ima[0].header['ATODGNA']\n",
+ " gain_2D[0:512,0:512] += ima[0].header['ATODGNB']\n",
+ " gain_2D[0:512, 512:] += ima[0].header['ATODGNC']\n",
+ " gain_2D[512: , 512:] += ima[0].header['ATODGND']\n",
+ "\n",
+ " #dark image\n",
+ " dark_im = fits.open(dark_file)\n",
+ "\n",
+ " ##And grabbing the flats\n",
+ " pflat_file = ima[0].header['PFLTFILE'].replace('iref$', os.getenv('iref'))\n",
+ " pflat_im = fits.open(pflat_file)\n",
+ " pflat = pflat_im[1].data\n",
+ "\n",
+ " dflat_file = ima[0].header['DFLTFILE'].replace('iref$', os.getenv('iref'))\n",
+ " dflat_im = fits.open(dflat_file)\n",
+ " dflat = dflat_im[1].data\n",
+ "\n",
+ "\n",
+ " #Computing the final error\n",
+ "\n",
+ " #### Variance terms\n",
+ "\n",
+ " ## poisson error: sqrt(signal), flux = final_sci, dark is converted to electrons\n",
+ " signal = (final_sci*(pflat*dflat)+final_dark*gain_2D)\n",
+ " ## flat errors\n",
+ " dflat_err=dflat_im['ERR'].data\n",
+ " pflat_err=pflat_im['ERR'].data\n",
+ " #dark error\n",
+ " dark_err = (dark_im['ERR'].data)*gain_2D \n",
+ " ##final\n",
+ " final_err = np.sqrt(RN**2 + signal + (dark_err**2) + (pflat_err*final_sci*dflat)**2\\\n",
+ " + (dflat_err*final_sci*pflat)**2)\n",
+ "\n",
+ " final_err /= (pflat*dflat*final_time)\n",
+ " final_err[np.isnan(final_err)] = 0\n",
+ "\n",
+ " #and finally the final science image (converted back to count rate)\n",
+ " final_sci /= final_time \n",
+ "\n",
+ "\n",
+ " #Updating the flt data\n",
+ " \n",
+ " flt = fits.open(flt_filepath, mode='update')\n",
+ "\n",
+ " flt['SCI'].data = final_sci[5:-5,5:-5]\n",
+ " flt['ERR'].data = final_err[5:-5,5:-5]\n",
+ "\n",
+ "\n",
+ " # Updating the FLT header\n",
+ " flt[0].header['IMA2FLT'] = (1, 'FLT extracted from IMA file')\n",
+ " flt[0].header['EXPTIME'] = np.max(final_time)\n",
+ " flt[0].header['NPOP'] = (len(bad_reads), 'Number of reads popped from the sequence')\n",
+ "\n",
+ " flt.flush()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 5.2 Comparing FLT Products "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You may want to move your reprocessed images to a new directory, especially if you plan to run the notebook again. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "reprocessed_flt = f'{file_id}_flt.fits'\n",
+ "\n",
+ "original_flt = f'orig/{file_id}_flt.fits'\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, we can compare our original and reprocessed FLT products."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "image_new = fits.open(reprocessed_flt)\n",
+ "image_old = fits.open(original_flt)\n",
+ "\n",
+ "fig = plt.figure(figsize = (20, 7))\n",
+ "fig\n",
+ "rows = 1\n",
+ "columns = 2\n",
+ "\n",
+ "#add the total exptime in the title \n",
+ "ax1 = fig.add_subplot(rows, columns, 1)\n",
+ "ax1.set_title(\"Reprocessed FLT image\", fontsize = 20)\n",
+ "im1 = plt.imshow(image_new[\"SCI\", 1].data, vmin = 0.8, vmax = 1.3, origin = 'lower', cmap = 'Greys_r')\n",
+ "ax1.tick_params(axis = 'both',labelsize = 10)\n",
+ "cbar1 = plt.colorbar(im1, ax = ax1)\n",
+ "cbar1.ax.tick_params(labelsize = 10)\n",
+ "\n",
+ "ax2 = fig.add_subplot(rows, columns, 2)\n",
+ "ax2.set_title(\"Original FLT image\", fontsize = 20)\n",
+ "im2=plt.imshow(image_old[\"SCI\", 1].data, vmin = 0.8, vmax = 1.3, origin = 'lower', cmap = 'Greys_r')\n",
+ "ax2.tick_params(axis = 'both', labelsize = 10)\n",
+ "cbar2 = plt.colorbar(im2, ax = ax2)\n",
+ "cbar2.ax.tick_params(labelsize = 10)\n",
+ "\n",
+ "plt.rc('xtick', labelsize = 10) \n",
+ "plt.rc('ytick', labelsize = 10) \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This new image was produced by subtracting the signal from the first 5 reads (not including the 0 read) from the final science data, reducing the effective exposure time from 1403 to 1000 seconds. While the total exposure is reduced from 1403 seconds to 1000 seconds (thus decreasing the overall S/N of the image), the background in the reprocessed image is now uniform over the entire field of view. We can see that the new FLT image is free of the Earth limb scattered light visible in the old FLT image. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print('The final exposure time after reprocessing is {}.'.format(image_new[0].header['EXPTIME']))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 6. Drizzling Nominal and Reprocessed FLT Products \n",
+ "\n",
+ "In our example we use an exposure (`icqtbbbxq`) from image association `ICQTBB020` acquired in visit BB of program 14037. This visit consists of two orbits of two exposures each, and we now download the three other FLTs in the visit (`icqtbbc0q_flt.fits`, `icqtbbbrq_flt.fits`, `icqtbbbtq_flt.fits`) and the pipeline drizzled DRZ product.\n",
+ "\n",
+ "To produce a clean DRZ image (without cosmic rays), we can drizzle the four FLTs together (from the nominal exposures and the reprocessed exposure)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data_list = Observations.query_criteria(obs_id=OBS_ID)\n",
+ "\n",
+ "Observations.download_products(data_list['obsid'], project='CALWF3', \n",
+ " mrp_only=False, productSubGroupDescription=['FLT','DRZ'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "nominal_file_ids = [\"icqtbbc0q\", \"icqtbbbrq\", \"icqtbbbtq\"]\n",
+ "\n",
+ "nominal_list = []\n",
+ "for nominal_file_id in nominal_file_ids:\n",
+ " shutil.copy(f'mastDownload/HST/{nominal_file_id}/{nominal_file_id}_flt.fits', f'{nominal_file_id}_flt.fits')\n",
+ " nominal_list.append(f'{nominal_file_id}_flt.fits')\n",
+ "print(nominal_list)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we update the image World Coordinate System of the reprocessed image in preparation for drizzling."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "updatewcs.updatewcs(reprocessed_flt, use_db=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally, we combine the four FLT images with AstroDrizzle."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "astrodrizzle.AstroDrizzle('*flt.fits', output='f140w', mdriztab=True, preserve=False, build=False, context=False)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Comparing the new DRZ image made with the reprocessed FLT product against the original pipeline DRZ image, we see that the new DRZ image no longer includes scattered light but has a slightly lower S/N due the reduced total exposure time from 1403 to 1000 seconds."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "DRZ_image = fits.getdata(\"f140w_drz.fits\")\n",
+ "Orig_DRZ = fits.getdata('mastDownload/HST/icqtbb020/icqtbb020_drz.fits')\n",
+ "\n",
+ "fig = plt.figure(figsize=(20,10))\n",
+ "rows = 1\n",
+ "columns = 2\n",
+ "\n",
+ "\n",
+ "#add the total exptime in the title \n",
+ "ax1 = fig.add_subplot(rows, columns, 1)\n",
+ "ax1.set_title(\"Reprocessed DRZ Image\", fontsize=20)\n",
+ "vmin,vmax = zscale(Orig_DRZ)\n",
+ "im1 = plt.imshow(DRZ_image, vmin=vmin, vmax=vmax, origin='lower', cmap='Greys_r')\n",
+ "_= plt.colorbar()\n",
+ "\n",
+ "ax2 = fig.add_subplot(rows, columns, 2)\n",
+ "ax2.set_title(\"Original Pipeline DRZ Image\", fontsize=20)\n",
+ "im2 = plt.imshow(Orig_DRZ, vmin=vmin, vmax=vmax, origin='lower', cmap='Greys_r')\n",
+ "_= plt.colorbar()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 7. Conclusions \n",
+ "\n",
+ "**Congratulations, you have completed the notebook.**\n",
+ "\n",
+ "You should now be familiar with how to reprocess an observation affected by Earth limb scattered light by removing the affected reads from your science and error images. \n",
+ "\n",
+ "Thank you for following along! "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Additional Resources \n",
+ "\n",
+ "\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Help Desk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ " - [WFC3/UVIS CTE Website](https://www.stsci.edu/hst/instrumentation/wfc3/performance/cte)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ "- [Instrument Science Report WFC3 2021-01](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/2021-01.pdf)\n",
+ "\n",
+ "## About this Notebook \n",
+ "\n",
+ "\n",
+ "**Author:** Anne O'Connor, Jennifer Mack, Annalisa Calamida, Harish Khandrika -- WFC3 Instrument\n",
+ "\n",
+ "**Updated On:** 2023-05-16\n",
+ "\n",
+ "## Citations \n",
+ "\n",
+ "If you use the following tools for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the tools:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://astroquery.readthedocs.io/en/latest/)\n",
+ "* [Citing `wfc3tools`](https://wfc3tools.readthedocs.io/en/latest/)\n",
+ "* [Citing `drizzlepac`](https://drizzlepac.readthedocs.io/en/latest/LICENSE.html)\n",
+ "\n",
+ "\n",
+ "If you use this notebook, or information from the WFC3 Data Handbook, Instrument Handbook,\n",
+ "or WFC3 ISRs for published research, please cite them:\n",
+ "\n",
+ "* [Citing the WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb#:~:text=Citation,%2C%20(Baltimore%3A%20STScI).)\n",
+ "* [Citing the WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb#:~:text=Citation,14.0%E2%80%9D%20(Baltimore%3A%20STScI))\n",
+ "* [Instrument Science Report WFC3 2021-01](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/2021-01.pdf)\n",
+ "* Citing this notebook:\n",
+ " Please cite the primary author and year, and hyperlink the notebook or WFC3 Library\n",
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "[Top of Page](#top)\n",
+ " "
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.0"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/WFC3/ir_scattered_light_manual_corrections/README.md b/notebooks/WFC3/ir_scattered_light_manual_corrections/README.md
new file mode 100644
index 000000000..b65e5988d
--- /dev/null
+++ b/notebooks/WFC3/ir_scattered_light_manual_corrections/README.md
@@ -0,0 +1,13 @@
+This notebook presents one of two available methods to correct for a time variable background (TVB) due to scattered light from observing close to the Earth's limb. This method illustrates how to manually subtract any bad reads from the final exposure read of the WFC3/IR IMA data.
+
+This notebook walks through the following:
+
+- Computing and ploting the difference between IMA reads to identify those affected by TVB.
+- Correcting a single exposure in which the first few reads are affected by scattered light by subtracting those "bad" reads from the final IMA read.
+- Comparing the original FLT to the reprocessed FLT image.
+
+Please note that the FLT products in this notebook are really 'corrected IMA' files and therefore do not include the 'ramp fitting' step in `calwf3`. The final images will therefore still contain cosmic rays, and these artifacts may be removed using software such as AstroDrizzle when combining multiple exposures.
+
+Installation Instructions:
+
+Please refer to the instructions found on the main [WFC3 Library github](https://github.com/spacetelescope/WFC3Library) page. No other installations are required.
\ No newline at end of file
diff --git a/notebooks/WFC3/ir_scattered_light_manual_corrections/ima_visualization_and_differencing.py b/notebooks/WFC3/ir_scattered_light_manual_corrections/ima_visualization_and_differencing.py
new file mode 100644
index 000000000..f242bedba
--- /dev/null
+++ b/notebooks/WFC3/ir_scattered_light_manual_corrections/ima_visualization_and_differencing.py
@@ -0,0 +1,446 @@
+import os
+import numpy as np
+from astropy.io import fits
+import matplotlib.pyplot as plt
+from ginga.util.zscale import zscale
+import matplotlib.patheffects as path_effects
+
+def read_wfc3(filename):
+ '''
+ Read a full-frame IR image and return the datacube plus integration times for each read.
+ Requires the path to a RAW full-frame IR image fits file (filename).
+
+ Parameters
+ ----------
+ filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ Returns
+ -------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+ '''
+
+ with fits.open(filename) as f:
+ hdr = f[0].header
+ NSAMP = hdr['NSAMP']
+ hdr1 = f[1].header
+ cube = np.zeros((hdr1['NAXIS1'],hdr1['NAXIS2'],NSAMP), dtype = float)
+ integ_time = np.zeros(shape = (NSAMP))
+
+ for i in range(1, NSAMP+1):
+ cube[:,:,i-1] = f[('SCI', i)].data
+ integ_time[i-1] = f[('TIME', i)].header['PIXVALUE']
+
+ cube = cube[:,:,::-1]
+ integ_time = integ_time[::-1]
+ return cube, integ_time
+
+
+
+def compute_diff_imas(cube, integ_time, diff_method):
+
+ '''
+ Compute the difference in signal between reads of a WFC3 IR IMA file.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ diff_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ Returns
+ --------
+ diff : array-like
+ 1024x1024x(NSAMP-1) datacube of the differebce between IR IMA reads in ascending time order,
+ where NSAMP is the number of samples taken.
+ '''
+
+ if diff_method == 'instantaneous':
+ ima_j = cube[:, :, 1:]
+ ima_j_1 = cube[:,:,0:-1]
+ t_0 = integ_time[0]
+ t_j = integ_time[1:]
+ t_j_1 = integ_time[0:-1]
+
+ diff = ((ima_j*(t_j-t_0))-(ima_j_1*(t_j_1-t_0)))/(t_j-t_j_1)
+
+ elif diff_method == 'cumulative':
+ diff = cube[:,:,0:-1] - cube[:,:,1:]
+
+ else: # if an incorrect method is chosen raise an error
+ raise ValueError(f"{diff_method} is an invalid method. The allowed methods are 'instantaneous' and 'cumulative'.")
+
+ return diff
+
+
+def get_median_fullframe_lhs_rhs(cube, lhs_region, rhs_region):
+
+ '''
+ Compute the median in the full-frame image, the user-defined left side region, and the user-defined right side region.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+ Returns
+ -------
+ median_full_frame : array of floats
+ The median signal of the full frame of each read, clipped by 5 pixels around the border to exclude any bad pixel regions.
+
+ median_lhs : array of floats
+ The median signal of the left side of each read.
+
+ median_rhs : array of floats
+ The median signal of the right side of each read.
+ '''
+
+
+ median_full_frame = np.nanmedian(cube[5:-5,5:-5,:], axis = (0,1))
+ median_lhs = np.nanmedian(cube[lhs_region['y0']:lhs_region['y1'],
+ lhs_region['x0']:lhs_region['x1'],:], axis = (0,1))
+ median_rhs = np.nanmedian(cube[rhs_region['y0']:rhs_region['y1'],
+ rhs_region['x0']:rhs_region['x1'],:], axis = (0,1))
+
+
+ return median_full_frame, median_lhs, median_rhs
+
+def get_std_fullframe_lhs_rhs(cube, lhs_region, rhs_region):
+
+ '''
+ Compute the standard deviation of the signal in the full-frame image, the user-defined left side region,
+ and the user-defined right side region.
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+
+ Returns
+ -------
+ standard_dev_fullframe : array of floats
+ The standard deviation of the signal of the full frame of each read, clipped by 5 pixels around the border to exclude any bad pixel regions.
+
+ standard_dev_lhs : array of floats
+ The standard deviation of the signal of the left side of each read.
+
+ standard_dev_rhs : array of floats
+ The standard deviation of the signal of the right side of each read.
+ '''
+
+
+ standard_dev_fullframe = np.nanstd(cube[5:-5,5:-5,:], axis = (0,1))
+ standard_dev_lhs = np.nanstd(cube[lhs_region['y0']:lhs_region['y1'],
+ lhs_region['x0']:lhs_region['x1'],:], axis = (0,1))
+ standard_dev_rhs = np.nanstd(cube[rhs_region['y0']:rhs_region['y1'],
+ rhs_region['x0']:rhs_region['x1'],:], axis = (0,1))
+
+
+ return standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs
+
+
+def plot_ramp(ima, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs):
+
+ '''
+ Plots the signal accumulation ramp of an IMA image. Each point is the median signal (in e-/s) of
+ the difference between subsequent reads. The median signal difference is plotted for the full
+ frame image, and the left and right sides.
+
+ Parameters
+ -----------
+ ima: str
+ Name of the IMA file.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ median_diff_full_frame: array-like
+ The median difference in signal between each full-frame read.
+
+ median_diff_lhs: array-like
+ The median difference in signal between the left side of each read.
+
+ median_diff_rhs: array-like
+ The median difference in signal between the right side of each read.
+ '''
+
+ plt.plot(integ_time[2:], median_diff_fullframe[1:], 's', markersize = 25, label = 'Full Frame', color = 'black')
+ plt.plot(integ_time[2:], median_diff_lhs[1:], '<', markersize = 20, label = 'LHS', color = 'orange')
+ plt.plot(integ_time[2:], median_diff_rhs[1:], '>', markersize = 20, label = 'RHS', color = 'green')
+ ax = plt.gca()
+ for spine in ['top', 'bottom', 'left', 'right']: ax.spines[spine].set_visible(False)
+ plt.grid()
+ plt.xlabel('SAMPTIME [s]')
+ plt.ylabel('$\mu$ [e-/s]')
+ plt.legend(loc = 0)
+ plt.title(ima)
+
+
+def panel_plot(cube, integ_time, median_diff_full_frame, median_diff_lhs, median_diff_rhs,
+ standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs, diff_method):
+ '''
+ Plot the difference between individual reads of an IMA image file in a
+ panel plot up to 4x4 in size (i.e. SCI[16]-SCI[15], SCI[15]-SCI[14], SCI[14]-SCI[15], etc.).
+
+ Parameters
+ ----------
+ cube : array-like
+ 1024x1024xNSAMP datacube of the IR image in ascending time order,
+ where NSAMP is the number of samples taken.
+
+ integ_time : array-like
+ Integration times associated with the datacube in ascending order.
+
+ median_diff_full_frame: array-like
+ The median difference in signal between each full-frame read.
+
+ median_diff_lhs: array-like
+ The median difference in signal between the left side of each read.
+
+ median_diff_rhs: array-like
+ The median difference in signal between the right side of each read.
+
+ standard_dev_fullframe : array of floats
+ The standard deviation of the signal of the full frame of each read.
+
+ standard_dev_lhs : array of floats
+ The standard deviation of the signal of the left side of each read.
+
+ standard_dev_rhs : array of floats
+ The standard deviation of the signal of the right side of each read.
+
+ diff_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ Returns:
+ --------
+
+ fig: figure object
+ Panel plot with subplots showing the difference between subsequent IMA reads.
+ Above each panel, we print the median difference $\mu$ in the count rate over the entire image.
+ Below each panel, we list the IMSET difference, along with the time interval between the two IMSETs.
+ The statistics in orange (on the left and right side of each panel) give the median rate and
+ standard deviation of each side of the image, respectively. The value in green 'delta' is the
+ difference between the left and right side of the image.
+ The value in white "Ratio" gives the ratio of the median difference in orange
+ for the left versus the right side.
+ '''
+
+
+ xlabel_list = ["SCI[16-15]","SCI[15-14]","SCI[14-13]","SCI[13-12]","SCI[12-11]",
+ "SCI[11-10]","SCI[10-9]","SCI[9-8]","SCI[8-7]","SCI[[7-6]]","SCI[6-5]",
+ "SCI[5-4]","SCI[4-3]","SCI[3-2]","SCI[2-1]"]
+
+ fig, axarr = plt.subplots(4, 4)
+ fig.set_size_inches(40, 40)
+ fig.set_dpi(40)
+ itime = integ_time[0:-1] - integ_time[1:]
+
+ diff = compute_diff_imas(cube, integ_time, diff_method = diff_method)
+
+
+ for i, ax in enumerate(axarr.reshape(-1)):
+ if (i < cube.shape[-1]-2):
+ i=i+1
+
+ diff_i = diff[:,:,i]
+ vmin = 0
+ vmax = 2
+ im = ax.imshow(np.abs(diff_i), cmap='Greys_r', origin='lower',
+ vmin = vmin, vmax = vmax)
+ ax.set_title(f'$\mu = ${median_diff_full_frame[i]:.2f}±{standard_dev_fullframe[i]:.2f} e-/s', fontsize = 30)
+
+ text = ax.text(50, 500, f'{median_diff_lhs[i]:.3f}\n±\n{standard_dev_lhs[i]:.3f}', color='Orange', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(700, 500, f'{median_diff_rhs[i]:.3f}\n±\n{standard_dev_rhs[i]:.3f}', color='Orange', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(200, 900, f'Ratio = {median_diff_lhs[i]/median_diff_rhs[i]:.2f}', color='White', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+ text = ax.text(300, 300, f'$\Delta = ${median_diff_lhs[i]-median_diff_rhs[i]:.2f}', color='#32CD32', fontsize=30)
+ text.set_path_effects([path_effects.Stroke(linewidth=15, foreground='black'),
+ path_effects.Normal()])
+
+ cbar = plt.colorbar(im, ax = ax)
+ cbar.ax.tick_params(labelsize = 20)
+
+
+ ax.set_yticklabels([])
+ ax.set_xticklabels([])
+ ax.set_xlabel(f'{xlabel_list[i]}, $\Delta t = ${np.abs(itime[i]):.2f} sec', fontsize = 30)
+
+
+ else:
+
+ ax.set_axis_off()
+
+ return fig
+
+
+def plot_ima_subplots(ima_filename, vmin, vmax):
+ '''
+ Build a simple panel plot of individual IMA reads.
+
+ Parameters
+ ----------
+ ima_filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ vmin: float
+ Minimum magnitude for scaling the data range that the colormap covers.
+
+ vmax: float
+ Maximum magnitude for scaling the data range that the colormap covers.
+ '''
+
+ path, filename = os.path.split(ima_filename)
+
+ cube, integ_time = read_wfc3(ima_filename)
+
+ fig_panel1, axarr = plt.subplots(4, 4)
+ fig_panel1.set_size_inches(40, 40)
+ fig_panel1.set_dpi(40)
+ plt.rcParams.update({'font.size':40})
+ itime = integ_time[0:-1] - integ_time[1:]
+ read_title=np.arange(16,0,-1)
+ for i, ax in enumerate(axarr.reshape(-1)):
+
+ im = ax.imshow(cube[:,:,i], cmap = 'Greys_r', origin = 'lower', vmin = vmin , vmax = vmax)
+
+ cbar=plt.colorbar(im, ax = ax)
+ cbar.ax.tick_params(labelsize = 20)
+ ax.set_title(f'SCI, {read_title[i]}', fontsize = 40)
+ ax.set_yticklabels([])
+ ax.set_xticklabels([])
+
+ _=fig_panel1.suptitle(filename, fontsize = 40)
+ plt.subplots_adjust(bottom = 0.3, right = 0.9, top = 0.95)
+
+
+def plot_ramp_subplots(ima_files, difference_method, ylims, exclude_sources, lhs_region, rhs_region):
+ '''
+ Build a simple figure with subplots of IMA accumulation ramps.
+
+ Parameters
+ ----------
+ ima_files : list of str
+ Paths to RAW full-frame IR image fits files.
+
+ difference_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ ylims: list of floats
+ Two floats, the first detailing the lower y-axis limit, and the second giving the
+ upper y-axis limit.
+
+ exclude_sources: bool
+ Set to True to exclude any sources (such as stars) and isolate the background counts.
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+ '''
+
+ fig = plt.figure(figsize = (50, 20))
+ fig
+ rows = 1
+ columns = 2
+
+ subplot_titles = ['scattered', 'nominal']
+
+ for i,ima in enumerate(ima_files):
+
+
+ path, filename = os.path.split(ima)
+ cube, integ_time = read_wfc3(ima)
+
+ if exclude_sources == True:
+ cube[np.abs(cube) > 3] = np.nan
+
+ diff_cube = compute_diff_imas(cube, integ_time, diff_method = difference_method)
+ median_diff_fullframe, median_diff_lhs, median_diff_rhs = get_median_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ ax = fig.add_subplot(rows, columns, i+1)
+ plot_ramp(ima, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs)
+ ax.set_ylim(ylims[0],ylims[1])
+
+ ax.tick_params(axis = "x", labelsize = 30)
+ ax.tick_params(axis = "y", labelsize = 30)
+
+ _=ax.set_title(f'{filename}, {subplot_titles[i]}', fontsize=50)
+
+
+def plot_ima_difference_subplots(ima_filename, difference_method, lhs_region, rhs_region):
+ '''
+ Build a complex panel plot of the difference between individual IMA reads.
+ The median difference $\mu$ in the count rate over the entire image is printed above each panel. Below each panel,
+ The IMSET difference, along with the time interval between the two IMSETs, is printed below.
+ The statistics in orange (on the left and right side of each panel) give the median rate and
+ standard deviation of each side of the image, respectively. The value in green 'delta' is the
+ difference between the left and right side of the image. The value in white "Ratio" gives the
+ ratio of the median difference in orange for the left versus the right side.
+
+ Parameters
+ ----------
+ ima_filename : str
+ Path to a RAW full-frame IR image fits file.
+
+ difference_method: str
+ The method of finding the difference between reads.
+ Either "instantaneous" or "cumulative".
+
+ lhs_region: dict
+ The four corners (x0, x1, y0, y1) of the left hand region.
+
+ rhs_region : dict
+ The four corners (x0, x1, y0, y1) of the right hand region.
+
+ '''
+
+ path,filename = os.path.split(ima_filename)
+
+ cube, integ_time = read_wfc3(ima_filename)
+
+ median_fullframe, median_lhs, median_rhs = get_median_fullframe_lhs_rhs(cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ diff_cube = compute_diff_imas(cube, integ_time, diff_method = difference_method)
+
+ median_diff_fullframe, median_diff_lhs, median_diff_rhs = get_median_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+ standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs = get_std_fullframe_lhs_rhs(diff_cube, lhs_region = lhs_region, rhs_region = rhs_region)
+
+ fig_0 = panel_plot(cube, integ_time, median_diff_fullframe, median_diff_lhs, median_diff_rhs, standard_dev_fullframe, standard_dev_lhs, standard_dev_rhs, diff_method = difference_method)
+ _=fig_0.suptitle(filename, fontsize = 40)
+ plt.subplots_adjust(bottom = 0.25, right = 0.9, top = 0.95)
\ No newline at end of file
diff --git a/notebooks/WFC3/ir_scattered_light_manual_corrections/instantaneous_diff.png b/notebooks/WFC3/ir_scattered_light_manual_corrections/instantaneous_diff.png
new file mode 100644
index 000000000..0c2285a6e
Binary files /dev/null and b/notebooks/WFC3/ir_scattered_light_manual_corrections/instantaneous_diff.png differ
diff --git a/notebooks/WFC3/ir_scattered_light_manual_corrections/requirements.txt b/notebooks/WFC3/ir_scattered_light_manual_corrections/requirements.txt
new file mode 100644
index 000000000..2814a9434
--- /dev/null
+++ b/notebooks/WFC3/ir_scattered_light_manual_corrections/requirements.txt
@@ -0,0 +1,8 @@
+astropy==5.2.1
+astroquery==0.4.6
+drizzlepac==3.5.1
+ginga==4.1.1
+matplotlib==3.7.0
+numpy==1.23.4
+stwcs==1.7.2
+wfc3tools==1.4.0
diff --git a/notebooks/WFC3/persistence/README.md b/notebooks/WFC3/persistence/README.md
new file mode 100644
index 000000000..2e6e030fb
--- /dev/null
+++ b/notebooks/WFC3/persistence/README.md
@@ -0,0 +1,16 @@
+This notebook shows how to use the WFC3/IR persistence model to flag pixels affected by persistence in the calibrated (FLT) science images. When the images are sufficiently dithered to step over the observed persistence artifacts, AstroDrizzle may be used to exclude those flagged pixels when combining the FLT frames.
+
+By the end of this tutorial, you will:
+
+- Download images and persistence products from MAST
+- Flag affected pixels in the data quality arrays of the FLT images
+- Redrizzle the FLT images to produce a 'clean' DRZ combined product
+
+Dependencies:
+
+The environment from [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions contains the packages you need. However if you would like to run this notebook from a different environment, then refer to the instructions below:
+
+Two astropy packages must be installed in your conda environment before downloading the data. To do this, type the following command in the terminal before starting the notebook:
+
+ conda install -c astropy astroquery ccdproc
+
diff --git a/notebooks/WFC3/persistence/requirements.txt b/notebooks/WFC3/persistence/requirements.txt
new file mode 100644
index 000000000..b50413f15
--- /dev/null
+++ b/notebooks/WFC3/persistence/requirements.txt
@@ -0,0 +1,6 @@
+astropy==5.2.1
+astroquery==0.4.6
+ccdproc==2.4.0
+drizzlepac==3.5.1
+matplotlib==3.7.0
+numpy==1.23.4
diff --git a/notebooks/WFC3/persistence/wfc3_ir_persistence.ipynb b/notebooks/WFC3/persistence/wfc3_ir_persistence.ipynb
new file mode 100644
index 000000000..e54f0d2f6
--- /dev/null
+++ b/notebooks/WFC3/persistence/wfc3_ir_persistence.ipynb
@@ -0,0 +1,493 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "\n",
+ "# Masking Persistence in WFC3/IR Images\n",
+ "***\n",
+ "## Learning Goals\n",
+ "\n",
+ "This notebook shows how to use the Hubble Space Telescope WFC3/IR persistence model to flag pixels affected by persistence in the calibrated (FLT) science images. When the images are sufficiently dithered to step over the observed persistence artifacts, AstroDrizzle may be used to exclude those flagged pixels when combining the FLT frames. \n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "\n",
+ "- Download images and persistence products from MAST.\n",
+ "- Flag affected pixels in the data quality arrays of the FLT images.\n",
+ "- Redrizzle the FLT images to produce a \"clean\" DRZ combined product.\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#import)
\n",
+ "[2. Data](#data)
\n",
+ "- [2.1 Download the WFC3/IR observations from MAST](#images)
\n",
+ "- [2.2 Download the persistence model products](#model)
\n",
+ "\n",
+ "[3. Analysis](#analysis)
\n",
+ "- [3.1 Display the images](#display)
\n",
+ "- [3.2 Use the persistence model to add DQ flags](#flag)
\n",
+ "- [3.3 Redrizzle the FLT data and apply the new DQ flags](#drizzle)
\n",
+ "- [3.4 Compare the original and corrected DRZ files](#compare)
\n",
+ "- [3.5 Compare the original and corrected WHT files](#weight)
\n",
+ "\n",
+ "[4. Conclusions](#conclusions)
\n",
+ "[Additional Resources](#add)
\n",
+ "[About this Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## Introduction \n",
+ "\n",
+ "Image persistence in the IR array occurs whenever a pixel is exposed to light that exceeds more than about half of the full well of a pixel in the array. Persistence can occur within a single visit, as the different exposures in a visit are dithered. Persistence also occurs from observations in a previous visit of completely different fields.\n",
+ "\n",
+ "Image persistence is seen in a small, but non-negligible fraction of WFC3/IR exposures. Its properties are discussed in in [Section 5.7.9](https://hst-docs.stsci.edu/wfc3ihb/chapter-5-wfc3-detector-characteristics-and-performance/5-7-ir-detector-characteristics-and-performance#id-5.7IRDetectorCharacteristicsandPerformance-5.7.95.7.9ImagePersistence) of the WFC3 Instrument Handbook and in [Chapter 8](https://hst-docs.stsci.edu/wfc3dhb/chapter-8-persistence-in-wfc3-ir) of the WFC3 Data Handbook. Persistence is primarily a function of the degree to which a pixel is filled (in electrons) and the time since this occurred. Additional information is available from the [WFC3 Persistence Webpage](https://www.stsci.edu/hst/instrumentation/wfc3/data-analysis/ir-persistence).\n",
+ "\n",
+ "As described in [Section 8.3](https://hst-docs.stsci.edu/wfc3dhb/chapter-8-persistence-in-wfc3-ir/8-3-mitigating-the-effects-of-persistence) of the Data Handbook, there are two possible ways to mitigate persistence: 1.) exclude the affected pixels from the analysis or 2.) subtract the persistence model directly from the image.\n",
+ "\n",
+ "This notebook illustrates the first method and shows how to use model to flag affected pixels in the data quality (DQ) array of each FLT image. When the images are sufficiently dithered, affected regions of the detector may be replaced with 'good' pixels from other exposures in the visit when combining the exposures with AstroDrizzle. Note that this reduces the effective exposure time in those regions of the combined image. \n",
+ "\n",
+ "In the second method, the persistence-corrected FLT frames, downloaded in [Section 2.2](#model) of this notebook, may be used directly for analysis or a scaled version of the persistence model may be subtracted from each FLT image until an adequate correction is achieved. In this case, flagging the affected pixels in the DQ arrays would not be required."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "## 1. Imports \n",
+ " \n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import: \n",
+ "\n",
+ "- *os* for setting environment variables\n",
+ "- *glob* for finding lists of files\n",
+ "- *shutil* for managing directories\n",
+ "- *numpy* for handling array functions\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "- *astropy.io fits* for accessing FITS files\n",
+ "\n",
+ "- *ccdproc* for querying keyword values in the FITS headers\n",
+ "- *astroquery* for downloading data from MAST\n",
+ "- *urllib* for obtaining the Persistence products from MAST\n",
+ "- *drizzlepac astrodrizzle* for combining images"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import os \n",
+ "import glob \n",
+ "import shutil\n",
+ "\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "from astropy.io import fits\n",
+ "\n",
+ "from ccdproc import ImageFileCollection\n",
+ "from astroquery.mast import Observations\n",
+ "\n",
+ "import urllib\n",
+ "from drizzlepac import astrodrizzle"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2. Data "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "### 2.1 Download the WFC3/IR observations from MAST \n",
+ "\n",
+ "Here, we obtain WFC3/IR observations from GLASS program 13459, Visit 29 in the F140W filter. These exposures were impacted by persistence from grism G102 exposures obtained just prior to these. \n",
+ "\n",
+ "The following commands query MAST and then download the FLT and DRZ data products to the current directory."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "data_list = Observations.query_criteria(obs_id='ica529*',filters='F140W')\n",
+ "\n",
+ "Observations.download_products(data_list['obsid'],mrp_only=False,download_dir='./data',\n",
+ " productSubGroupDescription=['FLT','DRZ'])\n",
+ "\n",
+ "science_files = glob.glob('data/mastDownload/HST/*/*fits')\n",
+ "\n",
+ "for im in science_files:\n",
+ " root = im.split('/')[-1]\n",
+ " os.rename(im,'./'+root)\n",
+ "shutil.rmtree('data/')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This Visit contains 4 consecutive dithered FLT exposures in the F140W filter, which are obtained in a single orbit. The following commands print the values of keywords describing those data, where the POSTARG* values represent the commanded x-axis and y-axis offsets in arcseconds. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "collec = ImageFileCollection('./',\n",
+ " keywords=[\"asn_id\",\"targname\",\"filter\",\"samp_seq\",\"nsamp\",\"exptime\",\n",
+ " \"postarg1\",\"postarg2\",\"date-obs\",\"time-obs\",], glob_include=\"ica529*flt.fits\", ext=0)\n",
+ "out_table = collec.summary\n",
+ "out_table"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 2.2 Download the Persistence Model Products \n",
+ "\n",
+ "To find the URL of the tar file containing the persistence fits files, visit the [PERSIST Search Form](https://archive.stsci.edu/prepds/persist/search.php) and search for dataset='ica529*'.\n",
+ "\n",
+ "You may hover over the link in the Visit column to get the URL to the gzipped tar file for Visit 29. This URL is called in the Python code below. The persistence model data products we will use to create a mask are named 'rootname_persist.fits' and contain any contributions from either external or internal persistence. \n",
+ "\n",
+ "External persistence is defined as residual signal that is generated by an earlier visit, and internal persistence as that generated within the same visit as the image in question. External persistence typically comes from a prior scheduled WFC3/IR program and is not within the control of the observer. Internal persistence can be mitigated by the observer by dithering the exposures within a given visit. \n",
+ "\n",
+ "This cell may take several minutes to complete, as it will download persistence products for all images in the visit, and not just those for the F140W filter. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "request=urllib.request.urlopen('https://archive.stsci.edu/pub/wfc3_persist/13459/Visit29/13459.Visit29.tar.gz')\n",
+ "\n",
+ "tar=request.read()\n",
+ "with open('13459.Visit29.tar.gz', \"wb\") as gzfile:\n",
+ " gzfile.write(tar)\n",
+ "\n",
+ "!tar -zxvf 13459.Visit29.tar.gz\n",
+ "\n",
+ "os.remove('13459.Visit29.tar.gz')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This creates a subdirectory named 13459.Visit29/ in the working directory with the following products for each calibrated 'flt.fits' image:\n",
+ " * persist.fits: The persistence model, including both internal and external persistence\n",
+ " * extper.fits: The persistence model, including only external persistence\n",
+ " * flt_corr.fits: The corrected FLT image, equal to the difference between the image and the model ('flt.fits' - 'persist.fits').\n",
+ " \n",
+ "Note that limitations in the accuracy of the model can result in corrected FLT images in which persistence is not properly removed. This is especially true when prior observations were obtained in scanning mode, where the model significantly underestimates the level of persistence. In this case the model may be iteratively scaled and subtracted from the FLT frame until the residual signal is fully removed. \n",
+ "\n",
+ "Alternately, this notebook shows how the user can flag the impacted pixels in the FLT data quality array then reprocess with AstroDrizzle to improve the combined image."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 3. Analysis "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 3.1 Display the images \n",
+ "\n",
+ "The DRZ product combines the 4 individual FLT exposures and shows faint residual persistence from grism observations obtained just prior to these data. An example of the 'Persistence Removal Evaluation' for the first dataset ica529rmq may be found [here](https://archive.stsci.edu/pub/wfc3_persist/13459/Visit29/ica529rmq_persist.html).\n",
+ "\n",
+ "The DRZ pipeline product is shown on the left, and we can see that the persistence was partially, but not completely, removed by the cosmic-ray rejection functionality in AstroDrizzle. The persistence model for the first FLT dataset is shown on the right. A pair of red boxes are overplotted on each image to highlight regions of the detector with the most visible grism persistence in the combined DRZ image. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "drz =fits.getdata('ica529030_drz.fits',ext=1)\n",
+ "per1=fits.getdata('13459.Visit29/ica529rsq_persist.fits',ext=1)\n",
+ "\n",
+ "fig=plt.figure(figsize=(20,8))\n",
+ "ax1=fig.add_subplot(1,2,1)\n",
+ "ax2=fig.add_subplot(1,2,2)\n",
+ "\n",
+ "ax1.imshow(drz, vmin=0.85,vmax=1.4,cmap='Greys_r',origin='lower')\n",
+ "ax2.imshow(per1, vmin=0.0,vmax=0.005,cmap='Greys_r',origin='lower')\n",
+ "\n",
+ "ax1.set_title('ica529030_drz.fits (Drizzled Product = 4 FLTs)',fontsize=20)\n",
+ "ax2.set_title('ica529rsq_persist.fits (Model for a single FLT)',fontsize=20)\n",
+ "\n",
+ "ax1.plot([0,280,280,0,0],[250,250,350,350,250],c='red')\n",
+ "ax2.plot([0,280,280,0,0],[250,250,350,350,250],c='red')\n",
+ "ax1.plot([200,480,480,200,200],[360,360,460,460,360],c='red')\n",
+ "ax2.plot([200,480,480,200,200],[360,360,460,460,360],c='red')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 3.2 Use the persistence model to add DQ flags \n",
+ "\n",
+ "For any pixels in the model with a signal greater than 0.005 e-/sec, we add a flag of 16384 to the current DQ array values in each FLT frame. This threshold is flexible and should be determined empirically by the user based on the science objective and the fraction of pixels impacted. Note that the IR dark rate is 0.049 e-/s, so a threshold of 0.05 e-/s or 0.01 e-/s may be a more reasonable starting value in order to avoid flagging more pixels than can be filled in with the associated dithered FLT frames. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "flt1_dq=fits.open('ica529rmq_flt.fits',mode='update')\n",
+ "per1 =fits.getdata('13459.Visit29/ica529rmq_persist.fits',ext=1)\n",
+ "\n",
+ "flt2_dq=fits.open('ica529rsq_flt.fits',mode='update')\n",
+ "per2 =fits.getdata('13459.Visit29/ica529rsq_persist.fits',ext=1)\n",
+ "\n",
+ "flt3_dq=fits.open('ica529s0q_flt.fits',mode='update')\n",
+ "per3 =fits.getdata('13459.Visit29/ica529s0q_persist.fits',ext=1)\n",
+ "\n",
+ "flt4_dq=fits.open('ica529s6q_flt.fits',mode='update')\n",
+ "per4 =fits.getdata('13459.Visit29/ica529s6q_persist.fits',ext=1)\n",
+ "\n",
+ "flt1_dq[3].data[per1 > 0.005] += 16384\n",
+ "flt2_dq[3].data[per2 > 0.005] += 16384\n",
+ "flt3_dq[3].data[per3 > 0.005] += 16384\n",
+ "flt4_dq[3].data[per4 > 0.005] += 16384\n",
+ "\n",
+ "flt1_dq.close()\n",
+ "flt2_dq.close()\n",
+ "flt3_dq.close()\n",
+ "flt4_dq.close()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 3.3 Redrizzle the FLT data and apply the new DQ flags \n",
+ "\n",
+ "Now, we recombine the FLT data with AstroDrizzle using the updated DQ arrays and compare with the pipeline DRZ data products. The following cell uses the default parameter values recommended for the IR detector, where `final_bits` tells AstroDrizzle which DQ flags to ignore (e.g. to treat as good data). All other flagged (non-zero) values will be treated as bad pixels and excluded from the combined image. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "astrodrizzle.AstroDrizzle('ica529*flt.fits',output='ica529030_pcorr',\n",
+ " preserve=False, build=True, clean=True, \n",
+ " skymethod='match', sky_bits='16',\n",
+ " driz_sep_bits='512,16', combine_type='median',\n",
+ " driz_cr_snr='5.0 4.0', driz_cr_scale='3.0 2.4', \n",
+ " final_bits='512,16', num_cores=1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 3.4 Compare the original and corrected DRZ files \n",
+ "\n",
+ "Here, we display the drizzled image from the pipeline and the reprocessed drizzled image with persistence masked. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "drz =fits.getdata('ica529030_drz.fits',ext=1)\n",
+ "drz_corr =fits.getdata('ica529030_pcorr_drz.fits',ext=1)\n",
+ "\n",
+ "fig=plt.figure(figsize=(20,8))\n",
+ "ax1=fig.add_subplot(1,2,1)\n",
+ "ax2=fig.add_subplot(1,2,2)\n",
+ "\n",
+ "ax1.imshow(drz, vmin=0.85,vmax=1.4,cmap='Greys_r',origin='lower')\n",
+ "ax2.imshow(drz_corr, vmin=0.85,vmax=1.4,cmap='Greys_r',origin='lower')\n",
+ "\n",
+ "ax1.set_title('ica529030_drz.fits (Pipeline SCI)',fontsize=20)\n",
+ "ax2.set_title('ica529030_pcorr_drz.fits (Corrected SCI)',fontsize=20)\n",
+ "\n",
+ "ax1.plot([0,280,280,0,0],[250,250,350,350,250],c='red')\n",
+ "ax2.plot([0,280,280,0,0],[250,250,350,350,250],c='red')\n",
+ "ax1.plot([200,480,480,200,200],[360,360,460,460,360],c='red')\n",
+ "ax2.plot([200,480,480,200,200],[360,360,460,460,360],c='red')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 3.5 Compare the original and corrected WHT files \n",
+ "\n",
+ "When `final_wht_type='EXP'`, the drizzled WHT images provide an effective exposure time map of the combined array. \n",
+ "\n",
+ "In the plots below, we can see that the pipeline products have lower weight in the region impacted by the grism, but that only a single frame was flagged and rejected by the cosmic ray algorithm. The grey horizontal bars have a weight ~500 seconds compared to the total exposure ~700 seconds.\n",
+ "\n",
+ "In the redrizzled 'corrected' WHT image, only a single exposure contributed to the darkest horizontal bars which have a value of ~200 seconds. The adjacent grey bars have a weight ~500 seconds and the rest of the WHT image is ~700 seconds. Users will need to experiment with the persistence masking thresholds and consider the size of the dithers in their individual datasets to determine the best masking strategy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "wht =fits.getdata('ica529030_drz.fits',ext=2)\n",
+ "wht_corr =fits.getdata('ica529030_pcorr_drz.fits',ext=2)\n",
+ "\n",
+ "fig=plt.figure(figsize=(20,8))\n",
+ "ax1=fig.add_subplot(1,2,1)\n",
+ "ax2=fig.add_subplot(1,2,2)\n",
+ "\n",
+ "ax1.imshow(wht, vmin=0,vmax=800,cmap='Greys_r',origin='lower')\n",
+ "ax2.imshow(wht_corr,vmin=0,vmax=800,cmap='Greys_r',origin='lower')\n",
+ "\n",
+ "ax1.set_title('ica529030_drz.fits (Pipeline WHT)',fontsize=20)\n",
+ "ax2.set_title('ica529030_pcorr_drz.fits (Corrected WHT)',fontsize=20)\n",
+ "\n",
+ "ax1.plot([0,300,300,0,0],[250,250,350,350,250],c='red')\n",
+ "ax2.plot([0,300,300,0,0],[250,250,350,350,250],c='red')\n",
+ "ax1.plot([200,480,480,200,200],[360,360,460,460,360],c='red')\n",
+ "ax2.plot([200,480,480,200,200],[360,360,460,460,360],c='red')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 4. Conclusions \n",
+ "\n",
+ "Thank you for walking through this notebook. Now with WFC3 data, you should be familiar with:\n",
+ "\n",
+ "- Examining the persistence models for a given dataset.\n",
+ "- Defining a threshold to use for masking pixels in the DQ array of FLT science frames.\n",
+ "- Reprocessing dithered frames with the new DQ flags to produce an improved combined DRZ image.\n",
+ "\n",
+ "**Congratulations, you have completed the notebook.**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Additional Resources \n",
+ "\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ " - see Sections 5.7.9 and 7.9.4 for a discussion of IR persistence\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ " - see Section 8.1 for a discussion of IR persistence\n",
+ " - see Section 8.2 for evaluating the amount of persistence in science images\n",
+ " - see Section 8.3 for a discussion methods for mitigating persistence\n",
+ "- [DrizzlePac Handbook](https://hst-docs.stsci.edu/drizzpac)\n",
+ "\n",
+ "\n",
+ "## About this Notebook \n",
+ "\n",
+ "**Author:** Jennifer Mack, WFC3 Instrument Team\n",
+ "\n",
+ "**Updated On:** 2021-09-28\n",
+ "\n",
+ "## Citations \n",
+ "If you use `numpy`, `astropy`, `astroquery`, `wfc3tools`, or `drizzlepac` for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://numpy.org/citing-numpy/)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `astroquery`](https://astroquery.readthedocs.io/en/latest/license.html)\n",
+ "* [Citing `wfc3tools`](https://wfc3tools.readthedocs.io/en/latest/)\n",
+ "* [Citing `drizzlepac`](https://drizzlepac.readthedocs.io/en/latest/LICENSE.html)\n",
+ "***"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "[Top of Page](#top)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.7.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/WFC3/photometry_examples/.ipynb_checkpoints/phot_examples-checkpoint.ipynb b/notebooks/WFC3/photometry_examples/.ipynb_checkpoints/phot_examples-checkpoint.ipynb
new file mode 100644
index 000000000..f9e4f12d3
--- /dev/null
+++ b/notebooks/WFC3/photometry_examples/.ipynb_checkpoints/phot_examples-checkpoint.ipynb
@@ -0,0 +1,878 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "3417f03b",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Synthetic Photometry Examples for WFC3\n",
+ "***\n",
+ "## Learning Goals\n",
+ "\n",
+ "By the end of this tutorial, you will:\n",
+ "\n",
+ "- Specify WFC3 bandpasses in `stsynphot` and define spectra with `synphot`.\n",
+ "- Compute WFC3 zeropoint values and an encircled energy correction.\n",
+ "- Renormalize a spectrum and predict its effective stimulus in another filter.\n",
+ "- Find the photometric transformation between two bandpasses.\n",
+ "- Find the UV color term across the two UVIS chips for different spectral types.\n",
+ "- Plot bandpasses and spectra.\n",
+ "\n",
+ "## Table of Contents\n",
+ "\n",
+ "[Introduction](#intro)
\n",
+ "[1. Imports](#imports)
\n",
+ "[2. Bandpasses and spectra](#band_spec)
\n",
+ "- [2.1 Set up bandpasses](#band)
\n",
+ "- [2.2 Define spectra](#spec)
\n",
+ "\n",
+ "[3. Examples](#ex)
\n",
+ "- [Example 1a: Compute the inverse sensitivity and zeropoint](#e1)
\n",
+ "- [Example 1b: Compute an encircled energy correction](#e1b)
\n",
+ "- [Example 2: Renormalize a spectrum and predict its effective stimulus in another filter](#e2)
\n",
+ "- [Example 3: Find the photometric transformation between two bandpasses](#e3)
\n",
+ "- [Example 4a: Find the UV color term across the two UVIS chips for different spectral types](#e4)
\n",
+ "- [Example 4b: Plot bandpasses and spectra](#e4b)\n",
+ "\n",
+ "[4. Conclusions](#conclusion)
\n",
+ "[Additional Resources](#resources)
\n",
+ "[About the Notebook](#about)
\n",
+ "[Citations](#cite)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b3415f46",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Introduction\n",
+ "\n",
+ "This notebook contains several examples of how to use the `synphot` and `stsynphot` modules for various photometric purposes. \n",
+ "\n",
+ "`synphot` is a Python module that facilitates synthetic photometry, which has an extension module called `stsynphot` to add support for STScI missions. `synphot` is meant to be a replacement for AstroLib `pysynphot`. \n",
+ "\n",
+ "Examples 1, 2, and 3 are based on those found in Section 9.1.10 of the 2018 version of the WFC3 Data Handbook. \n",
+ "\n",
+ "`stsynphot` requires access to data distributed by the [Calibration Data Reference System](https://hst-crds.stsci.edu/) (CRDS) in order to operate. Both packages look for an environment variable called `PYSYN_CDBS` to find the directory containing these data.\n",
+ "\n",
+ "Users can obtain these data files from the CDRS. Information on how to obtain the most up-to-date reference files (and what they contain) can be found [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/synphot-throughput-tables). An example of how to download the files with `curl` and set up this environment variable is presented below.\n",
+ "\n",
+ "For detailed instructions on how to install and set up these packages, see the [synphot](https://synphot.readthedocs.io/en/latest/#installation-and-setup) and [stsynphot](https://stsynphot.readthedocs.io/en/latest/#installation-and-setup) documentation."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f4d1218e",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 1. Imports\n",
+ "\n",
+ "This notebook assumes you have created the virtual environment in [WFC3 Library's](https://github.com/spacetelescope/WFC3Library) installation instructions.\n",
+ "\n",
+ "We import:\n",
+ "- *os* for setting environment variables\n",
+ "\n",
+ "- *numpy* for handling array functions\n",
+ "- *pandas* for managing data\n",
+ "- *matplotlib.pyplot* for plotting data\n",
+ "\n",
+ "- *synphot* and *stsynphot* for evaluating synthetic photometry\n",
+ "- *astropy.units* and *synphot.units* for handling units\n",
+ "\n",
+ "Additionally, we will need to set the `PYSYN_CDBS` environment variable *before* importing stsynphot. We will also create a Vega spectrum using synphot's inbuilt `from_vega()` method, as the latter package will supercede this method's functionality and require a downloaded copy of the latest Vega spectrum to be provided."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "83593365",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib notebook\n",
+ "\n",
+ "import os\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "import synphot as syn\n",
+ "\n",
+ "from astropy import units as u\n",
+ "from synphot import units as su\n",
+ "\n",
+ "vegaspec = syn.SourceSpectrum.from_vega()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "06d98189",
+ "metadata": {},
+ "source": [
+ "This section obtains the WFC3 throughput component tables for use with `synphot`. If reference files need to be downloaded, please uncomment and execute the code block below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "10709b0c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# cmd_input = 'curl -O https://ssb.stsci.edu/trds/tarfiles/synphot1.tar.gz'\n",
+ "# os.system(cmd_input)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "054629f8",
+ "metadata": {},
+ "source": [
+ "Once the downloaded is complete, unzip the file and set the environment variable `PYSYN_CDBS` to the path of the reference files. To do so, uncomment and execute the relevant line from the code block below. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "162bc0c7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# os.environ['PYSYN_CDBS'] = '/path/to/my/reference/files/'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ebbed337",
+ "metadata": {},
+ "source": [
+ "Now, after having set up `PYSYN_CDBS`, we import stsynphot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "487dd24c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import stsynphot as stsyn"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7f8346b2",
+ "metadata": {},
+ "source": [
+ "## 2. Bandpasses and spectra \n",
+ "\n",
+ "### 2.1 Set up bandpasses \n",
+ "\n",
+ "All of the examples below require us to define a bandpass. Bandpasses are defined in `stsynphot` using a string of comma-separated keywords that represents a particular observation mode (obsmode). For WFC3, an obsmode string will, at minimum, look something like: `\"wfc3, [detector], [filter]\"`. E.g. `\"wfc3, uvis1, f606w\"` will get you the bandpass for the F606W filter on WFC3's UVIS1 detector. One may also specify an aperture size in arcseconds with `aper#value` and a Modified Julian Date (to account for time-dependent changes in the UVIS detector sensitivity) with `mjd#value`.\n",
+ "\n",
+ "The documentation [here](https://stsynphot.readthedocs.io/en/latest/stsynphot/obsmode.html) provides a further overview of how to construct an observation mode, and includes a link to the full set of available obsmode keywords.\n",
+ "\n",
+ "### 2.2 Define spectra \n",
+ "\n",
+ "Examples 2-4 require us to define a spectrum. Examples for generating some commonly useful spectra using `synphot` are embedded here:\n",
+ "\n",
+ "\n",
+ "```python\n",
+ "# Blackbody\n",
+ "bb_temp = 5800 * u.K\n",
+ "\n",
+ "model = syn.models.BlackBody1D(bb_temp)\n",
+ "spec = syn.SourceSpectrum(model)\n",
+ "\n",
+ "# Power law \n",
+ "pl_index = 0\n",
+ "\n",
+ "model = syn.models.PowerLawFlux1D(amplitude=flux_in, x_0=wl_in, alpha=pl_index)\n",
+ "spec = syn.SourceSpectrum(model)\n",
+ " \n",
+ "# Load from a FITS table (e.g. a CALSPEC spectrum)\n",
+ "spec = syn.SourceSpectrum.from_file('/path/to/your/spectrum.fits')\n",
+ "```\n",
+ "\n",
+ "Note:\n",
+ "\n",
+ "- `synphot.models.BlackBody1D` outputs a function according to Planck's law, which means that the output unit carries an *implicit* \"per unit solid angle,\" in steradians. `BlackBodyNorm1D`, outputs a spectrum that is normalized to a 1 solar radius star at a distance of 1 kpc.\n",
+ "\n",
+ "- `synphot.models.PowerLawFlux1D` uses the definition $ f(x) = A (\\frac{x}{x_0})^{-\\alpha} $. We pass `flux_in` as $A$, and `wl_in` as $x_0$. Note the negative sign in front of the power law index $\\alpha$. The model can generate curves with $x$ as either frequency or wavelength, but the example here assumes that wavelength will be used. The y-axis unit will be taken from $A$. \n",
+ "\n",
+ "- A wide array of reference spectra are available for download from spectral atlases located [here](https://www.stsci.edu/hst/instrumentation/reference-data-for-calibration-and-tools/astronomical-catalogs)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aec1c476",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 3. Examples\n",
+ "\n",
+ "\n",
+ "### Example 1a: Compute the inverse sensitivity and zeropoint \n",
+ "**Compute inverse sensitivity (PHOTFLAM) and zeropoint values (STmag, ABmag, and Vegamag) for F814W on UVIS1 in an infinite (6.0â€) aperture.**\n",
+ "\n",
+ "This example should reproduce the values found in Table 6 of [WFC3 ISR 2021-04](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2021/WFC3_ISR_2021-04.pdf), the relevant row of which is reproduced here:\n",
+ "\n",
+ "| Filter \t| Pivot Wavelength \t| PHOTFLAM \t| STMAG \t| ABMAG \t| VEGAMAG \t|\n",
+ "|:--------\t|:-----------------\t|:------------\t|:--------\t|:--------\t|:---------\t|\n",
+ "| F814W \t| 8039.1 Ã… \t| 1.4980e-19 \t| 25.961 \t| 25.127 \t| 24.699 \t|\n",
+ "\n",
+ "We include the keywords `'aper#6.0'` and `'mjd#55008'` in our obsmode string to match the aperture and reference epoch used for the calculations in this ISR.\n",
+ "\n",
+ "The WFC3 Zeropoints notebook, which can be found in the [WFC3 Library](https://github.com/spacetelescope/WFC3Library), contains an example to perform this calculation iteratively over all UVIS and IR bandpasses and to compute 'total system throughput tables' for each mode."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "548ec9aa",
+ "metadata": {},
+ "source": [
+ "First, we set up a bandpass based on our observation mode. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3b24c5f6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obsmode = 'wfc3, uvis1, f814w, aper#6.0, mjd#55008'\n",
+ "bp = stsyn.band(obsmode)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6ac74915",
+ "metadata": {},
+ "source": [
+ "Then, we can find the unit response for the bandpass, which is the flux (in $\\text{erg } \\text{cm}^{-2} \\text{ s}^{-1} \\text{ Ã…}^{-1}$, aka FLAM) that produces 1 electron per second. For this calculation, we must pass the HST primary mirror area. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "47c807c9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "uresp = bp.unit_response(stsyn.conf.area)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "af7d302f",
+ "metadata": {},
+ "source": [
+ "Next, we convert the unit response to magnitudes in the ST and AB systems. For the AB conversion, we need the bandpass pivot wavelength."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5729fe90",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "st = -2.5 * np.log10(uresp.value) - 21.1 \n",
+ "\n",
+ "pivot = bp.pivot() # Pivot wavelength for ABmag conversion\n",
+ "ab = st - 5 * np.log10(pivot.value) + 18.6921"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c7850a3c",
+ "metadata": {},
+ "source": [
+ "Converting the unit response for the bandpass to the vegamag system requires us to generate a synthetic Observation, which consists of Vega's spectrum convolved with the bandpass."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9df9b9ee",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obs = syn.Observation(vegaspec, bp, binset=bp.binset)\n",
+ "effstim = obs.effstim(flux_unit=su.FLAM) # Effective stimulus for Vega observation\n",
+ "ve = -2.5 * np.log10(uresp/effstim) # vegamag sensitivity value"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "540cfe18",
+ "metadata": {},
+ "source": [
+ "Now, we can print our results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "68ab0876",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print('Obsmode:', obsmode)\n",
+ "print('Pivot Wavelength: {:.1f}'.format(pivot))\n",
+ "print()\n",
+ "print('PHOTFLAM: {:.6}'.format(uresp))\n",
+ "print('STmag: {:.3f}'.format(st))\n",
+ "print('ABmag: {:.3f}'.format(ab))\n",
+ "print('VEGAMAG: {:.3f}'.format(ve))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5c21fe77",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### Example 1b: Compute an encircled energy correction\n",
+ "\n",
+ "As an addendum to the previous example, we can calculate the unit response for the same bandpass, but with a ~10 pixel aperture (0.4\"), and compute the encircled energy correction, in magnitudes, with respect to the infinite aperture. \n",
+ "\n",
+ "First, we set up the new bandpass for the smaller aperture size."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b2c1fbfa",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obsmode_04 = 'wfc3, uvis1, f814w, aper#0.4, mjd#55008' # Set obsmode string\n",
+ "bp_04 = stsyn.band(obsmode_04)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3394ca94",
+ "metadata": {},
+ "source": [
+ "Then, we find the unit response for the new bandpass."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b628298a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "uresp_04 = bp_04.unit_response(stsyn.conf.area)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "152caecf",
+ "metadata": {},
+ "source": [
+ "Finally, we convert the unit response to a magnitude in the ST system, and find the difference between it and the corresponding value for the infinite aperture. This represents the encircled energy correction from 10 pixels to infinity."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7cbdc0c2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "st_04 = -2.5 * np.log10(uresp_04.value) - 21.1\n",
+ "\n",
+ "st_eecorr = st - st_04\n",
+ "\n",
+ "print('EE Correction (10 pixels -> infinity): {:.3f}'.format(st_eecorr),'mag')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ffb4f8bf",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### Example 2: Renormalize a spectrum and predict its magnitude in another bandpass\n",
+ "**Renormalize a 2,500 K blackbody spectrum to have 1 count/sec in the Johnson V band, and compute the predicted AB magnitude through the F110W filter on WFC3/IR.**\n",
+ "\n",
+ "This example reproduces the methods described in section 3 of [WFC3 ISR 2014-16](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2014/WFC3-2014-16.pdf), but will automatically use the latest available spectra and throughput tables."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "836fc659",
+ "metadata": {},
+ "source": [
+ "First, we define a Johnson V bandpass to which we normalize our spectrum."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2cbc838e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vband = stsyn.band('johnson, v')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b26b07ca",
+ "metadata": {},
+ "source": [
+ "Then, we define the output bandpass for the calculation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "59037e43",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obsmode = 'wfc3, ir, f110w'\n",
+ "bp = stsyn.band(obsmode)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "deafa6d9",
+ "metadata": {},
+ "source": [
+ "Next, we choose a 2500 K blackbody model, fit our spectrum to the model, and use the `normalize` method to normalize the spectrum to one count/sec in the V band."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2f0f8f30",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model = syn.models.BlackBody1D(2500)\n",
+ "spec = syn.SourceSpectrum(model)\n",
+ "spec_norm = spec.normalize(1*u.ct, vband, area=stsyn.conf.area)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1b0a59ac",
+ "metadata": {},
+ "source": [
+ "Finally, we generate a synthetic Observation, which consists of the normalized spectrum convolved with the bandpass, and print the predicted flux (in FLAM) and ABmag values for our Observation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "04ae77f8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obs = syn.Observation(spec_norm, bp)\n",
+ "\n",
+ "flux = obs.effstim(flux_unit=su.FLAM)\n",
+ "ab = obs.effstim(flux_unit=u.ABmag)\n",
+ "\n",
+ "print('Predicted flux: {:.4} for Obsmode = {}'.format(flux, obsmode))\n",
+ "print('Predicted ABmag: {:.3f} for Obsmode = {}'.format(ab, obsmode))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b5805e2e",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### Example 3: Find the photometric transformation between two bandpasses\n",
+ "**Find the color term for a 5,000 K blackbody between the Cousins-I and WFC3/UVIS1 F814W bandpasses in the ABmag system.**\n",
+ "\n",
+ "More examples may be found in the filter transformations notebook in the [WFC3 Library](https://github.com/spacetelescope/WFC3Library)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "19d55eac",
+ "metadata": {},
+ "source": [
+ "First, we set up two bandpasses based on our observation modes. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c1b14d64",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obsmode1 = 'wfc3, uvis1, f814w'\n",
+ "obsmode2 = 'cousins, i'\n",
+ "\n",
+ "bp1 = stsyn.band(obsmode1)\n",
+ "bp2 = stsyn.band(obsmode2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "72079ed0",
+ "metadata": {},
+ "source": [
+ "Then, we choose a 5000 K blackbody model and fit our spectrum to the model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2d16c712",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model = syn.models.BlackBody1D(5000.)\n",
+ "spec = syn.SourceSpectrum(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "98501f79",
+ "metadata": {},
+ "source": [
+ "Next, we generate two synthetic Observations, which consists of the blackbody spectrum convolved with the bandpass."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d693ca97",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obs1 = syn.Observation(spec, bp1, binset=bp1.binset)\n",
+ "obs2 = syn.Observation(spec, bp2, binset=bp2.binset)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "564d8592",
+ "metadata": {},
+ "source": [
+ "Finally, we calculate the color term by finding the difference between the two effective stimuli in ABmag."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0addd585",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "stim1 = obs1.effstim(flux_unit=u.ABmag)\n",
+ "stim2 = obs2.effstim(flux_unit=u.ABmag)\n",
+ "\n",
+ "color = stim2 - stim1\n",
+ "\n",
+ "print('ABmag({}) - ABmag({}) = {:.4f}'.format(obsmode2, obsmode1, color))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "beedb731",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### Example 4a: Find the UV color term across the two UVIS chips for different spectral types\n",
+ "**Calculate the UV color terms (in the STmag system) for a white dwarf spectrum and a G-type spectrum across the two UVIS chips with the F225W filter. Then, find the difference between these two terms to find the magnitude offset on UVIS2 for the G-type star.**\n",
+ "\n",
+ "This example reproduces the results from Figure 4 of [WFC3 ISR 2018-08](https://www.stsci.edu/files/live/sites/www/files/home/hst/instrumentation/wfc3/documentation/instrument-science-reports-isrs/_documents/2018/WFC3-2018-08.pdf).\n",
+ "\n",
+ "The spectra required to run this example, which are the latest relevant spectra from CALSPEC, are provided in the `example_spectra` sub-directory which was packaged with this notebook."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a88968e2",
+ "metadata": {},
+ "source": [
+ "First, we set up two bandpasses based on our observation modes, and define our area to be the HST primary mirror area."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7d3aea32",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obsmode1 = 'wfc3, uvis1, f225w'\n",
+ "obsmode2 = 'wfc3, uvis2, f225w'\n",
+ "\n",
+ "bp1 = stsyn.band(obsmode1)\n",
+ "bp2 = stsyn.band(obsmode2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "73dd029f",
+ "metadata": {},
+ "source": [
+ "Then, we define our spectra from the provided FITS files."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d407ff54",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "spec_wd = syn.SourceSpectrum.from_file('example_spectra/gd153_stiswfcnic_003.fits') # GD153 (white dwarf)\n",
+ "spec_g = syn.SourceSpectrum.from_file('example_spectra/p330e_stiswfcnic_003.fits') # P330E (G-type)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "392d4ed4",
+ "metadata": {},
+ "source": [
+ "Next, we generate four synthetic Observations, one for each spectrum in each bandpass. Ignore the warning messages."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8912d342",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obs1_wd = syn.Observation(spec_wd, bp1, binset=bp1.binset, force='extrap')\n",
+ "obs2_wd = syn.Observation(spec_wd, bp2, binset=bp2.binset, force='extrap')\n",
+ "\n",
+ "obs1_g = syn.Observation(spec_g, bp1, binset=bp1.binset, force='extrap')\n",
+ "obs2_g = syn.Observation(spec_g, bp2, binset=bp1.binset, force='extrap')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "58e7043f",
+ "metadata": {},
+ "source": [
+ "Following this, we calculate the effective stimuli (in STmag) for these Observations, and find the difference between these values across the two chips for each spectral type."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "be12eb31",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "stim1_wd = obs1_wd.effstim(flux_unit = u.STmag)\n",
+ "stim2_wd = obs2_wd.effstim(flux_unit = u.STmag)\n",
+ "\n",
+ "stim1_g = obs1_g.effstim(flux_unit = u.STmag)\n",
+ "stim2_g = obs2_g.effstim(flux_unit = u.STmag)\n",
+ "\n",
+ "dstim_wd = stim1_wd - stim2_wd\n",
+ "dstim_g = stim1_g - stim2_g"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a12d97c2",
+ "metadata": {},
+ "source": [
+ "Finally, we calculate the overall cross-chip color term for the G-type star by finding its offset from the white dwarf."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a64b9b78",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print('Color Term (UVIS1 - UVIS2): {:.3f}'.format(dstim_g - dstim_wd))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "73d4706b",
+ "metadata": {},
+ "source": [
+ "\n",
+ "### Example 4b: Plot bandpasses and spectra\n",
+ "\n",
+ "**Create a plot with the bandpasses and spectra used in Example 4a.**\n",
+ "\n",
+ "**Note:** For the purposes of these plots, the spectra will be scaled to the amplitude of the bandpasses, which reflect the actual total system throughput as a function of wavelength. You will see that the throughput is different between the two chips.\n",
+ "\n",
+ "First, define a set of wavelengths and a minimum/maximum bound for our plot, based on the average wavelength and witdth of the bandpasses."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c0817185",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "avgwave = (bp1.avgwave().to(u.nm) + bp2.avgwave().to(u.nm))/2\n",
+ "width = (bp1.rectwidth().to(u.nm) + bp2.rectwidth().to(u.nm))/2\n",
+ "\n",
+ "left = max((avgwave - 1.5 * width).value, 1)\n",
+ "right = (avgwave + 1.5 * width).value\n",
+ "\n",
+ "wl = np.arange(left, right) * u.nm"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4c8c986e",
+ "metadata": {},
+ "source": [
+ "Next, scale the spectra to the (average) amplitude of the bandpasses."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "55ec62d9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "avg_max = (np.max(bp1(wl)) + np.max(bp2(wl))) / 2\n",
+ "scale_wd = avg_max / np.max(spec_wd(wl))\n",
+ "scale_g = avg_max / np.max(spec_g(wl))\n",
+ "\n",
+ "spec_wd_scale = spec_wd(wl) * scale_wd\n",
+ "spec_g_scale = spec_g(wl) * scale_g"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cbdbd534",
+ "metadata": {},
+ "source": [
+ "Then, plot the bandpasses and spectra."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7fd87c5c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "plt.figure()\n",
+ "\n",
+ "plt.xlabel('Wavelength (nm)')\n",
+ "plt.ylabel('Throughput')\n",
+ "\n",
+ "plt.plot(wl, spec_wd_scale, ls=':', c='blue', label='White dwarf spectrum')\n",
+ "plt.plot(wl, spec_g_scale, ls=':', c='red', label='G-type spectrum')\n",
+ "plt.plot(wl, bp1(wl), ls='-', c='orange', label='UVIS 1 bandpass')\n",
+ "plt.plot(wl, bp2(wl), ls='-', c='purple', label='UVIS 2 bandpass')\n",
+ "\n",
+ "plt.legend(fontsize='small')\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "06a62d49",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## 4. Conclusions\n",
+ "\n",
+ "Thank you for walking through this notebook. Now using WFC3 data, you should be more familiar with:\n",
+ "\n",
+ "- Specify WFC3 bandpasses in `stsynphot` and define spectra with `synphot`.\n",
+ "- Computing WFC3 zeropoint values and an encircled energy correction.\n",
+ "- Renormalizing a spectrum and predict its effective stimulus in another filter.\n",
+ "- Finding the photometric transformation between two bandpasses.\n",
+ "- Finding the UV color term across the two UVIS chips for different spectral types.\n",
+ "- Plotting bandpasses and spectra.\n",
+ "\n",
+ "#### Congratulations, you have completed the notebook!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "24d1a132",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## Additional Resources\n",
+ "Below are some additional resources that may be helpful. Please send any questions through the [HST Helpdesk](https://stsci.service-now.com/hst).\n",
+ "\n",
+ "- [WFC3 Website](https://www.stsci.edu/hst/instrumentation/wfc3)\n",
+ "- [WFC3 Instrument Handbook](https://hst-docs.stsci.edu/wfc3ihb)\n",
+ "- [WFC3 Data Handbook](https://hst-docs.stsci.edu/wfc3dhb)\n",
+ " - see sections 9.5.2 for reference to this notebook\n",
+ " \n",
+ "\n",
+ "## About this Notebook\n",
+ "\n",
+ "**Authors:** Aidan Pidgeon, Jennifer Mack; WFC3 Instrument Team\n",
+ "\n",
+ "**Updated on:** 2021-09-14\n",
+ "\n",
+ "\n",
+ "## Citations\n",
+ "\n",
+ "If you use `numpy`, `astropy`, `synphot`, or `stsynphot` for published research, please cite the\n",
+ "authors. Follow these links for more information about citing the libraries below:\n",
+ "\n",
+ "* [Citing `numpy`](https://www.scipy.org/citing.html#numpy)\n",
+ "* [Citing `astropy`](https://www.astropy.org/acknowledging.html)\n",
+ "* [Citing `synphot`](https://synphot.readthedocs.io/en/latest/)\n",
+ "* [Citing `stsynphot`](https://stsynphot.readthedocs.io/en/latest/index.html)\n",
+ "\n",
+ "***\n",
+ "[Top of Page](#title)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9dd3642f",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/WFC3/photometry_examples/README.md b/notebooks/WFC3/photometry_examples/README.md
new file mode 100644
index 000000000..abd3476a9
--- /dev/null
+++ b/notebooks/WFC3/photometry_examples/README.md
@@ -0,0 +1,8 @@
+This notebook replaces `pysynphot` examples from the 2018 version of the Data Handbook and demonstrates how to use `stsynphot` for several use cases:
+
+- Compute the inverse sensitivity, zeropoint, and encircled energy correction for any WFC3 'obsmode'
+- Renormalize a spectrum to 1 count/sec in a given bandpass and output the predicted magnitude or flux for a different bandpass
+- Determine the color transformation between two bandpasses for a given spectrum
+- Compute color terms for UV filters for a blue versus a red standard star observed on UVIS2
+
+Note that the fourth example in the notebook requires the fits files found in the `example_spectra` subdirectory.
diff --git a/notebooks/WFC3/photometry_examples/example_spectra/gd153_stiswfcnic_003.fits b/notebooks/WFC3/photometry_examples/example_spectra/gd153_stiswfcnic_003.fits
new file mode 100644
index 000000000..f7f983330
--- /dev/null
+++ b/notebooks/WFC3/photometry_examples/example_spectra/gd153_stiswfcnic_003.fits
@@ -0,0 +1,6113 @@
+SIMPLE = T / BITPIX = 16 / NAXIS = 0 / EXTEND = T /FITS extensions present? TARGETID= 'GD153 ' / DBTABLE = 'CRSPECTRUM' / MAPKEY = 'calspec ' / AIRMASS = 0.00000 /Mean airmass of the observation DESCRIP = 'Standard star flux with an HST/STIS calibration------' / SOURCE = 'Flux scale of Bohlin, et al.2020, AJ, 160, 21' / USEAFTER= 'Jan 01 2000 00:00:00' / COMMENT = 'HST Flux scale is based on TMAP AND TLUSTY WD NLTE MODELS' / COMMENT = 'Pure-Hyd model WD' / PEDIGREE= 'INFLIGHT 18/05/1997 31/12/2020' / HISTORY FILE WRITTEN BY stismrg.PRO ON 4-Feb-2021 13:27:44.00 HISTORY FILE WRITTEN BY STISREDUCE.PRO ON 4-Feb-2021 13:27:42.00 HISTORY coadd lst for G140L from dir=dat/: HISTORY o3zx08hhm o4a502060 o4vt10yrq o4vt10z0q o4vt10z7q o4vt10zaq o6ig03t5q HISTORY o6ig03thq o6ig04v7q o6ig04vjq o6ig11cxq o6ig11djq o6ig02y3q o6ig02yfq HISTORY o8v202f7q oa8d02010 oa9z05010 obc402enq obto10qhq oc5506rjq ocga05euq HISTORY odck02p2q odud02fpq oehj02gyq HISTORY EPOCH: 1997.194:04:43:17-2021.025:14:41:03 HISTORY gwidth for G140L flux cal=11 w/ /Users/bohlin/stisidl/scal/sens_g140l.fiHISTORY SYS-ERROR is the broadband ~1% SYSTEMATIC UNCERTAINTY of STIS fluxes. HISTORY Bohlin(2014,PASP,126,711). BOTH THE STAT-ERR AND SYS-ERR ARE 1-SIGMA.HISTORY Net & Flux corr for change w/ time,temp (Bohlin,etal.2019,AJ,158,211) HISTORY coadd lst for G230L from dir=dat/: HISTORY o3zx08hlm o4a502050 o4vt10zdq o4vt10zlq o4vt10zuq o4vt10zyq o6ig03t9q HISTORY o6ig04vbq o6ig11daq o6ig02y7q o8v202fhq oa9z05020 obc402010 obto10010 HISTORY oc5506010 ocga05010 odck02010 odud02010 oehj02010 HISTORY EPOCH: 1997.194:04:55:14-2021.025:14:28:55 HISTORY gwidth for G230L flux cal=11 w/ /Users/bohlin/stisidl/scal/sens_g230l.fiHISTORY Net & Flux corr. for changes w/ time (Bohlin,etal.2019,AJ,158,211) HISTORY coadd lst for G230LB from dir=dat/: HISTORY o3tt42010 o3tt43010 o3tt44010 o3tt45010 o3tt46010 o3tt47010 o3tt48010 HISTORY o4d103010 o4a502040 o8v202030 o8v202040 obc402030 obto10030 oc5506030 HISTORY ocga05030 odck02030 odud02030 oehj02030 HISTORY EPOCH: 1997.141:10:18:00-2021.025:14:53:35 HISTORY gwidth for G230LB flux cal=11 w/ /Users/bohlin/stisidl/scal/sens11_g230lHISTORY Net & Flux corr for time(2019,AJ,158,211)&CTE loss(2006,PASP,118,1455) HISTORY MERGE POINT = 1678.0 HISTORY coadd lst for G430L from dir=dat/: HISTORY o3tt42020 o3tt43020 o3tt44020 o3tt45020 o3tt46020 o3tt47020 o3tt48020 HISTORY o4d103020 o4a502030 o8v202050 o8v202060 obc402040 obc402050 obto10040 HISTORY obto10050 oc5506040 oc5506050 ocga05040 ocga05050 odck02040 odck02050 HISTORY odud02040 odud02050 oehj02040 oehj02050 HISTORY EPOCH: 1997.141:10:34:18-2021.025:16:03:00 HISTORY gwidth for G430L flux cal=11 w/ /Users/bohlin/stisidl/scal/sens11_g430l.HISTORY Net and Flux corr for time(2019,AJ,158,211)&CTE loss(2006,PASP,118,1455)HISTORY MERGE POINT = 3065.0 HISTORY coadd lst for G750L from dir=dat/: HISTORY o3tt42040 o3tt43040 o3tt44040 o3tt45040 o3tt46040 o3tt47040 o3tt48040 HISTORY o4d103030 o4a502020 o8v202070 obc402060 obto10060 oc5506060 ocga05060 HISTORY odck02060 odud02060 oehj02060 HISTORY EPOCH: 1997.141:11:31:25-2021.025:16:08:44 HISTORY gwidth for G750L flux cal=11 w/ /Users/bohlin/stisidl/scal/sens11_g750l.HISTORY MERGE POINT = 5450.0 HISTORY HISTORY FILE WRITTEN BY WFCREDUCE.PRO ON 29-Oct-2020 17:21:53.00 HISTORY coadd lst for G102: HISTORY iab901ekq iab901elq iab901emq iab901enq iab901esq iab9a1eyq ibwq1asfq HISTORY ibwq1asgq ibwq1ashq ibwq1asiq ibwq1asmq ibwq1aspq ibwq1assq ibwq1aswq HISTORY ibwq1aszq ibwq1at2q ibwq1at6q ibwq1at9q ibwq1atcq ibwq1atgq ibwq1atjq HISTORY ibwq1atmq ibwq1atqq ibwq1attq ibwqaatwq ic461agjq ic461aglq ic461agmq HISTORY ic461agnq ic461agrq ic461agsq ic461agvq ic461agwq ich318bsq ich401hfq HISTORY ich401hgq ich401hhq ich401hiq ich401hmq ich401hnq ich401hqq ich401hrq HISTORY ich402anq ich402aoq ich402aqq ich402arq ich402avq ich402awq ich402azq HISTORY ich402b0q id2q01fmq id2q01fpq id2q01fsq id2q01fwq id2q01fzq id2q01g2q HISTORY id2q01g6q id2q01g9q id2q01gcq id2q01ggq id2q01gjq id2q01gmq idco01rmq HISTORY idco01rpq idco01rsq idco01rwq idco01rzq idco01s2q idco01s6q idco01s9q HISTORY idco01scq idco01sgq idco01sjq idco01smq idpo02p2q idpo02p5q idpo02p8q HISTORY idvj01p5q idvj01p8q idvj01pbq ie0v01noq ie0v01nrq ie0v01nuq HISTORY EPOCH: 2009.215:10:57:51-2020.071:20:51:24 HISTORY gwidth for G102 flux cal= 6.00000 HISTORY SYS-ERROR is a broadband 1% INTERNAL repeatability of WFC3 fluxes. HISTORY IN ADDITION, THERE IS SOME SYSTEMATIC UNCERTAINTY IN THE ABS CALIB, see HISTORY Bohlin et al.2014,PASP,126,711. BOTH THE STAT-ERR & SYS-ERR ARE 1-SIGMAHISTORY coadd lst for G141: HISTORY iab904mgq iab904mkq iab904mlq iab904mmq iab904mqq iab9a4muq ibwq1bl3q HISTORY ibwq1bl6q ibwq1blaq ibwq1bldq ibwq1blhq ibwq1blkq ibwq1bloq ibwq1blrq HISTORY ibwq1blvq ibwq1blyq ibwq1bm2q ibwq1bm5q ibwq1bm9q ibwq1bmcq ibwqabmgq HISTORY ibwqaau0q ibwqaau1q ibwqaau2q ibwqaau3q ic461ah6q ic461ah7q ic461ah8q HISTORY ic461ah9q ic461ahdq ic461aheq ic461ahhq ic461ahjq ich318buq ich401hvq HISTORY ich401hwq ich401hxq ich401hyq ich401i2q ich401i3q ich401i6q ich401i8q HISTORY ich402b4q ich402b5q ich402b6q ich402b7q ich402bbq ich402bcq ich402bfq HISTORY ich402bhq id2q02oyq id2q02p1q id2q02peq id2q02piq id2q02ppq id2q02qgq HISTORY id2q02qlq id2q02qoq id2q02qsq id2q02qvq id2q02qzq id2q02r2q idco02phq HISTORY idco02pkq idco02poq idco02prq idco02pvq idco02pyq idco02q2q idco02q5q HISTORY idco02q9q idco02qcq idco02qgq idco02qjq idpo02pcq idpo02pfq idpo02pjq HISTORY idvj01piq idvj01plq idvj01ppq ie0v01nyq ie0v01o1q ie0v01o4q HISTORY EPOCH: 2009.216:20:29:16-2020.071:21:15:47 HISTORY gwidth for G141 flux cal= 6.00000 HISTORY SYS-ERROR is a broadband 1% INTERNAL repeatability of WFC3 fluxes. HISTORY IN ADDITION, THERE IS SOME SYSTEMATIC UNCERTAINTY IN THE ABS CALIB, see HISTORY Bohlin et al.2014,PASP,126,711. BOTH THE STAT-ERR & SYS-ERR ARE 1-SIGMAHISTORY MERGE POINT =11375.0 HISTORY HISTORY file written by nicreduce.pro on 20-Feb-2020 08:46:09.00 HISTORY coadd lst and Temp(K) for gd153.g096: HISTORY n8u402 n94a02 n9u203 na5303 HISTORY 76.75 76.31 76.02 75.47 HISTORY Corr. for non-linearity gd153 G096 Epoch: 2004-06-09 to 2008-01-02 HISTORY coadd lst and Temp(K) for gd153.g141: HISTORY n8u402 n94a02 n9u203 na5303 HISTORY 76.76 76.32 75.96 75.39 HISTORY Corr. for non-linearity gd153 G141 Epoch: 2004-06-09 to 2008-01-02 HISTORY MERGE POINT (microns) = 1.167 HISTORY coadd lst and Temp(K) for gd153.g206: HISTORY n9u203 na5303 HISTORY 75.91 75.41 HISTORY Corr. for non-linearity gd153 G206 Epoch: 2006-11-23 to 2008-01-02 HISTORY MERGE POINT (microns) = 1.886 HISTORY HISTORY Units: Angstroms(A) and erg s-1 cm-2 A-1 HISTORY All wavelengths are in vacuum. HISTORY Written by MAKE_STIS_CALSPEC.pro 2-Mar-2021 HISTORY Sources for this spectrum: HISTORY ---------------- ---------------------- ---------- HISTORY WAVELENGTH RANGE SOURCE FILE HISTORY ---------------- ---------------------- ---------- HISTORY 1140 9610 STIS gd153.mrg HISTORY 9610 16900 WFC3 gd153.mrg HISTORY 16900 24200 NICMOS gd153.mrg HISTORY 24200 300108 TMAP pure Hyd Model From Grid HISTORY TMAP pure Hyd Model with Teff,log g,E(B-V)=40204 7.82 0.0002 HISTORY Bohlin, et al. 2020, AJ, 160, 21 HISTORY Model Normalized to Observed Flux at 6800-7700A HISTORY CHANGES from previous version: HISTORY Updated WFC3 IR Fluxes HISTORY For details see: HISTORY http://www.stsci.edu/hst/instrumentation/reference- HISTORY data-for-calibration-and-tools/astronomical- HISTORY catalogs/calspec FILENAME= 'gd153_stiswfcnic_003.fits' / WMIN = 1140.02062988 /Minimum Wavelength WMAX = 300107.159223 /Maximum Wavelength END XTENSION= 'BINTABLE' /Written by IDL: Tue Mar 2 13:24:01 2021 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 30 /Number of bytes per row NAXIS2 = 75687 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 7 /Number of columns EXTNAME = 'SCI ' / EXTVER = 1 / INHERIT = T / TFORM1 = '1D ' /Real*8 (double precision) TTYPE1 = 'WAVELENGTH' /Label for column 1 TUNIT1 = 'ANGSTROMS' /Units of column 1 TDISP1 = 'G10.4 ' /Display format for column 1 TFORM2 = '1E ' /Real*4 (floating point) TTYPE2 = 'FLUX ' /Absolutely calibrated net spectrum TUNIT2 = 'FLAM ' /Units of column 2 TDISP2 = 'E12.4 ' /Display format for column 2 TFORM3 = '1E ' /Real*4 (floating point) TTYPE3 = 'STATERROR' /Statistical flux error TUNIT3 = 'FLAM ' /Units of column 3 TDISP3 = 'E12.4 ' /Display format for column 3 TFORM4 = '1E ' /Real*4 (floating point) TTYPE4 = 'SYSERROR' /Systematic flux error=0.01*FLAM TUNIT4 = 'FLAM ' /Units of column 4 TDISP4 = 'E12.4 ' /Display format for column 4 TFORM5 = '1E ' /Real*4 (floating point) TTYPE5 = 'FWHM ' /FWHM spectral resolution TUNIT5 = 'ANGSTROMS' /Units of column 5 TDISP5 = 'G6.2 ' /Display format for column 5 TFORM6 = '1I ' /Integer*2 (short integer) TTYPE6 = 'DATAQUAL' /Data quality: 1=good, 0=bad TUNIT6 = 'NONE ' /Units of column 6 TDISP6 = 'I2 ' /Display format for column 6 TFORM7 = '1E ' /Real*4 (floating point) TTYPE7 = 'TOTEXP ' /Total exposure time TUNIT7 = 'SEC ' /Units of column 7 TDISP7 = 'G10.2 ' /Display format for column 7 END @‘Ð ,}P;)͉œ)"Þ,}P; Dš£3@‘Òk?éúÛ,tÎJ)'Æð)¬ü,tÎJ EÒðÍ@‘ÔÁ`4P,nõK)ˇ)îé,nõK EåÍ@‘×ñQç,rÇz)Ä)`ò,rÇz EåÍ@‘Ùm ‹],sÀ(ö¢˜) ,sÀ EåÍ@‘Ûÿø¨ô,qkÌ(á"Œ)‚n,qkÌ EåÍ@‘Þàâi,sAù(Ð Õ)¯X,sAù EåÍ@‘àp ,qš£(¾ñ‘) h,qš£ EåÍ@‘âÆâ—,pê(±Iè)/l,pê EåÍ@‘å@W,pvÍ(£´²)å¢,pvÍ EåÍ@‘çr_ét£,pdÊ(™Þ·)Ú,pdÊ EåÍ@‘éÈ€®,s5](‘7)§F,s5] EåÍ@‘ìŸðË°,r“<(ˆÝI)?ƒ,r“<